diff --git a/VoidLink/Base.lproj/iPad.storyboard b/VoidLink/Base.lproj/iPad.storyboard index cd65685a..443ec72b 100644 --- a/VoidLink/Base.lproj/iPad.storyboard +++ b/VoidLink/Base.lproj/iPad.storyboard @@ -60,7 +60,7 @@ - + @@ -891,16 +891,38 @@ + + + + + + + + + + + + + + - + + + @@ -990,7 +1012,7 @@ - + diff --git a/VoidLink/Base.lproj/iPhone.storyboard b/VoidLink/Base.lproj/iPhone.storyboard index 5294dce9..3ec54b5e 100644 --- a/VoidLink/Base.lproj/iPhone.storyboard +++ b/VoidLink/Base.lproj/iPhone.storyboard @@ -1541,6 +1541,25 @@ + + + + + + + + + + + + + @@ -1551,6 +1570,8 @@ + + diff --git a/VoidLink/Database/DataManager.h b/VoidLink/Database/DataManager.h index 73f9e284..f58f98a9 100644 --- a/VoidLink/Database/DataManager.h +++ b/VoidLink/Database/DataManager.h @@ -86,7 +86,8 @@ typedef NS_ENUM(NSInteger, SettingsMenuMode) { unlockDisplayOrientation:(BOOL)unlockDisplayOrientation resolutionSelected:(NSInteger)resolutionSelected externalDisplayMode:(NSInteger)externalDisplayMode - localMousePointerMode:(NSInteger)localMousePointerMode; + localMousePointerMode:(NSInteger)localMousePointerMode + backgroundSessionTimer:(NSInteger)backgroundSessionTimer; - (NSArray*) getHosts; - (void) updateHost:(TemporaryHost*)host; diff --git a/VoidLink/Database/DataManager.m b/VoidLink/Database/DataManager.m index 99bb2006..1fc68282 100644 --- a/VoidLink/Database/DataManager.m +++ b/VoidLink/Database/DataManager.m @@ -92,7 +92,8 @@ unlockDisplayOrientation:(BOOL)unlockDisplayOrientation resolutionSelected:(NSInteger)resolutionSelected externalDisplayMode:(NSInteger)externalDisplayMode - localMousePointerMode:(NSInteger)localMousePointerMode{ + localMousePointerMode:(NSInteger)localMousePointerMode + backgroundSessionTimer:(NSInteger)backgroundSessionTimer{ [_managedObjectContext performBlockAndWait:^{ Settings* settingsToSave = [self retrieveSettings]; @@ -134,6 +135,7 @@ settingsToSave.resolutionSelected = [NSNumber numberWithInteger:resolutionSelected]; settingsToSave.externalDisplayMode = [NSNumber numberWithInteger:externalDisplayMode]; settingsToSave.localMousePointerMode = [NSNumber numberWithInteger:localMousePointerMode]; + settingsToSave.backroundSessionTimer = [NSNumber numberWithInteger:backgroundSessionTimer]; [self saveData]; }]; } diff --git a/VoidLink/Database/TemporarySettings.h b/VoidLink/Database/TemporarySettings.h index 65674268..7089ae9a 100644 --- a/VoidLink/Database/TemporarySettings.h +++ b/VoidLink/Database/TemporarySettings.h @@ -39,6 +39,7 @@ @property (nonatomic, retain) NSNumber * resolutionSelected; @property (nonatomic, retain) NSNumber * externalDisplayMode; @property (nonatomic, retain) NSNumber * localMousePointerMode; +@property (nonatomic, retain) NSNumber * backgroundSessionTimer; @property (nonatomic) enum { CODEC_PREF_AUTO, CODEC_PREF_H264, diff --git a/VoidLink/Database/TemporarySettings.m b/VoidLink/Database/TemporarySettings.m index 3d317c38..d6f68e3e 100644 --- a/VoidLink/Database/TemporarySettings.m +++ b/VoidLink/Database/TemporarySettings.m @@ -114,6 +114,7 @@ self.resolutionSelected = settings.resolutionSelected; self.externalDisplayMode = settings.externalDisplayMode; self.localMousePointerMode = settings.localMousePointerMode; + self.backgroundSessionTimer = settings.backroundSessionTimer; #endif self.uniqueId = settings.uniqueId; diff --git a/VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents b/VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents index a2e95731..3049aa43 100644 --- a/VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents +++ b/VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents @@ -23,10 +23,11 @@ + - + diff --git a/VoidLink/Localization/Localizable.xcstrings b/VoidLink/Localization/Localizable.xcstrings index 730e22b9..ab4b6d92 100644 --- a/VoidLink/Localization/Localizable.xcstrings +++ b/VoidLink/Localization/Localizable.xcstrings @@ -47,6 +47,75 @@ } } }, + " disconnect " : { + "extractionState" : "manual", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : " 断开 " + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : " 斷開 " + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : " 斷開 " + } + } + } + }, + " keep %d min " : { + "extractionState" : "manual", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : " 保持%d分钟 " + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : " 保持%d分鐘 " + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : " 保持%d分鐘 " + } + } + } + }, + " keep alive " : { + "extractionState" : "manual", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : " 保活 " + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : " 保持連線 " + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : " 保持連線 " + } + } + } + }, " Launch" : { "extractionState" : "manual", "localizations" : { diff --git a/VoidLink/ViewControllers/MainFrameViewController.m b/VoidLink/ViewControllers/MainFrameViewController.m index 718814b7..1141d85b 100644 --- a/VoidLink/ViewControllers/MainFrameViewController.m +++ b/VoidLink/ViewControllers/MainFrameViewController.m @@ -1866,25 +1866,6 @@ static NSMutableSet* hostList; for (TemporaryHost* comp in sortedHostList) { if(comp.state == StateOnline || comp.pairState == PairStatePaired || comp.pairState == PairStateUnknown) [self.hostCollectionVC addHost:comp]; - - // new host card test - // if([comp.name isEqualToString: @"ASRockPC"]) { - /* - if([comp.name isEqualToString: @"ASRockPC"]) { - //if([comp.name isEqualToString: @"PianoServer"]) { - //if([comp.name isEqualToString: @"TrueZj"]) { - HostCardView *testCard = [[HostCardView alloc] initWithHost:comp]; - - [self.view addSubview:testCard]; - // [testCard resizeBySizeFactor:3]; - [NSLayoutConstraint activateConstraints:@[ - [testCard.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor constant:0], - [testCard.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor constant:150], - ]]; - - }*/ - // - // Start jobs to decode the box art in advance for (TemporaryApp* app in comp.appList) { diff --git a/VoidLink/ViewControllers/SettingsViewController.h b/VoidLink/ViewControllers/SettingsViewController.h index 5a35bdfc..01bed474 100644 --- a/VoidLink/ViewControllers/SettingsViewController.h +++ b/VoidLink/ViewControllers/SettingsViewController.h @@ -108,6 +108,9 @@ @property (strong, nonatomic) IBOutlet UIStackView *audioConfigStack; @property (strong, nonatomic) IBOutlet UISegmentedControl *audioConfigSelector; +@property (strong, nonatomic) IBOutlet UIStackView *backgroundSessionTimerStack; +@property (strong, nonatomic) IBOutlet UISlider *backgroundSessionTimerSlider; + #pragma clang diagnostic push diff --git a/VoidLink/ViewControllers/SettingsViewController.m b/VoidLink/ViewControllers/SettingsViewController.m index 95e8940c..eda1a312 100644 --- a/VoidLink/ViewControllers/SettingsViewController.m +++ b/VoidLink/ViewControllers/SettingsViewController.m @@ -552,6 +552,7 @@ BOOL isCustomResolution(CGSize res) { } [self addSetting:self.statsOverlayStack ofId:@"statsOverlayStack" withInfoTag:NO withDynamicLabel:NO to:otherSection]; [self addSetting:self.unlockDisplayOrientationStack ofId:@"unlockDisplayOrientationStack" withInfoTag:YES withDynamicLabel:NO to:otherSection]; + [self addSetting:self.backgroundSessionTimerStack ofId:@"backgroundSessionTimerStack" withInfoTag:NO withDynamicLabel:YES to:otherSection]; [self addSetting:self.optimizeGamesStack ofId:@"optimizeGamesStack" withInfoTag:YES withDynamicLabel:NO to:otherSection]; [self addSetting:self.multiControllerStack ofId:@"multiControllerStack" withInfoTag:YES withDynamicLabel:NO to:otherSection]; [self addSetting:self.softKeyboardToolbarStack ofId:@"softKeyboardToolbarStack" withInfoTag:YES withDynamicLabel:NO to:otherSection]; @@ -1300,6 +1301,9 @@ BOOL isCustomResolution(CGSize res) { else [self.unlockDisplayOrientationSelector setSelectedSegmentIndex:1]; // can't lock screen orientation in this mode = Display Orientation always unlocked [self.unlockDisplayOrientationSelector setEnabled:unlockDisplayOrientationSelectorEnabled]; + [self.backgroundSessionTimerSlider setValue:(uint32_t)currentSettings.backgroundSessionTimer.floatValue]; + [self.backgroundSessionTimerSlider addTarget:self action:@selector(backgroundSessionTimerSliderMoved:) forControlEvents:UIControlEventValueChanged]; + [self backgroundSessionTimerSliderMoved:self.backgroundSessionTimerSlider]; // lift streamview setting [self.liftStreamViewForKeyboardSelector setSelectedSegmentIndex:currentSettings.liftStreamViewForKeyboard ? 1 : 0];// Load old setting @@ -1514,6 +1518,14 @@ BOOL isCustomResolution(CGSize res) { [self findDynamicLabelFromStack:self.gyroSensitivityStack].text = [NSString stringWithFormat:@" %d%% ", (uint16_t)sender.value]; // Update label display } +- (void) backgroundSessionTimerSliderMoved:(UISlider* )sender { + NSString* labelString; + labelString = [LocalizationHelper localizedStringForKey:@" keep %d min ", (uint16_t)sender.value]; + if(sender.value == 0) labelString = [LocalizationHelper localizedStringForKey:@" disconnect "]; + if(sender.value == sender.maximumValue) labelString = [LocalizationHelper localizedStringForKey:@" keep alive "]; + [self findDynamicLabelFromStack:self.backgroundSessionTimerStack].text = labelString; // Update label display +} + // veloc factor upto 700% - (uint16_t) map_velocFactorDisplay_fromSliderValue:(CGFloat)sliderValue{ @@ -1970,6 +1982,7 @@ BOOL isCustomResolution(CGSize res) { NSInteger resolutionSelected = [self.resolutionSelector selectedSegmentIndex]; NSInteger externalDisplayMode = [self.externalDisplayModeSelector selectedSegmentIndex]; NSInteger localMousePointerMode = [self.localMousePointerModeSelector selectedSegmentIndex]; + NSInteger backgroundSessionTimer = self.backgroundSessionTimerSlider.value == self.backgroundSessionTimerSlider.maximumValue ? (uint32_t) INT16_MAX : (uint32_t)self.backgroundSessionTimerSlider.value; [dataMan saveSettingsWithBitrate:_bitrate framerate:framerate height:height @@ -2006,7 +2019,8 @@ BOOL isCustomResolution(CGSize res) { unlockDisplayOrientation:unlockDisplayOrientation resolutionSelected:resolutionSelected externalDisplayMode:externalDisplayMode - localMousePointerMode:localMousePointerMode]; + localMousePointerMode:localMousePointerMode + backgroundSessionTimer:backgroundSessionTimer]; } - (void)didReceiveMemoryWarning { diff --git a/VoidLink/ViewControllers/StreamFrameViewController.m b/VoidLink/ViewControllers/StreamFrameViewController.m index d35a49f4..e510d9e4 100644 --- a/VoidLink/ViewControllers/StreamFrameViewController.m +++ b/VoidLink/ViewControllers/StreamFrameViewController.m @@ -867,12 +867,12 @@ #if !TARGET_OS_TV // Terminate the stream if the app is inactive for 60 seconds - Log(LOG_I, @"Starting inactivity termination timer"); - _inactivityTimer = [NSTimer scheduledTimerWithTimeInterval:18000 - target:self - selector:@selector(inactiveTimerExpired:) - userInfo:nil - repeats:NO]; + Log(LOG_I, @"Starting inactivity termination timer with %d min", _settings.backgroundSessionTimer.intValue); + _inactivityTimer = [NSTimer scheduledTimerWithTimeInterval:60*(double)_settings.backgroundSessionTimer.intValue + target:self + selector:@selector(inactiveTimerExpired:) + userInfo:nil + repeats:NO]; #endif } @@ -894,10 +894,6 @@ if (self.pipController && self.pipController.isPictureInPictureActive) { [self.pipController stopPictureInPicture]; } - - //self.pipController = nil; - //[self setupPiPControllerWithRenderer:self->_streamMan.videoRenderer]; - //self->_streamMan.videoRenderer. } // This fires when the home button is pressed diff --git a/VoidLink/mul.lproj/iPad.xcstrings b/VoidLink/mul.lproj/iPad.xcstrings index cd596f33..4fb66b87 100644 --- a/VoidLink/mul.lproj/iPad.xcstrings +++ b/VoidLink/mul.lproj/iPad.xcstrings @@ -349,6 +349,36 @@ } } }, + "9pX-93-bC2.text" : { + "comment" : "Class = \"UILabel\"; text = \"Background Session\"; ObjectID = \"9pX-93-bC2\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Background Session" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "后台会话" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "背景執行" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "背景執行" + } + } + } + }, "9XL-xt-Q57.text" : { "comment" : "Class = \"UILabel\"; text = \"Gyro Sensitivity\"; ObjectID = \"9XL-xt-Q57\";", "extractionState" : "extracted_with_value", diff --git a/VoidLink/mul.lproj/iPhone.xcstrings b/VoidLink/mul.lproj/iPhone.xcstrings index 49375568..d7694217 100644 --- a/VoidLink/mul.lproj/iPhone.xcstrings +++ b/VoidLink/mul.lproj/iPhone.xcstrings @@ -727,6 +727,36 @@ } } }, + "9et-1g-y3D.text" : { + "comment" : "Class = \"UILabel\"; text = \"Background Session\"; ObjectID = \"9et-1g-y3D\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Background Session" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "后台会话" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "背景執行" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "背景執行" + } + } + } + }, "9Gg-66-UdB.text" : { "comment" : "Class = \"UILabel\"; text = \"Tap any widget to load configuration (per widget)\"; ObjectID = \"9Gg-66-UdB\";", "extractionState" : "extracted_with_value",