From 44564db31b1718248de3983d59872d446e22c807 Mon Sep 17 00:00:00 2001 From: Adam Demasi Date: Fri, 7 Jul 2017 16:17:36 +0930 Subject: [PATCH] [tweak] ditch the on-banner controls, use an embedded widget! --- HBCZNotificationMediaControlsViewController.h | 6 -- HBCZNotificationMediaControlsViewController.x | 21 ------ HBCZNotificationWidgetViewController.h | 69 ++++++++++++++++++ HBCZNotificationWidgetViewController.x | 40 +++++++++++ HBCZNowPlayingController.x | 2 +- NotificationNew.x | 70 ++++++++++--------- 6 files changed, 148 insertions(+), 60 deletions(-) delete mode 100644 HBCZNotificationMediaControlsViewController.h delete mode 100644 HBCZNotificationMediaControlsViewController.x create mode 100644 HBCZNotificationWidgetViewController.h create mode 100644 HBCZNotificationWidgetViewController.x diff --git a/HBCZNotificationMediaControlsViewController.h b/HBCZNotificationMediaControlsViewController.h deleted file mode 100644 index 0fb0400..0000000 --- a/HBCZNotificationMediaControlsViewController.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface HBCZNotificationMediaControlsViewController : MPUControlCenterMediaControlsViewController - -@end diff --git a/HBCZNotificationMediaControlsViewController.x b/HBCZNotificationMediaControlsViewController.x deleted file mode 100644 index 35612bb..0000000 --- a/HBCZNotificationMediaControlsViewController.x +++ /dev/null @@ -1,21 +0,0 @@ -#import "HBCZNotificationMediaControlsViewController.h" -#import - -%subclass HBCZNotificationMediaControlsViewController : MPUControlCenterMediaControlsViewController - -- (CGSize)transportControlsView:(MPUControlCenterMediaControlsView *)view defaultTransportButtonSizeWithProposedSize:(CGSize)proposedSize { - return CGSizeMake(28, 28); -} - -/*- (UIButton *)transportControlsView:(MPUControlCenterMediaControlsView *)view buttonForControlType:(MPUTransportButtonType)type { - UIButton *button = %orig; - button.highlightedColor = [button.regularColor colorWithAlphaComponent:0.7f]; -}*/ - -%end - -%ctor { - if (IS_IOS_OR_NEWER(iOS_10_0)) { - %init; - } -} diff --git a/HBCZNotificationWidgetViewController.h b/HBCZNotificationWidgetViewController.h new file mode 100644 index 0000000..e8ce832 --- /dev/null +++ b/HBCZNotificationWidgetViewController.h @@ -0,0 +1,69 @@ +@import NotificationCenter; + +@class WGWidgetHostingViewController; + +@protocol WGWidgetHostingViewControllerDelegate + +@required + +- (CGSize)maxSizeForWidget:(WGWidgetHostingViewController *)widgetViewController forDisplayMode:(NCWidgetDisplayMode)displayMode; + +@optional + +- (void)remoteViewControllerDidConnectForWidget:(WGWidgetHostingViewController *)widgetViewController; +- (void)remoteViewControllerDidDisconnectForWidget:(WGWidgetHostingViewController *)widgetViewController; +- (void)remoteViewControllerViewDidAppearForWidget:(WGWidgetHostingViewController *)widgetViewController; +- (void)remoteViewControllerViewDidHideForWidget:(WGWidgetHostingViewController *)widgetViewController; +- (void)brokenViewDidAppearForWidget:(WGWidgetHostingViewController *)widgetViewController; +- (void)contentAvailabilityDidChangeForWidget:(WGWidgetHostingViewController *)widgetViewController; + +- (NCWidgetDisplayMode)activeLayoutModeForWidget:(WGWidgetHostingViewController *)widgetViewController; +- (UIEdgeInsets)marginInsetsForWidget:(WGWidgetHostingViewController *)widgetViewController; + +- (void)widget:(WGWidgetHostingViewController *)widgetViewController didChangeLargestSupportedDisplayMode:(NCWidgetDisplayMode)largestDisplayMode; +- (id)widget:(WGWidgetHostingViewController *)widgetViewController didUpdatePreferredHeight:(CGFloat)preferredHeight completion:(id)completion; + +- (BOOL)shouldRequestWidgetRemoteViewControllers; + +@end + +@interface WGWidgetHostingViewController : UIViewController + +@end + +@class WGWidgetDiscoveryController; + +@protocol WGWidgetDiscoveryControllerDelegate + +@optional + +- (BOOL)widgetDiscoveryControllerShouldIncludeInternalWidgets:(WGWidgetDiscoveryController *)discoveryController; + +- (BOOL)widgetDiscoveryController:(WGWidgetDiscoveryController *)discoveryController shouldPurgeArchivedSnapshotsForWidgetWithBundleIdentifier:(NSString *)bundleIdentifier; +- (void)widgetDiscoveryController:(WGWidgetDiscoveryController *)discoveryController widgetWithBundleIdentifier:(NSString *)bundleIdentifier didEncounterProblematicSnapshotAtURL:(NSURL *)snapshotURL; + +- (UIViewController *)widgetDiscoveryController:(WGWidgetDiscoveryController *)discoveryController preferredViewControllerForPresentingFromViewController:(UIViewController *)viewController; +- (void)widgetDiscoveryController:(WGWidgetDiscoveryController *)discoveryController requestUnlockWithCompletion:(id)completion; + +- (id)whiteStatusBarAssertionForWidgetDiscoveryController:(WGWidgetDiscoveryController *)discoveryController; +- (void)widgetDiscoveryController:(WGWidgetDiscoveryController *)discoveryController didEndUsingStatusBarAssertion:(id)statusBarAssertion; + +@end + +@interface WGWidgetDiscoveryController : NSObject + +- (instancetype)initWithColumnModes:(NSUInteger)columnModes; + +@property (nonatomic, weak) id delegate; + +- (void)beginDiscovery; + +- (WGWidgetHostingViewController *)widgetWithIdentifier:(NSString *)identifier delegate:(id)delegate forRequesterWithIdentifier:(NSString *)requesterIdentifier; + +@end + +//////// + +@interface HBCZNotificationWidgetViewController : UIViewController + +@end diff --git a/HBCZNotificationWidgetViewController.x b/HBCZNotificationWidgetViewController.x new file mode 100644 index 0000000..c596667 --- /dev/null +++ b/HBCZNotificationWidgetViewController.x @@ -0,0 +1,40 @@ +#import "HBCZNotificationWidgetViewController.h" +#import + +%subclass HBCZNotificationWidgetViewController : UIViewController + +- (void)loadView { + %orig; + + WGWidgetDiscoveryController *discoverer = [[%c(WGWidgetDiscoveryController) alloc] initWithColumnModes:0]; + [discoverer beginDiscovery]; + + WGWidgetHostingViewController *viewController = [discoverer widgetWithIdentifier:@"ws.hbang.canzone.app.nowplayingwidget" delegate:self forRequesterWithIdentifier:@"ws.hbang.canzone.app"]; + + [viewController willMoveToParentViewController:self]; + viewController.view.frame = self.view.bounds; + viewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + [self.view addSubview:viewController.view]; +} + +#pragma mark - Widget hosting + +%new - (CGSize)maxSizeForWidget:(WGWidgetHostingViewController *)widgetViewController forDisplayMode:(NCWidgetDisplayMode)displayMode { + return CGSizeMake(self.view.frame.size.width, 65); +} + +%new - (NCWidgetDisplayMode)activeLayoutModeForWidget:(WGWidgetHostingViewController *)widgetViewController { + return NCWidgetDisplayModeCompact; +} + +%new - (UIEdgeInsets)marginInsetsForWidget:(WGWidgetHostingViewController *)widgetViewController { + return UIEdgeInsetsZero; +} + +%end + +%ctor { + if (IS_IOS_OR_NEWER(iOS_10_0)) { + %init; + } +} diff --git a/HBCZNowPlayingController.x b/HBCZNowPlayingController.x index f167557..3605eca 100644 --- a/HBCZNowPlayingController.x +++ b/HBCZNowPlayingController.x @@ -45,7 +45,7 @@ // listen for the now playing change notification [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_mediaInfoDidChange:) name:(__bridge NSString *)kMRMediaRemoteNowPlayingInfoDidChangeNotification object:nil]; - NSBundle *mpuiBundle = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/MediaPlayerUI.framework"]; + NSBundle *mpuiBundle = [NSBundle bundleWithIdentifier:@"com.apple.MediaPlayerUI"]; UIImage *placeholderImage = [UIImage imageNamed:@"placeholder-artwork" inBundle:mpuiBundle]; _placeholderArtData = UIImagePNGRepresentation(placeholderImage); } diff --git a/NotificationNew.x b/NotificationNew.x index 882a345..c712af3 100644 --- a/NotificationNew.x +++ b/NotificationNew.x @@ -1,4 +1,4 @@ -#import "HBCZNotificationMediaControlsViewController.h" +#import "HBCZNotificationWidgetViewController.h" #import "HBCZNowPlayingBulletinProvider.h" #import "HBCZNowPlayingController.h" #import "HBCZPreferences.h" @@ -115,9 +115,10 @@ static BOOL reuseIdentifierHax = NO; @interface NCNotificationContentView () - (BOOL)_hb_isCanzoneNotification; +- (BOOL)_hb_isCanzoneLockNotification; @property (nonatomic, retain) NSString *hb_canzoneSongIdentifier; -@property (nonatomic, retain) HBCZNotificationMediaControlsViewController *hb_canzoneControlsViewController; +@property (nonatomic, retain) HBCZNotificationWidgetViewController *hb_canzoneWidgetViewController; @property (nonatomic, retain) MPUTransportControlsView *hb_canzoneControlsView; @end @@ -125,8 +126,7 @@ static BOOL reuseIdentifierHax = NO; %hook NCNotificationContentView %property (nonatomic, retain) NSString *hb_canzoneSongIdentifier; -%property (nonatomic, retain) HBCZNotificationMediaControlsViewController *hb_canzoneControlsViewController; -%property (nonatomic, retain) MPUTransportControlsView *hb_canzoneControlsView; +%property (nonatomic, retain) HBCZNotificationWidgetViewController *hb_canzoneWidgetViewController; - (instancetype)initWithStyle:(NSInteger)style { self = %orig; @@ -149,8 +149,26 @@ static BOOL reuseIdentifierHax = NO; } } +%new - (BOOL)_hb_isCanzoneLockNotification { + if (!self._hb_isCanzoneNotification) { + return NO; + } + + UIViewController *viewController = self._viewControllerForAncestor; + + // walk up the view controller hierarchy until we hit either SBDashBoardViewController, or nil. + // we don't specifically use SBDashBoardMainPageViewController because metrolockscreen replaces + // it, or something + do { + viewController = viewController.parentViewController; + } while (viewController && ![viewController isKindOfClass:%c(SBDashBoardViewController)]); + + // if we got a non-nil view controller, we know we're on the lock screen + return viewController != nil; +} + %new - (void)_hb_canzoneThumbnailChanged:(NSNotification *)notification { - if (self._hb_isCanzoneNotification) { + if (self._hb_isCanzoneNotification && !preferences.showBannerControls) { NSString *identifier = self.hb_canzoneSongIdentifier; if (!identifier) { @@ -185,40 +203,28 @@ static BOOL reuseIdentifierHax = NO; BOOL isCanzoneNotification = self._hb_isCanzoneNotification; if (isCanzoneNotification) { - HBCZNotificationMediaControlsViewController *viewController = self.hb_canzoneControlsViewController; - MPUTransportControlsView *controlsView = self.hb_canzoneControlsView; + UIView *contentView = [self valueForKey:@"_contentView"]; + HBCZNotificationWidgetViewController *viewController = self.hb_canzoneWidgetViewController; - if (!viewController) { - viewController = [[%c(HBCZNotificationMediaControlsViewController) alloc] init]; - self.hb_canzoneControlsViewController = viewController; - } + if (preferences.showBannerControls && self._hb_isCanzoneLockNotification) { + if (!viewController) { + UIViewController *parentViewController = self._viewControllerForAncestor; - if (!controlsView && preferences.showBannerControls) { - controlsView = viewController.view.transportControls; - controlsView.alpha = 0.9f; - controlsView.minimumNumberOfTransportButtonsForLayout = 2; - controlsView.frame = CGRectMake(self.frame.size.width - 100.f - 15.f, 0, 100.f, self.frame.size.height); - controlsView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin; - [self addSubview:controlsView]; - - self.hb_canzoneControlsView = controlsView; + viewController = [[%c(HBCZNotificationWidgetViewController) alloc] init]; + [viewController willMoveToParentViewController:parentViewController]; + viewController.view.frame = self.bounds; + viewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + [self addSubview:viewController.view]; + + self.hb_canzoneWidgetViewController = viewController; + } } - controlsView.hidden = preferences.showBannerControls; + viewController.view.hidden = !preferences.showBannerControls; + contentView.hidden = !viewController.view.hidden; } %orig; - - if (isCanzoneNotification && preferences.showBannerControls) { - UIView *contentView = [self valueForKey:@"_contentView"]; - - // TODO: something not as stupid as this!!! - contentView.clipsToBounds = YES; - - CGRect contentFrame = contentView.frame; - contentFrame.size.width -= 115.f; - contentView.frame = contentFrame; - } } %end