Skip to content

Commit

Permalink
ResearchKit 2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Akshay authored and Akshay committed Jun 4, 2018
1 parent a23a22f commit edc9f44
Show file tree
Hide file tree
Showing 282 changed files with 17,638 additions and 1,697 deletions.
3 changes: 3 additions & 0 deletions RKWorkspace.xcworkspace/contents.xcworkspacedata

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions RKWorkspace.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
388 changes: 386 additions & 2 deletions ResearchKit.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Binary file added ResearchKit/ActiveTasks/Noise.wav
Binary file not shown.
137 changes: 111 additions & 26 deletions ResearchKit/ActiveTasks/ORKActiveStepViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
#import "ORKActiveStepTimer.h"
#import "ORKActiveStepTimerView.h"
#import "ORKActiveStepView.h"
#import "ORKNavigationContainerView.h"
#import "ORKNavigationContainerView_Internal.h"
#import "ORKStepHeaderView_Internal.h"
#import "ORKVerticalContainerView.h"
#import "ORKVoiceEngine.h"
Expand Down Expand Up @@ -63,6 +63,7 @@ @interface ORKActiveStepViewController () {
SystemSoundID _alertSound;
NSURL *_alertSoundURL;
BOOL _hasSpokenHalfwayCountdown;
NSArray<NSLayoutConstraint *> *_constraints;
}

@property (nonatomic, strong) NSArray *recorders;
Expand Down Expand Up @@ -108,37 +109,108 @@ - (ORKActiveStepView *)activeStepView {

- (void)viewDidLoad {
[super viewDidLoad];

_activeStepView = [[ORKActiveStepView alloc] initWithFrame:self.view.bounds];
_activeStepView.translatesAutoresizingMaskIntoConstraints = NO;
[_activeStepView setCustomView:_customView];
[self setActiveStepView];
[self setNavigationFooterView];
[self updateContinueButtonItem];
[self setupConstraints];
[self prepareStep];
}

- (void)setActiveStepView {
if (!_activeStepView) {
_activeStepView = [[ORKActiveStepView alloc] initWithFrame:self.view.bounds];
}
[_activeStepView setCustomView:_customView];
_activeStepView.headerView.learnMoreButtonItem = self.learnMoreButtonItem;
_activeStepView.continueSkipContainer.skipButtonItem = self.skipButtonItem;
_activeStepView.continueSkipContainer.continueEnabled = _finished;
[self.view addSubview:_activeStepView];
}

- (void)setNavigationFooterView {
if (!_navigationFooterView) {
_navigationFooterView = [ORKNavigationContainerView new];
}
_navigationFooterView.skipButtonItem = self.skipButtonItem;
_navigationFooterView.continueEnabled = _finished;

NSMutableArray *constraints = [NSMutableArray new];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[activeStepView]|"
options:(NSLayoutFormatOptions)0
metrics:nil
views:@{@"activeStepView": _activeStepView}]];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topLayoutGuide][activeStepView]|"
options:(NSLayoutFormatOptions)0
metrics:nil
views:@{@"activeStepView": _activeStepView,
@"topLayoutGuide": self.topLayoutGuide}]];
[NSLayoutConstraint activateConstraints:constraints];
ORKActiveStep *step = [self activeStep];
_navigationFooterView.useNextForSkip = step.shouldUseNextAsSkipButton;
_navigationFooterView.optional = step.optional;
_navigationFooterView.cancelButtonItem = self.cancelButtonItem;
BOOL neverHasContinueButton = (step.shouldContinueOnFinish && !step.startsFinished);
[_navigationFooterView setNeverHasContinueButton:neverHasContinueButton];
[_navigationFooterView updateContinueAndSkipEnabled];

[self prepareStep];
[self updateContinueButtonItem];
[self.view addSubview:_navigationFooterView];
}

- (void)setupConstraints {
if (_constraints) {
[NSLayoutConstraint deactivateConstraints:_constraints];
}
_constraints = nil;
_activeStepView.translatesAutoresizingMaskIntoConstraints = NO;
_navigationFooterView.translatesAutoresizingMaskIntoConstraints = NO;

_constraints = @[
[NSLayoutConstraint constraintWithItem:_activeStepView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.view.safeAreaLayoutGuide
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0.0],
[NSLayoutConstraint constraintWithItem:_activeStepView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.view.safeAreaLayoutGuide
attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:0.0],
[NSLayoutConstraint constraintWithItem:_activeStepView
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:self.view.safeAreaLayoutGuide
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:0.0],
[NSLayoutConstraint constraintWithItem:_navigationFooterView
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:0.0],
[NSLayoutConstraint constraintWithItem:_navigationFooterView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:0.0],
[NSLayoutConstraint constraintWithItem:_navigationFooterView
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:0.0],
[NSLayoutConstraint constraintWithItem:_activeStepView
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:_navigationFooterView
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0.0],

];
[NSLayoutConstraint activateConstraints:_constraints];
}

- (void)stepDidChange {
[super stepDidChange];
_activeStepView.activeStep = [self activeStep];
[self updateContinueButtonItem];


ORKActiveStep *step = [self activeStep];
_activeStepView.activeStep = step;
[self prepareStep];
}

Expand Down Expand Up @@ -187,7 +259,7 @@ - (void)viewWillDisappear:(BOOL)animated {
}

- (void)updateContinueButtonItem {
_activeStepView.continueSkipContainer.continueButtonItem = self.continueButtonItem;
_navigationFooterView.continueButtonItem = self.continueButtonItem;
}

- (void)setContinueButtonItem:(UIBarButtonItem *)continueButtonItem {
Expand All @@ -202,12 +274,17 @@ - (void)setLearnMoreButtonItem:(UIBarButtonItem *)learnMoreButtonItem {

- (void)setSkipButtonItem:(UIBarButtonItem *)skipButtonItem {
[super setSkipButtonItem:skipButtonItem];
_activeStepView.continueSkipContainer.skipButtonItem = skipButtonItem;
_navigationFooterView.skipButtonItem = skipButtonItem;
}

- (void)setCancelButtonItem:(UIBarButtonItem *)cancelButtonItem {
[super setCancelButtonItem:cancelButtonItem];
_navigationFooterView.cancelButtonItem = cancelButtonItem;
}

- (void)setFinished:(BOOL)finished {
_finished = finished;
_activeStepView.continueSkipContainer.continueEnabled = finished;
_navigationFooterView.continueEnabled = finished;
}

- (ORKStepResult *)result {
Expand Down Expand Up @@ -456,6 +533,14 @@ - (NSTimeInterval)timeRemaining {
return _activeStepTimer.duration - _activeStepTimer.runtime;
}

- (NSTimeInterval)runtime {
if (_activeStepTimer == nil) {
return 0;
}
return _activeStepTimer.runtime;
}


#pragma mark - action handlers

- (void)stepDidFinish {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ NS_ASSUME_NONNULL_BEGIN

@class ORKActiveStepTimer;
@class ORKActiveStepView;
@class ORKNavigationContainerView;

@interface ORKActiveStepViewController ()

Expand All @@ -49,11 +50,14 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, strong, readonly, nullable) ORKActiveStepView *activeStepView;

@property (nonatomic, readonly) NSTimeInterval timeRemaining;
@property (nonatomic, readonly) NSTimeInterval runtime;
@property (nonatomic, readonly) BOOL timerActive;
@property (nonatomic, assign) NSTimeInterval timerUpdateInterval;

@property (nonatomic, assign, getter=isStarted) BOOL started;

@property (nonatomic, strong, readonly) ORKNavigationContainerView *navigationFooterView;

- (void)countDownTimerFired:(ORKActiveStepTimer *)timer finished:(BOOL)finished; // Let subclass receive timer fires

- (void)applicationWillResignActive:(NSNotification *)notification;
Expand Down
47 changes: 47 additions & 0 deletions ResearchKit/ActiveTasks/ORKAmslerGridContentView.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
Copyright (c) 2018, Apple Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
3. Neither the name of the copyright holder(s) nor the names of any contributors
may be used to endorse or promote products derived from this software without
specific prior written permission. No license is granted to the trademarks of
the copyright holders even if such marks are included in this software.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#import <UIKit/UIKit.h>
#import "ORKCustomStepView_Internal.h"

NS_ASSUME_NONNULL_BEGIN

@interface ORKAmslerGridContentView : ORKActiveStepCustomView

@property (nonatomic, assign) int numberOfCellsPerSide;
@property (nonatomic, assign) float lineWidth;
@property (nonatomic, strong, nullable) UIColor *lineColor;
@property (nonatomic, strong, nullable) UIColor *backgroundColor;
@property (nonatomic, assign) float ratioOfWidthToRadius;


@end

NS_ASSUME_NONNULL_END
90 changes: 90 additions & 0 deletions ResearchKit/ActiveTasks/ORKAmslerGridContentView.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
/*
Copyright (c) 2018, Apple Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
3. Neither the name of the copyright holder(s) nor the names of any contributors
may be used to endorse or promote products derived from this software without
specific prior written permission. No license is granted to the trademarks of
the copyright holders even if such marks are included in this software.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#import "ORKAmslerGridContentView.h"

@interface ORKAmslerGridContentView() {
UIBezierPath *path;
}
@end

@implementation ORKAmslerGridContentView

- (void)plotAmslerGrid {
path = [[UIBezierPath alloc] init];
path.lineWidth = _lineWidth;

CGFloat cellSize = MIN(self.bounds.size.width, self.bounds.size.height)/_numberOfCellsPerSide;

for (int index = 0; index < _numberOfCellsPerSide; index ++) {
CGPoint startVertical = CGPointMake((CGFloat)index * cellSize, 0);
CGPoint endVertical = CGPointMake((CGFloat)index * cellSize, self.bounds.size.height);
[path moveToPoint:startVertical];
[path addLineToPoint:endVertical];

CGPoint startHorizontal = CGPointMake(0, (CGFloat)index * cellSize);
CGPoint endHorizontal = CGPointMake(self.bounds.size.width, (CGFloat)index * cellSize);
[path moveToPoint:startHorizontal];
[path addLineToPoint:endHorizontal];
}
[path closePath];
}

- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
[_backgroundColor setFill];
CGContextFillRect(UIGraphicsGetCurrentContext(), rect);

[self plotAmslerGrid];
[_lineColor setStroke];
[path stroke];
UIBezierPath *circleInTheCenter = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2) radius:self.bounds.size.width/_ratioOfWidthToRadius startAngle:0 endAngle:360 clockwise:YES];
[_lineColor setFill];
[circleInTheCenter fill];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

}

- (instancetype)init
{
self = [super init];
if (self) {
_numberOfCellsPerSide = 10;
_lineWidth = 1.0;
_ratioOfWidthToRadius = 75;
_lineColor = [UIColor blackColor];
_backgroundColor = [UIColor whiteColor];
}
return self;
}

@end
Loading

0 comments on commit edc9f44

Please sign in to comment.