fix: Free view bindings in dialogs

This commit is contained in:
Isira Seneviratne 2023-08-23 05:17:59 +05:30
parent 9ea7ca3237
commit b9a059d9ef
7 changed files with 81 additions and 33 deletions

View File

@ -14,20 +14,23 @@ class StatsSheet(
private val player: ExoPlayer, private val player: ExoPlayer,
private val videoId: String private val videoId: String
) : ExpandedBottomSheet() { ) : ExpandedBottomSheet() {
private var _binding: DialogStatsBinding? = null
private val binding get() = _binding!!
lateinit var binding: DialogStatsBinding
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
binding = DialogStatsBinding.inflate(layoutInflater) _binding = DialogStatsBinding.inflate(layoutInflater)
return binding.root return binding.root
} }
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class) @androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = binding
binding.videoId.setText(videoId) binding.videoId.setText(videoId)
binding.videoInfo.setText( binding.videoInfo.setText(
"${player.videoFormat?.codecs.orEmpty()} ${ "${player.videoFormat?.codecs.orEmpty()} ${
@ -47,4 +50,9 @@ class StatsSheet(
"${player.videoFormat?.width}x${player.videoFormat?.height} ${player.videoFormat?.frameRate?.toInt()}fps" "${player.videoFormat?.width}x${player.videoFormat?.height} ${player.videoFormat?.frameRate?.toInt()}fps"
) )
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
} }

View File

@ -12,26 +12,32 @@ import com.github.libretube.ui.adapters.BottomSheetAdapter
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
open class BaseBottomSheet : ExpandedBottomSheet() { open class BaseBottomSheet : ExpandedBottomSheet() {
private var _binding: BottomSheetBinding? = null
private val binding get() = _binding!!
private lateinit var items: List<BottomSheetItem> private lateinit var items: List<BottomSheetItem>
private lateinit var listener: (index: Int) -> Unit private lateinit var listener: (index: Int) -> Unit
private lateinit var binding: BottomSheetBinding
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
binding = BottomSheetBinding.inflate(layoutInflater) _binding = BottomSheetBinding.inflate(layoutInflater)
return binding.root return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) val binding = binding
binding.optionsRecycler.layoutManager = LinearLayoutManager(requireContext()) binding.optionsRecycler.layoutManager = LinearLayoutManager(requireContext())
binding.optionsRecycler.adapter = BottomSheetAdapter(items, listener) binding.optionsRecycler.adapter = BottomSheetAdapter(items, listener)
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
fun setItems(items: List<BottomSheetItem>, listener: (suspend (index: Int) -> Unit)?) = apply { fun setItems(items: List<BottomSheetItem>, listener: (suspend (index: Int) -> Unit)?) = apply {
this.items = items this.items = items
this.listener = { index -> this.listener = { index ->

View File

@ -17,7 +17,9 @@ import com.github.libretube.ui.models.CommentsViewModel
import com.github.libretube.ui.models.PlayerViewModel import com.github.libretube.ui.models.PlayerViewModel
class CommentsSheet : UndimmedBottomSheet() { class CommentsSheet : UndimmedBottomSheet() {
lateinit var binding: CommentsSheetBinding private var _binding: CommentsSheetBinding? = null
val binding get() = _binding!!
private val playerViewModel: PlayerViewModel by activityViewModels() private val playerViewModel: PlayerViewModel by activityViewModels()
private val commentsViewModel: CommentsViewModel by activityViewModels() private val commentsViewModel: CommentsViewModel by activityViewModels()
@ -26,7 +28,7 @@ class CommentsSheet : UndimmedBottomSheet() {
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
binding = CommentsSheetBinding.inflate(layoutInflater) _binding = CommentsSheetBinding.inflate(layoutInflater)
return binding.root return binding.root
} }
@ -35,29 +37,29 @@ class CommentsSheet : UndimmedBottomSheet() {
commentsViewModel.commentsSheetDismiss = this::dismiss commentsViewModel.commentsSheetDismiss = this::dismiss
binding.apply { val binding = binding
dragHandle.viewTreeObserver.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
dragHandle.viewTreeObserver.removeOnGlobalLayoutListener(this)
// limit the recyclerview height to not cover the video binding.dragHandle.viewTreeObserver.addOnGlobalLayoutListener(object :
binding.standardBottomSheet.layoutParams = ViewTreeObserver.OnGlobalLayoutListener {
binding.commentFragContainer.layoutParams.apply { override fun onGlobalLayout() {
height = playerViewModel.maxSheetHeightPx binding.dragHandle.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
}
})
btnBack.setOnClickListener { // limit the recyclerview height to not cover the video
if (childFragmentManager.backStackEntryCount > 0) { binding.standardBottomSheet.layoutParams =
childFragmentManager.popBackStack() binding.commentFragContainer.layoutParams.apply {
} height = playerViewModel.maxSheetHeightPx
}
} }
})
btnClose.setOnClickListener { dismiss() } binding.btnBack.setOnClickListener {
if (childFragmentManager.backStackEntryCount > 0) {
childFragmentManager.popBackStack()
}
} }
binding.btnClose.setOnClickListener { dismiss() }
childFragmentManager.commit { childFragmentManager.commit {
replace<CommentsMainFragment>(R.id.commentFragContainer) replace<CommentsMainFragment>(R.id.commentFragContainer)
} }
@ -72,6 +74,11 @@ class CommentsSheet : UndimmedBottomSheet() {
} }
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun getSheetMaxHeightPx() = playerViewModel.maxSheetHeightPx override fun getSheetMaxHeightPx() = playerViewModel.maxSheetHeightPx
override fun getDragHandle() = binding.dragHandle override fun getDragHandle() = binding.dragHandle

View File

@ -26,8 +26,10 @@ class EditChannelGroupSheet(
private var group: SubscriptionGroup, private var group: SubscriptionGroup,
private val onGroupChanged: (SubscriptionGroup) -> Unit private val onGroupChanged: (SubscriptionGroup) -> Unit
) : ExpandedBottomSheet() { ) : ExpandedBottomSheet() {
private var _binding: DialogEditChannelGroupBinding? = null
private val binding get() = _binding!!
private val subscriptionsModel: SubscriptionsViewModel by activityViewModels() private val subscriptionsModel: SubscriptionsViewModel by activityViewModels()
private lateinit var binding: DialogEditChannelGroupBinding
private var channels = listOf<Subscription>() private var channels = listOf<Subscription>()
override fun onCreateView( override fun onCreateView(
@ -35,7 +37,13 @@ class EditChannelGroupSheet(
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
binding = DialogEditChannelGroupBinding.inflate(layoutInflater) _binding = DialogEditChannelGroupBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = binding
binding.groupName.setText(group.name) binding.groupName.setText(group.name)
binding.channelsRV.layoutManager = LinearLayoutManager(context) binding.channelsRV.layoutManager = LinearLayoutManager(context)
@ -60,8 +68,11 @@ class EditChannelGroupSheet(
onGroupChanged(group) onGroupChanged(group)
dismiss() dismiss()
} }
}
return binding.root override fun onDestroyView() {
super.onDestroyView()
_binding = null
} }
private fun fetchSubscriptions() { private fun fetchSubscriptions() {
@ -81,6 +92,7 @@ class EditChannelGroupSheet(
} }
private fun showChannels(channels: List<Subscription>, query: String?) { private fun showChannels(channels: List<Subscription>, query: String?) {
val binding = binding
binding.channelsRV.adapter = SubscriptionGroupChannelsAdapter( binding.channelsRV.adapter = SubscriptionGroupChannelsAdapter(
channels.filter { query == null || it.name.lowercase().contains(query.lowercase()) }, channels.filter { query == null || it.name.lowercase().contains(query.lowercase()) },
group group

View File

@ -9,19 +9,26 @@ import com.github.libretube.databinding.BottomSheetBinding
import com.github.libretube.ui.adapters.IconsSheetAdapter import com.github.libretube.ui.adapters.IconsSheetAdapter
class IconsBottomSheet : ExpandedBottomSheet() { class IconsBottomSheet : ExpandedBottomSheet() {
private lateinit var binding: BottomSheetBinding private var _binding: BottomSheetBinding? = null
private val binding get() = _binding!!
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
binding = BottomSheetBinding.inflate(layoutInflater) _binding = BottomSheetBinding.inflate(layoutInflater)
return binding.root return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = binding
binding.optionsRecycler.layoutManager = GridLayoutManager(context, 3) binding.optionsRecycler.layoutManager = GridLayoutManager(context, 3)
binding.optionsRecycler.adapter = IconsSheetAdapter() binding.optionsRecycler.adapter = IconsSheetAdapter()
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
} }

View File

@ -26,6 +26,7 @@ class IntentChooserSheet(
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = binding
binding.optionsRecycler.layoutManager = GridLayoutManager(context, 3) binding.optionsRecycler.layoutManager = GridLayoutManager(context, 3)
binding.optionsRecycler.adapter = IntentChooserAdapter(packages, url) binding.optionsRecycler.adapter = IntentChooserAdapter(packages, url)
} }

View File

@ -16,20 +16,22 @@ import com.github.libretube.ui.adapters.SliderLabelsAdapter
class PlaybackOptionsSheet( class PlaybackOptionsSheet(
private val player: ExoPlayer private val player: ExoPlayer
) : ExpandedBottomSheet() { ) : ExpandedBottomSheet() {
private lateinit var binding: PlaybackBottomSheetBinding private var _binding: PlaybackBottomSheetBinding? = null
private val binding get() = _binding!!
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
binding = PlaybackBottomSheetBinding.inflate(layoutInflater) _binding = PlaybackBottomSheetBinding.inflate(layoutInflater)
return binding.root return binding.root
} }
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class) @androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) val binding = binding
binding.speedShortcuts.layoutManager = GridLayoutManager(context, SUGGESTED_SPEEDS.size) binding.speedShortcuts.layoutManager = GridLayoutManager(context, SUGGESTED_SPEEDS.size)
binding.pitchShortcuts.layoutManager = GridLayoutManager(context, SUGGESTED_PITCHES.size) binding.pitchShortcuts.layoutManager = GridLayoutManager(context, SUGGESTED_PITCHES.size)
@ -60,6 +62,11 @@ class PlaybackOptionsSheet(
} }
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
private fun onChange() { private fun onChange() {
player.playbackParameters = PlaybackParameters( player.playbackParameters = PlaybackParameters(
binding.speed.value.round(2), binding.speed.value.round(2),