diff --git a/Documentation/NEWS.md b/Documentation/NEWS.md index 27ff0aef2de3e122dcff2032274166327e8d8983..e788ff0a4ec09d8f129dc00b9f26408b2009ae33 100644 --- a/Documentation/NEWS.md +++ b/Documentation/NEWS.md @@ -25,6 +25,8 @@ · Fix silence for a split second when starting playback · Add option to force the video playback orientation lock · Seek playback using the number keys on external keyboards +· Add options to skip forward/back instead of go to next/previous track + - on lockscreen and when using external controls (like headphones and car controls) · Integrate with the pCloud service Known issues: diff --git a/Resources/iOS/Settings.bundle/Root.inApp.plist b/Resources/iOS/Settings.bundle/Root.inApp.plist index 757b8d73826eb85171eaab00a8493cf5ca21b1ea..2172d720bdc9e792760ec9c5eef1515bdd12c97e 100644 --- a/Resources/iOS/Settings.bundle/Root.inApp.plist +++ b/Resources/iOS/Settings.bundle/Root.inApp.plist @@ -356,6 +356,46 @@ <integer>60</integer> </array> </dict> + <dict> + <key>Type</key> + <string>PSMultiValueSpecifier</string> + <key>Title</key> + <string>SETTINGS_PLAYBACK_LOCKSCREEN_SKIP</string> + <key>Key</key> + <string>playback-lockscreen-skip</string> + <key>DefaultValue</key> + <false/> + <key>Titles</key> + <array> + <string>SETTINGS_PLAYBACK_CONTROLS_SKIP_NO</string> + <string>SETTINGS_PLAYBACK_CONTROLS_SKIP_YES</string> + </array> + <key>Values</key> + <array> + <false/> + <true/> + </array> + </dict> + <dict> + <key>Type</key> + <string>PSMultiValueSpecifier</string> + <key>Title</key> + <string>SETTINGS_PLAYBACK_EXTERNAL_CONTROLS_SKIP</string> + <key>Key</key> + <string>playback-remote-control-skip</string> + <key>DefaultValue</key> + <false/> + <key>Titles</key> + <array> + <string>SETTINGS_PLAYBACK_CONTROLS_SKIP_NO</string> + <string>SETTINGS_PLAYBACK_CONTROLS_SKIP_YES</string> + </array> + <key>Values</key> + <array> + <false/> + <true/> + </array> + </dict> <dict> <key>Type</key> <string>PSMultiValueSpecifier</string> diff --git a/Resources/iOS/Settings.bundle/Root.plist b/Resources/iOS/Settings.bundle/Root.plist index 0f5784a30fc703da11d82d6893ba05ab10ce9912..d5ea292f6499d8c70a9f362ffd9fa55c9b313fb4 100644 --- a/Resources/iOS/Settings.bundle/Root.plist +++ b/Resources/iOS/Settings.bundle/Root.plist @@ -258,6 +258,46 @@ <integer>1</integer> </array> </dict> + <dict> + <key>Type</key> + <string>PSMultiValueSpecifier</string> + <key>Title</key> + <string>SETTINGS_PLAYBACK_LOCKSCREEN_SKIP</string> + <key>Key</key> + <string>playback-lockscreen-skip</string> + <key>DefaultValue</key> + <false/> + <key>Titles</key> + <array> + <string>SETTINGS_PLAYBACK_CONTROLS_SKIP_NO</string> + <string>SETTINGS_PLAYBACK_CONTROLS_SKIP_YES</string> + </array> + <key>Values</key> + <array> + <false/> + <true/> + </array> + </dict> + <dict> + <key>Type</key> + <string>PSMultiValueSpecifier</string> + <key>Title</key> + <string>SETTINGS_PLAYBACK_EXTERNAL_CONTROLS_SKIP</string> + <key>Key</key> + <string>playback-remote-control-skip</string> + <key>DefaultValue</key> + <false/> + <key>Titles</key> + <array> + <string>SETTINGS_PLAYBACK_CONTROLS_SKIP_NO</string> + <string>SETTINGS_PLAYBACK_CONTROLS_SKIP_YES</string> + </array> + <key>Values</key> + <array> + <false/> + <true/> + </array> + </dict> <dict> <key>Type</key> <string>PSMultiValueSpecifier</string> diff --git a/Resources/iOS/Settings.bundle/en.lproj/Root.strings b/Resources/iOS/Settings.bundle/en.lproj/Root.strings index 9379a87c57a1839c2628f4119e4f813daf380aaf..533c90bd7d489466e65cc99270b30deca5611c96 100644 --- a/Resources/iOS/Settings.bundle/en.lproj/Root.strings +++ b/Resources/iOS/Settings.bundle/en.lproj/Root.strings @@ -151,6 +151,10 @@ "SETTINGS_PLAYBACK_SKIP_FORWARD_SWIPE" = "Forward skip on swipe"; "SETTINGS_PLAYBACK_SKIP_BACKWARD_SWIPE" = "Backward skip on swipe"; "SETINGS_LONG_TOUCH_SPEED_UP" = "Long touch to speed-up"; +"SETTINGS_PLAYBACK_LOCKSCREEN_SKIP" = "Lock screen controls"; +"SETTINGS_PLAYBACK_EXTERNAL_CONTROLS_SKIP" = "External controls (headphones, car)"; +"SETTINGS_PLAYBACK_CONTROLS_SKIP_NO" = "Next/Previous"; +"SETTINGS_PLAYBACK_CONTROLS_SKIP_YES" = "Skip Forward/Back"; "SETTINGS_DURATION_FOUR" = "4 seconds"; "SETTINGS_DURATION_FIVE" = "5 seconds"; diff --git a/Resources/tvOS/Settings.bundle/en.lproj/Root.strings b/Resources/tvOS/Settings.bundle/en.lproj/Root.strings index 9379a87c57a1839c2628f4119e4f813daf380aaf..533c90bd7d489466e65cc99270b30deca5611c96 100644 --- a/Resources/tvOS/Settings.bundle/en.lproj/Root.strings +++ b/Resources/tvOS/Settings.bundle/en.lproj/Root.strings @@ -151,6 +151,10 @@ "SETTINGS_PLAYBACK_SKIP_FORWARD_SWIPE" = "Forward skip on swipe"; "SETTINGS_PLAYBACK_SKIP_BACKWARD_SWIPE" = "Backward skip on swipe"; "SETINGS_LONG_TOUCH_SPEED_UP" = "Long touch to speed-up"; +"SETTINGS_PLAYBACK_LOCKSCREEN_SKIP" = "Lock screen controls"; +"SETTINGS_PLAYBACK_EXTERNAL_CONTROLS_SKIP" = "External controls (headphones, car)"; +"SETTINGS_PLAYBACK_CONTROLS_SKIP_NO" = "Next/Previous"; +"SETTINGS_PLAYBACK_CONTROLS_SKIP_YES" = "Skip Forward/Back"; "SETTINGS_DURATION_FOUR" = "4 seconds"; "SETTINGS_DURATION_FIVE" = "5 seconds"; diff --git a/Sources/App/iOS/VLCAppDelegate.m b/Sources/App/iOS/VLCAppDelegate.m index a5015b1e93a95b21ae8c664a078e556781f07400..d054b695fd72d1b4ac34b8c41ffefe250e623e0b 100644 --- a/Sources/App/iOS/VLCAppDelegate.m +++ b/Sources/App/iOS/VLCAppDelegate.m @@ -75,6 +75,8 @@ kVLCSettingPlaybackBackwardSkipLength : kVLCSettingPlaybackBackwardSkipLengthDefaultValue, kVLCSettingPlaybackForwardSkipLengthSwipe : kVLCSettingPlaybackForwardSkipLengthSwipeDefaultValue, kVLCSettingPlaybackBackwardSkipLengthSwipe : kVLCSettingPlaybackBackwardSkipLengthSwipeDefaultValue, + kVLCSettingPlaybackLockscreenSkip : @(NO), + kVLCSettingPlaybackRemoteControlSkip : @(NO), kVLCSettingOpenAppForPlayback : kVLCSettingOpenAppForPlaybackDefaultValue, kVLCAutomaticallyPlayNextItem : @(YES), kVLCPlaylistPlayNextItem: @(YES), diff --git a/Sources/App/tvOS/AppleTVAppDelegate.m b/Sources/App/tvOS/AppleTVAppDelegate.m index 3ebe374a5844e203fbec2e853efc8d0c82ec7f57..4502514633e16a6eea701196e089fb459ff36b40 100644 --- a/Sources/App/tvOS/AppleTVAppDelegate.m +++ b/Sources/App/tvOS/AppleTVAppDelegate.m @@ -58,6 +58,8 @@ kVLCSettingEqualizerProfile : kVLCSettingEqualizerProfileDefaultValue, kVLCSettingPlaybackForwardSkipLength : kVLCSettingPlaybackForwardSkipLengthDefaultValue, kVLCSettingPlaybackBackwardSkipLength : kVLCSettingPlaybackBackwardSkipLengthDefaultValue, + kVLCSettingPlaybackLockscreenSkip : @(NO), + kVLCSettingPlaybackRemoteControlSkip : @(NO), kVLCSettingWiFiSharingIPv6 : kVLCSettingWiFiSharingIPv6DefaultValue, kVLCAutomaticallyPlayNextItem : @(YES), kVLCPlayerShouldRememberState: @(YES), diff --git a/Sources/Headers/VLCConstants.h b/Sources/Headers/VLCConstants.h index f1fa44db972d6cd926751e0db26b2c91dba062f1..c5d22a5b154c56bff82141ad42060c657cdc2bda 100644 --- a/Sources/Headers/VLCConstants.h +++ b/Sources/Headers/VLCConstants.h @@ -85,6 +85,8 @@ #define kVLCSettingPlaybackBackwardSkipLengthSwipe @"playback-backward-skip-length-swipe" #define kVLCSettingPlaybackLongTouchSpeedUp @"LongTouchSpeedUp" #define kVLCSettingPlaybackBackwardSkipLengthSwipeDefaultValue @(10) +#define kVLCSettingPlaybackLockscreenSkip @"playback-lockscreen-skip" +#define kVLCSettingPlaybackRemoteControlSkip @"playback-remote-control-skip" #define kVLCSettingOpenAppForPlayback @"open-app-for-playback" #define kVLCSettingOpenAppForPlaybackDefaultValue @YES #define kVLCSettingShowThumbnails @"ShowThumbnails" diff --git a/Sources/Headers/VLCTVConstants.h b/Sources/Headers/VLCTVConstants.h index 0a50d5751154d6c07345874fcbc51b308df5c86c..3d5e993b09d098c0f682f539619ac4c2575b5743 100644 --- a/Sources/Headers/VLCTVConstants.h +++ b/Sources/Headers/VLCTVConstants.h @@ -65,6 +65,8 @@ #define kVLCSettingPlaybackForwardSkipLengthDefaultValue @(10) #define kVLCSettingPlaybackBackwardSkipLength @"playback-backward-skip-length" #define kVLCSettingPlaybackBackwardSkipLengthDefaultValue @(10) +#define kVLCSettingPlaybackLockscreenSkip @"playback-lockscreen-skip" +#define kVLCSettingPlaybackRemoteControlSkip @"playback-remote-control-skip" #define kVLCSettingSaveHTTPUploadServerStatus @"isHTTPServerOn" #define kVLCAutomaticallyPlayNextItem @"AutomaticallyPlayNextItem" #define kVLCPlayerUIShouldHide @"PlayerUIShouldHide" diff --git a/Sources/Playback/OS Integration/VLCRemoteControlService.m b/Sources/Playback/OS Integration/VLCRemoteControlService.m index fdac5521eee244f3582dc5a284adec6fe4c3d8b1..4ac418525fff7fbdc52adea8be55de602e8d1553 100644 --- a/Sources/Playback/OS Integration/VLCRemoteControlService.m +++ b/Sources/Playback/OS Integration/VLCRemoteControlService.m @@ -55,12 +55,14 @@ static inline NSArray * RemoteCommandCenterCommandsToHandle(void) - (void)playbackStarted:(NSNotification *)aNotification { MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; /* Since the control center and lockscreen shows only either skipForward/Backward * or next/previousTrack buttons but prefers skip buttons, * we only enable skip buttons if we have no medialist */ - BOOL enableSkip = [VLCPlaybackService sharedInstance].mediaList.count <= 1; + BOOL alwaysEnableSkip = [defaults boolForKey:kVLCSettingPlaybackLockscreenSkip]; + BOOL enableSkip = alwaysEnableSkip || [VLCPlaybackService sharedInstance].mediaList.count <= 1; commandCenter.skipForwardCommand.enabled = enableSkip; commandCenter.skipBackwardCommand.enabled = enableSkip; @@ -76,7 +78,6 @@ static inline NSArray * RemoteCommandCenterCommandsToHandle(void) commandCenter.seekForwardCommand.enabled = NO; commandCenter.seekBackwardCommand.enabled = NO; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSNumber *forwardSkip = [defaults valueForKey:kVLCSettingPlaybackForwardSkipLength]; commandCenter.skipForwardCommand.preferredIntervals = @[forwardSkip]; NSNumber *backwardSkip = [defaults valueForKey:kVLCSettingPlaybackBackwardSkipLength]; @@ -102,6 +103,7 @@ static inline NSArray * RemoteCommandCenterCommandsToHandle(void) { MPRemoteCommandCenter *cc = [MPRemoteCommandCenter sharedCommandCenter]; VLCPlaybackService *vps = [VLCPlaybackService sharedInstance]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if (event.command == cc.pauseCommand) { [vps pause]; @@ -120,12 +122,25 @@ static inline NSArray * RemoteCommandCenterCommandsToHandle(void) return MPRemoteCommandHandlerStatusSuccess; } if (event.command == cc.nextTrackCommand) { - BOOL success = [vps next]; - return success ? MPRemoteCommandHandlerStatusSuccess : MPRemoteCommandHandlerStatusNoSuchContent; + if ([defaults boolForKey:kVLCSettingPlaybackRemoteControlSkip]) { + NSInteger interval = [defaults integerForKey:kVLCSettingPlaybackForwardSkipLength]; + [vps jumpForward:(int)interval]; + return MPRemoteCommandHandlerStatusSuccess; + } else { + BOOL success = [vps next]; + return success ? MPRemoteCommandHandlerStatusSuccess : MPRemoteCommandHandlerStatusNoSuchContent; + } } if (event.command == cc.previousTrackCommand) { - BOOL success = [vps previous]; - return success ? MPRemoteCommandHandlerStatusSuccess : MPRemoteCommandHandlerStatusNoSuchContent; + if ([defaults boolForKey:kVLCSettingPlaybackRemoteControlSkip]) { + NSInteger interval = [defaults integerForKey:kVLCSettingPlaybackBackwardSkipLength]; + [vps jumpBackward:(int)interval]; + return MPRemoteCommandHandlerStatusSuccess; + + } else { + BOOL success = [vps previous]; + return success ? MPRemoteCommandHandlerStatusSuccess : MPRemoteCommandHandlerStatusNoSuchContent; + } } if (event.command == cc.skipForwardCommand) { MPSkipIntervalCommandEvent *skipEvent = (MPSkipIntervalCommandEvent *)event; diff --git a/Sources/Settings/Model/SettingsSection.swift b/Sources/Settings/Model/SettingsSection.swift index 0522ca9021bc69234d093057df4cdbcad66d5c59..a7b6ffbe598ddc6c2906c0d78aae9d2ab5a88f9c 100644 --- a/Sources/Settings/Model/SettingsSection.swift +++ b/Sources/Settings/Model/SettingsSection.swift @@ -397,6 +397,20 @@ enum GestureControlOptions { preferenceKey: kVLCSettingPlaybackLongTouchSpeedUp) } + static var lockScreenSkip: SettingsItem { + let k = kVLCSettingPlaybackLockscreenSkip + return .init(title: "SETTINGS_PLAYBACK_LOCKSCREEN_SKIP", + subtitle: Localizer.getSubtitle(for: k), + action: .showActionSheet(title: "SETTINGS_PLAYBACK_LOCKSCREEN_SKIP", preferenceKey: k, hasInfo: false)) + } + + static var externalControlsSkip: SettingsItem { + let k = kVLCSettingPlaybackRemoteControlSkip + return .init(title: "SETTINGS_PLAYBACK_EXTERNAL_CONTROLS_SKIP", + subtitle: Localizer.getSubtitle(for: k), + action: .showActionSheet(title: "SETTINGS_PLAYBACK_EXTERNAL_CONTROLS_SKIP", preferenceKey: k, hasInfo: false)) + } + static func section(isForwardBackwardEqual: Bool, isTapSwipeEqual: Bool) -> SettingsSection? { .init(title: "SETTINGS_GESTURES", items: [ swipeUpDownForVolume, @@ -411,6 +425,8 @@ enum GestureControlOptions { isTapSwipeEqual ? nil : forwardSkipLengthSwipe, (isTapSwipeEqual || isForwardBackwardEqual) ? nil : backwardSkipLengthSwipe, longTouchToSpeedUp, + lockScreenSkip, + externalControlsSkip, ].compactMap { $0 }) }