Skip to content

Commit

Permalink
feat: swipe controls override volume button behaviour (#114)
Browse files Browse the repository at this point in the history
  • Loading branch information
shadow578 committed Aug 14, 2022
1 parent 166bfd3 commit 8056e2e
Show file tree
Hide file tree
Showing 9 changed files with 263 additions and 275 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import android.view.WindowManager;

import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.swipecontrols.views.SwipeControlsHostLayout;
import app.revanced.integrations.swipecontrols.SwipeControlsHostActivity;

/**
* Patch class for 'hdr-auto-brightness' patch
Expand All @@ -27,7 +27,7 @@ public static float getHDRBrightness(float original) {

// override with brightness set by swipe-controls
// only when swipe-controls is active and has overridden the brightness
final SwipeControlsHostLayout swipeControlsHost = SwipeControlsPatch.CURRENT_HOST.get();
final SwipeControlsHostActivity swipeControlsHost = SwipeControlsHostActivity.getCurrentHost().get();
if (swipeControlsHost != null
&& swipeControlsHost.getScreen() != null
&& swipeControlsHost.getConfig().getEnableBrightnessControl()
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class SwipeControlsConfigurationProvider(
) {
//region swipe enable
/**
* should swipe controls be enabled? (global setting
* should swipe controls be enabled? (global setting)
*/
val enableSwipeControls: Boolean
get() = isFullscreenVideo && (enableVolumeControls || enableBrightnessControl)
Expand All @@ -39,6 +39,14 @@ class SwipeControlsConfigurationProvider(
get() = PlayerType.current == PlayerType.WATCH_WHILE_FULLSCREEN
//endregion

//region keys enable
/**
* should volume key controls be overwritten? (global setting)
*/
val overwriteVolumeKeyControls: Boolean
get() = isFullscreenVideo && enableVolumeControls
//endregioin

//region gesture adjustments
/**
* should press-to-swipe be enabled?
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
package app.revanced.integrations.swipecontrols

import android.app.Activity
import android.os.Bundle
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.ViewGroup
import app.revanced.integrations.shared.PlayerType
import app.revanced.integrations.swipecontrols.controller.AudioVolumeController
import app.revanced.integrations.swipecontrols.controller.ScreenBrightnessController
import app.revanced.integrations.swipecontrols.controller.SwipeZonesController
import app.revanced.integrations.swipecontrols.controller.VolumeKeysController
import app.revanced.integrations.swipecontrols.controller.gesture.NoPtSSwipeGestureController
import app.revanced.integrations.swipecontrols.controller.gesture.SwipeGestureController
import app.revanced.integrations.swipecontrols.misc.Rectangle
import app.revanced.integrations.swipecontrols.views.SwipeControlsOverlayLayout
import app.revanced.integrations.utils.LogHelper
import java.lang.ref.WeakReference

/**
* The main controller for volume and brightness swipe controls.
* note that the superclass is overwritten to the superclass of the WatchWhileActivity at patch time
*
* @smali Lapp/revanced/integrations/swipecontrols/SwipeControlsHostActivity;
*/
class SwipeControlsHostActivity : Activity() {
/**
* current instance of [AudioVolumeController]
*/
var audio: AudioVolumeController? = null

/**
* current instance of [ScreenBrightnessController]
*/
var screen: ScreenBrightnessController? = null

/**
* current instance of [SwipeControlsConfigurationProvider]
*/
lateinit var config: SwipeControlsConfigurationProvider

/**
* current instance of [SwipeControlsOverlayLayout]
*/
lateinit var overlay: SwipeControlsOverlayLayout

/**
* current instance of [SwipeZonesController]
*/
lateinit var zones: SwipeZonesController

/**
* main gesture controller
*/
private lateinit var gesture: SwipeGestureController

/**
* main volume keys controller
*/
private lateinit var keys: VolumeKeysController

/**
* current content view with id [android.R.id.content]
*/
private val contentRoot
get() = window.decorView.findViewById<ViewGroup>(android.R.id.content)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

// create controllers
LogHelper.info(this.javaClass, "initializing swipe controls controllers")
config = SwipeControlsConfigurationProvider(this)
gesture = createGestureController()
keys = VolumeKeysController(this)
audio = createAudioController()
screen = createScreenController()

// create overlay
SwipeControlsOverlayLayout(this).let {
overlay = it
contentRoot.addView(it)
}

// create swipe zone controller
zones = SwipeZonesController(this) {
Rectangle(
contentRoot.x.toInt(),
contentRoot.y.toInt(),
contentRoot.width,
contentRoot.height
)
}

// listen for changes in the player type
PlayerType.onChange += this::onPlayerTypeChanged

// set current instance reference
currentHost = WeakReference(this)
}

override fun onStart() {
super.onStart()

// (re) attach overlay
LogHelper.info(this.javaClass, "attaching swipe controls overlay")
contentRoot.removeView(overlay)
contentRoot.addView(overlay)
}

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
return if ((ev != null) && gesture.onTouchEvent(ev)) true else {
super.dispatchTouchEvent(ev)
}
}

override fun dispatchKeyEvent(ev: KeyEvent?): Boolean {
return if((ev != null) && keys.onKeyEvent(ev)) true else {
super.dispatchKeyEvent(ev)
}
}

/**
* dispatch a touch event to downstream views
*
* @param event the event to dispatch
* @return was the event consumed?
*/
fun dispatchDownstreamTouchEvent(event: MotionEvent) =
super.dispatchTouchEvent(event)

/**
* called when the player type changes
*
* @param type the new player type
*/
private fun onPlayerTypeChanged(type: PlayerType) {
when (type) {
PlayerType.WATCH_WHILE_FULLSCREEN -> screen?.restore()
else -> {
screen?.save()
screen?.restoreDefaultBrightness()
}
}
}

/**
* create the audio volume controller
*/
private fun createAudioController() =
if (config.enableVolumeControls)
AudioVolumeController(this) else null

/**
* create the screen brightness controller instance
*/
private fun createScreenController() =
if (config.enableBrightnessControl)
ScreenBrightnessController(this) else null

/**
* create the gesture controller based on settings
*/
private fun createGestureController() =
if (config.shouldEnablePressToSwipe)
SwipeGestureController(this)
else NoPtSSwipeGestureController(this)

companion object {
/**
* the currently active swipe controls host.
* the reference may be null!
*/
@JvmStatic
var currentHost: WeakReference<SwipeControlsHostActivity> = WeakReference(null)
private set
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package app.revanced.integrations.swipecontrols.controller

import android.content.Context
import android.app.Activity
import android.util.TypedValue
import android.view.ViewGroup
import app.revanced.integrations.swipecontrols.misc.Rectangle
Expand Down Expand Up @@ -35,29 +35,28 @@ import kotlin.math.min
*/
@Suppress("PrivatePropertyName")
class SwipeZonesController(
context: Context,
private val parentView: ViewGroup,
private val host: Activity,
private val fallbackScreenRect: () -> Rectangle
) {
/**
* 20dp, in pixels
*/
private val _20dp = 20.applyDimension(context, TypedValue.COMPLEX_UNIT_DIP)
private val _20dp = 20.applyDimension(host, TypedValue.COMPLEX_UNIT_DIP)

/**
* 40dp, in pixels
*/
private val _40dp = 40.applyDimension(context, TypedValue.COMPLEX_UNIT_DIP)
private val _40dp = 40.applyDimension(host, TypedValue.COMPLEX_UNIT_DIP)

/**
* 80dp, in pixels
*/
private val _80dp = 80.applyDimension(context, TypedValue.COMPLEX_UNIT_DIP)
private val _80dp = 80.applyDimension(host, TypedValue.COMPLEX_UNIT_DIP)

/**
* id for R.id.player_view
*/
private val playerViewId = ReVancedUtils.getResourceIdByName(context, "id", "player_view")
private val playerViewId = ReVancedUtils.getResourceIdByName(host, "id", "player_view")

/**
* current bounding rectangle of the player
Expand Down Expand Up @@ -114,7 +113,7 @@ class SwipeZonesController(
*/
private fun maybeAttachPlayerBoundsListener() {
if (playerRect != null) return
parentView.findViewById<ViewGroup>(playerViewId)?.let {
host.findViewById<ViewGroup>(playerViewId)?.let {
onPlayerViewLayout(it)
it.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
onPlayerViewLayout(it)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package app.revanced.integrations.swipecontrols.controller

import android.view.KeyEvent
import app.revanced.integrations.swipecontrols.SwipeControlsHostActivity

/**
* controller for custom volume button behaviour
*
* @param controller main controller instance
*/
class VolumeKeysController(
private val controller: SwipeControlsHostActivity
) {
/**
* key event handler
*
* @param event the key event
* @return consume the event?
*/
fun onKeyEvent(event: KeyEvent): Boolean {
if(!controller.config.overwriteVolumeKeyControls) {
return false
}

return when (event.keyCode) {
KeyEvent.KEYCODE_VOLUME_DOWN ->
handleVolumeKeyEvent(event, false)
KeyEvent.KEYCODE_VOLUME_UP ->
handleVolumeKeyEvent(event, true)
else -> false
}
}

/**
* handle a volume up / down key event
*
* @param event the key event
* @param volumeUp was the key pressed the volume up key?
* @return consume the event?
*/
private fun handleVolumeKeyEvent(event: KeyEvent, volumeUp: Boolean): Boolean {
if (event.action == KeyEvent.ACTION_DOWN) {
controller.audio?.apply {
volume += if (volumeUp) 1 else -1
controller.overlay.onVolumeChanged(volume, maxVolume)
}
}

return true
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package app.revanced.integrations.swipecontrols.controller.gesture

import android.content.Context
import android.view.MotionEvent
import app.revanced.integrations.swipecontrols.views.SwipeControlsHostLayout
import app.revanced.integrations.swipecontrols.SwipeControlsHostActivity

/**
* [SwipeGestureController], but with press-to-swipe disabled because a lot of people dislike the feature.
* If you want to change something, try to do it in [SwipeGestureController] so that both configurations can benefit from it
*/
class NoPtSSwipeGestureController(context: Context, controller: SwipeControlsHostLayout) :
SwipeGestureController(context, controller) {
class NoPtSSwipeGestureController(controller: SwipeControlsHostActivity) :
SwipeGestureController(controller) {

/**
* to disable press-to-swipe, we have to become press-to-swipe
Expand Down
Loading

0 comments on commit 8056e2e

Please sign in to comment.