Last active
November 16, 2023 07:41
-
-
Save VIkash2601/ffea545edbd40fc4d6ba258c0b9b698b to your computer and use it in GitHub Desktop.
FragProfileVideos Gist
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.app.spinnr.frag.profile | |
import android.app.Dialog | |
import android.content.Context | |
import android.os.Bundle | |
import android.text.InputFilter | |
import android.text.Spanned | |
import android.util.Log | |
import androidx.fragment.app.Fragment | |
import android.view.LayoutInflater | |
import android.view.View | |
import android.view.View.* | |
import android.view.ViewGroup | |
import androidx.recyclerview.widget.ItemTouchHelper | |
import androidx.recyclerview.widget.ItemTouchHelper.* | |
import androidx.recyclerview.widget.RecyclerView | |
import androidx.viewpager2.widget.ViewPager2 | |
import com.app.spinnr.App | |
import com.app.spinnr.App.Companion.getStr | |
import com.app.spinnr.R | |
import com.app.spinnr.act.ActHome | |
import com.app.spinnr.adapter.ProfileVideoAdapter | |
import com.app.spinnr.adapter.ViewPagerAdapter | |
import com.app.spinnr.databinding.DialogRenameVideoBinding | |
import com.app.spinnr.databinding.FragProfileVideosBinding | |
import com.app.spinnr.databinding.ItemIntroVideoBinding | |
import com.app.spinnr.frag.BottomSheetDialog | |
import com.app.spinnr.frag.FragVideoPreview | |
import com.app.spinnr.frag.chat.ChatRepo | |
import com.app.spinnr.frag.chat.FragChat | |
import com.app.spinnr.frag.FragImageVideo | |
import com.app.spinnr.frag.video.FragDailyVideo | |
import com.app.spinnr.frag.video.FragImportVideo | |
import com.app.spinnr.helper.Constant | |
import com.app.spinnr.listener.ActionSelectListener | |
import com.app.spinnr.model.* | |
import com.app.spinnr.model.CoinModelImpl.Companion.CREATE_INTRO | |
import com.app.spinnr.model.CoinModelImpl.Companion.PROFILE_VIDEO | |
import com.app.spinnr.model.CoinModelImpl.Companion.earnLimitReach | |
import com.app.spinnr.model.CoinModelImpl.Companion.todayEarned | |
import com.app.spinnr.model.ProfileModel.Companion.profileData | |
import com.app.spinnr.service.ApiClient | |
import com.app.spinnr.service.ApiClient.Companion.getClient | |
import com.app.spinnr.service.ApiClient.Companion.getMediaClient | |
import com.app.spinnr.service.ApiInterface | |
import com.app.spinnr.service.ResponseBean | |
import com.app.spinnr.service.ResponseListBean | |
import com.app.spinnr.service.ResponseListBean.Companion.saveUserData | |
import com.app.spinnr.util.* | |
import com.app.spinnr.util.Preference.Companion.GUID | |
import com.app.spinnr.util.Preference.Companion.USERNAME | |
import com.app.spinnr.util.Preference.Companion.preferenceInstance | |
import com.appsflyer.AppsFlyerLib | |
import com.google.android.material.tabs.TabLayout | |
import com.google.android.material.tabs.TabLayoutMediator | |
import com.google.gson.JsonElement | |
import retrofit2.Call | |
import retrofit2.Callback | |
import retrofit2.Response | |
import java.util.* | |
import java.util.Locale.Category | |
class FragProfileVideos : Fragment() { | |
private lateinit var ctx: Context | |
private lateinit var binding: FragProfileVideosBinding | |
private lateinit var adapter: ProfileVideoAdapter | |
private lateinit var data: ProfileModel | |
private val videos = mutableListOf<VideoModel>() | |
private var loaded = false | |
private var loader: Loader? = null | |
private var category: String = "" | |
override fun onCreateView( | |
inflater: LayoutInflater, container: ViewGroup?, | |
savedInstanceState: Bundle? | |
): View { | |
if (loaded) return binding.root | |
loaded = true | |
ctx = requireContext() | |
binding = FragProfileVideosBinding.inflate(inflater, container, false) | |
(ctx as ActHome).changeUi(this) | |
postDelayed({ setup() }, 300) | |
return binding.root | |
} | |
private fun setup() { | |
setupPager() | |
binding.add.setOnClickListener(clickListener) | |
binding.back.setOnClickListener(clickListener) | |
binding.instructionIv.setOnClickListener(clickListener) | |
binding.instructionTv.setOnClickListener(clickListener) | |
data = profileData() | |
getProfile() | |
binding.instructionTv.text = String.format(" - %s:", getString(R.string.start)) | |
binding.instructionIv.setImageResource(R.mipmap.img_new_reoder) | |
category = Char(80).toString() | |
data.video?.filter { it.category == category }?.also { | |
videos.addAll(it) | |
} | |
binding.noCollection.load(Constant.NO_COLLECTION_PICTURE, enableCache = true) | |
binding.noData.visibility = if (videos.isEmpty()) VISIBLE else GONE | |
adapter = ProfileVideoAdapter(layoutInflater, videos, videosListener) | |
itemTouchHelper.attachToRecyclerView(binding.rv) | |
binding.rv.adapter = adapter | |
} | |
private var introTabSelected = 0 | |
private var tabSelected = 0 | |
private fun setupPager() { | |
val names = mutableListOf( | |
getString(R.string.videos), | |
getString(R.string.spins), | |
getString(R.string.intros), | |
) | |
val pager = ViewPager2(ctx).apply { | |
adapter = ViewPagerAdapter(activity, mutableListOf(Fragment(), Fragment(), Fragment())) | |
isUserInputEnabled = false | |
} | |
TabLayoutMediator(binding.tabs, pager) { tab, position -> tab.text = names[position] }.attach() | |
val pager2 = ViewPager2(ctx).apply { | |
adapter = ViewPagerAdapter(activity, mutableListOf(Fragment(), Fragment(), Fragment())) | |
isUserInputEnabled = false | |
} | |
TabLayoutMediator(binding.tabsIntro, pager2) { tab, position -> tab.text = when (position) {0 -> "Saved";1 -> "Sent";else -> "Received"; } }.attach() | |
binding.tabsIntro.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { | |
override fun onTabSelected(tab: TabLayout.Tab?) { | |
introTabSelected = tab?.position ?: 0 | |
binding.instruction.visibility = if (introTabSelected == 0) VISIBLE else GONE | |
if (introTabSelected == 0) { | |
videos.clear() | |
data.video?.filter { it.category == category }?.also { videos.addAll(it) } | |
adapter = ProfileVideoAdapter(LayoutInflater.from(ctx), videos, videosListener) | |
binding.rv.adapter = adapter | |
binding.noDataMsg.text = if (category == "I") "This is where you can upload or record intro videos to send to members on the app to introduce yourself. Just click on the video icon on someone's profile to send one!" else if (category == "D") "You don’t have any Daily Spins videos" else getString(R.string.you_don_t_have_videos) | |
binding.noData.visibility = if (videos.isEmpty()) VISIBLE else GONE | |
} else if (introTabSelected == 1) { | |
binding.noDataMsg.text = getString(R.string.you_don_t_have_videos) | |
videoIntroMessage("sent") | |
binding.rv.adapter = IntroVideoAdapter(sentIntroVideo, "sent") | |
} else if (introTabSelected == 2) { | |
binding.noDataMsg.text = getString(R.string.you_don_t_have_videos) | |
videoIntroMessage("received") | |
binding.rv.adapter = IntroVideoAdapter(receivedIntroVideo, "received") | |
} | |
} | |
override fun onTabUnselected(tab: TabLayout.Tab?) {} | |
override fun onTabReselected(tab: TabLayout.Tab?) {} | |
}) | |
binding.tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { | |
override fun onTabSelected(tab: TabLayout.Tab?) { | |
tabSelected = tab?.position ?: 0 | |
binding.instruction.visibility = if (tabSelected == 0 || (tabSelected == 2 && introTabSelected == 0)) VISIBLE else GONE | |
binding.tabsIntro.visibility = if (tabSelected == 2) VISIBLE else GONE | |
adapter.dragEnable = false | |
if (tabSelected == 0) binding.instructionTv2.text = "Reorder top 5 videos for your profile" | |
else binding.instructionTv2.text = "Reorder your intro videos" | |
binding.instructionTv.text = String.format(" - %s:", getString(R.string.start)) | |
binding.instructionIv.setImageResource(R.mipmap.img_new_reoder) | |
category = when (tabSelected) { | |
0 -> "${Char(80)}" | |
1 -> "${Char(68)}" | |
2 -> "${Char(73)}" | |
else -> "" | |
} | |
videos.clear() | |
data.video?.filter { it.category == category }?.also { | |
videos.addAll(it) | |
} | |
if (tabSelected == 2) { | |
if (introTabSelected == 0) { | |
adapter = ProfileVideoAdapter(LayoutInflater.from(ctx), videos, videosListener) | |
binding.rv.adapter = adapter | |
binding.noDataMsg.text = if (category == "I") "This is where you can upload or record intro videos to send to members on the app to introduce yourself. Just click on the video icon on someone's profile to send one!" else if (category == "D") "You don’t have any Daily Spins videos" else getString(R.string.you_don_t_have_videos) | |
binding.noData.visibility = if (videos.isEmpty()) VISIBLE else GONE | |
} else if (introTabSelected == 1) { | |
binding.noDataMsg.text = getString(R.string.you_don_t_have_videos) | |
videoIntroMessage("sent") | |
binding.rv.adapter = IntroVideoAdapter(sentIntroVideo, "sent") | |
} else if (introTabSelected == 2) { | |
binding.noDataMsg.text = getString(R.string.you_don_t_have_videos) | |
videoIntroMessage("received") | |
binding.rv.adapter = IntroVideoAdapter(receivedIntroVideo, "received") | |
} | |
} else { | |
adapter = ProfileVideoAdapter(LayoutInflater.from(ctx), videos, videosListener) | |
binding.rv.adapter = adapter | |
binding.noDataMsg.text = if (category == "I") "This is where you can upload or record intro videos to send to members on the app to introduce yourself. Just click on the video icon on someone's profile to send one!" else if (category == "D") "You don’t have any Daily Spins videos" else getString(R.string.you_don_t_have_videos) | |
binding.noData.visibility = if (videos.isEmpty()) VISIBLE else GONE | |
} | |
} | |
override fun onTabUnselected(tab: TabLayout.Tab?) {} | |
override fun onTabReselected(tab: TabLayout.Tab?) {} | |
}) | |
} | |
private val clickListener = OnClickListener { | |
when (it) { | |
binding.back -> (ctx as ActHome).backPress() | |
binding.add -> { | |
if (category == "D") { | |
if (CoinModelImpl.recentlyEarnCoin(CoinModelImpl.DAILY_SPIN)) { | |
showSnackBar("You've already recorded today's video. Come back tomorrow.") | |
return@OnClickListener | |
} | |
(ctx as ActHome).navigateTo(FragDailyVideo { | |
getProfile() | |
}, true) | |
return@OnClickListener | |
} | |
BottomSheetDialog( | |
getString(R.string.post_a_video), | |
mutableListOf( | |
if (category == "I") | |
BottomSheetModel( | |
getString(R.string.create_intro_video), | |
R.mipmap.img_add_intro_video | |
) else | |
BottomSheetModel( | |
getString(R.string.create_profile_video), | |
R.mipmap.img_add_profile_video | |
), | |
BottomSheetModel( | |
getString(R.string.choose_from_camera_roll), | |
R.mipmap.img_video_upload | |
), | |
) | |
) { a0 -> | |
App.appsFlyerEvent(when(category){ | |
"P" -> "My_Videos_Create_Profile_Video" | |
"D" -> "My_Videos_Record_Daily_Spin" | |
else -> "My_Videos_Create_Intro_Video" | |
}) | |
val frag = if (a0 == 0) | |
FragImageVideo { _, a -> | |
App.appsFlyerEvent(when(a){ | |
"P" -> "My_Videos_Upload_Profile_Video" | |
"D" -> "My_Videos_Record_Daily_Spin" | |
else -> "My_Videos_Upload_Intro_Video" | |
}) | |
getProfile(a) | |
} | |
else | |
FragImportVideo { _, a -> | |
App.appsFlyerEvent(when(a){ | |
"P" -> "My_Videos_Upload_Profile_Video" | |
"D" -> "My_Videos_Record_Daily_Spin" | |
else -> "My_Videos_Upload_Intro_Video" | |
}) | |
getProfile(a) | |
} | |
frag.arguments = Bundle().apply { | |
putString("category", category) | |
} | |
(ctx as ActHome).navigateTo(frag, true) | |
}.show(childFragmentManager, BottomSheetDialog::class.java.simpleName) | |
} | |
binding.instructionIv, | |
binding.instructionTv -> { | |
if (netNotConnected()) { | |
showSnackBar(getString(R.string.no_internet)) | |
return@OnClickListener | |
} | |
if (adapter.dragEnable) { | |
adapter.dragEnable = false | |
binding.instructionTv.text = String.format(" - %s:", getString(R.string.start)) | |
binding.instructionIv.setImageResource(R.mipmap.img_new_reoder) | |
if (isMoved) { | |
loader = showLoader() | |
isMoved = false | |
updateVideoSequence(category) | |
} | |
} else { | |
adapter.dragEnable = true | |
binding.instructionTv.text = String.format(" - %s:", getString(R.string.done)) | |
binding.instructionIv.setImageResource(R.mipmap.img_fill_check) | |
} | |
} | |
} | |
} | |
private val videosListener = ActionSelectListener { | |
a0, a1 -> | |
when(a0) { | |
0 -> { | |
val frag = FragVideoPreview() | |
frag.arguments = Bundle().apply { | |
putString("path", videos[a1].vidlink) | |
putString("title", videos[a1].name) | |
} | |
(ctx as ActHome).navigateTo(frag, true) | |
} | |
1 -> { | |
if (netNotConnected()) { | |
showSnackBar(getString(R.string.no_internet)) | |
return@ActionSelectListener | |
} | |
renameVideo(a1) | |
} | |
2 -> { | |
if (netNotConnected()) { | |
showSnackBar(getString(R.string.no_internet)) | |
return@ActionSelectListener | |
} | |
if (videos.size == 1 && category == "P") { | |
showMessage(getString(R.string.you_must_have_at_least_one_video_to_use_spinnr), narrowPadding = true) | |
return@ActionSelectListener | |
} | |
else { | |
showOptionMessage( | |
getString(R.string.delete_video_desc), | |
getString(R.string.no), | |
getString(R.string.yes), | |
) { | |
if (netNotConnected()) { | |
showSnackBar(getString(R.string.no_internet)) | |
return@showOptionMessage | |
} | |
videos.removeAt(a1) | |
adapter.notifyItemRemoved(a1) | |
binding.noData.visibility = if (videos.isEmpty()) VISIBLE else GONE | |
App.appsFlyerEvent( | |
when (category) { | |
"P" -> "My_Videos_Delete_Profile_Video" | |
"D" -> "My_Videos_Delete_Daily_Spin" | |
else -> "My_Videos_Delete_Intro_Video" | |
} | |
) | |
updateVideoSequence(category) | |
} | |
} | |
} | |
} | |
} | |
/** | |
* | |
* Video | |
* | |
* */ | |
// region | |
private var isMoved = false | |
private val itemTouchHelper by lazy { | |
val touchCallback = object : SimpleCallback(UP or DOWN, 0) { | |
override fun isLongPressDragEnabled() = adapter.dragEnable | |
override fun onMove( | |
recyclerView: RecyclerView, | |
viewHolder: RecyclerView.ViewHolder, | |
target: RecyclerView.ViewHolder | |
): Boolean { | |
adapter.move(viewHolder.absoluteAdapterPosition, target.absoluteAdapterPosition) | |
isMoved = true | |
return true | |
} | |
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {} | |
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { | |
super.onSelectedChanged(viewHolder, actionState) | |
if (viewHolder == null) return | |
viewHolder.itemView.elevation = 15f | |
viewHolder.itemView.scaleX = 1.08f | |
viewHolder.itemView.scaleY = 1.08f | |
} | |
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { | |
super.clearView(recyclerView, viewHolder) | |
viewHolder.itemView.elevation = 0f | |
viewHolder.itemView.scaleX = 1f | |
viewHolder.itemView.scaleY = 1f | |
} | |
} | |
ItemTouchHelper(touchCallback) | |
} | |
private fun renameVideo(a1: Int) { | |
videoRenameDialog(videos[a1].name) { | |
_, a -> | |
if (a.length < 3 || a.length > 18 || !a.contains(Regex("^[a-zA-Z0-9 ]+$"))) { | |
showMessage( | |
getString(R.string.name_video_validation), | |
narrowPadding = true, | |
expanded = true | |
) { renameVideo(a1) } | |
return@videoRenameDialog | |
} | |
var duplicateName = false | |
for (video in videos) | |
if (video.name == a) { | |
duplicateName = true | |
break | |
} | |
if (duplicateName) { | |
showOptionMessage(getString(R.string.name_already_used_please_enter_a_new_name)) { | |
renameVideo(a1) | |
} | |
return@videoRenameDialog | |
} | |
if (netNotConnected()) { | |
showSnackBar(getString(R.string.no_internet)) | |
return@videoRenameDialog | |
} | |
if (isOffendWord(a)) { | |
showOptionDialog("Blocked Words", "Sorry, but you used blocked words that we do not allow on our platform. Please clean it up and try again.", "Cancel", "Try Again"){ | |
if (it == 1) renameVideo(a1) | |
} | |
return@videoRenameDialog | |
} | |
videos[a1].name = a | |
adapter.notifyItemChanged(a1) | |
App.appsFlyerEvent( | |
when (category) { | |
"P" -> "My_Videos_Edit_Profile_Video" | |
"D" -> "My_Videos_Edit_Daily_Spin" | |
else -> "My_Videos_Edit_Intro_Video" | |
} | |
) | |
updateVideoSequence(category) | |
} | |
} | |
private fun updateVideoSequence(category: String) { | |
if (category == "P" || category == "I") | |
for (a in 0 until videos.size) | |
videos[a].vidsequence = "${a + 1}" | |
val request = UpdateMediaRequest( | |
preferenceInstance.readString(GUID), | |
preferenceInstance.readString(USERNAME), | |
category, videos | |
) | |
getClient() | |
.updateUserMedia(request) | |
.enqueue(object : Callback<ResponseBean<JsonElement>>{ | |
override fun onResponse( | |
call: Call<ResponseBean<JsonElement>>, | |
response: Response<ResponseBean<JsonElement>> | |
) { | |
getProfile() | |
if (category == "P") concatMedia() | |
else postDelayed({ loader?.dismiss() }, 2500) | |
} | |
override fun onFailure(call: Call<ResponseBean<JsonElement>>, t: Throwable) { | |
loader?.dismiss() | |
showMessage("${t.message}") | |
} | |
}) | |
} | |
private fun concatMedia(input: MutableList<VideoModel> = mutableListOf()) { | |
val concatFiles = mutableListOf<MediaConcatPath>() | |
if (input.isEmpty()) | |
input.addAll(videos) | |
for(a in 0 until input.size) { | |
val link = input[a].vidlink | |
val name = link.substring(link.lastIndexOf("/") + 1) | |
concatFiles.add(MediaConcatPath(name)) | |
if (concatFiles.size >= 5) | |
break | |
} | |
val request = MediaConcatModel( | |
preferenceInstance.readString(GUID), | |
preferenceInstance.readString(USERNAME), | |
"ffmpeg-enc", | |
concatFiles | |
) | |
getMediaClient() | |
.concatMedia(request) | |
.enqueue(object : Callback<ResponseBean<JsonElement>>{ | |
override fun onResponse(call: Call<ResponseBean<JsonElement>>, response: Response<ResponseBean<JsonElement>>) { | |
loader?.dismiss() | |
} | |
override fun onFailure(call: Call<ResponseBean<JsonElement>>, t: Throwable) { | |
loader?.dismiss() | |
} | |
}) | |
} | |
override fun onDestroy() { | |
Log.e("vi26", "onDestroy: FragmentDestroyed") | |
super.onDestroy() | |
} | |
private fun getProfile(category: String = "", xcv: MutableList<VideoModel> = mutableListOf()) { | |
if (category == "I") { | |
val eventValues = HashMap<String, Any>() | |
eventValues["customer_user_id"] = Preference.preferenceInstance.readString(Preference.USERNAME) | |
eventValues["datetime"] = Calendar.getInstance().time.toString() | |
AppsFlyerLib.getInstance().logEvent(ctx, "My_Videos_Upload_Intro_Video", eventValues) | |
} | |
if (category == "D") { | |
val eventValues = HashMap<String, Any>() | |
eventValues["customer_user_id"] = Preference.preferenceInstance.readString(Preference.USERNAME) | |
eventValues["datetime"] = Calendar.getInstance().time.toString() | |
AppsFlyerLib.getInstance().logEvent(ctx, "My_Videos_Upload_Profile_Video", eventValues) | |
} | |
earnCoin(category) | |
getClient().getProfileDetail( | |
preferenceInstance.readString(GUID), | |
preferenceInstance.readString(USERNAME), | |
).enqueue(object : Callback<ResponseListBean<ProfileModel>>{ | |
override fun onResponse( | |
call: Call<ResponseListBean<ProfileModel>>, | |
response: Response<ResponseListBean<ProfileModel>> | |
) { | |
if (response.body()?.code == 0) { | |
response.body()?.saveUserData() | |
if (context == null) return | |
data = profileData() | |
videos.clear() | |
data.video?.filter { it.category == [email protected] }?.let { videos.addAll(it) } | |
adapter = ProfileVideoAdapter(layoutInflater, videos, videosListener) | |
binding.rv.adapter = adapter | |
binding.noData.visibility = if (videos.isEmpty()) VISIBLE else GONE | |
if (category == "P") | |
concatMedia(xcv) | |
} else { | |
if (context == null) return | |
showMessage("${response.body()?.code}") { ctx.logout() } | |
} | |
} | |
override fun onFailure(call: Call<ResponseListBean<ProfileModel>>, t: Throwable) {} | |
}) | |
} | |
private fun earnCoin(category: String) { | |
if (category.isEmpty() || !(category == "P" || category == "I")) return | |
if (category == "P" && earnLimitReach(PROFILE_VIDEO, 5)) return | |
if (category == "I" && todayEarned(CREATE_INTRO)) return | |
getClient() | |
.updateCoin( | |
preferenceInstance.readString(USERNAME), | |
preferenceInstance.readString(GUID), | |
"1", | |
if (category == "I") "2" else "0", | |
if (category == "I") CREATE_INTRO else PROFILE_VIDEO, | |
if (category == "I") "Create intro video" else "Profile questions", | |
"earned" | |
).enqueue(object : Callback<ResponseBean<ProfileModel>>{ | |
override fun onResponse( | |
call: Call<ResponseBean<ProfileModel>>, | |
response: Response<ResponseBean<ProfileModel>> | |
) { | |
if (response.body()?.code == 0) { | |
showEarnCoin("1") | |
(ctx as ActHome).getCredApi() | |
} | |
} | |
override fun onFailure(call: Call<ResponseBean<ProfileModel>>, t: Throwable) {} | |
}) | |
} | |
//endregion | |
private val sentIntroVideo = mutableListOf<ApiInterface.VideoIntroMessage>() | |
private val receivedIntroVideo = mutableListOf<ApiInterface.VideoIntroMessage>() | |
private fun videoIntroMessage(introStatus: String) { | |
if (netNotConnected()) { | |
showSnackBar(getStr(R.string.no_internet)) | |
return | |
} | |
binding.noData.visibility = GONE | |
getClient().videoIntroMessage(preferenceInstance.readString(USERNAME), preferenceInstance.readString(GUID), introStatus).enqueue(object : Callback<ApiInterface.VideoIntroMessageResponse>{ | |
override fun onResponse(call: Call<ApiInterface.VideoIntroMessageResponse>, response: Response<ApiInterface.VideoIntroMessageResponse>) { | |
if (response.body()?.code == "1") { | |
if (introStatus == "sent" && response.body()?.intros != sentIntroVideo) { | |
sentIntroVideo.clear() | |
sentIntroVideo.addAll(response.body()?.intros ?: mutableListOf()) | |
if (introTabSelected == 1 && tabSelected == 2) | |
binding.rv.adapter = IntroVideoAdapter(sentIntroVideo, introStatus) | |
} else if (introStatus == "received" && response.body()?.intros != receivedIntroVideo) { | |
receivedIntroVideo.clear() | |
receivedIntroVideo.addAll(response.body()?.intros ?: mutableListOf()) | |
if (introTabSelected == 2 && tabSelected == 2) | |
binding.rv.adapter = IntroVideoAdapter(receivedIntroVideo, introStatus) | |
} | |
if (introStatus == "sent" && introTabSelected == 1 && tabSelected == 2) { | |
binding.noData.visibility = if (sentIntroVideo.isEmpty()) VISIBLE else GONE | |
} else if (introStatus == "received" && introTabSelected == 2 && tabSelected == 2) { | |
binding.noData.visibility = if (receivedIntroVideo.isEmpty()) VISIBLE else GONE | |
} | |
} else if (response.body()?.code == "0") { | |
if ((introStatus == "sent" && introTabSelected == 1 && tabSelected == 2) || (introStatus == "received" && introTabSelected == 2 && tabSelected == 2)) { | |
binding.rv.adapter = IntroVideoAdapter(mutableListOf(), introStatus) | |
binding.noData.visibility = VISIBLE | |
} | |
} else { | |
response.body()?.msg?.let { | |
showSnackBar(it) | |
} | |
} | |
} | |
override fun onFailure(call: Call<ApiInterface.VideoIntroMessageResponse>, t: Throwable) {} | |
}) | |
} | |
inner class IntroVideoAdapter(private val data: MutableList<ApiInterface.VideoIntroMessage>, private val introStatus: String): RecyclerView.Adapter<IntroVideoAdapter.MyViewHolder>() { | |
inner class MyViewHolder(val binding: ItemIntroVideoBinding): RecyclerView.ViewHolder(binding.root) | |
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = MyViewHolder(ItemIntroVideoBinding.inflate(LayoutInflater.from(ctx), parent, false)) | |
override fun getItemCount() = data.size | |
override fun onBindViewHolder(holder: MyViewHolder, position: Int) { | |
val item = data[holder.absoluteAdapterPosition] | |
holder.binding.thumbnail.load(item.value, 15f) | |
holder.binding.title.text = if (introStatus == "sent") item.username else item.fromusername | |
holder.binding.reply1.visibility = if (introStatus == "received" && item.status == "S") View.VISIBLE else View.GONE | |
holder.binding.chat1.visibility = if (introStatus == "received" && item.status == "S") View.VISIBLE else View.GONE | |
holder.binding.delete1.visibility = if (introStatus == "received" && item.status == "S") View.VISIBLE else View.GONE | |
holder.binding.thumbnail.setOnClickListener { | |
val frag = FragVideoPreview() | |
frag.arguments = Bundle().apply { | |
putString("path", item.value) | |
putString("title", "") | |
} | |
(ctx as ActHome).navigateTo(frag, true) | |
} | |
holder.binding.reply1.setOnClickListener { | |
val frag = FragVideoPreview() | |
frag.arguments = Bundle().apply { | |
putString("title", getString(R.string.intro)) | |
putString("path", item.value) | |
} | |
(ctx as ActHome).navigateTo(frag, true) | |
} | |
holder.binding.chat1.setOnClickListener { | |
data[holder.absoluteAdapterPosition].status = "V" | |
notifyItemChanged(holder.absoluteAdapterPosition) | |
updateUserFav(item.fromguid, item.fromusername) | |
markRead(item.fromguid, item.fromusername, false) | |
} | |
holder.binding.delete1.setOnClickListener { | |
showOptionDialog( | |
getString(R.string.delete), | |
getString(R.string.intro_delete_desc)) { | |
if (it == 1) { | |
data[holder.absoluteAdapterPosition].status = "V" | |
notifyItemChanged(holder.absoluteAdapterPosition) | |
markRead(item.fromguid, item.fromusername, true) | |
} | |
} | |
} | |
} | |
} | |
private fun markRead(guid: String?,username: String?, delete: Boolean = false) { | |
App.appsFlyerEvent(if (delete) "Intro_Delete" else "Intro_Reply") | |
if (!delete) | |
loader = showLoader() | |
getClient().getIntroMessages(preferenceInstance.readString(Preference.GUID), preferenceInstance.readString(Preference.USERNAME), guid, true) | |
.enqueue(object : Callback<ResponseListBean<ResponseListBean.IntroMessage>>{ | |
override fun onResponse(call: Call<ResponseListBean<ResponseListBean.IntroMessage>>, response: Response<ResponseListBean<ResponseListBean.IntroMessage>>) { | |
loader?.dismiss() | |
response.body()?.intros?.let { items -> | |
if (!delete) { | |
loader = showLoader() | |
ChatRepo.startChatWith(username!!, guid!!, items) | |
val frag = FragChat() | |
frag.arguments = Bundle().apply { | |
putString("guid", guid) | |
putString("username", username) | |
} | |
postDelayed({ | |
loader?.dismiss() | |
(ctx as ActHome).navigateTo(frag, true) | |
postDelayed({ binding.root.visibility = View.VISIBLE }, 1000) | |
}, 1000) | |
} | |
} | |
} | |
override fun onFailure(call: Call<ResponseListBean<ResponseListBean.IntroMessage>>, t: Throwable) { loader?.dismiss() } | |
}) | |
} | |
private fun updateUserFav(guid: String, username: String) { | |
getClient().setUserFavRequest(FavUpdateRequestModel(preferenceInstance.readString(Preference.GUID), guid, "L")) | |
.enqueue(object : Callback<ResponseBean<JsonElement>>{ | |
override fun onResponse(call: Call<ResponseBean<JsonElement>>, response: Response<ResponseBean<JsonElement>>) {} | |
override fun onFailure(call: Call<ResponseBean<JsonElement>>, t: Throwable) {} | |
}) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment