diff --git a/CHANGELOG.md b/CHANGELOG.md index 0decb958..47b97d4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 1.5.3.9 + +Fixes: + +* Fix voice tutorial so it continues to poll after an error + ## 1.5.3.8 New: diff --git a/Extensions/RoomConditions/Info.plist b/Extensions/RoomConditions/Info.plist index 14517fa4..5e043ee3 100644 --- a/Extensions/RoomConditions/Info.plist +++ b/Extensions/RoomConditions/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 1.5.3.8 + 1.5.3.9 NSExtension NSExtensionMainStoryboard diff --git a/SleepModel/HEMDeviceService.m b/SleepModel/HEMDeviceService.m index 27839a7e..db85c598 100644 --- a/SleepModel/HEMDeviceService.m +++ b/SleepModel/HEMDeviceService.m @@ -28,7 +28,6 @@ NSString* const HEMDeviceServiceErrorDomain = @"is.hello.app.service.device"; static NSInteger const HEMPillDfuPillMinimumRSSI = -70; -static NSString* const HEMPillDfuBinURL = @"https://s3.amazonaws.com/hello-firmware/kodobannin/mobile/pill.hex"; static NSString* const HEMPillDfuPrefLastUpdate = @"HEMPillDfuPrefLastUpdate"; static NSUInteger const HEMPillDfuSuppressionReq = 2; // will not show dfu updates if done within the hour static CGFloat const HEMPillDfuMinPhoneBattery = 0.2f; diff --git a/SleepModel/HEMRoomConditionsPresenter.m b/SleepModel/HEMRoomConditionsPresenter.m index 942961c2..39f98506 100644 --- a/SleepModel/HEMRoomConditionsPresenter.m +++ b/SleepModel/HEMRoomConditionsPresenter.m @@ -592,7 +592,7 @@ - (void)configureSensorCell:(HEMSensorCollectionViewCell*)sensorCell forSensor:( [[sensorCell descriptionLabel] setText:[sensor localizedMessage]]; [[sensorCell nameLabel] setText:[[sensor localizedName] uppercaseString]]; - CGFloat minValue = MAX(0.0f, [chartView chartYMin]); + CGFloat minValue = [chartView chartYMin]; CGFloat maxValue = [chartView chartYMax]; [[self formatter] setIncludeUnitSymbol:YES]; diff --git a/SleepModel/HEMSensorDetailPresenter.m b/SleepModel/HEMSensorDetailPresenter.m index 984d2c0c..ebd617a3 100644 --- a/SleepModel/HEMSensorDetailPresenter.m +++ b/SleepModel/HEMSensorDetailPresenter.m @@ -65,6 +65,9 @@ @interface HEMSensorDetailPresenter() < @property (nonatomic, weak) HEMSensorValueCollectionViewCell* valueCell; @property (nonatomic, assign) SENSensorType type; +@property (nonatomic, assign) CGFloat chartMinValue; +@property (nonatomic, assign) CGFloat chartMaxValue; + @end @implementation HEMSensorDetailPresenter @@ -75,6 +78,8 @@ - (instancetype)initWithSensorService:(HEMSensorService*)sensorService _sensorService = sensorService; _sensor = sensor; _type = [sensor type]; + _chartMinValue = MAXFLOAT; + _chartMaxValue = 0.0f; _xAxisLabelFormatter = [NSDateFormatter new]; _exactTimeFormatter = [NSDateFormatter new]; _formatter = [[HEMSensorValueFormatter alloc] initWithSensorUnit:[sensor unit]]; @@ -225,6 +230,15 @@ - (void)prepareChartDataAndReload { [labelData addObject:[[strongSelf xAxisLabelFormatter] stringFromDate:[time date]]]; } + + if (entryValue < [strongSelf chartMinValue]) { + [strongSelf setChartMinValue:entryValue]; + } + + if (entryValue > [strongSelf chartMaxValue]) { + [strongSelf setChartMaxValue:entryValue]; + } + index++; } [strongSelf setChartData:chartData]; @@ -242,6 +256,8 @@ - (void)clearData { [self setSensorData:nil]; [self setXLabelData:nil]; [self setStatus:nil]; + [self setChartMaxValue:0.0f]; + [self setChartMinValue:MAXFLOAT]; } - (void)setPollScope:(HEMSensorServiceScope)scope { @@ -367,7 +383,6 @@ - (LineChartView*)chartViewForSensor:(SENSensor*)sensor LineChartView* lineChartView = (id) [[cell chartContentView] chartView]; if (!lineChartView) { lineChartView = [[LineChartView alloc] initForSensorWithFrame:[[cell chartContentView] bounds]]; - [lineChartView setHighlightPerDragEnabled:NO]; } NSArray *gradientColors = [lineChartView gradientColorsWithColor:sensorColor]; @@ -453,13 +468,16 @@ - (void)configureChartCell:(HEMSensorChartCollectionViewCell*)chartCell { [[[chartCell chartContentView] botLimitLabel] setText:nil]; } else { chartView = [self chartViewForSensor:[self sensor] inCell:chartCell]; - CGFloat minValue = MAX(0.0f, [chartView chartYMin]); - CGFloat maxValue = [chartView chartYMax]; [chartContainer showLoadingActivity:NO]; [[chartContainer noDataLabel] setHidden:YES]; [chartContainer setChartView:chartView]; - [[chartContainer topLimitLabel] setText:[[self formatter] stringFromSensorValue:@(maxValue)]]; - [[chartContainer botLimitLabel] setText:[[self formatter] stringFromSensorValue:@(minValue)]]; + + NSNumber* minValue = @([chartView chartYMin]); + NSNumber* maxValue = @([chartView chartYMax]); + NSString* minText = [[self formatter] stringFromSensorValue:minValue]; + NSString* maxText = [[self formatter] stringFromSensorValue:maxValue]; + [[chartContainer topLimitLabel] setText:maxText]; + [[chartContainer botLimitLabel] setText:minText]; if (![self chartLoaded] && [[self chartData] count] > 0) { [chartView animateIn]; diff --git a/SleepModel/HEMVoiceService.m b/SleepModel/HEMVoiceService.m index a4c22fa8..703cb49d 100644 --- a/SleepModel/HEMVoiceService.m +++ b/SleepModel/HEMVoiceService.m @@ -22,12 +22,21 @@ typedef void(^HEMVoiceCommandsHandler)(NSArray* _Nullable resu @interface HEMVoiceService() @property (nonatomic, assign, getter=isStarted) BOOL started; +@property (nonatomic, assign, getter=isInProgress) BOOL inProgress; @property (nonatomic, strong) NSDate* lastVoiceResultDate; @end @implementation HEMVoiceService +- (instancetype)init { + self = [super init]; + if (self) { + _lastVoiceResultDate = [NSDate date]; + } + return self; +} + - (void)mostRecentVoiceCommands:(HEMVoiceCommandsHandler)completion { [SENAPISpeech getRecentVoiceCommands:^(id data, NSError *error) { if (error) { @@ -45,7 +54,11 @@ - (void)startListeningForVoiceResult { } - (void)waitForVoiceCommandResult { + if ([self isInProgress]) { + return; + } __weak typeof(self) weakSelf = self; + [self setInProgress:YES]; [self mostRecentVoiceCommands:^(NSArray * results, NSError * error) { __strong typeof(weakSelf) strongself = weakSelf; NSDictionary* info = nil; @@ -72,6 +85,7 @@ - (void)waitForVoiceCommandResult { int64_t delay = (int64_t)(HEMVoiceServiceWaitDelay * NSEC_PER_SEC); dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, delay); dispatch_after(delayTime, dispatch_get_main_queue(), ^{ + [strongself setInProgress:NO]; if ([strongself isStarted]) { [strongself waitForVoiceCommandResult]; } diff --git a/SleepModel/HEMVoiceTutorialPresenter.m b/SleepModel/HEMVoiceTutorialPresenter.m index 57e0ec42..ec013074 100644 --- a/SleepModel/HEMVoiceTutorialPresenter.m +++ b/SleepModel/HEMVoiceTutorialPresenter.m @@ -66,7 +66,7 @@ @interface HEMVoiceTutorialPresenter() @property (nonatomic, assign) NSInteger failures; @property (nonatomic, weak) HEMVoiceService* voiceService; -@property (nonatomic, assign, getter=hasStoppedListening) BOOL stopListening; +@property (nonatomic, assign, getter=isInfoShowing) BOOL infoShowing; @end @@ -297,6 +297,7 @@ - (void)voiceInfo { [sheet setOptionTextAlignment:NSTextAlignmentCenter]; [sheet addDismissAction:^{ __strong typeof(weakSelf) strongSelf = weakSelf; + [strongSelf setInfoShowing:NO]; [strongSelf listenForVoiceResult]; }]; [sheet addOptionWithTitle:cancelOption @@ -305,10 +306,12 @@ - (void)voiceInfo { imageName:nil action:^{ __strong typeof(weakSelf) strongSelf = weakSelf; + [strongSelf setInfoShowing:NO]; [strongSelf listenForVoiceResult]; }]; [self stopListeningForVoiceResult]; + [self setInfoShowing:YES]; [[self delegate] showController:sheet fromPresenter:self]; } @@ -372,20 +375,27 @@ - (void)stopListeningForVoiceResult { NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; [center removeObserver:self name:HEMVoiceNotification object:[self voiceService]]; [[self voiceService] stopListeningForVoiceResult]; - [self setStopListening:YES]; } - (void)listenForVoiceResult { + if ([self isInfoShowing]) { + [self stopListeningForVoiceResult]; + return; + } + NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(didGetVoiceResult:) name:HEMVoiceNotification object:[self voiceService]]; [[self voiceService] startListeningForVoiceResult]; - [self setStopListening:NO]; } - (void)didGetVoiceResult:(NSNotification*)note { + if ([self isInfoShowing]) { + return; + } + SENSpeechResult* result = [note userInfo][HEMVoiceNotificationInfoResult]; if (result) { NSDictionary* props = @{kHEManaltyicsEventPropStatus : @([result status])}; @@ -452,7 +462,7 @@ - (void)restartListeningForResponse { __strong typeof(weakSelf) strongSelf = weakSelf; if ([strongSelf failures] == HEMVoiceTutorialFailureBeforeTip) { [strongSelf voiceInfo]; - } else if (![strongSelf hasStoppedListening]){ + } else { [strongSelf listenForVoiceResult]; } }); diff --git a/SleepModel/Sense-Info.plist b/SleepModel/Sense-Info.plist index 1750cebd..d03d5233 100644 --- a/SleepModel/Sense-Info.plist +++ b/SleepModel/Sense-Info.plist @@ -35,7 +35,7 @@ CFBundleVersion - 1.5.3.8 + 1.5.3.9 FacebookAppID 372438546161587 FacebookDisplayName