Skip to content
This repository has been archived by the owner on Feb 1, 2023. It is now read-only.

Commit

Permalink
♻️ Decoupling fragments with LocalBroadcast for KeyDown events
Browse files Browse the repository at this point in the history
  • Loading branch information
markhaehnel committed May 16, 2019
1 parent 5b14825 commit 71e4de2
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 36 deletions.
@@ -1,13 +1,15 @@
package de.markhaehnel.rbtv.rocketbeanstv

import android.content.Intent
import android.os.Bundle
import android.view.KeyEvent
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import dagger.android.DispatchingAndroidInjector
import dagger.android.support.HasSupportFragmentInjector
import de.markhaehnel.rbtv.rocketbeanstv.util.FragmentInterface
import de.markhaehnel.rbtv.rocketbeanstv.util.Constants
import javax.inject.Inject

class MainActivity : AppCompatActivity(), HasSupportFragmentInjector {
Expand All @@ -24,13 +26,8 @@ class MainActivity : AppCompatActivity(), HasSupportFragmentInjector {
}

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
val navHostFragment = supportFragmentManager.findFragmentById(R.id.navContainer)
val currentFragment = navHostFragment?.getChildFragmentManager()?.fragments?.get(0)
if (currentFragment is FragmentInterface){
val res = currentFragment.onKeyDown(keyCode, event)
if (res) return res;
}

val intent = Intent(Constants.BROADCAST_KEYDOWN).apply { putExtra(Constants.BROADCAST_KEYDOWN_KEY_CODE, keyCode) }
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
return super.onKeyDown(keyCode, event)
}

Expand Down
@@ -1,5 +1,9 @@
package de.markhaehnel.rbtv.rocketbeanstv.ui.player

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.view.KeyEvent
import android.view.LayoutInflater
Expand All @@ -12,6 +16,7 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelProviders
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import de.markhaehnel.rbtv.rocketbeanstv.R
import de.markhaehnel.rbtv.rocketbeanstv.binding.FragmentDataBindingComponent
import de.markhaehnel.rbtv.rocketbeanstv.databinding.FragmentPlayerBinding
Expand All @@ -21,14 +26,14 @@ import de.markhaehnel.rbtv.rocketbeanstv.ui.common.RetryCallback
import de.markhaehnel.rbtv.rocketbeanstv.ui.schedule.ScheduleFragment
import de.markhaehnel.rbtv.rocketbeanstv.ui.serviceinfo.ServiceInfoFragment
import de.markhaehnel.rbtv.rocketbeanstv.ui.serviceinfo.ServiceInfoFragmentInterface
import de.markhaehnel.rbtv.rocketbeanstv.util.FragmentInterface
import de.markhaehnel.rbtv.rocketbeanstv.util.Constants
import de.markhaehnel.rbtv.rocketbeanstv.util.IntervalTask
import de.markhaehnel.rbtv.rocketbeanstv.util.autoCleared
import de.markhaehnel.rbtv.rocketbeanstv.util.highestBandwith
import kotlinx.android.synthetic.main.fragment_player.*
import javax.inject.Inject

class PlayerFragment : Fragment(), Injectable, FragmentInterface, ServiceInfoFragmentInterface {
class PlayerFragment : Fragment(), Injectable, ServiceInfoFragmentInterface {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory

Expand All @@ -38,6 +43,20 @@ class PlayerFragment : Fragment(), Injectable, FragmentInterface, ServiceInfoFra
private lateinit var playerViewModel: PlayerViewModel
private lateinit var playStateObserver: IntervalTask

private val keyDownBroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when(intent.getIntExtra(Constants.BROADCAST_KEYDOWN_KEY_CODE, 0)) {
KeyEvent.KEYCODE_DPAD_CENTER,
KeyEvent.KEYCODE_DPAD_UP,
KeyEvent.KEYCODE_DPAD_RIGHT,
KeyEvent.KEYCODE_DPAD_DOWN,
KeyEvent.KEYCODE_DPAD_LEFT -> {
inflateServiceInfoFragment()
}
}
}
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val dataBinding = DataBindingUtil.inflate<FragmentPlayerBinding>(
inflater,
Expand All @@ -64,6 +83,10 @@ class PlayerFragment : Fragment(), Injectable, FragmentInterface, ServiceInfoFra
binding.isChatVisible = playerViewModel.isChatVisible
binding.isBuffering = playerViewModel.isBuffering

LocalBroadcastManager.getInstance(requireContext())
.registerReceiver(keyDownBroadcastReceiver, IntentFilter(Constants.BROADCAST_KEYDOWN))


initObservers()
initPlayer()
}
Expand All @@ -78,19 +101,6 @@ class PlayerFragment : Fragment(), Injectable, FragmentInterface, ServiceInfoFra
videoView.pause()
}

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
when(keyCode) {
KeyEvent.KEYCODE_DPAD_CENTER,
KeyEvent.KEYCODE_DPAD_UP,
KeyEvent.KEYCODE_DPAD_RIGHT,
KeyEvent.KEYCODE_DPAD_DOWN,
KeyEvent.KEYCODE_DPAD_LEFT -> {
return inflateServiceInfoFragment()
}
}
return false
}

private fun inflateChat() {
val fragmentTag = "tagFragmentChat"

Expand Down Expand Up @@ -124,9 +134,8 @@ class PlayerFragment : Fragment(), Injectable, FragmentInterface, ServiceInfoFra
val fragmentTag = "tagFragmentServiceInfo"

if (childFragmentManager.findFragmentByTag(fragmentTag) == null) {
val serviceInfoFragment = ServiceInfoFragment()
childFragmentManager.beginTransaction().apply {
replace(R.id.serviceInfoContainer, serviceInfoFragment, fragmentTag)
replace(R.id.serviceInfoContainer, ServiceInfoFragment(), fragmentTag)
addToBackStack(null)
commit()
}
Expand Down
@@ -1,9 +1,12 @@
package de.markhaehnel.rbtv.rocketbeanstv.ui.serviceinfo

import android.animation.ObjectAnimator
import android.os.Bundle
import android.os.Handler
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.DecelerateInterpolator
import androidx.databinding.DataBindingComponent
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
Expand All @@ -20,9 +23,6 @@ import de.markhaehnel.rbtv.rocketbeanstv.ui.common.RetryCallback
import de.markhaehnel.rbtv.rocketbeanstv.util.autoCleared
import kotlinx.android.synthetic.main.fragment_service_info.*
import javax.inject.Inject
import android.animation.ObjectAnimator
import android.view.animation.DecelerateInterpolator
import androidx.navigation.fragment.findNavController
import kotlin.math.roundToInt

class ServiceInfoFragment : Fragment(), Injectable {
Expand All @@ -35,6 +35,8 @@ class ServiceInfoFragment : Fragment(), Injectable {
var binding by autoCleared<FragmentServiceInfoBinding>()

private lateinit var serviceInfoViewModel: ServiceInfoViewModel
private var autoCloseHandler = Handler()
private lateinit var autoCloseRunnable: Runnable

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val dataBinding = DataBindingUtil.inflate<FragmentServiceInfoBinding>(
Expand Down Expand Up @@ -79,11 +81,16 @@ class ServiceInfoFragment : Fragment(), Injectable {

binding.serviceInfo = serviceInfoViewModel.serviceInfo

initServiceInfo()
autoCloseRunnable = Runnable {
fragmentManager?.popBackStack()
}

initServiceInfo()
serviceInfoScheduleButton.requestFocus()
}



fun initServiceInfo() {
serviceInfoViewModel.serviceInfo.observe(viewLifecycleOwner, Observer { serviceInfo ->
if (serviceInfo.data != null) {
Expand Down
@@ -0,0 +1,8 @@
package de.markhaehnel.rbtv.rocketbeanstv.util

class Constants {
companion object {
val BROADCAST_KEYDOWN = "BROADCAST_KEYDOWN"
val BROADCAST_KEYDOWN_KEY_CODE = "BROADCAST_KEYDOWN_KEY_CODE"
}
}

This file was deleted.

0 comments on commit 71e4de2

Please sign in to comment.