Skip to content

Commit

Permalink
Merge pull request #1053 from wutschel/feature_blurredcover_ipad
Browse files Browse the repository at this point in the history
Feature: Blurred cover for iPad
  • Loading branch information
kambala-decapitator committed May 11, 2024
2 parents a057d45 + 5f87b4d commit eb72b3d
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 23 deletions.
1 change: 1 addition & 0 deletions XBMC Remote/NowPlaying.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@
@property (strong, nonatomic) OBSlider *ProgressSlider;
@property (strong, nonatomic) UIView *BottomView;
@property (strong, nonatomic) UIView *playlistToolbarView;
@property (strong, nonatomic) UIView *toolbarBackground;
@property (strong, nonatomic) IBOutlet UIView *scrabbingView;
@property (strong, nonatomic) IBOutlet UITextView *itemDescription;

Expand Down
25 changes: 14 additions & 11 deletions XBMC Remote/NowPlaying.m
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ @implementation NowPlaying
@synthesize ProgressSlider;
@synthesize BottomView;
@synthesize playlistToolbarView;
@synthesize toolbarBackground;
@synthesize scrabbingView;
@synthesize itemDescription;

Expand Down Expand Up @@ -135,11 +136,11 @@ - (void)updateBlurredCoverBackground:(UIImage*)image {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if ([userDefaults boolForKey:@"blurred_cover_preference"] && IS_IPHONE) {
[Utilities imageView:fullscreenCover AnimDuration:1.0 Image:image];
visualEffectView.alpha = 1;
visualEffectView.hidden = NO;
}
else {
fullscreenCover.image = nil;
visualEffectView.alpha = 0;
visualEffectView.hidden = YES;
}
}

Expand Down Expand Up @@ -450,14 +451,14 @@ - (void)nothingIsPlaying {
shuffleButton.hidden = YES;
hiresImage.hidden = YES;
musicPartyMode = 0;
[self notifyChangeForBackgroundImage:nil];
[self notifyChangeForBackgroundImage:nil coverImage:nil];
[self hidePlaylistProgressbarWithDeselect:YES];
[self showPlaylistTable];
[self toggleSongDetails];

// Unload and hide blurred cover effect
fullscreenCover.image = nil;
visualEffectView.alpha = 0;
visualEffectView.hidden = YES;
}

- (void)setButtonImageAndStartDemo:(UIImage*)buttonImage {
Expand Down Expand Up @@ -612,15 +613,13 @@ - (void)getActivePlayers {
NSString *serverURL = [Utilities getImageServerURL];
NSString *thumbnailPath = [self getNowPlayingThumbnailPath:nowPlayingInfo];
NSString *stringURL = [Utilities formatStringURL:thumbnailPath serverURL:serverURL];
NSString *fanart = [Utilities getStringFromItem:nowPlayingInfo[@"fanart"]];
if (![lastThumbnail isEqualToString:stringURL] || [lastThumbnail isEqualToString:@""]) {
if (IS_IPAD) {
NSString *fanart = [Utilities getStringFromItem:nowPlayingInfo[@"fanart"]];
[self notifyChangeForBackgroundImage:fanart];
}
if (!thumbnailPath.length) {
UIImage *image = [UIImage imageNamed:@"coverbox_back"];
[self processLoadedThumbImage:self thumb:thumbnailView image:image enableJewel:enableJewel];
[self updateBlurredCoverBackground:nil];
[self notifyChangeForBackgroundImage:fanart coverImage:nil];
}
else {
__weak UIImageView *thumb = thumbnailView;
Expand All @@ -631,6 +630,7 @@ - (void)getActivePlayers {
if (error == nil) {
[weakSelf processLoadedThumbImage:weakSelf thumb:thumb image:image enableJewel:enableJewel];
[weakSelf updateBlurredCoverBackground:image];
[weakSelf notifyChangeForBackgroundImage:fanart coverImage:image];
}
}];
}
Expand Down Expand Up @@ -806,10 +806,13 @@ - (void)getActivePlayers {
}];
}

- (void)notifyChangeForBackgroundImage:(NSString*)bgImagePath {
- (void)notifyChangeForBackgroundImage:(NSString*)bgImagePath coverImage:(UIImage*)coverImage {
if (IS_IPAD) {
NSDictionary *params = @{@"image": bgImagePath ?: @""};
[[NSNotificationCenter defaultCenter] postNotificationName:@"UIViewChangeBackgroundImage" object:nil userInfo:params];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
bgImagePath ?: @"", @"image",
coverImage, @"cover",
nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"IpadChangeBackgroundImage" object:nil userInfo:params];
}
}

Expand Down
2 changes: 2 additions & 0 deletions XBMC Remote/ViewControllerIPad.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
BOOL serverPicker;
BOOL appInfo;
UIImageView *fanartBackgroundImage;
UIImageView *coverBackgroundImage;
UIVisualEffectView *visualEffectView;
BOOL isFullscreen;
MessagesView *messagesView;
}
Expand Down
61 changes: 49 additions & 12 deletions XBMC Remote/ViewControllerIPad.m
Original file line number Diff line number Diff line change
Expand Up @@ -395,13 +395,33 @@ - (void)viewDidLoad {
rootView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
rootView.backgroundColor = UIColor.clearColor;

fanartBackgroundImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
fanartBackgroundImage = [[UIImageView alloc] initWithFrame:self.view.bounds];
fanartBackgroundImage.autoresizingMask = rootView.autoresizingMask;
fanartBackgroundImage.contentMode = UIViewContentModeScaleAspectFill;
fanartBackgroundImage.alpha = 0.05;
fanartBackgroundImage.layer.minificationFilter = kCAFilterTrilinear;
fanartBackgroundImage.layer.magnificationFilter = kCAFilterTrilinear;
[self.view addSubview:fanartBackgroundImage];

coverBackgroundImage = [[UIImageView alloc] initWithFrame:self.view.bounds];
coverBackgroundImage.autoresizingMask = rootView.autoresizingMask;
coverBackgroundImage.contentMode = UIViewContentModeScaleAspectFill;
coverBackgroundImage.layer.minificationFilter = kCAFilterTrilinear;
coverBackgroundImage.layer.magnificationFilter = kCAFilterTrilinear;
[self.view addSubview:coverBackgroundImage];

visualEffectView = [[UIVisualEffectView alloc] initWithFrame:self.view.bounds];
visualEffectView.autoresizingMask = rootView.autoresizingMask;
visualEffectView.effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
[self.view addSubview:visualEffectView];

// Add gradient overlay to improve readability of control elements and labels
UIImageView *overlayGradient = [[UIImageView alloc] initWithFrame:self.view.bounds];
overlayGradient.autoresizingMask = rootView.autoresizingMask;
overlayGradient.image = [UIImage imageNamed:@"overlay_gradient"];
overlayGradient.contentMode = UIViewContentModeScaleToFill;
overlayGradient.alpha = 0.5;
[visualEffectView.contentView addSubview:overlayGradient];

rightSlideView = [[UIView alloc] initWithFrame:CGRectMake(PAD_MENU_TABLE_WIDTH, 0, rootView.frame.size.width - PAD_MENU_TABLE_WIDTH, rootView.frame.size.height - TOOLBAR_HEIGHT)];
rightSlideView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Expand Down Expand Up @@ -567,7 +587,7 @@ - (void)viewDidLoad {
object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(handleChangeBackgroundImage:)
name: @"UIViewChangeBackgroundImage"
name: @"IpadChangeBackgroundImage"
object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(handleNowPlayingFullscreenToggle)
Expand All @@ -590,6 +610,7 @@ - (void)handleNowPlayingFullscreenToggle {
[UIView animateWithDuration:0.3
animations:^{
playlistHeader.alpha = menuViewController.view.alpha = isFullscreen ? 0 : 1;
self.nowPlayingController.toolbarBackground.alpha = isFullscreen ? 0.4 : 1;
[self.nowPlayingController setNowPlayingDimension:[self currentScreenBoundsDependOnOrientation].size.width
height:[self currentScreenBoundsDependOnOrientation].size.height
YPOS:-YPOS
Expand All @@ -600,18 +621,34 @@ - (void)handleNowPlayingFullscreenToggle {
}

- (void)handleChangeBackgroundImage:(NSNotification*)sender {
NSString *fanart = [sender.userInfo objectForKey:@"image"];
if (fanart.length) {
NSString *serverURL = [Utilities getImageServerURL];
NSString *fanartURL = [Utilities formatStringURL:fanart serverURL:serverURL];
[fanartBackgroundImage sd_setImageWithURL:[NSURL URLWithString:fanartURL]
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *url) {
UIImage *fanartImage = (error == nil && image != nil) ? image : [UIImage new];
[Utilities imageView:fanartBackgroundImage AnimDuration:1.0 Image:fanartImage];
}];
NSDictionary *params = sender.userInfo;
UIImage *coverImage = params[@"cover"];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// Prefer blurred cover feature over fanart. Fall back to fanart, if no cover is present.
if ([userDefaults boolForKey:@"blurred_cover_preference"] && coverImage) {
// Enable blur effect and animate to cover image
visualEffectView.hidden = NO;
[Utilities imageView:coverBackgroundImage AnimDuration:1.0 Image:coverImage];
}
else {
[Utilities imageView:fanartBackgroundImage AnimDuration:1.0 Image:[UIImage new]];
// Disable blur effect and remove cover image
visualEffectView.hidden = YES;
coverBackgroundImage.image = nil;

// Load and animate background to fanart, if present.
NSString *fanart = params[@"image"];
if (fanart.length) {
NSString *serverURL = [Utilities getImageServerURL];
NSString *fanartURL = [Utilities formatStringURL:fanart serverURL:serverURL];
[fanartBackgroundImage sd_setImageWithURL:[NSURL URLWithString:fanartURL]
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *url) {
UIImage *fanartImage = (error == nil && image != nil) ? image : nil;
[Utilities imageView:fanartBackgroundImage AnimDuration:1.0 Image:fanartImage];
}];
}
else {
[Utilities imageView:fanartBackgroundImage AnimDuration:1.0 Image:nil];
}
}
}

Expand Down

0 comments on commit eb72b3d

Please sign in to comment.