MyList all of the recycler views integrated and shown
offline data handling for my fav data in repository like count and click api integration remove from favorite api integration
This commit is contained in:
@@ -93,7 +93,6 @@ class HomeActivity : WokaBaseActivity(),
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
|
||||
window.statusBarColor = Color.TRANSPARENT
|
||||
window.navigationBarColor = Color.WHITE
|
||||
window.lightStatusBar()
|
||||
|
||||
viewModel = ViewModelProvider(this)[HomeViewModel::class.java]
|
||||
progressView = ProgressView(this)
|
||||
@@ -145,7 +144,11 @@ class HomeActivity : WokaBaseActivity(),
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
unregisterReceiver(minuteReceiver)
|
||||
try {
|
||||
unregisterReceiver(minuteReceiver)
|
||||
}catch (e: Exception){
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
||||
private fun setObservers(){
|
||||
@@ -450,20 +453,28 @@ class HomeActivity : WokaBaseActivity(),
|
||||
override fun onBottomTabSelected(tab: Int) {
|
||||
when (tab){
|
||||
HOME -> {
|
||||
binding.notifications.show()
|
||||
|
||||
if (userPrefs?.appTheme == Theme.THEME_TWO){
|
||||
binding.root.backgroundTintList = ColorStateList.valueOf(getColor(R.color.color_primary))
|
||||
|
||||
supportFragmentManager.beginTransaction()
|
||||
.replace(R.id.fc_home, Home2Fragment.newInstance())
|
||||
.runOnCommit {
|
||||
binding.notifications.show()
|
||||
window.lightStatusBar()
|
||||
|
||||
binding.root.backgroundTintList = ColorStateList.valueOf(getColor(R.color.color_primary))
|
||||
|
||||
}
|
||||
.commit()
|
||||
}else{
|
||||
binding.root.backgroundTintList = null
|
||||
|
||||
supportFragmentManager.beginTransaction()
|
||||
.replace(R.id.fc_home, Home1Fragment.newInstance())
|
||||
.runOnCommit {
|
||||
binding.notifications.show()
|
||||
window.lightStatusBar()
|
||||
|
||||
binding.root.backgroundTintList = null
|
||||
}
|
||||
.commit()
|
||||
|
||||
}
|
||||
|
||||
registerReceiver(minuteReceiver, IntentFilter(Intent.ACTION_TIME_TICK))
|
||||
@@ -478,14 +489,17 @@ class HomeActivity : WokaBaseActivity(),
|
||||
, ActivityOptions.makeSceneTransitionAnimation(this).toBundle())
|
||||
}
|
||||
MY_LIST -> {
|
||||
binding.notifications.hide()
|
||||
binding.root.backgroundTintList = ColorStateList.valueOf(getColor(R.color.orders_bg))
|
||||
unregisterReceiver(minuteReceiver)
|
||||
|
||||
supportFragmentManager.beginTransaction()
|
||||
.replace(R.id.fc_home, MyListFragment.newInstance())
|
||||
.runOnCommit {
|
||||
window.lightStatusBar(true)
|
||||
binding.notifications.hide()
|
||||
binding.root.backgroundTintList = ColorStateList.valueOf(getColor(R.color.orders_bg))
|
||||
}
|
||||
.commit()
|
||||
|
||||
updateBackground()
|
||||
viewModel.selectedBottomTab = tab
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,12 +5,19 @@ import androidx.fragment.app.Fragment
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.SimpleItemAnimator
|
||||
import com.woka.databinding.FragmentMyListBinding
|
||||
import com.woka.home.mylist.MyListRepository
|
||||
import com.woka.home.mylist.adapters.AudioBooksAdapter
|
||||
import com.woka.home.mylist.adapters.GamesAdapter
|
||||
import com.woka.home.mylist.adapters.KaraokeAdapter
|
||||
import com.woka.home.mylist.adapters.WebSeriesAdapter
|
||||
import com.woka.home.mylist.models.ShowData
|
||||
import com.woka.networking.ApiResult
|
||||
import com.woka.utils.hide
|
||||
import com.woka.utils.show
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class MyListFragment : Fragment() {
|
||||
|
||||
@@ -18,6 +25,9 @@ class MyListFragment : Fragment() {
|
||||
|
||||
private lateinit var webSeriesEAdapter: WebSeriesAdapter
|
||||
private lateinit var webSeriesHAdapter: WebSeriesAdapter
|
||||
private lateinit var audioBooksAdapter: AudioBooksAdapter
|
||||
private lateinit var karaokeAdapter: KaraokeAdapter
|
||||
private lateinit var gamesAdapter: GamesAdapter
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
@@ -26,8 +36,11 @@ class MyListFragment : Fragment() {
|
||||
binding = FragmentMyListBinding.inflate(inflater, container, false)
|
||||
|
||||
// adapters
|
||||
webSeriesEAdapter = WebSeriesAdapter()
|
||||
webSeriesHAdapter = WebSeriesAdapter()
|
||||
webSeriesEAdapter = WebSeriesAdapter("1")
|
||||
webSeriesHAdapter = WebSeriesAdapter("18")
|
||||
audioBooksAdapter = AudioBooksAdapter()
|
||||
karaokeAdapter = KaraokeAdapter()
|
||||
gamesAdapter = GamesAdapter()
|
||||
|
||||
initViews()
|
||||
|
||||
@@ -35,15 +48,17 @@ class MyListFragment : Fragment() {
|
||||
|
||||
setObservers()
|
||||
|
||||
MyListRepository.loadMyFavList()
|
||||
|
||||
return binding.root
|
||||
}
|
||||
|
||||
private fun initViews() {
|
||||
binding.apply {
|
||||
(rvWebSeriesEnglish.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false
|
||||
rvWebSeriesEnglish.adapter = webSeriesEAdapter
|
||||
rvWebSeriesHindi.adapter = webSeriesHAdapter
|
||||
rvAudioBooks.adapter = audioBooksAdapter
|
||||
rvKaraoke.adapter = karaokeAdapter
|
||||
rvGames.adapter = gamesAdapter
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,18 +73,101 @@ class MyListFragment : Fragment() {
|
||||
private fun setObservers(){
|
||||
binding.apply {
|
||||
MyListRepository.myFavListLiveData.observe(viewLifecycleOwner){
|
||||
when (it){
|
||||
is ApiResult.Error -> {
|
||||
webSeriesEnglishView.hide()
|
||||
webSeriesHindiView.hide()
|
||||
}
|
||||
is ApiResult.Loading -> {}
|
||||
is ApiResult.Success -> {
|
||||
it.data?.result?.let { result ->
|
||||
result.show_data?.let {showData ->
|
||||
if (showData.isNotEmpty()){
|
||||
webSeriesEnglishView.show()
|
||||
webSeriesEAdapter.submitList(ArrayList(showData))
|
||||
lifecycleScope.launch {
|
||||
when (it){
|
||||
is ApiResult.Error -> {
|
||||
progressBar.hide()
|
||||
noData.show()
|
||||
}
|
||||
is ApiResult.Loading -> {}
|
||||
is ApiResult.Success -> {
|
||||
it.data?.result?.let { result ->
|
||||
|
||||
var dataLoaded = false
|
||||
|
||||
progressBar.hide()
|
||||
|
||||
result.show_data?.let {showData ->
|
||||
if (showData.isNotEmpty()){
|
||||
val engList = mutableListOf<ShowData>()
|
||||
val hinList = mutableListOf<ShowData>()
|
||||
|
||||
for (show in showData){
|
||||
val ids = show.bookmark_category_ids?.split(",")
|
||||
ids?.let {bIds ->
|
||||
if (bIds.isNotEmpty()) {
|
||||
when (bIds.size) {
|
||||
1 -> if (bIds[0] == "1") engList.add(show) else hinList.add(show)
|
||||
else -> {
|
||||
engList.add(show)
|
||||
hinList.add(show)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (engList.isNotEmpty()){
|
||||
webSeriesEnglishView.show()
|
||||
dataLoaded = true
|
||||
webSeriesEAdapter.submitList(engList)
|
||||
}else{
|
||||
webSeriesEnglishView.hide()
|
||||
}
|
||||
|
||||
if (hinList.isNotEmpty()){
|
||||
webSeriesHindiView.show()
|
||||
dataLoaded = true
|
||||
webSeriesHAdapter.submitList(hinList)
|
||||
}else{
|
||||
webSeriesHindiView.hide()
|
||||
}
|
||||
|
||||
}else{
|
||||
webSeriesEnglishView.hide()
|
||||
webSeriesHindiView.hide()
|
||||
}
|
||||
}
|
||||
|
||||
result.audio_data?.let { audioData ->
|
||||
|
||||
if (audioData.isNotEmpty()){
|
||||
audioBooksView.show()
|
||||
|
||||
dataLoaded = true
|
||||
audioBooksAdapter.submitList(audioData)
|
||||
}else{
|
||||
audioBooksView.hide()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
result.sing_karaoke_data?.let { singKaraokeData ->
|
||||
if (singKaraokeData.isNotEmpty()){
|
||||
karaokeView.show()
|
||||
|
||||
dataLoaded = true
|
||||
karaokeAdapter.submitList(singKaraokeData)
|
||||
}else{
|
||||
karaokeView.hide()
|
||||
}
|
||||
}
|
||||
|
||||
result.game_data?.let { gamesData ->
|
||||
if (gamesData.isNotEmpty()){
|
||||
gamesView.show()
|
||||
|
||||
dataLoaded = true
|
||||
gamesAdapter.submitList(gamesData)
|
||||
}else{
|
||||
gamesView.hide()
|
||||
}
|
||||
}
|
||||
|
||||
if (!dataLoaded){
|
||||
noData.show()
|
||||
}else{
|
||||
noData.hide()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
22
app/src/main/java/com/woka/home/mylist/MyFavApiService.kt
Normal file
22
app/src/main/java/com/woka/home/mylist/MyFavApiService.kt
Normal file
@@ -0,0 +1,22 @@
|
||||
package com.woka.home.mylist
|
||||
|
||||
import com.woka.networking.ApiResponse
|
||||
import okhttp3.FormBody
|
||||
import retrofit2.Response
|
||||
import retrofit2.http.Body
|
||||
import retrofit2.http.POST
|
||||
|
||||
interface MyFavApiService {
|
||||
|
||||
@POST("post_like")
|
||||
suspend fun likePost(@Body body: FormBody): Response<ApiResponse<Any>>
|
||||
|
||||
@POST("post_unlike")
|
||||
suspend fun unLikePost(@Body body: FormBody): Response<ApiResponse<Any>>
|
||||
|
||||
@POST("favourite_add")
|
||||
suspend fun addToFav(@Body body: FormBody): Response<ApiResponse<Any>>
|
||||
|
||||
@POST("favourite_remove")
|
||||
suspend fun removeFromFav(@Body body: FormBody): Response<ApiResponse<Any>>
|
||||
}
|
||||
@@ -2,23 +2,301 @@ package com.woka.home.mylist
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.woka.home.mylist.models.AudioData
|
||||
import com.woka.home.mylist.models.GameData
|
||||
import com.woka.home.mylist.models.MyListResponse
|
||||
import com.woka.home.mylist.models.PostType
|
||||
import com.woka.home.mylist.models.ShowData
|
||||
import com.woka.home.mylist.models.SingKaraokeData
|
||||
import com.woka.networking.ApiResult
|
||||
import com.woka.networking.RetrofitHelper
|
||||
import com.woka.userdata.UserRepository
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import okhttp3.FormBody
|
||||
import kotlin.math.max
|
||||
|
||||
object MyListRepository {
|
||||
|
||||
private val myFavApiService = RetrofitHelper.getRetrofit().create(MyFavApiService::class.java)
|
||||
|
||||
private val _myFavListLiveData = MutableLiveData<ApiResult<MyListResponse>>()
|
||||
val myFavListLiveData: LiveData<ApiResult<MyListResponse>>
|
||||
get() = _myFavListLiveData
|
||||
get() {
|
||||
// also updating local changes
|
||||
myFavData?.let { _myFavListLiveData.postValue(ApiResult.Success(it)) }
|
||||
return _myFavListLiveData
|
||||
}
|
||||
|
||||
fun loadMyFavList(){
|
||||
private var myFavData: MyListResponse? = null
|
||||
|
||||
init {
|
||||
loadMyFavList()
|
||||
}
|
||||
|
||||
private fun loadMyFavList(){
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
_myFavListLiveData.postValue(ApiResult.Loading())
|
||||
_myFavListLiveData.postValue(UserRepository.loadMyFavList())
|
||||
val response = UserRepository.loadMyFavList()
|
||||
|
||||
when (response){
|
||||
is ApiResult.Error -> {}
|
||||
is ApiResult.Loading -> {}
|
||||
is ApiResult.Success -> {
|
||||
myFavData = response.data
|
||||
}
|
||||
}
|
||||
|
||||
_myFavListLiveData.postValue(response)
|
||||
}
|
||||
}
|
||||
|
||||
fun likePost(postId: String, postType: PostType, categoryId: String = "0"){
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val response = RetrofitHelper.handleApiCall {
|
||||
myFavApiService.likePost(
|
||||
FormBody.Builder()
|
||||
.add("post_id", postId)
|
||||
.add("post_type", postType.value)
|
||||
.build()
|
||||
)
|
||||
}
|
||||
|
||||
when (response){
|
||||
is ApiResult.Error -> {}
|
||||
is ApiResult.Loading -> {}
|
||||
is ApiResult.Success -> {
|
||||
changeLikeLocally(postId, postType, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun unLikePost(postId: String, postType: PostType, categoryId: String = "0") {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val response = RetrofitHelper.handleApiCall {
|
||||
myFavApiService.unLikePost(
|
||||
FormBody.Builder()
|
||||
.add("post_id", postId)
|
||||
.add("post_type", postType.value)
|
||||
.add("category", categoryId)
|
||||
.build()
|
||||
)
|
||||
}
|
||||
|
||||
when (response) {
|
||||
is ApiResult.Error -> {}
|
||||
is ApiResult.Loading -> {}
|
||||
is ApiResult.Success -> {
|
||||
changeLikeLocally(postId, postType, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun markAsFavShowLocally(showData: ShowData, addToFav: Boolean){
|
||||
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val response = RetrofitHelper.handleApiCall {
|
||||
if (addToFav){
|
||||
myFavApiService.addToFav(
|
||||
FormBody.Builder()
|
||||
.add("post_id", "${showData.id}")
|
||||
.add("post_type", PostType.WEB_SERIES.value)
|
||||
.build()
|
||||
)
|
||||
}else{
|
||||
myFavApiService.removeFromFav(
|
||||
FormBody.Builder()
|
||||
.add("post_id", "${showData.id}")
|
||||
.add("post_type", PostType.WEB_SERIES.value)
|
||||
.build()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
when (response){
|
||||
is ApiResult.Error -> {}
|
||||
is ApiResult.Loading -> {}
|
||||
is ApiResult.Success -> {
|
||||
myFavData?.result?.show_data?.let {
|
||||
if (addToFav){
|
||||
it.add(showData)
|
||||
}else{
|
||||
it.remove(showData)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun markAsFavAudioLocally(audioData: AudioData, addToFav: Boolean){
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val response = RetrofitHelper.handleApiCall {
|
||||
if (addToFav){
|
||||
myFavApiService.addToFav(
|
||||
FormBody.Builder()
|
||||
.add("post_id", "${audioData.id}")
|
||||
.add("post_type", PostType.AUDIO_BOOKS.value)
|
||||
.build()
|
||||
)
|
||||
}else{
|
||||
myFavApiService.removeFromFav(
|
||||
FormBody.Builder()
|
||||
.add("post_id", "${audioData.id}")
|
||||
.add("post_type", PostType.AUDIO_BOOKS.value)
|
||||
.build()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
when (response){
|
||||
is ApiResult.Error -> {}
|
||||
is ApiResult.Loading -> {}
|
||||
is ApiResult.Success -> {
|
||||
myFavData?.result?.audio_data?.let {
|
||||
if (addToFav){
|
||||
it.add(audioData)
|
||||
}else{
|
||||
it.remove(audioData)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun markAsFavKaraokeLocally(karaokeData: SingKaraokeData, addToFav: Boolean){
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val response = RetrofitHelper.handleApiCall {
|
||||
if (addToFav){
|
||||
myFavApiService.addToFav(
|
||||
FormBody.Builder()
|
||||
.add("post_id", "${karaokeData.id}")
|
||||
.add("post_type", PostType.KARAOKE.value)
|
||||
.build()
|
||||
)
|
||||
}else{
|
||||
myFavApiService.removeFromFav(
|
||||
FormBody.Builder()
|
||||
.add("post_id", "${karaokeData.id}")
|
||||
.add("post_type", PostType.KARAOKE.value)
|
||||
.build()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
when (response){
|
||||
is ApiResult.Error -> {}
|
||||
is ApiResult.Loading -> {}
|
||||
is ApiResult.Success -> {
|
||||
myFavData?.result?.sing_karaoke_data?.let {
|
||||
if (addToFav){
|
||||
it.add(karaokeData)
|
||||
}else{
|
||||
it.remove(karaokeData)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fun markAsFavGameLocally(gameData: GameData, addToFav: Boolean){
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val response = RetrofitHelper.handleApiCall {
|
||||
if (addToFav){
|
||||
myFavApiService.addToFav(
|
||||
FormBody.Builder()
|
||||
.add("post_id", "${gameData.id}")
|
||||
.add("post_type", PostType.GAMES.value)
|
||||
.build()
|
||||
)
|
||||
}else{
|
||||
myFavApiService.removeFromFav(
|
||||
FormBody.Builder()
|
||||
.add("post_id", "${gameData.id}")
|
||||
.add("post_type", PostType.GAMES.value)
|
||||
.build()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
when (response){
|
||||
is ApiResult.Error -> {}
|
||||
is ApiResult.Loading -> {}
|
||||
is ApiResult.Success -> {
|
||||
myFavData?.result?.game_data?.let {
|
||||
if (addToFav){
|
||||
it.add(gameData)
|
||||
}else{
|
||||
it.remove(gameData)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
private fun changeLikeLocally(id: String, postType: PostType, isLiked: Boolean){
|
||||
when(postType){
|
||||
PostType.WEB_SERIES -> {
|
||||
myFavData?.result?.show_data?.let {
|
||||
for (show in it){
|
||||
if ("${show.id}" == id){
|
||||
show.is_liked = isLiked
|
||||
show.likes_count?.let { count ->
|
||||
show.likes_count = if (isLiked) count + 1
|
||||
else max(0, count - 1)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PostType.AUDIO_BOOKS -> {
|
||||
myFavData?.result?.audio_data?.let {
|
||||
for (audio in it){
|
||||
if ("${audio.id}" == id){
|
||||
audio.is_liked = isLiked
|
||||
audio.likes_count?.let { count ->
|
||||
audio.likes_count = if (isLiked) count + 1
|
||||
else max(0, count - 1)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
PostType.KARAOKE -> {
|
||||
myFavData?.result?.sing_karaoke_data?.let {
|
||||
for (song in it){
|
||||
if ("${song.id}" == id){
|
||||
song.is_liked = isLiked
|
||||
song.likes_count?.let { count ->
|
||||
song.likes_count = if (isLiked) count + 1
|
||||
else max(0, count - 1)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
PostType.GAMES -> {
|
||||
myFavData?.result?.game_data?.let {
|
||||
for (game in it){
|
||||
if ("${game.id}" == id){
|
||||
game.is_liked = isLiked
|
||||
game.likes_count?.let { count ->
|
||||
game.likes_count = if (isLiked) count + 1
|
||||
else max(0, count - 1)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
package com.woka.home.mylist.adapters
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.AsyncDifferConfig
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.ListAdapter
|
||||
import com.bumptech.glide.Glide
|
||||
import com.woka.databinding.FavViewHolderBinding
|
||||
import com.woka.home.mylist.MyListRepository
|
||||
import com.woka.home.mylist.models.AudioData
|
||||
import com.woka.home.mylist.models.PostType
|
||||
import java.util.concurrent.Executors
|
||||
import kotlin.math.max
|
||||
|
||||
class AudioBooksAdapter(config: AsyncDifferConfig<AudioData>): ListAdapter<AudioData, FavoriteViewHolder>(config) {
|
||||
|
||||
companion object{
|
||||
private val DIFF_UTIL = object : DiffUtil.ItemCallback<AudioData>(){
|
||||
override fun areItemsTheSame(oldItem: AudioData, newItem: AudioData): Boolean = oldItem.id == newItem.id
|
||||
override fun areContentsTheSame(oldItem: AudioData, newItem: AudioData): Boolean {
|
||||
return oldItem.title == newItem.title &&
|
||||
oldItem.is_liked == newItem.is_liked &&
|
||||
oldItem.likes_count == newItem.likes_count
|
||||
}
|
||||
}
|
||||
|
||||
private val DIFF_CONFIG = AsyncDifferConfig.Builder(DIFF_UTIL)
|
||||
.setBackgroundThreadExecutor(Executors.newSingleThreadExecutor())
|
||||
.build()
|
||||
}
|
||||
|
||||
constructor(): this(DIFF_CONFIG)
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FavoriteViewHolder {
|
||||
return FavoriteViewHolder(
|
||||
FavViewHolderBinding.inflate(
|
||||
LayoutInflater.from(parent.context),
|
||||
parent,
|
||||
false
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: FavoriteViewHolder, position: Int) {
|
||||
val audioData = getItem(position)
|
||||
|
||||
holder.binding.apply {
|
||||
audioData.thumbnail_path?.let {
|
||||
Glide.with(root.context)
|
||||
.load(it)
|
||||
.into(image)
|
||||
}
|
||||
|
||||
title.text = audioData.title
|
||||
|
||||
audioData.likes_count?.let {
|
||||
likeCount.text = "$it"
|
||||
}
|
||||
|
||||
audioData.is_liked?.let {
|
||||
like.isSelected = it
|
||||
}
|
||||
|
||||
like.setOnClickListener {
|
||||
if (like.isSelected){
|
||||
MyListRepository.unLikePost(
|
||||
"${audioData.id}",
|
||||
PostType.AUDIO_BOOKS
|
||||
)
|
||||
|
||||
audioData.likes_count?.let {
|
||||
likeCount.text = "${max(it - 1, 0)}"
|
||||
}
|
||||
}else{
|
||||
MyListRepository.likePost(
|
||||
"${audioData.id}",
|
||||
PostType.AUDIO_BOOKS
|
||||
)
|
||||
|
||||
audioData.likes_count?.let {
|
||||
val value = it + 1
|
||||
likeCount.text = "$value"
|
||||
}
|
||||
}
|
||||
|
||||
like.isSelected = !like.isSelected
|
||||
}
|
||||
|
||||
fav.isSelected = true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
package com.woka.home.mylist.adapters
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.AsyncDifferConfig
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.ListAdapter
|
||||
import com.bumptech.glide.Glide
|
||||
import com.woka.databinding.FavViewHolderBinding
|
||||
import com.woka.home.mylist.MyListRepository
|
||||
import com.woka.home.mylist.models.GameData
|
||||
import com.woka.home.mylist.models.PostType
|
||||
import java.util.concurrent.Executors
|
||||
import kotlin.math.max
|
||||
|
||||
class GamesAdapter(config: AsyncDifferConfig<GameData>): ListAdapter<GameData, FavoriteViewHolder>(config) {
|
||||
|
||||
companion object{
|
||||
private val DIFF_UTIL = object : DiffUtil.ItemCallback<GameData>(){
|
||||
override fun areItemsTheSame(oldItem: GameData, newItem: GameData): Boolean = oldItem.id == newItem.id
|
||||
override fun areContentsTheSame(oldItem: GameData, newItem: GameData): Boolean {
|
||||
return oldItem.title == newItem.title &&
|
||||
oldItem.is_liked == newItem.is_liked &&
|
||||
oldItem.likes_count == newItem.likes_count
|
||||
}
|
||||
}
|
||||
|
||||
private val DIFF_CONFIG = AsyncDifferConfig.Builder(DIFF_UTIL)
|
||||
.setBackgroundThreadExecutor(Executors.newSingleThreadExecutor())
|
||||
.build()
|
||||
}
|
||||
|
||||
constructor(): this(DIFF_CONFIG)
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FavoriteViewHolder {
|
||||
return FavoriteViewHolder(
|
||||
FavViewHolderBinding.inflate(
|
||||
LayoutInflater.from(parent.context),
|
||||
parent,
|
||||
false
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: FavoriteViewHolder, position: Int) {
|
||||
val gameData = getItem(position)
|
||||
|
||||
holder.binding.apply {
|
||||
gameData.thumbnail_path?.let {
|
||||
Glide.with(root.context)
|
||||
.load(it)
|
||||
.into(image)
|
||||
}
|
||||
|
||||
title.text = gameData.title
|
||||
|
||||
gameData.likes_count?.let {
|
||||
likeCount.text = "$it"
|
||||
}
|
||||
|
||||
gameData.is_liked?.let {
|
||||
like.isSelected = it
|
||||
}
|
||||
|
||||
like.setOnClickListener {
|
||||
if (like.isSelected){
|
||||
MyListRepository.unLikePost(
|
||||
"${gameData.id}",
|
||||
PostType.GAMES
|
||||
)
|
||||
|
||||
gameData.likes_count?.let {
|
||||
likeCount.text = "${max(it - 1, 0)}"
|
||||
}
|
||||
}else{
|
||||
MyListRepository.likePost(
|
||||
"${gameData.id}",
|
||||
PostType.GAMES
|
||||
)
|
||||
|
||||
gameData.likes_count?.let {
|
||||
val value = it + 1
|
||||
likeCount.text = "$value"
|
||||
}
|
||||
}
|
||||
|
||||
like.isSelected = !like.isSelected
|
||||
}
|
||||
|
||||
fav.isSelected = true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
package com.woka.home.mylist.adapters
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.AsyncDifferConfig
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.ListAdapter
|
||||
import com.bumptech.glide.Glide
|
||||
import com.woka.databinding.FavViewHolderBinding
|
||||
import com.woka.home.mylist.MyListRepository
|
||||
import com.woka.home.mylist.models.PostType
|
||||
import com.woka.home.mylist.models.SingKaraokeData
|
||||
import java.util.concurrent.Executors
|
||||
import kotlin.math.max
|
||||
|
||||
class KaraokeAdapter(config: AsyncDifferConfig<SingKaraokeData>): ListAdapter<SingKaraokeData, FavoriteViewHolder>(config) {
|
||||
|
||||
companion object{
|
||||
private val DIFF_UTIL = object : DiffUtil.ItemCallback<SingKaraokeData>(){
|
||||
override fun areItemsTheSame(oldItem: SingKaraokeData, newItem: SingKaraokeData): Boolean = oldItem.id == newItem.id
|
||||
override fun areContentsTheSame(oldItem: SingKaraokeData, newItem: SingKaraokeData): Boolean {
|
||||
return oldItem.title == newItem.title &&
|
||||
oldItem.is_liked == newItem.is_liked &&
|
||||
oldItem.likes_count == newItem.likes_count
|
||||
}
|
||||
}
|
||||
|
||||
private val DIFF_CONFIG = AsyncDifferConfig.Builder(DIFF_UTIL)
|
||||
.setBackgroundThreadExecutor(Executors.newSingleThreadExecutor())
|
||||
.build()
|
||||
}
|
||||
|
||||
constructor(): this(DIFF_CONFIG)
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FavoriteViewHolder {
|
||||
return FavoriteViewHolder(
|
||||
FavViewHolderBinding.inflate(
|
||||
LayoutInflater.from(parent.context),
|
||||
parent,
|
||||
false
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: FavoriteViewHolder, position: Int) {
|
||||
val karaokeData = getItem(position)
|
||||
|
||||
holder.binding.apply {
|
||||
karaokeData.thumbnail_path?.let {
|
||||
Glide.with(root.context)
|
||||
.load(it)
|
||||
.into(image)
|
||||
}
|
||||
|
||||
title.text = karaokeData.title
|
||||
|
||||
karaokeData.likes_count?.let {
|
||||
likeCount.text = "$it"
|
||||
}
|
||||
|
||||
karaokeData.is_liked?.let {
|
||||
like.isSelected = it
|
||||
}
|
||||
|
||||
like.setOnClickListener {
|
||||
if (like.isSelected){
|
||||
MyListRepository.unLikePost(
|
||||
"${karaokeData.id}",
|
||||
PostType.KARAOKE
|
||||
)
|
||||
|
||||
karaokeData.likes_count?.let {
|
||||
likeCount.text = "${max(it - 1, 0)}"
|
||||
}
|
||||
}else{
|
||||
MyListRepository.likePost(
|
||||
"${karaokeData.id}",
|
||||
PostType.KARAOKE
|
||||
)
|
||||
|
||||
karaokeData.likes_count?.let {
|
||||
val value = it + 1
|
||||
likeCount.text = "$value"
|
||||
}
|
||||
}
|
||||
|
||||
like.isSelected = !like.isSelected
|
||||
}
|
||||
|
||||
fav.isSelected = true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,15 +7,22 @@ import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.ListAdapter
|
||||
import com.bumptech.glide.Glide
|
||||
import com.woka.databinding.FavViewHolderBinding
|
||||
import com.woka.home.mylist.MyListRepository
|
||||
import com.woka.home.mylist.models.PostType
|
||||
import com.woka.home.mylist.models.ShowData
|
||||
import java.util.concurrent.Executors
|
||||
import kotlin.math.max
|
||||
|
||||
class WebSeriesAdapter(config: AsyncDifferConfig<ShowData>): ListAdapter<ShowData, FavoriteViewHolder>(config) {
|
||||
class WebSeriesAdapter(private val categoryId: String, config: AsyncDifferConfig<ShowData>): ListAdapter<ShowData, FavoriteViewHolder>(config) {
|
||||
|
||||
companion object{
|
||||
private val DIFF_UTIL = object : DiffUtil.ItemCallback<ShowData>(){
|
||||
override fun areItemsTheSame(oldItem: ShowData, newItem: ShowData): Boolean = oldItem.id == newItem.id
|
||||
override fun areContentsTheSame(oldItem: ShowData, newItem: ShowData): Boolean = oldItem == newItem
|
||||
override fun areContentsTheSame(oldItem: ShowData, newItem: ShowData): Boolean {
|
||||
return oldItem.title == newItem.title &&
|
||||
oldItem.is_liked == newItem.is_liked &&
|
||||
oldItem.likes_count == newItem.likes_count
|
||||
}
|
||||
}
|
||||
|
||||
private val DIFF_CONFIG = AsyncDifferConfig.Builder(DIFF_UTIL)
|
||||
@@ -23,7 +30,7 @@ class WebSeriesAdapter(config: AsyncDifferConfig<ShowData>): ListAdapter<ShowDat
|
||||
.build()
|
||||
}
|
||||
|
||||
constructor(): this(DIFF_CONFIG)
|
||||
constructor(categoryId: String): this(categoryId, DIFF_CONFIG)
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FavoriteViewHolder {
|
||||
return FavoriteViewHolder(
|
||||
@@ -47,7 +54,54 @@ class WebSeriesAdapter(config: AsyncDifferConfig<ShowData>): ListAdapter<ShowDat
|
||||
|
||||
title.text = showData.title
|
||||
|
||||
showData.likes_count?.let {
|
||||
likeCount.text = "$it"
|
||||
}
|
||||
|
||||
showData.is_liked?.let {
|
||||
like.isSelected = it
|
||||
}
|
||||
|
||||
like.setOnClickListener {
|
||||
if (like.isSelected){
|
||||
MyListRepository.unLikePost(
|
||||
"${showData.id}",
|
||||
PostType.WEB_SERIES,
|
||||
categoryId
|
||||
)
|
||||
|
||||
showData.likes_count?.let {
|
||||
likeCount.text = "${max(it - 1, 0)}"
|
||||
}
|
||||
}else{
|
||||
MyListRepository.likePost(
|
||||
"${showData.id}",
|
||||
PostType.WEB_SERIES,
|
||||
categoryId
|
||||
)
|
||||
|
||||
showData.likes_count?.let {
|
||||
val value = it + 1
|
||||
likeCount.text = "$value"
|
||||
}
|
||||
}
|
||||
|
||||
like.isSelected = !like.isSelected
|
||||
}
|
||||
|
||||
fav.isSelected = true
|
||||
|
||||
fav.setOnClickListener {
|
||||
if (fav.isSelected){
|
||||
MyListRepository.markAsFavShowLocally(
|
||||
showData,
|
||||
false
|
||||
)
|
||||
|
||||
currentList.removeAt(position)
|
||||
notifyItemRemoved(position)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,9 +11,9 @@ data class AudioData(
|
||||
val description: String?,
|
||||
val gender_master_id: String?,
|
||||
val id: Int?,
|
||||
val is_liked: Boolean?,
|
||||
var is_liked: Boolean?,
|
||||
val language_master_id: Int?,
|
||||
val likes_count: Int?,
|
||||
var likes_count: Int?,
|
||||
val mark_as_favourite: Boolean?,
|
||||
val media_id: String?,
|
||||
val release_date: String?,
|
||||
|
||||
@@ -10,9 +10,9 @@ data class GameData(
|
||||
val game_url: String?,
|
||||
val gender_master_id: String?,
|
||||
val id: Int?,
|
||||
val is_liked: Boolean?,
|
||||
var is_liked: Boolean?,
|
||||
val language_master_id: Int?,
|
||||
val likes_count: Int?,
|
||||
var likes_count: Int?,
|
||||
val mark_as_favourite: Boolean?,
|
||||
val release_date: String?,
|
||||
val screen_orientation: String?,
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.woka.home.mylist.models
|
||||
|
||||
enum class PostType(val value: String) {
|
||||
WEB_SERIES("1"),
|
||||
AUDIO_BOOKS("7"),
|
||||
KARAOKE("8"),
|
||||
GAMES("6");
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
package com.woka.home.mylist.models
|
||||
|
||||
data class Result(
|
||||
val audio_data: List<AudioData>?,
|
||||
val game_data: List<GameData>?,
|
||||
val show_data: List<ShowData>?,
|
||||
val sing_karaoke_data: List<SingKaraokeData>?,
|
||||
val video_data: List<Any>?
|
||||
val audio_data: MutableList<AudioData>?,
|
||||
val game_data: MutableList<GameData>?,
|
||||
val show_data: MutableList<ShowData>?,
|
||||
val sing_karaoke_data: MutableList<SingKaraokeData>?,
|
||||
val video_data: MutableList<Any>?
|
||||
)
|
||||
@@ -9,9 +9,9 @@ data class ShowData(
|
||||
val description: String?,
|
||||
val gender_master_id: String?,
|
||||
val id: Int?,
|
||||
val is_liked: Boolean?,
|
||||
val likes_count: Int?,
|
||||
val mark_as_favourite: Boolean?,
|
||||
var is_liked: Boolean?,
|
||||
var likes_count: Int?,
|
||||
var mark_as_favourite: Boolean?,
|
||||
val show_type: String?,
|
||||
val thumbnail_path: String?,
|
||||
val title: String?,
|
||||
|
||||
@@ -10,9 +10,9 @@ data class SingKaraokeData(
|
||||
val duration: String?,
|
||||
val gender_master_id: String?,
|
||||
val id: Int?,
|
||||
val is_liked: Boolean?,
|
||||
var is_liked: Boolean?,
|
||||
val language_master_id: Int?,
|
||||
val likes_count: Int?,
|
||||
var likes_count: Int?,
|
||||
val mark_as_favourite: Boolean?,
|
||||
val release_date: String?,
|
||||
val thumbnail_path: String?,
|
||||
|
||||
7
app/src/main/res/drawable/ic_like_filled.xml
Normal file
7
app/src/main/res/drawable/ic_like_filled.xml
Normal file
@@ -0,0 +1,7 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
|
||||
|
||||
<path android:fillColor="#1C274C" android:pathData="M20.27,16.265L20.975,12.185C21.152,11.166 20.368,10.234 19.335,10.234H14.154C13.64,10.234 13.249,9.773 13.333,9.266L13.995,5.221C14.103,4.564 14.072,3.892 13.905,3.248C13.766,2.714 13.354,2.285 12.813,2.111L12.668,2.064C12.34,1.959 11.983,1.984 11.674,2.132C11.335,2.296 11.086,2.595 10.994,2.95L10.518,4.784C10.367,5.367 10.146,5.93 9.862,6.463C9.447,7.24 8.805,7.862 8.137,8.438L6.698,9.677C6.293,10.027 6.08,10.551 6.126,11.084L6.938,20.477C7.012,21.339 7.733,22 8.597,22H13.245C16.726,22 19.698,19.574 20.27,16.265Z"/>
|
||||
|
||||
<path android:fillColor="#1C274C" android:fillType="evenOdd" android:pathData="M2.968,9.485C3.369,9.468 3.713,9.77 3.747,10.17L4.719,21.406C4.781,22.128 4.213,22.75 3.487,22.75C2.803,22.75 2.25,22.195 2.25,21.513V10.234C2.25,9.833 2.566,9.502 2.968,9.485Z"/>
|
||||
|
||||
</vector>
|
||||
10
app/src/main/res/drawable/ic_like_not_filled.xml
Normal file
10
app/src/main/res/drawable/ic_like_not_filled.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="800dp"
|
||||
android:height="800dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M12.438,2.778C12.293,2.732 12.134,2.743 12,2.808C11.852,2.879 11.755,3.003 11.72,3.138L11.244,4.972C11.078,5.613 10.835,6.232 10.524,6.816C10.039,7.723 9.306,8.42 8.626,9.006L7.188,10.246C6.965,10.438 6.847,10.726 6.873,11.02L7.685,20.413C7.726,20.887 8.122,21.25 8.596,21.25H13.245C16.381,21.25 19.024,19.068 19.531,16.137L20.236,12.057C20.333,11.496 19.901,10.984 19.335,10.984H14.154C13.177,10.984 12.434,10.108 12.592,9.145L13.255,5.1C13.346,4.546 13.32,3.979 13.179,3.436C13.107,3.16 12.89,2.923 12.583,2.825L12.438,2.778L12.668,2.064L12.438,2.778ZM11.349,1.457C11.831,1.224 12.387,1.187 12.897,1.35L13.042,1.397L12.813,2.111L13.042,1.397C13.819,1.646 14.425,2.267 14.631,3.059C14.824,3.805 14.86,4.583 14.735,5.343L14.072,9.387C14.064,9.439 14.104,9.484 14.154,9.484H19.335C20.834,9.484 21.969,10.837 21.714,12.313L21.009,16.393C20.371,20.081 17.071,22.75 13.245,22.75H8.596C7.343,22.75 6.299,21.79 6.191,20.542L5.378,11.149C5.311,10.375 5.62,9.616 6.209,9.109L7.647,7.87C8.302,7.305 8.854,6.758 9.2,6.109C9.457,5.629 9.656,5.121 9.792,4.595L10.268,2.762C10.417,2.186 10.817,1.713 11.349,1.457ZM2.968,9.485C3.369,9.468 3.713,9.769 3.747,10.17L4.719,21.406C4.781,22.128 4.213,22.75 3.487,22.75C2.803,22.75 2.25,22.195 2.25,21.513V10.234C2.25,9.833 2.566,9.502 2.968,9.485Z"
|
||||
android:fillColor="#1C274C"
|
||||
android:fillType="evenOdd"/>
|
||||
</vector>
|
||||
10
app/src/main/res/drawable/ic_like_selector.xml
Normal file
10
app/src/main/res/drawable/ic_like_selector.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<item android:drawable="@drawable/ic_like_filled"
|
||||
android:state_selected="true"/>
|
||||
|
||||
<item android:drawable="@drawable/ic_like_not_filled"
|
||||
android:state_selected="false"/>
|
||||
|
||||
</selector>
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/image"
|
||||
android:layout_width="@dimen/_200sdp"
|
||||
android:layout_width="@dimen/_240sdp"
|
||||
android:layout_height="@dimen/_120sdp"
|
||||
android:contentDescription="@string/image"
|
||||
android:src="@android:color/darker_gray"
|
||||
@@ -39,6 +39,7 @@
|
||||
tools:text="Woka title of show"
|
||||
android:fontFamily="@font/exo_2_bold"
|
||||
android:textColor="@color/color_primary"
|
||||
android:textSize="@dimen/_14ssp"
|
||||
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
@@ -46,17 +47,54 @@
|
||||
app:layout_constraintTop_toBottomOf="@id/image"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/fav"
|
||||
app:layout_constraintEnd_toStartOf="@id/like"
|
||||
|
||||
android:layout_marginTop="5dp"
|
||||
android:layout_marginEnd="10dp"
|
||||
|
||||
/>
|
||||
|
||||
<ImageView
|
||||
<com.woka.utils.PressableImageView
|
||||
android:id="@+id/like"
|
||||
android:layout_width="25dp"
|
||||
android:layout_height="24dp"
|
||||
android:contentDescription="@string/image"
|
||||
android:src="@drawable/ic_like_selector"
|
||||
android:scaleType="fitXY"
|
||||
app:tint="@color/color_primary"
|
||||
|
||||
app:layout_constraintEnd_toStartOf="@id/like_count"
|
||||
app:layout_constraintTop_toBottomOf="@id/image"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
||||
android:layout_marginTop="5dp"
|
||||
android:layout_marginEnd="2dp"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/like_count"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
android:text="@string/_0"
|
||||
android:fontFamily="@font/exo_2_semibold"
|
||||
android:textColor="@color/color_primary"
|
||||
android:textSize="@dimen/_14ssp"
|
||||
android:textAlignment="center"
|
||||
|
||||
app:layout_constraintEnd_toStartOf="@id/fav"
|
||||
app:layout_constraintTop_toBottomOf="@id/image"
|
||||
app:layout_constraintBottom_toBottomOf="@id/like"
|
||||
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
|
||||
/>
|
||||
|
||||
<com.woka.utils.PressableImageView
|
||||
android:id="@+id/fav"
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="16dp"
|
||||
android:layout_width="20dp"
|
||||
android:layout_height="19dp"
|
||||
android:contentDescription="@string/image"
|
||||
android:src="@drawable/ic_heart_select"
|
||||
android:scaleType="fitXY"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#D3EFF8"
|
||||
android:layout_marginBottom="15dp"
|
||||
tools:context=".shop.MyOrdersActivity">
|
||||
|
||||
<ImageView
|
||||
@@ -22,7 +23,7 @@
|
||||
android:translationZ="1dp"
|
||||
|
||||
android:layout_marginStart="15dp"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginTop="25dp"
|
||||
|
||||
app:tint="@color/color_primary" />
|
||||
|
||||
@@ -70,7 +71,7 @@
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/back_btn"
|
||||
|
||||
android:layout_marginTop="25dp"
|
||||
android:layout_marginTop="15dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
@@ -246,4 +247,37 @@
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/no_data"
|
||||
android:visibility="gone"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
android:text="@string/no_favorites_added"
|
||||
android:fontFamily="@font/exo_2_bold"
|
||||
android:textColor="@color/color_primary"
|
||||
android:textSize="@dimen/_14ssp"
|
||||
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
||||
/>
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progress_bar"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
android:indeterminate="true"
|
||||
android:indeterminateTint="@color/color_primary"
|
||||
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
||||
/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -171,4 +171,6 @@
|
||||
<string name="favorites">Favorites</string>
|
||||
<string name="web_series_hindi">WEB SERIES (HINDI)</string>
|
||||
<string name="web_series_english">WEB SERIES (ENGLISH)</string>
|
||||
<string name="no_favorites_added">No favorites added</string>
|
||||
<string name="_0">0</string>
|
||||
</resources>
|
||||
Reference in New Issue
Block a user