diff --git a/VoidLink.xcodeproj/project.pbxproj b/VoidLink.xcodeproj/project.pbxproj index f7e9d4fc..62b899ee 100644 --- a/VoidLink.xcodeproj/project.pbxproj +++ b/VoidLink.xcodeproj/project.pbxproj @@ -59,7 +59,6 @@ DC1F5A07206436B20037755F /* ConnectionHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1F5A06206436B20037755F /* ConnectionHelper.m */; }; F74BEF9C2C1A705600224667 /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = F74BEF9B2C1A705600224667 /* OpenSSL */; }; FB1A674D2131E65900507771 /* KeyboardSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = FB1A674C2131E65900507771 /* KeyboardSupport.m */; }; - FB1D59971BBCCB6400F482CA /* ComputerScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = FB1D59961BBCCB6400F482CA /* ComputerScrollView.m */; }; FB1D599A1BBCCD7E00F482CA /* AppCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = FB1D59991BBCCD7E00F482CA /* AppCollectionView.m */; }; FB290CF219B2C406004C83CF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290CF119B2C406004C83CF /* Foundation.framework */; }; FB290CF419B2C406004C83CF /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290CF319B2C406004C83CF /* CoreGraphics.framework */; }; @@ -104,7 +103,6 @@ FBD3495019FF2174002D2A60 /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3494F19FF2174002D2A60 /* SettingsViewController.m */; }; FBD3495319FF36FB002D2A60 /* SWRevealViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3495219FF36FB002D2A60 /* SWRevealViewController.m */; }; FBD349621A0089F6002D2A60 /* DataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD349611A0089F6002D2A60 /* DataManager.m */; }; - FBDE86E019F7A837001C18A8 /* UIComputerView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86DF19F7A837001C18A8 /* UIComputerView.m */; }; FBDE86E619F82297001C18A8 /* UIAppView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86E519F82297001C18A8 /* UIAppView.m */; }; /* End PBXBuildFile section */ @@ -233,8 +231,6 @@ FB1A67642132419A00507771 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; FB1A67E421324A1F00507771 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS11.4.sdk/System/Library/Frameworks/CoreData.framework; sourceTree = DEVELOPER_DIR; }; FB1A67E921324DF300507771 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS11.4.sdk/usr/lib/libxml2.tbd; sourceTree = DEVELOPER_DIR; }; - FB1D59951BBCCB6400F482CA /* ComputerScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ComputerScrollView.h; sourceTree = ""; }; - FB1D59961BBCCB6400F482CA /* ComputerScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ComputerScrollView.m; sourceTree = ""; }; FB1D59981BBCCD7E00F482CA /* AppCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppCollectionView.h; sourceTree = ""; }; FB1D59991BBCCD7E00F482CA /* AppCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppCollectionView.m; sourceTree = ""; }; FB290CEE19B2C406004C83CF /* VoidLink.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = VoidLink.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -319,8 +315,6 @@ FBD3495219FF36FB002D2A60 /* SWRevealViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SWRevealViewController.m; sourceTree = ""; }; FBD349601A0089F6002D2A60 /* DataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DataManager.h; path = Database/DataManager.h; sourceTree = ""; }; FBD349611A0089F6002D2A60 /* DataManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DataManager.m; path = Database/DataManager.m; sourceTree = ""; }; - FBDE86DE19F7A837001C18A8 /* UIComputerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIComputerView.h; sourceTree = ""; }; - FBDE86DF19F7A837001C18A8 /* UIComputerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIComputerView.m; sourceTree = ""; }; FBDE86E419F82297001C18A8 /* UIAppView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAppView.h; sourceTree = ""; }; FBDE86E519F82297001C18A8 /* UIAppView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIAppView.m; sourceTree = ""; }; /* End PBXFileReference section */ @@ -513,8 +507,6 @@ 841BAC912DE35D6B00DA639E /* ThemeManager.m */, 847D2FD82DDA00C800937A62 /* MenuSectionView.h */, 847D2FDA2DDA015F00937A62 /* MenuSectionView.m */, - FBDE86DE19F7A837001C18A8 /* UIComputerView.h */, - FBDE86DF19F7A837001C18A8 /* UIComputerView.m */, FBDE86E419F82297001C18A8 /* UIAppView.h */, FBDE86E519F82297001C18A8 /* UIAppView.m */, 1888C1902E24C2C800108730 /* AboutView.swift */, @@ -522,8 +514,6 @@ FB89463719F6473800339C8A /* Launch Screen.xib */, FB290D0819B2C406004C83CF /* Images.xcassets */, FB290D0519B2C406004C83CF /* Limelight.xcdatamodeld */, - FB1D59951BBCCB6400F482CA /* ComputerScrollView.h */, - FB1D59961BBCCB6400F482CA /* ComputerScrollView.m */, FB1D59981BBCCD7E00F482CA /* AppCollectionView.h */, FB1D59991BBCCD7E00F482CA /* AppCollectionView.m */, 843E93BD2C41528700B1651F /* OrientationHelper.swift */, @@ -889,12 +879,10 @@ 84351B112C29ACCB00A77989 /* OSCProfilesManager.m in Sources */, FB89462919F646E200339C8A /* mkcert.c in Sources */, FB9AFD281A7C84ED00872C98 /* HttpResponse.m in Sources */, - FBDE86E019F7A837001C18A8 /* UIComputerView.m in Sources */, FB89463019F646E200339C8A /* StreamConfiguration.m in Sources */, FBD3495319FF36FB002D2A60 /* SWRevealViewController.m in Sources */, 84203F232C5F24C00032EEED /* OnScreenWidgetView.swift in Sources */, 84FD0B512C31338D006B5BE5 /* LocalizationHelper.m in Sources */, - FB1D59971BBCCB6400F482CA /* ComputerScrollView.m in Sources */, FBD3495019FF2174002D2A60 /* SettingsViewController.m in Sources */, 843CC7F02C1E757D00BBC475 /* NativeTouchPointer.m in Sources */, FB89462C19F646E200339C8A /* HttpManager.m in Sources */, diff --git a/VoidLink/ComputerScrollView.h b/VoidLink/ComputerScrollView.h deleted file mode 100644 index 16a93cef..00000000 --- a/VoidLink/ComputerScrollView.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// ComputerScrollView.h -// Moonlight -// -// Created by Diego Waxemberg on 9/30/15. -// Copyright © 2015 Moonlight Stream. All rights reserved. -// - -#import - -@interface ComputerScrollView : UIScrollView - -@end diff --git a/VoidLink/ComputerScrollView.m b/VoidLink/ComputerScrollView.m deleted file mode 100644 index c9610170..00000000 --- a/VoidLink/ComputerScrollView.m +++ /dev/null @@ -1,28 +0,0 @@ -// -// ComputerScrollView.m -// Moonlight -// -// Created by Diego Waxemberg on 9/30/15. -// Copyright © 2015 Moonlight Stream. All rights reserved. -// - -#import "ComputerScrollView.h" - -@implementation ComputerScrollView - -- (BOOL)touchesShouldCancelInContentView:(UIView *)view { - if ([view isKindOfClass:[UIButton class]]) { - return YES; - } - return [super touchesShouldCancelInContentView:view]; -} - -/* -// Only override drawRect: if you perform custom drawing. -// An empty implementation adversely affects performance during animation. -- (void)drawRect:(CGRect)rect { - // Drawing code -} -*/ - -@end diff --git a/VoidLink/UIComputerView.h b/VoidLink/UIComputerView.h deleted file mode 100644 index 1e5c6a1a..00000000 --- a/VoidLink/UIComputerView.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// UIComputerView.h -// Moonlight -// -// Created by Diego Waxemberg on 10/22/14. -// Copyright (c) 2014 Moonlight Stream. All rights reserved. -// - -#import -#import "TemporaryHost.h" - -@protocol HostCallback - -- (void) noneUserInitiatedHostAction:(TemporaryHost*)host view:(UIView*)view; -- (void) hostCardLongPressed:(TemporaryHost*)host view:(UIView*)view; -- (void) addHostTapped; - -@end - -#if !TARGET_OS_TV -@interface UIComputerView : UIButton -#else -@interface UIComputerView : UIButton -#endif - -- (id) initWithComputer:(TemporaryHost*)host andCallback:(id)callback; -- (id) initForAddWithCallback:(id)callback; - -@end diff --git a/VoidLink/UIComputerView.m b/VoidLink/UIComputerView.m deleted file mode 100644 index e3f26ef5..00000000 --- a/VoidLink/UIComputerView.m +++ /dev/null @@ -1,244 +0,0 @@ -// -// UIComputerView.m -// Moonlight -// -// Created by Diego Waxemberg on 10/22/14. -// Copyright (c) 2014 Moonlight Stream. All rights reserved. -// -// Modified by True砖家 since 2024.6.30 -// Copyright © 2024 True砖家 @ Bilibili. All rights reserved. -// -// - -#import "UIComputerView.h" -#import "LocalizationHelper.h" - -@implementation UIComputerView { - TemporaryHost* _host; - UIImageView* _hostIcon; - UILabel* _hostLabel; - UIImageView* _hostOverlay; - UIActivityIndicatorView* _hostSpinner; - id _callback; - CGSize _labelSize; -} -static const float REFRESH_CYCLE = 2.0f; - -#if TARGET_OS_TV -static const int ITEM_PADDING = 50; -static const int LABEL_DY = 40; -#else -static const int ITEM_PADDING = 0; -static const int LABEL_DY = 20; -#endif - -- (id) init { - self = [super init]; - -#if TARGET_OS_TV - self.frame = CGRectMake(0, 0, 400, 400); -#else - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - self.frame = CGRectMake(0, 0, 200, 200); - } else { - self.frame = CGRectMake(0, 0, 100, 100); - } -#endif - - _hostIcon = [[UIImageView alloc] initWithFrame:self.frame]; - [_hostIcon setImage:[UIImage imageNamed:@"Computer"]]; - - self.layer.shadowColor = [[UIColor blackColor] CGColor]; - self.layer.shadowOffset = CGSizeMake(5,8); - self.layer.shadowOpacity = 0.3; - - [self addTarget:self action:@selector(hostButtonSelected:) forControlEvents:UIControlEventTouchDown]; - [self addTarget:self action:@selector(hostButtonDeselected:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchCancel | UIControlEventTouchDragExit]; - - _hostLabel = [[UILabel alloc] init]; - _hostLabel.textColor = [UIColor whiteColor]; - - _hostOverlay = [[UIImageView alloc] initWithFrame:CGRectMake(self.frame.size.width / 3, _hostIcon.frame.size.height / 4, _hostIcon.frame.size.width / 3, self.frame.size.height / 3)]; - _hostSpinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; - [_hostSpinner setFrame:_hostOverlay.frame]; - _hostSpinner.userInteractionEnabled = NO; - _hostSpinner.hidesWhenStopped = YES; - - [self addSubview:_hostLabel]; - [self addSubview:_hostIcon]; - -#if TARGET_OS_TV - _hostIcon.clipsToBounds = NO; - _hostIcon.adjustsImageWhenAncestorFocused = YES; - _hostIcon.masksFocusEffectToContents = YES; - - self.adjustsImageWhenHighlighted = NO; - - _hostOverlay.masksFocusEffectToContents = YES; - _hostOverlay.adjustsImageWhenAncestorFocused = NO; - - [_hostIcon.overlayContentView addSubview:_hostOverlay]; - [_hostIcon.overlayContentView addSubview:_hostSpinner]; -#else - [self addSubview:_hostOverlay]; - [self addSubview:_hostSpinner]; - - if (@available(iOS 13.4.1, *)) { - // Allow the button style to change when moused over - self.pointerInteractionEnabled = YES; - } -#endif - - return self; -} - -- (void) hostButtonSelected:(id)sender { - _hostIcon.layer.opacity = 0.5f; - _hostSpinner.layer.opacity = 0.5f; - _hostOverlay.layer.opacity = 0.5f; -} -- (void) hostButtonDeselected:(id)sender { - _hostIcon.layer.opacity = 1.0f; - _hostSpinner.layer.opacity = 1.0f; - _hostOverlay.layer.opacity = 1.0f; -} - -- (id) initForAddWithCallback:(id)callback { - self = [self init]; - _callback = callback; - - [self addTarget:self action:@selector(addClicked) forControlEvents:UIControlEventPrimaryActionTriggered]; - - [_hostLabel setText:[LocalizationHelper localizedStringForKey:@"Add Host Manually"]]; - [_hostLabel sizeToFit]; - - [_hostOverlay setImage:[UIImage imageNamed:@"AddOverlayIcon"]]; - - [self updateBounds]; - - return self; -} - -- (id) initWithComputer:(TemporaryHost*)host andCallback:(id)callback { - self = [self init]; - _host = host; - _callback = callback; - - // Use UIContextMenuInteraction on iOS 13.0+ and a standard UILongPressGestureRecognizer - // for tvOS devices and iOS prior to 13.0. -#if !TARGET_OS_TV - if (@available(iOS 13.0, *)) { - UIContextMenuInteraction* rightClickInteraction = [[UIContextMenuInteraction alloc] initWithDelegate:self]; - [self addInteraction:rightClickInteraction]; - } - else -#endif - { - UILongPressGestureRecognizer* longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(hostLongClicked:)]; - [self addGestureRecognizer:longPressRecognizer]; - } - - [self addTarget:self action:@selector(hostClicked) forControlEvents:UIControlEventPrimaryActionTriggered]; - - [self updateContentsForHost:host]; - - return self; -} - -- (void)didMoveToSuperview { - // Start our update loop when we are added to our cell - if (self.superview != nil && _host != nil) { - [self updateLoop]; - } -} - -- (void) updateBounds { - float x = FLT_MAX; - float y = FLT_MAX; - float width = 0; - float height; - - float iconX = _hostIcon.frame.origin.x + _hostIcon.frame.size.width / 2; - _hostLabel.center = CGPointMake(iconX, _hostIcon.frame.origin.y + _hostIcon.frame.size.height + LABEL_DY); - - x = MIN(x, _hostIcon.frame.origin.x); - x = MIN(x, _hostLabel.frame.origin.x); - - y = MIN(y, _hostIcon.frame.origin.y); - y = MIN(y, _hostLabel.frame.origin.y); - - width = MAX(width, _hostIcon.frame.size.width); - width = MAX(width, _hostLabel.frame.size.width); - - height = _hostIcon.frame.size.height + - _hostLabel.frame.size.height + - LABEL_DY / 2; - - self.bounds = CGRectMake(x - ITEM_PADDING, y - ITEM_PADDING, width + 2 * ITEM_PADDING, height + 2 * ITEM_PADDING); -} - -- (void) updateContentsForHost:(TemporaryHost*)host { - _hostLabel.text = _host.name; - [_hostLabel sizeToFit]; - - if (host.state == StateOnline) { - [_hostSpinner stopAnimating]; - - if (host.pairState == PairStateUnpaired) { - [_hostOverlay setImage:[UIImage imageNamed:@"LockedOverlayIcon"]]; - } - else { - [_hostOverlay setImage:nil]; - } - } - else if (host.state == StateOffline) { - [_hostSpinner stopAnimating]; - [_hostOverlay setImage:[UIImage imageNamed:@"ErrorOverlayIcon"]]; - } - else { - [_hostSpinner startAnimating]; - } - - [self updateBounds]; -} - -- (void) updateLoop { - // Stop immediately if the view has been detached - if (self.superview == nil) { - return; - } - - [self updateContentsForHost:_host]; - - // Queue the next refresh cycle - [self performSelector:@selector(updateLoop) withObject:self afterDelay:REFRESH_CYCLE]; -} - -- (void) hostLongClicked:(UILongPressGestureRecognizer*)gesture { - if (gesture.state == UIGestureRecognizerStateBegan) { - [_callback hostCardLongPressed:_host view:self]; - } -} - -#if !TARGET_OS_TV -- (UIContextMenuConfiguration *)contextMenuInteraction:(UIContextMenuInteraction *)interaction - configurationForMenuAtLocation:(CGPoint)location { - // We don't want to trigger the primary action at this point, so cancel - // tracking touch on this view now. This will also have the (intended) - // effect of removing the touch highlight on this view. - [self cancelTrackingWithEvent:nil]; - - [_callback hostCardLongPressed:_host view:self]; - return nil; -} -#endif - -- (void) hostClicked { - [_callback noneUserInitiatedHostAction:_host view:self]; -} - -- (void) addClicked { - [_callback addHostTapped]; -} - -@end diff --git a/VoidLink/ViewControllers/MainFrameViewController.h b/VoidLink/ViewControllers/MainFrameViewController.h index ebc9b42e..8d978cd8 100644 --- a/VoidLink/ViewControllers/MainFrameViewController.h +++ b/VoidLink/ViewControllers/MainFrameViewController.h @@ -13,7 +13,6 @@ #import "DiscoveryManager.h" #import "PairManager.h" #import "StreamConfiguration.h" -#import "UIComputerView.h" #import "HostCardView.h" #import "UIAppView.h" #import "AppAssetManager.h" @@ -21,7 +20,7 @@ #import "HostCollectionViewController.h" -@interface MainFrameViewController : UICollectionViewController +@interface MainFrameViewController : UICollectionViewController @property (nonatomic, strong) IBOutlet UIBarButtonItem *settingsButton; #if !TARGET_OS_TV diff --git a/VoidLink/ViewControllers/MainFrameViewController.m b/VoidLink/ViewControllers/MainFrameViewController.m index 84c53759..51cf0ebb 100644 --- a/VoidLink/ViewControllers/MainFrameViewController.m +++ b/VoidLink/ViewControllers/MainFrameViewController.m @@ -16,7 +16,6 @@ #import "Connection.h" #import "StreamManager.h" #import "Utils.h" -#import "UIComputerView.h" #import "UIAppView.h" #import "DataManager.h" #import "TemporarySettings.h" @@ -25,7 +24,6 @@ #import "ServerInfoResponse.h" #import "StreamFrameViewController.h" #import "LoadingFrameViewController.h" -#import "ComputerScrollView.h" #import "TemporaryApp.h" #import "IdManager.h" #import "ConnectionHelper.h"