summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Fischer <joeljfischer@gmail.com>2020-03-11 13:17:19 -0400
committerJoel Fischer <joeljfischer@gmail.com>2020-03-11 13:17:19 -0400
commit3ddbb025c5e8b465c641d4654cfff2859189920c (patch)
treeda1eb5b2394dedd2fd0f8384139dc075d291ccfe
parentcfb751738ea7854e243b3fb24a121d5c3fa4114d (diff)
downloadsdl_ios-3ddbb025c5e8b465c641d4654cfff2859189920c.tar.gz
Update SoftButtonManager
* Update how the soft button manager updates its capabilities * Only send a replace operation if the capabilities changed * Break from the loop early
-rw-r--r--SmartDeviceLink/SDLSoftButtonManager.m31
1 files changed, 18 insertions, 13 deletions
diff --git a/SmartDeviceLink/SDLSoftButtonManager.m b/SmartDeviceLink/SDLSoftButtonManager.m
index 858f29ef8..2c0616ab7 100644
--- a/SmartDeviceLink/SDLSoftButtonManager.m
+++ b/SmartDeviceLink/SDLSoftButtonManager.m
@@ -47,7 +47,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic) NSOperationQueue *transactionQueue;
-@property (strong, nonatomic, nullable) SDLWindowCapability *windowCapability;
+@property (strong, nonatomic, nullable) SDLSoftButtonCapabilities *softButtonCapabilities;
@property (copy, nonatomic, nullable) SDLHMILevel currentLevel;
@property (strong, nonatomic) NSMutableArray<SDLAsynchronousOperation *> *batchQueue;
@@ -82,7 +82,7 @@ NS_ASSUME_NONNULL_BEGIN
_softButtonObjects = @[];
_currentMainField1 = nil;
_currentLevel = nil;
- _windowCapability = nil;
+ _softButtonCapabilities = nil;
[_transactionQueue cancelAllOperations];
self.transactionQueue = [self sdl_newTransactionQueue];
@@ -100,12 +100,10 @@ NS_ASSUME_NONNULL_BEGIN
return queue;
}
-/// Suspend the queue if the soft button capabilities are nil or there are no capability objects in the array (we assume that soft buttons are not supported)
+/// Suspend the queue if the soft button capabilities are nil (we assume that soft buttons are not supported)
/// OR if the HMI level is NONE since we want to delay sending RPCs until we're in non-NONE
- (void)sdl_updateTransactionQueueSuspended {
- if (self.windowCapability.softButtonCapabilities == nil
- || self.windowCapability.softButtonCapabilities.count == 0
- || [self.currentLevel isEqualToEnum:SDLHMILevelNone]) {
+ if (self.softButtonCapabilities == nil || [self.currentLevel isEqualToEnum:SDLHMILevelNone]) {
self.transactionQueue.suspended = YES;
} else {
self.transactionQueue.suspended = NO;
@@ -142,7 +140,7 @@ NS_ASSUME_NONNULL_BEGIN
_softButtonObjects = softButtonObjects;
// We only need to pass the first `softButtonCapabilities` in the array due to the fact that all soft button capabilities are the same (i.e. there is no way to assign a `softButtonCapabilities` to a specific soft button).
- SDLSoftButtonReplaceOperation *op = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager capabilities:self.windowCapability.softButtonCapabilities.firstObject softButtonObjects:_softButtonObjects mainField1:self.currentMainField1];
+ SDLSoftButtonReplaceOperation *op = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager capabilities:self.softButtonCapabilities softButtonObjects:_softButtonObjects mainField1:self.currentMainField1];
if (self.isBatchingUpdates) {
[self.batchQueue removeAllObjects];
@@ -154,7 +152,7 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)sdl_transitionSoftButton:(SDLSoftButtonObject *)softButton {
- SDLSoftButtonTransitionOperation *op = [[SDLSoftButtonTransitionOperation alloc] initWithConnectionManager:self.connectionManager capabilities:self.windowCapability.softButtonCapabilities.firstObject softButtons:self.softButtonObjects mainField1:self.currentMainField1];
+ SDLSoftButtonTransitionOperation *op = [[SDLSoftButtonTransitionOperation alloc] initWithConnectionManager:self.connectionManager capabilities:self.softButtonCapabilities softButtons:self.softButtonObjects mainField1:self.currentMainField1];
if (self.isBatchingUpdates) {
for (SDLAsynchronousOperation *sbOperation in self.batchQueue) {
@@ -211,24 +209,31 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Observers
- (void)sdl_displayCapabilityDidUpdate:(SDLSystemCapability *)systemCapability {
+ SDLSoftButtonCapabilities *oldCapabilities = self.softButtonCapabilities;
+
+ // Extract and update the capabilities
NSArray<SDLDisplayCapability *> *capabilities = systemCapability.displayCapabilities;
if (capabilities == nil || capabilities.count == 0) {
- self.windowCapability = nil;
+ self.softButtonCapabilities = nil;
} else {
SDLDisplayCapability *mainDisplay = capabilities[0];
for (SDLWindowCapability *windowCapability in mainDisplay.windowCapabilities) {
NSUInteger currentWindowID = windowCapability.windowID != nil ? windowCapability.windowID.unsignedIntegerValue : SDLPredefinedWindowsDefaultWindow;
if (currentWindowID == SDLPredefinedWindowsDefaultWindow) {
- self.windowCapability = windowCapability;
+ self.softButtonCapabilities = windowCapability.softButtonCapabilities.firstObject;
+ break;
}
}
}
+ // Update the queue's suspend state
[self sdl_updateTransactionQueueSuspended];
- // Auto-send an updated Show to account for changes to the capabilities
- if (self.softButtonObjects.count > 0 && self.windowCapability.softButtonCapabilities != nil) {
- SDLSoftButtonReplaceOperation *op = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager capabilities:self.windowCapability.softButtonCapabilities.firstObject softButtonObjects:self.softButtonObjects mainField1:self.currentMainField1];
+ // Auto-send an updated Show if we have new capabilities
+ if (self.softButtonObjects.count > 0
+ && self.softButtonCapabilities != nil
+ && ![self.softButtonCapabilities isEqual:oldCapabilities]) {
+ SDLSoftButtonReplaceOperation *op = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager capabilities:self.softButtonCapabilities softButtonObjects:self.softButtonObjects mainField1:self.currentMainField1];
[self.transactionQueue addOperation:op];
}
}