From b8a4093c75a7b6e1997c201ac6be63cb14512b7a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 21 Jan 2016 14:03:07 -0500 Subject: [PATCH] Preserve app art when updating the app list --- Limelight/Database/DataManager.h | 5 +- Limelight/Database/DataManager.m | 44 +++++++++++++++++- Limelight/Database/TemporaryApp.m | 1 - Limelight/Database/TemporaryHost.h | 6 +-- Limelight/Database/TemporaryHost.m | 18 +------- .../ViewControllers/MainFrameViewController.m | 46 ++++++++++++++++++- 6 files changed, 92 insertions(+), 28 deletions(-) diff --git a/Limelight/Database/DataManager.h b/Limelight/Database/DataManager.h index a4b5600..7ac8ef0 100644 --- a/Limelight/Database/DataManager.h +++ b/Limelight/Database/DataManager.h @@ -18,6 +18,8 @@ - (NSArray*) getHosts; - (void) updateHost:(TemporaryHost*)host; +- (void) updateAppsForExistingHost:(TemporaryHost *)host; +- (void) updateIconForExistingApp:(TemporaryApp*)app; - (void) removeHost:(TemporaryHost*)host; - (TemporarySettings*) getSettings; @@ -25,7 +27,4 @@ - (void) updateUniqueId:(NSString*)uniqueId; - (NSString*) getUniqueId; -// Don't call this outside of database code -- (App*) getAppForTemporaryApp:(TemporaryApp*)tempApp; - @end diff --git a/Limelight/Database/DataManager.m b/Limelight/Database/DataManager.m index e9b643a..5fa1648 100644 --- a/Limelight/Database/DataManager.m +++ b/Limelight/Database/DataManager.m @@ -68,7 +68,49 @@ } // Push changes from the temp host to the persistent one - [host propagateChangesToParent:parent withDm:self]; + [host propagateChangesToParent:parent]; + + [self saveData]; + }]; +} + +- (void) updateAppsForExistingHost:(TemporaryHost *)host { + [_managedObjectContext performBlockAndWait:^{ + Host* parent = [self getHostForTemporaryHost:host]; + if (parent == nil) { + // The host must exist to be updated + return; + } + + NSMutableSet *applist = [[NSMutableSet alloc] init]; + for (TemporaryApp* app in host.appList) { + // Add a new persistent managed object if one doesn't exist + App* parentApp = [self getAppForTemporaryApp:app]; + if (parentApp == nil) { + NSEntityDescription* entity = [NSEntityDescription entityForName:@"App" inManagedObjectContext:_managedObjectContext]; + parentApp = [[App alloc] initWithEntity:entity insertIntoManagedObjectContext:_managedObjectContext]; + } + + [app propagateChangesToParent:parentApp withHost:parent]; + + [applist addObject:parentApp]; + } + + parent.appList = applist; + + [self saveData]; + }]; +} + +- (void) updateIconForExistingApp:(TemporaryApp*)app { + [_managedObjectContext performBlockAndWait:^{ + App* parentApp = [self getAppForTemporaryApp:app]; + if (parentApp == nil) { + // The app must exist to be updated + return; + } + + parentApp.image = app.image; [self saveData]; }]; diff --git a/Limelight/Database/TemporaryApp.m b/Limelight/Database/TemporaryApp.m index f328e19..fc8e1c3 100644 --- a/Limelight/Database/TemporaryApp.m +++ b/Limelight/Database/TemporaryApp.m @@ -24,7 +24,6 @@ - (void) propagateChangesToParent:(App*)parent withHost:(Host*)host { parent.id = self.id; - parent.image = self.image; parent.name = self.name; parent.host = host; } diff --git a/Limelight/Database/TemporaryHost.h b/Limelight/Database/TemporaryHost.h index c1c4731..d762042 100644 --- a/Limelight/Database/TemporaryHost.h +++ b/Limelight/Database/TemporaryHost.h @@ -10,8 +10,6 @@ #import "Utils.h" #import "Host.h" -@class DataManager; - @interface TemporaryHost : NSObject @property (nonatomic) BOOL online; @@ -26,13 +24,13 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, retain) NSString *mac; @property (nonatomic, retain) NSString *name; @property (nonatomic, retain) NSString *uuid; -@property (nonatomic, retain) NSSet *appList; +@property (nonatomic, retain) NSMutableSet *appList; - (id) initFromHost:(Host*)host; - (NSComparisonResult)compareName:(TemporaryHost *)other; -- (void) propagateChangesToParent:(Host*)host withDm:(DataManager*)dm; +- (void) propagateChangesToParent:(Host*)host; NS_ASSUME_NONNULL_END diff --git a/Limelight/Database/TemporaryHost.m b/Limelight/Database/TemporaryHost.m index 6fd7cb3..334368f 100644 --- a/Limelight/Database/TemporaryHost.m +++ b/Limelight/Database/TemporaryHost.m @@ -37,7 +37,7 @@ return self; } -- (void) propagateChangesToParent:(Host*)parentHost withDm:(DataManager*)dm { +- (void) propagateChangesToParent:(Host*)parentHost { parentHost.address = self.address; parentHost.externalAddress = self.externalAddress; parentHost.localAddress = self.localAddress; @@ -45,22 +45,6 @@ parentHost.name = self.name; parentHost.uuid = self.uuid; parentHost.pairState = [NSNumber numberWithInt:self.pairState]; - - NSMutableSet *applist = [[NSMutableSet alloc] init]; - for (TemporaryApp* app in self.appList) { - // Add a new persistent managed object if one doesn't exist - App* parentApp = [dm getAppForTemporaryApp:app]; - if (parentApp == nil) { - NSEntityDescription* entity = [NSEntityDescription entityForName:@"App" inManagedObjectContext:parentHost.managedObjectContext]; - parentApp = [[App alloc] initWithEntity:entity insertIntoManagedObjectContext:parentHost.managedObjectContext]; - } - - [app propagateChangesToParent:parentApp withHost:parentHost]; - - [applist addObject:parentApp]; - } - - parentHost.appList = applist; } - (NSComparisonResult)compareName:(TemporaryHost *)other { diff --git a/Limelight/ViewControllers/MainFrameViewController.m b/Limelight/ViewControllers/MainFrameViewController.m index 8e7c3ec..4da2f1b 100644 --- a/Limelight/ViewControllers/MainFrameViewController.m +++ b/Limelight/ViewControllers/MainFrameViewController.m @@ -161,9 +161,48 @@ static NSMutableSet* hostList; - (void) updateApplist:(NSSet*) newList forHost:(TemporaryHost*)host { DataManager* database = [[DataManager alloc] init]; - host.appList = newList; + for (TemporaryApp* app in newList) { + BOOL appAlreadyInList = NO; + for (TemporaryApp* savedApp in host.appList) { + if ([app.id isEqualToString:savedApp.id]) { + savedApp.name = app.name; + savedApp.isRunning = app.isRunning; + appAlreadyInList = YES; + break; + } + } + if (!appAlreadyInList) { + app.host = host; + [host.appList addObject:app]; + } + } + + BOOL appWasRemoved; + do { + appWasRemoved = NO; + + for (TemporaryApp* app in host.appList) { + appWasRemoved = YES; + for (TemporaryApp* mergedApp in newList) { + if ([mergedApp.id isEqualToString:app.id]) { + appWasRemoved = NO; + break; + } + } + if (appWasRemoved) { + // Removing the app mutates the list we're iterating (which isn't legal). + // We need to jump out of this loop and restart enumeration. + + [host.appList removeObject:app]; + + break; + } + } + + // Keep looping until the list is no longer being mutated + } while (appWasRemoved); - [database updateHost:host]; + [database updateAppsForExistingHost:host]; } - (void)showHostSelectionView { @@ -179,6 +218,9 @@ static NSMutableSet* hostList; // on the main thread [self updateBoxArtCacheForApp:app]; + DataManager* dataManager = [[DataManager alloc] init]; + [dataManager updateIconForExistingApp: app]; + dispatch_async(dispatch_get_main_queue(), ^{ [self.collectionView reloadData]; });