From baa034fa3f5a4d43201e33897544697202fd9c64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Fri, 15 Jan 2021 17:00:05 +0100 Subject: [PATCH] Finish Basic Touchpad on Android --- .../java/com/metallic/chiaki/lib/Chiaki.kt | 5 +++-- .../metallic/chiaki/stream/StreamActivity.kt | 19 ++++++---------- .../touchcontrols/TouchControlsFragment.kt | 17 ++++++++------ .../touchcontrols/TouchpadOnlyFragment.kt | 22 +++++-------------- .../chiaki/touchcontrols/TouchpadView.kt | 1 + .../src/main/res/layout/activity_stream.xml | 2 +- .../res/layout/fragment_touchpad_only.xml | 22 +++++++++++++++---- 7 files changed, 46 insertions(+), 42 deletions(-) diff --git a/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt b/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt index 9c4ea34..2c474f0 100644 --- a/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt +++ b/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt @@ -165,7 +165,7 @@ data class ControllerState constructor( var leftY: Short = 0, var rightX: Short = 0, var rightY: Short = 0, - private var touchIdNext: UByte = 100U, + private var touchIdNext: UByte = 0U, var touches: Array = arrayOf(ControllerTouch(), ControllerTouch()), var gyroX: Float = 0.0f, var gyroY: Float = 0.0f, @@ -280,7 +280,8 @@ data class ControllerState constructor( .find { it.id < 0 } ?.also { it.id = touchIdNext.toByte() - Log.d("TouchId", "touch id next: $touchIdNext") + it.x = x + it.y = y touchIdNext = ((touchIdNext + 1U) and 0x7fU).toUByte() }?.id?.toUByte() diff --git a/android/app/src/main/java/com/metallic/chiaki/stream/StreamActivity.kt b/android/app/src/main/java/com/metallic/chiaki/stream/StreamActivity.kt index fd07ff4..b0248be 100644 --- a/android/app/src/main/java/com/metallic/chiaki/stream/StreamActivity.kt +++ b/android/app/src/main/java/com/metallic/chiaki/stream/StreamActivity.kt @@ -22,6 +22,7 @@ import com.metallic.chiaki.databinding.ActivityStreamBinding import com.metallic.chiaki.lib.ConnectInfo import com.metallic.chiaki.lib.ConnectVideoProfile import com.metallic.chiaki.session.* +import com.metallic.chiaki.touchcontrols.DefaultTouchControlsFragment import com.metallic.chiaki.touchcontrols.TouchControlsFragment import com.metallic.chiaki.touchcontrols.TouchpadOnlyFragment import io.reactivex.disposables.CompositeDisposable @@ -120,20 +121,14 @@ class StreamActivity : AppCompatActivity(), View.OnSystemUiVisibilityChangeListe override fun onAttachFragment(fragment: Fragment) { super.onAttachFragment(fragment) - when(fragment) + if(fragment is TouchControlsFragment) { - is TouchControlsFragment -> - { - fragment.controllerState - .subscribe { viewModel.input.touchControllerState = it } - .addTo(controlsDisposable) - fragment.onScreenControlsEnabled = viewModel.onScreenControlsEnabled - } - is TouchpadOnlyFragment -> - { - fragment.controllerStateCallback = { viewModel.input.touchControllerState = it } + fragment.controllerState + .subscribe { viewModel.input.touchControllerState = it } + .addTo(controlsDisposable) + fragment.onScreenControlsEnabled = viewModel.onScreenControlsEnabled + if(fragment is TouchpadOnlyFragment) fragment.touchpadOnlyEnabled = viewModel.touchpadOnlyEnabled - } } } diff --git a/android/app/src/main/java/com/metallic/chiaki/touchcontrols/TouchControlsFragment.kt b/android/app/src/main/java/com/metallic/chiaki/touchcontrols/TouchControlsFragment.kt index ad734ce..b3ab922 100644 --- a/android/app/src/main/java/com/metallic/chiaki/touchcontrols/TouchControlsFragment.kt +++ b/android/app/src/main/java/com/metallic/chiaki/touchcontrols/TouchControlsFragment.kt @@ -12,14 +12,14 @@ import androidx.lifecycle.Observer import com.metallic.chiaki.databinding.FragmentControlsBinding import com.metallic.chiaki.lib.ControllerState import io.reactivex.Observable -import io.reactivex.Observable.combineLatest +import io.reactivex.rxkotlin.Observables.combineLatest import io.reactivex.subjects.BehaviorSubject import io.reactivex.subjects.Subject -class TouchControlsFragment : Fragment() +abstract class TouchControlsFragment : Fragment() { - private var ownControllerState = ControllerState() - private set(value) + protected var ownControllerState = ControllerState() + set(value) { val diff = field != value field = value @@ -27,17 +27,20 @@ class TouchControlsFragment : Fragment() ownControllerStateSubject.onNext(ownControllerState) } - private val ownControllerStateSubject: Subject + protected val ownControllerStateSubject: Subject = BehaviorSubject.create().also { it.onNext(ownControllerState) } // to delay attaching to the touchpadView until it's available - private val controllerStateProxy: Subject> - = BehaviorSubject.create>().also { it.onNext(ownControllerStateSubject) } + protected val controllerStateProxy: Subject> + = BehaviorSubject.create>().also { it.onNext(ownControllerStateSubject) } val controllerState: Observable get() = controllerStateProxy.flatMap { it } var onScreenControlsEnabled: LiveData? = null +} +class DefaultTouchControlsFragment : TouchControlsFragment() +{ private var _binding: FragmentControlsBinding? = null private val binding get() = _binding!! diff --git a/android/app/src/main/java/com/metallic/chiaki/touchcontrols/TouchpadOnlyFragment.kt b/android/app/src/main/java/com/metallic/chiaki/touchcontrols/TouchpadOnlyFragment.kt index ef96b84..788b6d5 100644 --- a/android/app/src/main/java/com/metallic/chiaki/touchcontrols/TouchpadOnlyFragment.kt +++ b/android/app/src/main/java/com/metallic/chiaki/touchcontrols/TouchpadOnlyFragment.kt @@ -6,26 +6,14 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.LiveData import androidx.lifecycle.Observer -import com.metallic.chiaki.R -import com.metallic.chiaki.databinding.FragmentControlsBinding import com.metallic.chiaki.databinding.FragmentTouchpadOnlyBinding import com.metallic.chiaki.lib.ControllerState +import io.reactivex.rxkotlin.Observables.combineLatest -class TouchpadOnlyFragment : Fragment() +class TouchpadOnlyFragment : TouchControlsFragment() { - private var controllerState = ControllerState() - private set(value) - { - val diff = field != value - field = value - if(diff) - controllerStateCallback?.let { it(value) } - } - - var controllerStateCallback: ((ControllerState) -> Unit)? = null var touchpadOnlyEnabled: LiveData? = null private var _binding: FragmentTouchpadOnlyBinding? = null @@ -34,6 +22,9 @@ class TouchpadOnlyFragment : Fragment() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = FragmentTouchpadOnlyBinding.inflate(inflater, container, false).let { _binding = it + controllerStateProxy.onNext( + combineLatest(ownControllerStateSubject, binding.touchpadView.controllerState) { a, b -> a or b } + ) it.root } @@ -49,13 +40,12 @@ class TouchpadOnlyFragment : Fragment() } private fun buttonStateChanged(buttonMask: UInt) = { pressed: Boolean -> - controllerState = controllerState.copy().apply { + ownControllerState = ownControllerState.copy().apply { buttons = if(pressed) buttons or buttonMask else buttons and buttonMask.inv() - } } } \ No newline at end of file diff --git a/android/app/src/main/java/com/metallic/chiaki/touchcontrols/TouchpadView.kt b/android/app/src/main/java/com/metallic/chiaki/touchcontrols/TouchpadView.kt index 8c8f44f..b712c6e 100644 --- a/android/app/src/main/java/com/metallic/chiaki/touchcontrols/TouchpadView.kt +++ b/android/app/src/main/java/com/metallic/chiaki/touchcontrols/TouchpadView.kt @@ -86,6 +86,7 @@ class TouchpadView @JvmOverloads constructor( private fun triggerStateChanged() { + invalidate() stateSubject.onNext(state) } } \ No newline at end of file diff --git a/android/app/src/main/res/layout/activity_stream.xml b/android/app/src/main/res/layout/activity_stream.xml index 99eea1b..6a7f9a3 100644 --- a/android/app/src/main/res/layout/activity_stream.xml +++ b/android/app/src/main/res/layout/activity_stream.xml @@ -28,7 +28,7 @@ diff --git a/android/app/src/main/res/layout/fragment_touchpad_only.xml b/android/app/src/main/res/layout/fragment_touchpad_only.xml index a42b78a..2da7a09 100644 --- a/android/app/src/main/res/layout/fragment_touchpad_only.xml +++ b/android/app/src/main/res/layout/fragment_touchpad_only.xml @@ -1,5 +1,6 @@ - + + \ No newline at end of file