Skip to content
This repository has been archived by the owner on Jun 21, 2020. It is now read-only.

Commit

Permalink
[tweak] ditch the on-banner controls, use an embedded widget!
Browse files Browse the repository at this point in the history
  • Loading branch information
kirb committed Jul 7, 2017
1 parent 4cb763d commit 44564db
Show file tree
Hide file tree
Showing 6 changed files with 148 additions and 60 deletions.
6 changes: 0 additions & 6 deletions HBCZNotificationMediaControlsViewController.h

This file was deleted.

21 changes: 0 additions & 21 deletions HBCZNotificationMediaControlsViewController.x

This file was deleted.

69 changes: 69 additions & 0 deletions HBCZNotificationWidgetViewController.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
@import NotificationCenter;

@class WGWidgetHostingViewController;

@protocol WGWidgetHostingViewControllerDelegate <NSObject>

@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 <NSObject>

@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 <WGWidgetDiscoveryControllerDelegate> delegate;

- (void)beginDiscovery;

- (WGWidgetHostingViewController *)widgetWithIdentifier:(NSString *)identifier delegate:(id<WGWidgetHostingViewControllerDelegate>)delegate forRequesterWithIdentifier:(NSString *)requesterIdentifier;

@end

////////

@interface HBCZNotificationWidgetViewController : UIViewController <WGWidgetDiscoveryControllerDelegate, WGWidgetHostingViewControllerDelegate>

@end
40 changes: 40 additions & 0 deletions HBCZNotificationWidgetViewController.x
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#import "HBCZNotificationWidgetViewController.h"
#import <version.h>

%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;
}
}
2 changes: 1 addition & 1 deletion HBCZNowPlayingController.x
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
70 changes: 38 additions & 32 deletions NotificationNew.x
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#import "HBCZNotificationMediaControlsViewController.h"
#import "HBCZNotificationWidgetViewController.h"
#import "HBCZNowPlayingBulletinProvider.h"
#import "HBCZNowPlayingController.h"
#import "HBCZPreferences.h"
Expand Down Expand Up @@ -115,18 +115,18 @@ 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

%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;
Expand All @@ -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) {
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 44564db

Please sign in to comment.