Compare commits

...

3499 Commits

Author SHA1 Message Date
Pariece McKinney 9443313e96 updated docs 2025-02-19 17:43:31 -05:00
Pariece McKinney 3e79f78bbd updated docs 2025-02-19 17:37:30 -05:00
Pariece McKinney c152631578 Update documentation to 7a899026 on 'stable' 2025-02-19 14:05:00 -05:00
Pariece McKinney b33747374f initial commit 2025-02-19 13:57:23 -05:00
Pariece McKinney 7a8990260c Public Release 3.1.1 2025-02-18 18:05:13 -05:00
Pariece McKinney 9b1153da04 Public release 2.2.16 2024-04-25 17:09:00 -04:00
Louie 38d161f1bf Stable Public Release 2.2.15
Merging main into stable
2023-12-05 14:20:25 -08:00
Louie 1b9daf60ee Merge pull request #1530 from ResearchKit/cocoapod_version_bump
Point ResearchKit.podspec to 2.1.0
2022-11-29 13:11:01 -08:00
Louis Chatta e71d71cf9c Point ResearchKit.podspec to 2.1.0 2022-11-29 11:48:27 -08:00
akshay-yadav 29950b62e4 marker 2022-06-15 12:53:26 -07:00
akshay-yadav 65de4b333c README update 2022-06-15 11:44:35 -07:00
akshay-yadav 63fcf4918f Merge branch 'stable' into 'main' for housekeeping 2022-06-15 11:40:04 -07:00
akshay-yadav c9880b0139 merge stable into main
resolve merge conflicts
Bugfixes
Cleanup
merge main back to stable
2022-06-15 11:38:42 -07:00
akshay-yadav 13eabb7720 merging stable back to main
Resolving Merge conflicts
Bugfixes
Cleanup
2022-06-15 11:37:16 -07:00
Pariece McKinney 743b773ea3 Point RK to IOS 13 (#1499) 2022-04-25 09:40:44 -07:00
Pariece McKinney 249eee5dfb IOS15 Fixes (#1487) 2022-02-17 11:29:47 -08:00
aplummer-apple 90c68d0d19 Update project library search paths to compile on apple silicon (#1479)
I believe this line was in here to resolve issues with an early beta of xcode 11 and is unnecessary now
2021-11-29 10:20:27 -08:00
Pariece McKinney d10a427911 Merge pull request #1471 from Pariecemckinney-apple/pmckinney/taskVCDeprecationWarningFix
Fix ORKTaskViewController deprecation warning
2021-10-25 14:50:24 -07:00
Pariecemckinney-apple 05755a3213 initial commit 2021-10-25 11:38:50 -07:00
Corey e18a633de1 Set ORKTaskViewController nav background color (#1469) 2021-10-04 13:58:03 -07:00
Pariece McKinney 0e68cdf744 Merge pull request #1448 from stevemoser/patch-6
Fix broken Apple Forums link
2021-06-28 15:58:31 -07:00
Pariece McKinney 7f119a8d0d Merge pull request #1338 from Hengyu/hengyu
Use implied answer format for cells
2021-06-28 15:54:27 -07:00
hengyu fde1e7e957 Use implied answer format for cells 2021-06-27 14:58:31 +08:00
Erik Hornberger 0ad96d505c Merge pull request #1462 from erik-apple/nullable-return-type
Silence warning about nullable return types
2021-06-21 15:25:36 -07:00
Erik Hornberger d4ff76fc25 Silence warning about nullable return types 2021-06-21 15:08:01 -07:00
Erik Hornberger 85c1395361 Merge pull request #1461 from erik-apple/update-deprecated-method-in-keychain
Update deprecated method call
2021-06-21 14:47:45 -07:00
Erik Hornberger 1443e57c57 Replace deprecated method call 2021-06-21 14:22:10 -07:00
Erik Hornberger 3b75f6213c Updates to the predefined range of motion task (#1459) 2021-05-25 17:05:56 -07:00
gavirawson-apple e9d5de64a5 Clip step image (#1457) 2021-05-19 18:11:15 -07:00
Erik Hornberger 19c61383f6 Permission Type Updates (#1454)
* Ensure that the slider's colors match the view's tint

* New visual style for request permission step

* Add a new notifications permission type

* Add a new motion activity permission type

* Update ORKRequestPermissionButton.m

* Forward declare button

* Update ResearchKit/Common/ORKPermissionType.m

Co-authored-by: joeylabarck-apple <81833193+joeylabarck-apple@users.noreply.github.com>

* Update ResearchKit/Common/ORKPermissionType.h

Co-authored-by: joeylabarck-apple <81833193+joeylabarck-apple@users.noreply.github.com>

* Update ResearchKit/Common/ORKMotionActivityPermissionType.h

Co-authored-by: joeylabarck-apple <81833193+joeylabarck-apple@users.noreply.github.com>

* Update ResearchKit/Common/ORKPermissionType.h

Co-authored-by: joeylabarck-apple <81833193+joeylabarck-apple@users.noreply.github.com>

* Update ResearchKit/Common/ORKPermissionType.h

Co-authored-by: joeylabarck-apple <81833193+joeylabarck-apple@users.noreply.github.com>

* Add missing import

* Add missing import

Co-authored-by: joeylabarck-apple <81833193+joeylabarck-apple@users.noreply.github.com>
2021-04-16 17:02:45 -07:00
Steve Moser cb6cc97fa4 Fix broken Apple Forums link 2021-03-01 08:26:36 -05:00
srinathtm-apple 0651bf0c2a Use wheel date picker style (#1447)
* Use wheel date picker style
2021-02-11 19:16:32 -08:00
Pariece McKinney 68f9d29b66 Merge pull request #1396 from Pariecemckinney-apple/video_instruction_fix_issue_1389
Video Instruction Step Now Presents Play Button (#1389)
2020-08-03 16:29:25 -07:00
Pariecemckinney-apple 24afb1b1ec video instruction step now presents the play button so that the user can present the video intended for them 2020-08-03 16:19:07 -07:00
Kyle Seth Gray 47f44c488e Update ORKSkin.m (#1390)
literally just a misspelling of 'Margin'
2020-07-21 11:13:42 -07:00
Pariece McKinney a9b64253f1 VideoCaptureStep now corrects its state when navigating to it after pressing the back button (#1386)
Co-authored-by: Pariece McKinney <pariecemckinney@gmail.com>
2020-07-17 15:44:23 -07:00
Volodymyr Klymenko 506dc646ad Fix markdown formatting (#1383) 2020-06-24 14:21:05 -07:00
srinathtm-apple b50b759c7e RK 2.1 updates (#1384) 2020-06-24 14:20:11 -07:00
Greg Fiumara ed2602e523 Handle new UITouchPhase enumerations. (#1366)
* Handle new UITouchPhase enumerations.

Added in iOS 13.4.

* Conditionally include new UITouchPhase enums.
2020-04-05 16:36:15 -07:00
srinathtm-apple bbe376cddc Remove scripts folder, this is causing app store submission issues (#1362)
* removing scripts folder

* removing references from build phases
2020-03-26 11:25:16 -07:00
srinathtm-apple 50a2b3427a RK 2.1 updates (#1343)
* updates to RK 2.1

* adding AirPodsPro calibration data
2020-03-09 20:34:15 -07:00
Alex Wald ac7c63fc1b added missing nullability annotation in one of the initialisers (#1323) 2020-02-10 12:41:39 -08:00
srinathtm-apple b50e1d7aa4 Merge pull request #1333 from davwillev/master
Spoken instruction for TouchAnywhereStep changed from from title to text
2020-02-10 12:38:47 -08:00
David Evans 454e501cb6 Reallocated TouchAnywhereStep spoken instructions
Reallocated TouchAnywhereStep spoken instructions from task 'title' to instruction 'text'
2020-01-17 12:44:51 +00:00
David Evans 69cb1b7f2e Merge pull request #7 from ResearchKit/master
Update from master
2020-01-06 14:04:09 +00:00
srinathtm-apple 7c8917deb0 Merge pull request #1329 from xinsight/remove-tests-from-archive-2
remove tests from archive
2019-12-11 10:55:26 -08:00
Jay Moore e5e96b8db9 remove address and undef behaviour sanitizers 2019-12-11 18:04:31 +01:00
Jay Moore faffea0008 remove tests from archive 2019-12-11 13:28:29 +01:00
erik-apple e08711ff4b Retrieve tint color from view's window instead of AppDelegate's window (#1324)
We used to retrieve the view's tint color from a reference to the window held by the AppDelegate, however, iOS 13 introduced a new SceneDelegate pattern in which there may be more than one window. We now have to retrieve the tint color from window that the view belongs to, as there may be multiple windows with different tint colors.
2019-12-03 23:23:57 -05:00
srinathtm-apple c6c99a41db Merge pull request #1321 from erik-apple/2.1
ResearchKit 2.1 Update
2019-11-22 17:11:35 -08:00
erik-apple ff709e01f2 Update .travis.yml for Xcode 11 and iOS 13 2019-11-22 16:58:20 -08:00
erik-apple 666bf54dd5 Update ORKFormStep.h 2019-11-22 16:52:30 -08:00
erik-apple fbcd6adc9e Merge branch 'master' into 2.1 2019-11-22 16:48:50 -08:00
Erik Hornberger 2dc3cfb109 ResearchKit 2.1 Update 2019-11-22 16:40:08 -08:00
akshay-yadav ae9b9e57cb updates 2019-10-24 14:19:09 -07:00
srinathtm-apple e19dfbff8d Merge pull request #1298 from susom/instructionStepView-learnMore-fix
Fix displaying of Close button in ORKLearnMoreStepViewController
2019-10-23 12:03:58 -07:00
srinathtm-apple 6fc2e6d0fe Merge pull request #1308 from chrisortman/master
Fixes podspec in cocoapods 1.8.0
2019-10-23 12:03:24 -07:00
srinathtm-apple 456c3e4a45 Merge pull request #1311 from CareEvolution/sectionBug
Bugfix - Index needs to be _allSections
2019-10-23 12:02:54 -07:00
Eric Schramm eaca80f55a index needs to be _allSections 2019-10-17 08:45:10 -05:00
Chris Ortman d60ab56972 Fixes podspec in cocoapods 1.8.0 2019-10-04 16:56:39 -05:00
Paweł Kowalczyk 6b55e5ba81 Fix displaying of Close button in ORKLearnMoreStepViewController 2019-09-02 17:52:12 +02:00
David Evans 8c16ee46cc Merge pull request #6 from ResearchKit/master
Updating master to latest version
2019-07-24 12:15:53 +01:00
srinathtm-apple d56e6d5267 Merge pull request #1288 from srinathtm-apple/master
adding macro to bypass ios13 only api
2019-06-20 10:37:16 -07:00
Srinath Tupil Muralidharan 1ff84f4f96 adding macro to bypass ios13 only api 2019-06-19 16:08:14 -07:00
srinathtm-apple 3efb3ae1ae Merge pull request #1279 from CareEvolution/hideORKFormItemFix
Fix for hidePredicate changes where an ORKTableSection may contain more than one ORKFormItem
2019-06-17 14:39:02 -07:00
Eric Schramm d516d0cc0a reimplementation of hide ORKFormItem post-RK 2.1 2019-06-16 18:10:06 -05:00
Eric Schramm d2794890f8 Merge branch 'appleMaster' into hideORKFormItemFix
# Conflicts:
#	ResearchKit/Common/ORKFormStepViewController.m
2019-06-16 17:55:51 -05:00
srinathtm-apple ae70457c56 Merge pull request #1282 from ninoguba/bugfix_flash_modes
Fixed crash related to supported flash modes on certain devices
2019-06-04 13:57:27 -07:00
srinathtm-apple 800e45a27a Merge pull request #1280 from gabriel-blanco-apple/embeddedReviewStepIsEmpty-51368434
Missing embedded summary in ORKReviewStep
2019-06-04 13:56:51 -07:00
Akshay Yadav 7b6dae062c ResearchKit 2.1 Beta 2019-06-04 13:45:18 -07:00
Nino Guba 5070325d9a Fixed crash related to supported flash modes on certain devices 2019-06-03 18:48:21 -07:00
Gabriel Blanco 84511204d2 Missing embedded summary in ORKReviewStep
Bug introduced here:

commit 9ef1876c45
Author: Brian Ganninger <coder@infinitenexus.com>
Date:   Sun Nov 25 20:44:22 2018 -0800

    [code cleanup] Review mismatched nil returns (issue #1214)

——

Impact:
Causes embedded ORKReviewStep to return no steps
2019-06-03 14:52:32 -07:00
Eric Schramm ad8129efdf fixes for animation of changes 2019-06-02 22:48:57 -05:00
Eric Schramm 5f0f32f824 hideForm fix for sections which contain >1 forms 2019-05-31 15:17:59 -05:00
srinathtm-apple 7347a99520 Merge pull request #1277 from PersonalTouchProjects/mytouch
Add new activity tasks
2019-05-30 16:59:43 -07:00
Tommy Lin 12b2df63b4 Add missing header files to umbrella headers 2019-05-28 01:54:28 +08:00
Tommy Lin 00ac394379 Inherit ORKTouchAbilityScrollResult from ORKResult instead of ORKStepResult (typo) 2019-05-28 01:51:46 +08:00
srinathtm-apple 8f8cc4de14 Merge pull request #1271 from CareEvolution/Schramm/hideFormItemWithPredicate-2.0
Conditionally Hide an ORKFormItem based on an NSPredicate
2019-05-27 09:17:06 -07:00
Tommy Lin 577f612778 Fix retain cycle warnings 2019-05-27 22:31:10 +08:00
Tommy Lin e0f092decc Fix shadow declaration warning 2019-05-27 22:10:59 +08:00
Tommy Lin acacacdcce Add NSCopying, NSCoding and isEqual to ORKTouchAbility steps 2019-05-27 20:56:28 +08:00
Eric Schramm fce7172bac rename - filtered to hidden 2019-05-08 12:31:39 -05:00
Eric Schramm 264d51f1c9 explicitly compare against nil 2019-05-08 12:13:42 -05:00
Eric Schramm 6b1dd7f73d naming improvements, simplification 2019-05-08 12:08:50 -05:00
Eric Schramm ad5b4cb2fd update for renaming to hidePredicate 2019-04-24 21:44:08 -05:00
Eric Schramm 1faa99a490 rename to hidePredicate 2019-04-24 21:43:46 -05:00
Eric Schramm cf67d09e1b remove null results for filtered formItems 2019-04-24 16:00:29 -05:00
Eric Schramm 14a87b2067 fixed to corrected indexPath due to filtering 2019-04-24 15:56:53 -05:00
Eric Schramm 4f59976114 bypass non-optional formItems that are filtered 2019-04-24 15:36:34 -05:00
Eric Schramm 392dd87881 stop animated scrolling if no section show/hide changes 2019-04-19 16:06:03 -05:00
Eric Schramm fd8c973004 update didSelect to unfiltered indexPath 2019-04-19 15:16:01 -05:00
Eric Schramm ab400a203a implement hideItemPredicate in ORKFormStepVC 2019-04-19 14:43:39 -05:00
Eric Schramm 7fbd650fbb add hideItemPredicate to ORKFormItem 2019-04-19 14:39:42 -05:00
srinathtm-apple 01cc7ed79d Project updates (#1264)
* overall updates to ResearchKit, new textChoiceOtherAnswerFormat, unit tests and more..
2019-04-15 14:42:02 -07:00
Tommy Lin 62d5f17c75 Merge branch 'master' into mytouch 2019-03-28 15:48:25 +08:00
srinathtm-apple d198a8fa67 Merge pull request #1256 from yo1995/ORKSkinFix
Ork skin fix
2019-03-24 11:27:15 -07:00
Duke Mobile Center 77aa2444a2 clean comments 2019-03-24 13:01:44 -04:00
Duke Mobile Center 281b2093b1 #1255 solved the mapHeight metric and other compatibility issues. 2019-03-24 12:55:19 -04:00
srinathtm-apple 94c2b68e53 Merge pull request #1247 from srinathtm-apple/dBHLUpdates
dBHL Tone Audiometry updates
2019-02-26 18:42:30 -08:00
Srinath Tupil Muralidharan 99e3b370d5 if user taps during the preStimulusDelay, do not count it towards threshold calculation 2019-02-26 18:06:06 -08:00
srinathtm-apple 093513f01f Merge pull request #1241 from srinathtm-apple/splMeterUpdates
bugfixes for splmeter
2019-02-23 10:11:33 -08:00
srinathtm-apple 5e39fffe0d Merge pull request #1246 from rsanchezsaez-apple/rss/project-hardening-d
[Misc] Homogenize errorOut argument naming
2019-02-23 10:08:49 -08:00
Ricardo Sanchez-Saez 0ddd16b202 [Misc] Homogenize errorOut argument naming 2019-02-21 16:38:57 -08:00
David Evans 13fdd71613 Merge pull request #5 from ResearchKit/master
merge upstream
2019-02-21 12:26:25 +00:00
srinathtm-apple d000f5b45e Merge pull request #1245 from ResearchKit/rss/project-hardening-c
[Project Hardening] Improvements (III)
2019-02-20 23:40:02 -08:00
Ricardo Sanchez-Saez 19de603340 [ORKTaskViewController] More compact nil UUID check 2019-02-20 18:18:04 -08:00
Ricardo Sanchez-Saez 61af3f9b19 [ORKTaskViewController] Remove unneeded implementation 2019-02-20 18:12:44 -08:00
Ricardo Sanchez-Saez f614fda7b3 [Misc] Add a space before every ‘nil’ 2019-02-20 18:00:38 -08:00
Ricardo Sanchez-Saez 63fb484f22 [ORKSpeechRecognitionResult] Fix typo 2019-02-20 18:00:35 -08:00
Ricardo Sanchez-Saez 6e61d4f79b [ORKConsentSection] Remove unneeded import 2019-02-20 18:00:28 -08:00
Ricardo Sanchez-Saez 54feccdcff [ORKValuePicker] Undo unneeded changes 2019-02-20 17:59:51 -08:00
Ricardo Sanchez-Saez 5bc0088f16 [ORKVisualContentStepViewController] Better nullability handling 2019-02-20 17:59:44 -08:00
Ricardo Sanchez-Saez e4f7516b6f [ORKTintedImageView] Remove unneeded changes 2019-02-20 17:59:34 -08:00
Ricardo Sanchez-Saez 61290e42fa [ORKTintedImageView] Remove unneeded nullability 2019-02-20 17:59:26 -08:00
Ricardo Sanchez-Saez 82720f2978 [ORKPDFViewerStepView] Add default nullability 2019-02-20 17:59:17 -08:00
Ricardo Sanchez-Saez 08af95d3a7 [ORKTaskViewController] Better UUID nullability 2019-02-20 17:59:14 -08:00
Ricardo Sanchez-Saez 319b9f189e [ORKTableStepViewController] Better nullability 2019-02-20 17:59:10 -08:00
Ricardo Sanchez-Saez d6f71e2cdb [ORKStepNavigationRule] Improve comment 2019-02-20 17:59:02 -08:00
Ricardo Sanchez-Saez 92c2299a9d [ORKSkin] Remove unused code 2019-02-20 17:58:50 -08:00
Ricardo Sanchez-Saez ddb2c50aba [ORKReviewStep] Add braces for safety 2019-02-20 17:58:23 -08:00
Ricardo Sanchez-Saez 4d7c27a1dd [ORKReviewStep] Add extra nullable annotations 2019-02-20 17:58:20 -08:00
Ricardo Sanchez-Saez 2e0bef5490 [ORKPicker] Better nullability fix, remove unused function 2019-02-20 17:58:15 -08:00
Ricardo Sanchez-Saez 222855fabc [Misc] Nicer variable names 2019-02-20 17:58:12 -08:00
Ricardo Sanchez-Saez 97a503cf18 [ORKMultiValuePicker] Better nullability fix 2019-02-20 17:57:51 -08:00
Ricardo Sanchez-Saez 15b6204a9e [Misc] Rename findInArrayByKey to ORKFindInArrayByKey 2019-02-20 17:57:47 -08:00
Ricardo Sanchez-Saez 6f883b4acb [ORKHealthAnswerFormat] Better static analyzer fixes 2019-02-20 17:57:42 -08:00
Ricardo Sanchez-Saez 762d0350c4 Update comment to reflect code 2019-02-20 17:57:32 -08:00
Ricardo Sanchez-Saez ea01dbdbc3 Remove unneeded check 2019-02-20 17:57:24 -08:00
Ricardo Sanchez-Saez 363a1f7caa [ORKDateTimePicker] Better nullability test 2019-02-20 17:57:18 -08:00
Ricardo Sanchez-Saez 81b945a129 [ORKHealthAnswerFormat] Better nullability issue fix 2019-02-20 17:57:13 -08:00
Ricardo Sanchez-Saez 16a5da4566 [ORKGraphChartView] Simpler fix for shadowing variable declaration 2019-02-20 17:57:10 -08:00
Ricardo Sanchez-Saez 1c2af3c669 [ORKGraphChartView] Simpler fix for shadowing variable declaration 2019-02-20 17:57:06 -08:00
Ricardo Sanchez-Saez b412f47578 Rename ORKLineGraphAccessibilityElement to ORKGraphChartAccessibilityElement 2019-02-20 17:56:59 -08:00
Ricardo Sanchez-Saez d9cfb03dc6 [ORkGraphChartView] Fix wrong accessibility fix 2019-02-20 17:56:53 -08:00
Ricardo Sanchez-Saez 4baa86df01 [ORKGraphChartView] Remove unneeded change 2019-02-20 17:56:48 -08:00
Ricardo Sanchez-Saez c0c512b9ad [ORKStroopStepViewController] Change NSMutableDictionaries to NSDictionaries 2019-02-20 17:56:43 -08:00
Ricardo Sanchez-Saez 95d82db7cf [ORKAudioContentView] Do no set unneeded _timerLabel initial text 2019-02-20 17:56:24 -08:00
Ricardo Sanchez-Saez 66dbac3bb7 [Localization] Continue retuning ‘nil’ when the slider is not found 2019-02-20 17:56:20 -08:00
srinathtm-apple d969d55ab1 Merge pull request #1244 from rsanchezsaez-apple/rss/project-hardening-b
[Project Hardening] Improvements (II)
2019-02-20 17:51:09 -08:00
srinathtm-apple 95e8250194 Merge pull request #1243 from rsanchezsaez-apple/rss/project-hardening-a
[Project Hardening] Improvements (I)
2019-02-20 17:50:53 -08:00
Ricardo Sanchez-Saez 2539157e47 [Project] Disable “Missing Localization Context Comment” from static analyzer 2019-02-20 17:02:56 -08:00
Ricardo Sanchez-Saez a51b85622a [Project] Update project languages appropriately 2019-02-20 17:02:13 -08:00
Ricardo Sanchez-Saez 1e25391b0a Revert "[code cleanup] Add missing localization comments (issue #1214)"
This reverts commit c2b664f3b8.

# Conflicts:
#	ResearchKit/ActiveTasks/ORKAudioContentView.m
2019-02-20 16:57:14 -08:00
Ricardo Sanchez-Saez 9cc6255b45 [ORKSample] Update to Swift 4 2019-02-20 16:52:48 -08:00
Ricardo Sanchez-Saez 112bb1b7fa [ORKTest] Update to Swift 4 2019-02-20 16:52:38 -08:00
Ricardo Sanchez-Saez 041d015dbf [Project] Run static analyzer, in deep mode, only when building in Debug 2019-02-20 16:50:25 -08:00
Ricardo Sanchez-Saez 877edca1e6 [Project] Remove unsupported Swift 3.0 specifier from project 2019-02-20 16:50:16 -08:00
srinathtm-apple c7b2c33a29 Merge pull request #1216 from bgannin/projectHardening
Project hardening
2019-02-20 16:07:29 -08:00
srinathtm-apple ca1a18978f check if error is non-NULL before assignment 2019-02-18 20:24:30 -08:00
srinathtm-apple 0a962c6822 using NSInteger instead of NSUInteger 2019-02-18 17:56:49 -08:00
srinathtm-apple f07ae4b8f0 logical-or the missing super calls in ORKLocationSelectionView 2019-02-18 17:19:33 -08:00
srinathtm-apple b0d7eff709 logical-or the missing super calls 2019-02-18 17:16:49 -08:00
Srinath Tupil Muralidharan 390c02d2a8 bugfixes for splmeter 2019-02-14 12:25:46 -08:00
Tommy Lin 233142920f Merge master into mytouch 2019-02-14 17:10:44 +08:00
srinathtm-apple a4a147332d Merge pull request #1236 from jayway/email_fix
Fixed email regex to enforce start and end of string.
2019-02-04 08:57:26 -08:00
Gustaf Nilklint f1fdddf5d4 Fixed email regex to enforce start and end of string to eliminate the possibility to accidentally accept white space in the email adress. 2019-02-04 15:09:52 +01:00
Tommy Lin 489de1d8aa Fix ORKBorderedButton background color issue 2019-02-02 22:50:36 +08:00
Tommy Lin 52578e21fe Add internationalization strings 2019-01-28 16:26:08 +08:00
srinathtm-apple 92fc374b46 Merge pull request #1224 from srinathtm-apple/AttributedTextForSurveys
attributed text for surveys
2019-01-18 16:50:47 -08:00
Srinath Tupil Muralidharan c87b189f8a moving the assert to the designated initializer 2019-01-18 16:45:21 -08:00
Srinath Tupil Muralidharan b7cf4bc918 adding an assert if all the input params are nil 2019-01-18 16:39:51 -08:00
srinathtm-apple b803c3aab0 Merge pull request #1232 from aplummer-apple/tidy-onboarding
Minor example project onboarding cleanup
2019-01-18 15:58:56 -08:00
aplummer-apple 3094ba675c Update ORKSpatialSpanMemoryStepViewController.m 2019-01-18 15:51:23 -08:00
Andrew Plummer 88b7c9a68f Minor example project onboarding cleanup
- Tidy up localized strings
- Remove unused language config
- Delegate reference cycle
- Tidy signature access at end of onboarding

Minor syntax tidy

Minor Tidy, remove redundant check

Minor tidy, remove unnecessary variable

Minor tidy, clearer call

Fix broken “Disagree” button in example onboarding consent flow

Previously the flow let you progress as usual even if you select “disagree”

Remove development team

Clean whitespace
2019-01-10 18:38:34 -08:00
Tommy Lin 06e1e9bbfc Remove useless code 2019-01-08 14:50:11 +08:00
Srinath Tupil Muralidharan 36b8a72056 renaming an internal function 2019-01-07 17:44:10 -08:00
Srinath Tupil Muralidharan 111b983716 account for case where text is nil but primaryTextAttributedString is non-nil 2019-01-07 15:49:53 -08:00
Srinath Tupil Muralidharan 599a723dd1 call designated initializer using self 2019-01-07 15:14:03 -08:00
Srinath Tupil Muralidharan 7f37428426 support attributedText in ORKMultipleValuePickerAnswerFormat 2019-01-07 13:59:50 -08:00
Srinath Tupil Muralidharan 630a431299 support attributedText in textScaleAnswerFormat 2019-01-07 13:22:17 -08:00
Srinath Tupil Muralidharan ab081e28e1 ensure that attributedText always overrides text 2019-01-07 12:18:30 -08:00
Tommy Lin 8b912b7d25 Add touch ability instruction art works 2019-01-04 19:02:04 +08:00
Tommy Lin 375e1380d7 Add instructions before every touch ability tasks 2019-01-03 18:05:42 +08:00
Tommy Lin fdd3d7c653 Modify scroll task design 2019-01-02 20:33:42 +08:00
Tommy Lin 18ea1236e2 Rename ORKTouchAbilityScrollStep 2019-01-02 16:34:30 +08:00
Tommy Lin 18842a0e64 Add target hint label to ORKTouchAbilityScrollContentView 2018-12-25 17:13:27 +08:00
Tommy Lin 7a3d0606d5 Reset gesture recognizer events after reset tracks 2018-12-25 15:43:52 +08:00
Tommy Lin 528186535c Rename -[ORKTouchAbilityContentView startTracking] to -[ORKTouchAbilityContentView startTrial]
And also  -[ORKTouchAbilityContentView stopTracking] to  -[ORKTouchAbilityContentView endTrial]
2018-12-25 15:26:08 +08:00
Tommy Lin bd4c1a1568 Add start date and end date to ORKTouchAbilityTrial 2018-12-25 15:20:41 +08:00
Tommy Lin 08382cf7a3 Override some touch ability model descriptions 2018-12-24 19:24:01 +08:00
Tommy Lin 1080e4f08d Add ORKTouchAbilityTaskOption 2018-12-24 17:10:37 +08:00
Tommy Lin 81c9fd83e3 Refine scroll trial view 2018-12-24 16:51:13 +08:00
Tommy Lin f65b22993b Update some constraints 2018-12-24 16:37:11 +08:00
Tommy Lin e9059ee42c Add touch ability scroll ability models, views and view controllers 2018-12-22 16:48:52 +08:00
Tommy Lin f4feaffe19 Rename some protocol name and methods 2018-12-21 17:16:23 +08:00
Tommy Lin 176da46dd4 Replace auto layout codes using anchor API with traditional API 2018-12-21 17:07:26 +08:00
Tommy Lin e4a023713d Refine touch ability arrow view 2018-12-20 18:16:38 +08:00
Tommy Lin 7cfc964143 Refine pinch and rotation content view and step view controller 2018-12-20 17:40:27 +08:00
Tommy Lin b4b363cac6 Refine swipe content view and tap step view controller 2018-12-20 17:10:00 +08:00
Tommy Lin 3deaee1ef0 Refine long press content view and tap step view controller 2018-12-20 16:39:55 +08:00
Tommy Lin 330587f6f8 Refine tap content view and tap step view controller 2018-12-20 16:28:22 +08:00
Tommy Lin 7615ed631d Refine ORKTouchAbilityCustomView 2018-12-20 15:46:27 +08:00
Tommy Lin 567c1802ba Add rotation task models, views and controller 2018-12-19 17:50:21 +08:00
Tommy Lin 400ba05d8e Add pinch task models, views and controller 2018-12-17 14:36:34 +08:00
Srinath Tupil Muralidharan 3cd8cd7661 display attributed strings in picker view 2018-12-13 21:10:53 -08:00
Srinath Tupil Muralidharan 612b411dc2 adding support to provide attributed string for both primary text and detail text in ORKAnswerFormat 2018-12-13 21:10:20 -08:00
Srinath Tupil Muralidharan cd216ab1c0 setting attributed text to nil seems to override other UILabel properties, adding checks before assigning 2018-12-13 16:21:53 -08:00
Srinath Tupil Muralidharan 610d30fb0a adding support for setting attributed string to the primary text label of ORKAnswerFormat 2018-12-12 18:34:34 -08:00
Tommy Lin f81825bb78 Add touch ability swipe task 2018-12-05 18:28:32 +08:00
Tommy Lin eb5c34b35a Complete touch ability long press controller and models 2018-12-05 13:42:17 +08:00
Tommy Lin 7ea163bc14 Add property "success" to ORKTouchAbilityTapTrial 2018-12-05 13:21:38 +08:00
srinathtm-apple acc45033b7 Merge pull request #1222 from srinathtm-apple/CleanupPR1088
Cleanup for knee and shoulder range of motion
2018-12-04 17:33:47 -08:00
Srinath Tupil Muralidharan aa5bfa8142 pointing to the renamed assets for the task 2018-12-04 17:22:27 -08:00
srinathtm-apple 070950b31a Merge pull request #1088 from davwillev/master
Changes to angle calculations in Range of Motion active tasks
2018-12-04 15:16:52 -08:00
srinathtm-apple 981c1af7a8 Update ORKRangeOfMotionResult.h
adding new line spacing..
2018-12-04 13:55:36 -08:00
Tommy Lin 2cbf211613 Refine touch ability touch tracker 2018-12-04 15:33:06 +08:00
Tommy Lin 77de9ddf05 Refine touch ability tap step view controller 2018-12-04 14:58:30 +08:00
srinathtm-apple 1dfca472e2 Merge pull request #1213 from stevebaranski/issue/contributing
Correct link to ResearchKit forum in contributing guidelines
2018-12-03 13:15:23 -08:00
Tommy Lin 4b9dc94927 Add touch ability long press step, view, controller and result 2018-11-30 17:15:57 +08:00
Tommy Lin f3eec95c98 Refine tap task behavior 2018-11-30 16:10:00 +08:00
Tommy Lin 005b4b744f Refine ORKTouchAbility models 2018-11-29 17:16:51 +08:00
Tommy Lin 002939a0ec Refine property attributes 2018-11-28 17:08:00 +08:00
Brian Ganninger 35e5d5aa95 [code cleanup] Review mismatched nil returns, part II (issue #1214) 2018-11-27 22:18:03 -08:00
Brian Ganninger 547e1b5cd2 [code cleanup] Use local variable across autorelease pools (issue #1214) 2018-11-27 22:05:43 -08:00
Brian Ganninger 421e90615f [code cleanup] Resolve semantic issue with navigation buttons (issue #1214) 2018-11-27 20:40:23 -08:00
Tommy Lin 3538a50e55 Implement tap task trial points generator 2018-11-27 18:14:53 +08:00
Brian Ganninger 30a758e2b7 Tweak build settings a bit (issue #1214)
// implicit self retain in blocks, priority inversion are larger issues to tackle
2018-11-27 01:09:52 -08:00
Brian Ganninger 9ef1876c45 [code cleanup] Review mismatched nil returns (issue #1214) 2018-11-27 00:52:51 -08:00
Tommy Lin b06ffbb44e Refine code structure 2018-11-27 16:46:16 +08:00
Brian Ganninger 60076032b9 [code cleanup] Use defined enum values (issue #1214) 2018-11-25 19:12:15 -08:00
Brian Ganninger c2b664f3b8 [code cleanup] Add missing localization comments (issue #1214) 2018-11-25 13:08:51 -08:00
Brian Ganninger fc61990e03 [code cleanup] Address missing prototypes for functions (issue #1214) 2018-11-24 21:39:47 -08:00
Brian Ganninger ca81287311 [code cleanup] Resolve shadow declarations (issue #1214) 2018-11-24 19:33:28 -08:00
Brian Ganninger db995e3b35 [code cleanup] Fix dead code stores (issue #1214) 2018-11-24 17:46:16 -08:00
Brian Ganninger 1a902eefdd [code cleanup] Security fixes for random, loop counter (issue #1214) 2018-11-24 17:32:31 -08:00
Brian Ganninger 5c3fe6eaef [code cleanup] Fix unknown pragmas (issue #1214) 2018-11-24 17:27:06 -08:00
Brian Ganninger a033e1cc5e [code cleanup] Remove extraneous semicolons (issue #1214) 2018-11-24 15:42:54 -08:00
Brian Ganninger fbb7892ea6 [code cleanup] Add missing newlines (issue #1214) 2018-11-24 15:36:33 -08:00
Brian Ganninger 336096f680 [code cleanup] Fix memory management/mutability mismatch (issue #1214) 2018-11-24 01:13:05 -08:00
Brian Ganninger f3929e0e12 [code cleanup] Resolve generics type mismatch (issue #1214) 2018-11-24 01:10:20 -08:00
Brian Ganninger 3736cf573e [code cleanup] Resolve missing super calls (issue #1214) 2018-11-24 00:55:43 -08:00
Brian Ganninger 336ab0e21b Enable a swath of new compiler and analyzer flags and shallow analyze on build 2018-11-24 00:49:40 -08:00
Brian Ganninger 6459a4a5a0 Merge pull request #1 from ResearchKit/master
Merge ORK-latest
2018-11-21 15:38:04 -08:00
Tommy Lin d04c38b4a0 Add target view in ORKTouchAbilityTapContentView 2018-11-20 18:27:48 +08:00
stevebaranski 535cec7f08 Correct link to ResearchKit forum in contributing guidelines 2018-11-19 10:21:41 -08:00
Tommy Lin 843895e1e4 Add ORKTouchAbilityCustomView 2018-11-13 18:30:54 +08:00
Tommy Lin fe29159d14 Add ORKTouchAbilityTouchTracker 2018-11-13 16:31:39 +08:00
srinathtm-apple 7c883966d0 Merge pull request #1200 from bgannin/chartFontCustomization
Chart font customization
2018-11-10 13:12:26 -08:00
srinathtm-apple 332c8299fa Merge pull request #1210 from srinathtm-apple/runUnitTests
run unit tests on iPhone X iOS12.0 simulator
2018-11-08 17:27:42 -08:00
Srinath Tupil Muralidharan 120612cae0 run unit tests on iPhone X iOS12.0 simulator 2018-11-08 17:12:38 -08:00
srinathtm-apple dbb525a469 Merge pull request #1188 from CareEvolution/field-content-types
Add support for textContentType from UITextInputTraits to ORKAnswerFormat
2018-11-08 13:32:51 -08:00
Tommy Lin 4dea6d8a7b Make ORKTouchAbilityTouch, ORKTouchAbilityTrack, ORKTouchAbilityGestureRecognizer and ORKTouchAbilityTrial confirm to NSCopying and NSSecureCoding 2018-11-08 15:52:22 +08:00
srinathtm-apple c57d3a1e1f Merge pull request #1107 from rsanchezsaez/rsanchezsaez/optional-pie-legend
[ORKPieChartView] Allow skipping segment legend labels
2018-11-07 14:30:01 -08:00
Tommy Lin 77a15aa734 Add ORKTouchAbilityTrial class 2018-11-07 16:27:57 +08:00
srinathtm-apple aa482452e0 Merge pull request #1209 from srinathtm-apple/FixForIssue1205
fix for issue #1205
2018-11-06 21:09:17 -08:00
Srinath Tupil Muralidharan f1f322d442 fix for issue #1205 2018-11-06 20:56:55 -08:00
Tommy Lin 8191a977b7 Add basic touch ability data models, views and view controller 2018-11-06 15:39:16 +08:00
srinathtm-apple 54c3333b81 Merge pull request #1204 from srinathtm-apple/badgeForBuildStatus
adding badge for CI build status
2018-10-31 13:12:40 -07:00
Srinath Tupil Muralidharan ad755bb222 adding badge for CI build status 2018-10-31 13:06:52 -07:00
srinathtm-apple 920127d096 Merge pull request #1199 from susom/replace_deprecated_uiwebview
Replace deprecated UIWebView
2018-10-30 17:19:25 -07:00
srinathtm-apple 2696f2377b Merge pull request #1192 from bgannin/documentationTweak
Documentation tweaks
2018-10-30 16:52:02 -07:00
srinathtm-apple 81fdbdac57 Merge pull request #1187 from bgannin/testFixes
ORKTest unit tests fail
2018-10-30 16:44:17 -07:00
Brian Ganninger dd04625562 Updates per PR review 2018-10-30 16:23:46 -07:00
srinathtm-apple 98e8c8e09a Merge pull request #1185 from tobiasjungnickel/ScreenType_iPhone_MAX_XR
ScreenType iPhone Max & XR
2018-10-29 20:20:02 -07:00
srinathtm-apple 2da27dddd6 Merge pull request #1196 from xldrx/patch-1
Fixing a typo/bug in TaskList.
2018-10-29 20:14:28 -07:00
srinathtm-apple e40be2e5f6 Merge pull request #1201 from srinathtm-apple/setupTravisCI
Setup travis ci
2018-10-29 19:52:11 -07:00
Srinath Tupil Muralidharan 79228e8ab7 switching to ResearchKit unit tests 2018-10-29 18:07:37 -07:00
Srinath Tupil Muralidharan 161149d2df adding .travis.yml file 2018-10-29 17:39:03 -07:00
Brian Ganninger a38561bfed Add font changes for all chart types to ORKTest (issue #1158) 2018-10-27 16:55:40 -07:00
Paweł Kowalczyk 74f44435ef Replace deprecated UIWebView in ORKConsentReviewController 2018-10-26 12:56:12 +02:00
Paweł Kowalczyk 66a754d24f Replace deprecated UIWebView in ORKConsentLearnMoreViewController 2018-10-26 12:54:03 +02:00
Paweł Kowalczyk 258e2623f3 Replace deprecated UIWebView in ORKHTMLPDFWriter 2018-10-26 12:51:22 +02:00
Paweł Kowalczyk 7043316b90 Fix unit tests related to Two Finger Tapping Interval Task 2018-10-26 12:51:08 +02:00
Paweł Kowalczyk fcb980beb8 Fix unit tests related to adding new css style to handle signamture image 2018-10-26 12:46:19 +02:00
Brian Ganninger d186e5c6df Expose graph chart view fonts (issue #1158) 2018-10-24 20:18:00 -07:00
Brian Ganninger 5822caa980 Expose pie chart view fonts (issue #1158) 2018-10-23 22:18:19 -07:00
Sayed Hadi Hashemi bb55a603db Fixing a typo/bug in TaskList.
passcodeTask identifier has to be ".passcodeTask" not ".passcodeStep".
2018-10-21 15:47:01 -05:00
Brian Ganninger a75938f6bb Add flair (badge) for DVCS to README for clarity 2018-10-21 12:09:28 -07:00
Brian Ganninger 23ba6e97a8 Add badge flair for project attributes/status on README 2018-10-19 18:16:07 -07:00
Brian Ganninger 053625a0a1 Add prerequisites to the dependency management doc (fixes issue #1184) 2018-10-19 17:41:29 -07:00
Tobias Jungnickel 682cd83213 adding XS term to screen types for XSMax model 2018-10-18 10:30:04 +02:00
Eric DeLabar 55a2833c6e Address code review comments by @srinathtm-apple 2018-10-17 10:15:15 -04:00
Brian Ganninger c6e2df2a6e Additional cleanup 2018-10-16 23:41:46 -07:00
Brian Ganninger a3b6732406 Remove spurious initializer change; silence surfaced serialization failure properly (PR feedback) 2018-10-16 23:35:58 -07:00
Eric DeLabar d2fade561b Add support for textContentType from UITextInputTraits
* Add support for passwordFormat to support automatic secure passwords
2018-10-16 09:45:43 -04:00
Brian Ganninger ab6600eaf2 Pre-PR cleanup 2018-10-13 18:12:31 -07:00
Brian Ganninger 815f5bf60a Ignore shoulder range of motion step for now as it fails deserialization (issue #1151) 2018-10-13 13:43:28 -07:00
Brian Ganninger e9ecae2720 Minor code tweaks 2018-10-12 23:36:28 -07:00
Tobias Jungnickel c9f49d9f18 adding iPhone Max 2018-10-11 10:06:08 +02:00
srinathtm-apple 73faa2e59f Merge pull request #1182 from MacroYau/feature/cancelable-task
Allow task view controller to be canceled directly
2018-10-11 13:28:33 +05:30
srinathtm-apple 70889a0671 Merge pull request #1181 from bgannin/scaleHideValueLabel
Add option to hide selected value in slider scale (#657)
2018-10-11 13:27:55 +05:30
Brian Ganninger 26101d0068 Fix remaining issues for -testSecureCoding (issue #1151) 2018-10-10 22:23:55 -07:00
Brian Ganninger 340c5abdc0 Minor cleanup 2018-10-09 02:49:16 -07:00
Brian Ganninger 0c121f283b Properly init test data for clinical recorder configuration (issue #1151) 2018-10-08 20:53:50 -07:00
Brian Ganninger f50587eaf4 Add missing nullability keywords 2018-10-08 19:10:06 -07:00
Brian Ganninger fad50b20e0 Fix precision of equality check in speech recognition step (issue #1151) 2018-10-08 19:08:24 -07:00
Brian Ganninger 99be8240b0 Fix initialization and serialization issues for numeric answer format (issue #1151) 2018-10-08 18:14:10 -07:00
Brian Ganninger b6028a9eef Update known exceptions for serialization checking (issue #1151) 2018-10-08 18:09:32 -07:00
Brian Ganninger fcad24f94b Update known exceptions for serialization checking (issue #1151) 2018-10-07 23:31:05 -07:00
Brian Ganninger 211aa5a118 Fix serialization equality test failures (issue #1151) 2018-10-07 22:43:19 -07:00
Brian Ganninger 53842c3231 Fix addResult test failures (issue #1151) 2018-10-07 18:38:05 -07:00
Brian Ganninger b6ab7414fd Fix comment misspelling 2018-10-07 12:53:42 -07:00
Brian Ganninger e56ac6b2e9 Fix test failure by marking phone number related properties not serialized (issue #1151) 2018-10-07 12:52:08 -07:00
Brian Ganninger 0da343ea6f Fix serialization test failure for dB HL tone audiometry onboarding step (issue #1151) 2018-10-07 12:42:24 -07:00
Brian Ganninger 1fc475e826 Fix serialization test failure for Amsler grid result (issue #1151) 2018-10-07 12:29:25 -07:00
Brian Ganninger dc0890233f Rename variable for spelling and clarity 2018-10-07 12:17:37 -07:00
Brian Ganninger 15a8deba02 Fix serialization test failure for health clinical recorder configuration [iOS 12+ only] (issue #1151) 2018-10-07 12:16:28 -07:00
Brian Ganninger ac27b6d8fa Fix serialization test failure for Amsler grid step (issue #1151)
// also align whitespace for several entries
2018-10-06 20:31:30 -07:00
Brian Ganninger 8625fa19d6 Fix serialization test failure for speech recognition step (issue #1151) 2018-10-06 20:18:56 -07:00
Brian Ganninger 6e0a3a5c4a Fix serialization test failure for environment SPL meter result (issue #1151) 2018-10-06 19:17:56 -07:00
Brian Ganninger 388a20a79b Fix serialization test failure for streaming audio recorder configuration (issue #1151) 2018-10-06 16:48:55 -07:00
Brian Ganninger ef0c8d0495 Fix serialization test failure for Environment SPL Meter step (issue #1151) 2018-10-06 13:51:31 -07:00
Brian Ganninger 97fb686ad4 Fix serialization test failure for Speech in Noise step (issue #1151) 2018-10-06 13:50:44 -07:00
Brian Ganninger 2c0a6d7761 Fix serialization test failure for PDF Viewer step (issue #1151) 2018-10-06 13:49:57 -07:00
Brian Ganninger 0070d3ca04 Fix serialization test failure for tone audiometry step (issue #1151) 2018-10-05 23:43:48 -07:00
Macro Yau 6d0c331aba Fix typo 2018-10-05 14:30:21 +08:00
Macro Yau 0d81a9c696 Rename cancelable to discardable 2018-10-05 14:23:49 +08:00
srinathtm-apple 1e7d2c2460 Merge pull request #1179 from MacroYau/feature/custom-minute-interval
Allow custom minute interval setting for UIDatePicker with date and time, and time of day answer formats
2018-10-05 11:13:03 +05:30
Brian Ganninger 3197a62a3a Update TaskFactory+QuestionSteps.m
Fix incorrect comment
2018-10-04 14:57:26 -07:00
Brian Ganninger 4cdffbd061 Consistency cleanup from PR feedback. 2018-10-04 12:46:31 -07:00
Brian Ganninger fad570f6e9 Explicitly initialize per PR feedback 2018-10-04 10:26:10 -07:00
Macro Yau 05e4011f2a Remove unused getters 2018-09-29 18:43:49 +08:00
Macro Yau b28785d160 Allow task view controller to be cancelable regardless of step type 2018-09-28 19:15:13 +08:00
Brian Ganninger 2b25f66086 Remove hideSelectedValue from serialization test after initializer changes 2018-09-27 23:20:02 -07:00
Brian Ganninger 54f7a9b53a Update initializer 2018-09-27 23:13:05 -07:00
Brian Ganninger 0d6bd0e3c4 Whitespace tweak again 2018-09-27 23:11:29 -07:00
Brian Ganninger ed3d787972 Flipped parameters accidentally 2018-09-27 23:10:39 -07:00
Brian Ganninger 834e992bf0 Whitespace fix take 2 2018-09-27 23:09:27 -07:00
Brian Ganninger 4a894d2b3c Whitespace fix 2018-09-27 23:07:32 -07:00
Brian Ganninger 6848c067d0 Remove copyright attribution 2018-09-27 23:04:16 -07:00
Brian Ganninger ff3fe765f1 Remove hideSelectedValue from initializers, utilize only via settable property per PR review. 2018-09-27 23:01:24 -07:00
Macro Yau ecc6d2b6f9 Remove minute interval parameter from constructors 2018-09-27 16:45:50 +08:00
Brian Ganninger 8f633dcb43 Add copyright attribution per guidelines 2018-09-26 19:25:16 -07:00
Brian Ganninger a62b853500 Fix whitespace to match coding guidelines for project 2018-09-26 19:20:36 -07:00
Brian Ganninger 0a12a96af5 Add an extra step for testing text choice scale with no selected value; update serialization tests 2018-09-26 19:13:01 -07:00
Brian Ganninger 62bba0b6c9 Fix whitespace to match coding guidelines for project 2018-09-26 18:51:11 -07:00
Brian Ganninger b7c6772266 Add copyright attribution per guidelines 2018-09-25 22:56:27 -07:00
Brian Ganninger 224ce04a41 Redo initializers and Scale section of OKRTest to include hiding the selected value for all variants (#657) 2018-09-25 22:46:48 -07:00
Macro Yau 05b6f308e3 Allow custom minute interval setting for UIDatePicker with date and time, and time of day answer formats 2018-09-25 14:06:59 +08:00
Brian Ganninger 3f96750424 Port changes from pull request #446 to latest master 2018-09-24 20:33:23 -07:00
srinathtm-apple e7e501c087 Merge pull request #1175 from king7532/master
NSHealthShareUsageDescription must be longer than one word
2018-09-24 20:18:37 -06:00
Benjamin King 3aeb8dd9f9 NSHealthShareUsageDescription must be longer than one word, otherwise HealthKit will throw a runtime exception during the on-boarding or profile view controller 2018-09-19 11:05:31 -04:00
David Evans d30331a403 Slight change to RoM instructions
Made a slight improvement to the wording of the knee and shoulder range of motion tasks, in line with the new 'maximum' and 'minimum' angle calculations, following feedback after testing with volunteers.
2018-09-19 10:03:46 +01:00
David Evans 1726f5353d Trying to resolve file conflict by updating to latest RK version 2018-09-05 09:32:13 +01:00
Srinath Tupil Muralidharan b46a5f4d83 Updating podspec, readme and project settings for ResearchKit 2.0 stable release 2018-09-04 19:30:52 -07:00
Srinath Tupil Muralidharan e1d47c2882 Adding remaining audio files for Speech in Noise to Git LFS 2018-09-04 19:21:11 -07:00
Srinath Tupil Muralidharan dbc21a1c2a Changing lfsconfig to recursively track the LFS-files folder 2018-09-04 19:13:28 -07:00
Srinath Tupil Muralidharan f73645127c Adding proof of concept LFS file for speech in noise 2018-09-04 19:04:17 -07:00
Akshay 95425a81ae Stable Release 2.0 2018-09-04 16:58:27 -07:00
srinathtm-apple 8a44bceb99 Merge pull request #1170 from srinathtm-apple/FixForIssue1168
adding new css style class to handle signature image
2018-09-04 17:19:16 -06:00
Srinath Tupil Muralidharan 543fb892b1 adding new css style class to handle signature image 2018-09-04 16:17:01 -07:00
David Evans e3fad9e1d9 Final changes for angle calculations 2018-09-03 16:41:38 +01:00
David Evans 9f2e77d103 Updated version for consistency with latest RK version 2018-09-03 16:39:18 +01:00
David Evans 0478b552dc Made final changes to knee and shoulder angle calculations 2018-09-03 16:34:58 +01:00
srinathtm-apple 0598cbdbd3 Merge pull request #1167 from srinathtm-apple/FixForIssue1136
navigationFooterView should adopt app tint color
2018-08-28 23:27:29 -06:00
Srinath Tupil Muralidharan c1e6dc0a54 navigationFooterView should adopt app tint color 2018-08-28 17:44:32 -07:00
srinathtm-apple c4968de7d7 Merge pull request #1161 from overcyn/patch-1
Allow autoplay and inline media playback in ORKWebViewStep
2018-08-28 12:12:11 -06:00
srinathtm-apple f02d401737 Merge pull request #1162 from srinathtm-apple/FixForIssue1142
Fix for issue #1142
2018-08-28 12:08:20 -06:00
David Evans 19ee558b57 Adjusted for phone landscape orientation issue
Changed the 'range' result to the absolute difference between maximum and minimum angles, which deals with the problem of the phone being in opposite landscape orientations, and the device recording 'positive' or 'negative ' results accordingly
2018-08-22 12:08:21 +01:00
David Evans 8fde58535b Changed angle results calculations
This needed changes to allow for the negative direction of pitch during knee and shoulder RoM tasks. Counterintuitively, min and max values needed to be exchanged for these particular tasks
2018-08-22 11:49:17 +01:00
Srinath Tupil Muralidharan ec33ec5f8c minor change in import which was causing build failure 2018-08-20 12:42:19 -07:00
Srinath Tupil Muralidharan d23db60948 pass the fhir data object directly to the logger 2018-08-20 12:41:51 -07:00
Kevin Dang fd36ad5463 Update to use latest WKWebView api 2018-08-17 11:51:26 -07:00
Kevin Dang 06360f246d Allow autoplay and inline media playback in ORKWebViewStep 2018-08-16 14:47:39 -07:00
srinathtm-apple 7f1226e74a Merge pull request #1109 from rsanchezsaez/rsanchezsaez/xcode-9.3
[Misc] Fix Xcode 9.3 warnings and rename some methods
2018-08-15 10:46:22 -06:00
srinathtm-apple 0799ec32c9 Merge pull request #1155 from kasemset-apple/trail_making_dynamic_type
Improvements to Dynamic Type support in the Trail Making Test.
2018-08-08 16:09:07 -06:00
srinathtm-apple ae2333f2e4 Merge pull request #1156 from kasemset-apple/tapping_button_ax
Improve usability of tests that use ORKRoundTappingButton.
2018-08-08 16:08:44 -06:00
srinathtm-apple 6da6842adb Merge pull request #1157 from ysf199711/master
Update Consent Doc
2018-08-07 17:35:03 -06:00
srinathtm-apple a016834614 Merge pull request #1139 from joshavant/add-docset
Add docset
2018-08-07 17:33:44 -06:00
Sifan Ye 6d0e6e1931 Apply changes to old document 2018-08-08 02:37:55 +08:00
Sifan Ye 65c5ca082b Added suggested changes
Will update original consent doc
2018-08-08 02:25:01 +08:00
srinathtm-apple a8bbd7d4d8 Merge pull request #1135 from CareEvolution/consentMustScroll
Option to require scrolling to the bottom of ORKConsentReviewStep
2018-08-06 17:53:42 -06:00
Eric Schramm b5cdb5b7fe cond scrollView delegate, check if unscrollable
- minimize callbacks if not needed - make UIScrollViewDelegate only if needed
- if a short consent is used and no scrolling is needed on device, re-enable Agree button
2018-08-06 17:38:34 -05:00
srinathtm-apple 781c080033 Merge pull request #1153 from kasemset-apple/speech_recognition_dynamic_type
Improved Dynamic Type support for the Speech Recognition recording view.
2018-08-06 12:28:13 -06:00
srinathtm-apple cd8e0ebb00 Merge pull request #1152 from kasemset-apple/speech_recognition_transcript_ax
Accessibility fixes for the transcript view in the Speech Recognition task.
2018-08-06 12:27:56 -06:00
Sifan Ye b32c87a3b2 Merge pull request #1 from ResearchKit/master
Merge Updates
2018-08-03 12:21:38 +02:00
srinathtm-apple 9ea3d8bb09 Merge pull request #1150 from kasemset-apple/speech_recognition_waveform_axlabel
Make the waveform accessible so that low vision users are aware that it is present.
2018-08-02 12:38:23 -06:00
srinathtm-apple a1600c6e0b Merge branch 'master' into speech_recognition_waveform_axlabel 2018-08-02 12:37:01 -06:00
Sifan Ye ebc0eeef7d Update pdf code -> swift 2018-08-02 17:47:48 +02:00
Sifan Ye 020b21f261 consentShare -> swift 2018-08-02 17:42:51 +02:00
Sifan Ye 403ef4e6ee Oops, wrong code block 2018-08-02 17:39:45 +02:00
Sifan Ye 74d3f60562 Code block 4 -> swift 2018-08-02 17:37:22 +02:00
Sifan Ye bf3b66e6ff Code block 3 -> Swift 2018-08-02 17:30:12 +02:00
Sifan Ye 9265d45878 Code block 2 -> Swift 2018-08-02 17:22:53 +02:00
Sifan Ye f07c4fe7ff Correct some label typos 2018-08-02 17:11:48 +02:00
Sifan Ye 81e106dde0 First code block -> swift 2018-08-02 17:09:53 +02:00
Sifan Ye cb45004eb0 Init, prepare to replace objc with swift 2018-08-02 16:57:59 +02:00
Sifan Ye f683a494df Update more image formatting and add syntax highlighting 2018-08-02 16:56:31 +02:00
Sifan Ye f7e2e39e1c Update headers and image formats 2018-08-02 16:34:27 +02:00
Sifan Ye 6147283a63 Rename to InformedConsent-template-ObjC.markdown 2018-08-02 16:00:17 +02:00
David Evans c424ada8fd Adjusted 'finish' angle calculation in line with ORKRangeOfMotionStepViewController 2018-08-01 11:55:09 +01:00
Clare Kasemset 2a02e94987 Merge branch 'master' into tapping_button_ax 2018-08-01 17:04:14 +09:00
Clare Kasemset 2be7575a93 Improve usability of tests that use ORKRoundTappingButton.
- In the tone audiometry test, the user has a chance to determine the location of the buttons during the practice step. Once the test begins, the buttons become directly tappable.
- In the two finger tapping interval test, the user can also determine the location of the buttons first. Then on the first activation of either button, the buttons become directly tappable, but the tap is not registered yet.
- In the dBHL tone audiometry test, the user is given instructions about the button and it is directly tappable.
- In the trailmaking test, the user is given instructions about the buttons and they are directly tappable.
2018-08-01 17:01:11 +09:00
Ricardo Sanchez-Saez 326e44b055 [Project] Update to Xcode 9.4 recommended settings 2018-07-31 22:58:26 -07:00
David Evans ba58b4dbad Removed min and max +90.0 adjustment 2018-07-31 22:27:40 +01:00
David Evans 0ee66f6a26 Removed +90.0 adjustment from min and max results 2018-07-31 22:26:34 +01:00
David Evans 261ef01f93 Adjusting maximum and minimum results by +90.0 2018-07-31 21:57:59 +01:00
David Evans f1083cf096 Adjusted minimum and mximum results by +90.0 2018-07-31 21:26:10 +01:00
David Evans 4b5a587eb8 Removed 'fabs' from rangeOfMotionMoreThan180Degrees function 2018-07-31 20:40:02 +01:00
David Evans 4bdd148b53 Removed 'phonesoundwaves' image 2018-07-31 11:42:27 +01:00
David Evans 6bad43fb9f Delete phonesoundwaves_inverted@3x.png 2018-07-31 11:36:29 +01:00
David Evans 34040ac1cd Delete phonesoundwaves_inverted@2x~ipad.png 2018-07-31 11:36:19 +01:00
David Evans 4a58bff1fd Delete phonesoundwaves_inverted@2x.png 2018-07-31 11:36:09 +01:00
David Evans d8391522db Delete Contents.json 2018-07-31 11:34:34 +01:00
Clare Kasemset 4ce1635da5 Improvements to Dynamic Type support in the Trail Making Test.
- Make sure the text doesn't grow outside the bubbles
- Make sure the "Starting text in" text doesn't get truncated
- Scale the timer and error text
2018-07-31 17:44:31 +09:00
Ricardo Sanchez-Saez 26c7884002 [Project] Make ORKHTMLPDFPageRenderer.h private again 2018-07-31 00:59:51 -07:00
Ricardo Sanchez-Saez 3bc160c5b2 [Tests] Fix ResearchKit unit tests 2018-07-31 00:43:51 -07:00
Clare Kasemset 7e21d2486d Improved Dynamic Type support for the Speech Recognition recording view.
- The phrase to be recorded now scales with dynamic type.
- The Start Recording button expands if needed to fill the available width.
2018-07-31 16:39:00 +09:00
srinathtm-apple 1921a72f26 Merge pull request #1149 from kasemset-apple/amsler_grid_direct_touch_ax
Make the Amsler Grid a direct touch area, so the task can be completed easily by low vision users using VoiceOver.
2018-07-31 01:00:14 -06:00
srinathtm-apple ce93665ba2 Merge pull request #1148 from kasemset-apple/speech_in_noise_button_axtraits
Use UIAccessibilityTraitStartsMediaSession on the Play Audio button, so that VoiceOver doesn't speak the button title when you activate it.
2018-07-31 00:59:56 -06:00
srinathtm-apple e7f72ffde2 Merge pull request #1147 from kasemset-apple/speech_recognition_button_axtraits
Use UIAccessibilityTraitStartsMediaSession on the Start Recording button, so that VoiceOver doesn't speak the button title when you activate it.
2018-07-31 00:59:19 -06:00
Clare Kasemset 94a4e8b261 Accessibility fixes for the transcript view in the Speech Recognition task.
- Expose only one element for the text view.
- Expose a custom action to allow dismissing the keyboard.

Resolves rdar://problem/42294608. Tested on iPhone 7 with VoiceOver and Switch Control.
2018-07-31 15:29:51 +09:00
Ricardo Sanchez-Saez f605a10dfb Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez/xcode-9.3 2018-07-30 22:27:33 -07:00
Ricardo Sanchez-Saez aa2fd02c67 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez/optional-pie-legend 2018-07-30 22:21:09 -07:00
David Evans acf5f194f0 Updated calculation for minimum angle 2018-07-30 23:19:46 +01:00
srinathtm-apple 69e2aeb202 Merge pull request #1129 from karimhm/master
Add calls to remove self from the notification center observers after deallocation.
2018-07-30 13:55:37 -06:00
srinathtm-apple ebc948a8cc Merge pull request #1132 from ysf199711/master
Update Chart & Graph Doc
2018-07-30 13:55:02 -06:00
Clare Kasemset 584302cd2f Also add a hint so users know they can simply double tap to end recording. 2018-07-30 13:54:01 +09:00
Clare Kasemset b4bfe14641 Make the waveform accessible so that low vision users are aware that it is present.
Resolves rdar://problem/42294396. Tested on iPhone 7.
2018-07-30 13:48:21 +09:00
Clare Kasemset 57ca376732 Make the Amsler Grid a direct touch area, so the task can be completed easily by low vision users using VoiceOver.
Also give it an appropriate label and hint.

Resolves rdar://problem/42293953. Tested on iPhone 7.
2018-07-30 13:35:25 +09:00
Clare Kasemset bb30966458 Use UIAccessibilityTraitStartsMediaSession on the Play Audio button, so that VoiceOver doesn't speak the button title when you activate it.
Resolves rdar://problem/42294815. Tested on iPhone 7.
2018-07-30 12:53:09 +09:00
srinathtm-apple a40b67f458 Merge pull request #1144 from conorhughes-apple/completion_check_axlabel
Use fixed accessibility label for the completion view.
2018-07-29 20:49:50 -06:00
srinathtm-apple d0897d7166 Merge pull request #1143 from conorhughes-apple/pdf_button_axlabels
Add accessibility labels to PDF Viewer action buttons.
2018-07-29 20:49:28 -06:00
Clare Kasemset 729fc5355a Use UIAccessibilityTraitStartsMediaSession on the Start Recording button, so that VoiceOver doesn't speak the button title when you activate it.
Resolves rdar://problem/42294456. Tested on iPhone 7.
2018-07-30 11:38:00 +09:00
David Evans b83684fac9 Update ResearchKit.strings
Updated instructions for range of motion tasks
2018-07-27 08:50:01 +01:00
David Evans 6ea0e4d248 Update ORKRangeOfMotionStepViewController.m 2018-07-26 23:06:12 +01:00
David Evans f730ed5a00 Update ORKRangeOfMotionStepViewController.m 2018-07-26 23:04:35 +01:00
David Evans 30e5a09c0c Update ORKRangeOfMotionStepViewController.m 2018-07-26 23:03:51 +01:00
David Evans 98e2ae73e4 Add files via upload 2018-07-26 22:38:12 +01:00
David Evans 100f744827 Add files via upload 2018-07-26 22:03:30 +01:00
David Evans 9ea558d233 Delete shoulder_flexed@3x.png 2018-07-26 21:57:58 +01:00
David Evans d3ceaabce0 Delete shoulder_flexed@2x~ipad.png 2018-07-26 21:57:48 +01:00
David Evans cf62288080 Delete shoulder_flexed@2x.png 2018-07-26 21:57:39 +01:00
David Evans a8e541a462 Delete Contents.json 2018-07-26 21:57:29 +01:00
David Evans 3c29db9917 Delete shoulder_extended@3x.png 2018-07-26 21:57:06 +01:00
David Evans 2b682cd197 Delete shoulder_extended@2x~ipad.png 2018-07-26 21:56:57 +01:00
David Evans cf753bea67 Delete shoulder_extended@2x.png 2018-07-26 21:56:48 +01:00
David Evans a4e1d13bad Delete Contents.json 2018-07-26 21:56:37 +01:00
David Evans 268af9b05d Delete shoulder_extended@3x.png 2018-07-26 21:56:19 +01:00
David Evans 9b47a271a4 Delete shoulder_extended@2x~ipad.png 2018-07-26 21:56:10 +01:00
David Evans 8608143e40 Delete shoulder_extended@2x.png 2018-07-26 21:55:59 +01:00
David Evans 01534209ac Delete Contents.json 2018-07-26 21:55:51 +01:00
David Evans ce75fc84bb Delete knee_flexed@3x.png 2018-07-26 21:55:29 +01:00
David Evans 4f1b8e1b89 Delete knee_flexed@2x~ipad.png 2018-07-26 21:55:20 +01:00
David Evans bb6be3bde1 Delete knee_flexed@2x.png 2018-07-26 21:55:11 +01:00
David Evans 52046a60bc Delete Contents.json 2018-07-26 21:55:02 +01:00
David Evans aba6fb5889 Delete knee_flexed@3x.png 2018-07-26 21:54:47 +01:00
David Evans 239ad2d8c9 Delete knee_flexed@2x~ipad.png 2018-07-26 21:54:37 +01:00
David Evans c220e6dfbd Delete knee_flexed@2x.png 2018-07-26 21:54:28 +01:00
David Evans 5d0cfbf9de Delete Contents.json 2018-07-26 21:54:19 +01:00
David Evans 644a563d20 Delete knee_extended@3x.png 2018-07-26 21:54:03 +01:00
David Evans c49ff60d73 Delete knee_extended@2x~ipad.png 2018-07-26 21:53:54 +01:00
David Evans 892713bec4 Delete knee_extended@2x.png 2018-07-26 21:53:45 +01:00
David Evans 60ca971d8e Delete Contents.json 2018-07-26 21:53:34 +01:00
David Evans e8f695ee32 Delete knee_extended@3x.png 2018-07-26 21:53:17 +01:00
David Evans 7941f76033 Delete knee_extended@2x~ipad.png 2018-07-26 21:53:01 +01:00
David Evans f871fafed6 Delete Contents.json 2018-07-26 21:52:51 +01:00
David Evans fbd02ffc59 Delete knee_extended@2x.png 2018-07-26 21:52:41 +01:00
David Evans 371c729a48 Delete shoulder_flexed@3x.png 2018-07-26 21:51:36 +01:00
David Evans 9f9cbd9fee Delete Contents.json 2018-07-26 21:51:21 +01:00
David Evans 1341070411 Delete shoulder_flexed@2x~ipad.png 2018-07-26 21:51:08 +01:00
David Evans ed26df05ae Delete shoulder_flexed@2x.png 2018-07-26 21:50:58 +01:00
David Evans 6583215cda Add files via upload
Added new results to range of motion tasks, and renamed flexed and extended
2018-07-26 21:41:54 +01:00
David Evans c77823dfa8 Add files via upload
Added a new image (phonesoundwaves_inverted) to range of motion tasks.
Added additional spoken instruction to 'tap anywhere' stage in range of motion tasks.
2018-07-26 21:36:39 +01:00
David Evans ec62232d9f Add files via upload 2018-07-26 21:28:45 +01:00
David Evans a54a266335 Add files via upload 2018-07-26 21:27:29 +01:00
David Evans 734e85ead6 Add files via upload
Added new results
2018-07-26 21:24:04 +01:00
David Evans 5182776e1f Add files via upload 2018-07-26 21:17:44 +01:00
David Evans 57f896b86f Add files via upload 2018-07-26 21:14:56 +01:00
David Evans abea94060e Update ORKRangeOfMotionStepViewController.m 2018-07-26 17:31:26 +01:00
David Evans 8a21932d62 Update ORKRangeOfMotionStepViewController.m 2018-07-26 17:30:48 +01:00
David Evans 07469cf2c1 Update ORKRangeOfMotionStepViewController.m 2018-07-26 17:28:43 +01:00
David Evans b684c9f2f8 Update ORKRangeOfMotionStepViewController.m 2018-07-26 17:27:56 +01:00
Ricardo Sanchez-Saez d58ac3982c [ORKTowerOfHanoiStep] Fix warning by removing unallowed init 2018-07-25 23:36:20 -07:00
Conor Hughes fbdca00cf2 Use fixed accessibility label for the completion view.
The completion view looks like it's now just always a check in a blue
circle. Update the label to a fixed string. This avoids interpolating
nil, which was happening because captionLabel is not visible here (and
as such moving focus to it with a screen change is also inappropriate).

Resolves rdar://problem/42294298. Tested on iPhone 8.
2018-07-24 19:52:18 -07:00
Conor Hughes 49677ea0f8 Add accessibility labels to PDF Viewer action buttons.
Resolves rdar://problem/42255725. Tested on iPhone 8.
2018-07-24 19:17:57 -07:00
Josh Avant a00a237c29 Add docset 2018-07-23 19:30:47 -05:00
Shannon Young caed724ce2 Merge pull request #1137 from tobiasjungnickel/ScreenType_iPad_10_5
ScreenType for iPad 10.5
2018-07-23 09:08:20 -07:00
Tobias Jungnickel cbd1ccb13d adding iPad 10.5 2018-07-21 12:12:36 +02:00
Eric Schramm fa23b2a841 reverted back to original initializer 2018-07-18 13:38:03 -05:00
Eric Schramm d853c54935 adjusted for backwards compatibility
- restored initial initializer as a convenience initializer
- fixed documentation text to address new parameter
2018-07-17 15:30:07 -05:00
Eric Schramm 8c0236e33a implement requires scroll to bottom to agree 2018-07-17 07:44:47 -05:00
srinathtm-apple ac18d816ee Merge pull request #1134 from anaglik/cocoapods-fix
Fixed position of ORK_CLASS_AVAILABLE
2018-07-13 16:34:30 -06:00
Andrzej Naglik 143184f792 Fixed position of ORK_CLASS_AVAILABLE. 2018-07-13 16:38:41 +02:00
Sifan Ye 6beb7bfbf1 Comment indentation 2018-07-11 01:07:35 +02:00
Sifan Ye b2707702f1 Indentation 2018-07-11 01:06:52 +02:00
Sifan Ye 1e87138b9a Update syntax in code example 2018-07-11 01:06:09 +02:00
Sifan Ye 91c6e0e7da Added how to update a chart graph 2018-07-11 01:00:06 +02:00
Sifan Ye 5c6e8662c5 Remove Fig Captions
where the line above the figure is clear enough to explain
2018-07-11 00:46:25 +02:00
Sifan Ye 25444b68fd Update ChartsAndGraphs-template.markdown 2018-07-11 00:41:44 +02:00
Sifan Ye d9f2e1171e Update ChartsAndGraphs-template.markdown 2018-07-11 00:41:19 +02:00
Karim H 101e792254 Add calls to remove self from the notification center observers after deallocation. 2018-07-08 20:58:25 +01:00
Akshay 266b9f1c71 updating ResearchKit 2.0 Release notes 2018-06-04 16:20:42 -07:00
Akshay dcae4e5775 adding ResearchKit 2.0 Release notes 2018-06-04 16:17:31 -07:00
Akshay edc9f445ab ResearchKit 2.0 2018-06-04 14:24:57 -07:00
Akshay a23a22f7bf Merging updates 2018-06-04 14:03:29 -07:00
srinathtm-apple aea49a7950 Merge pull request #1104 from srinathtm-apple/toneAudiometryCleanup
ORKToneAudiometry cleanup
2018-04-12 21:19:31 -07:00
Srinath Tupil Muralidharan e7a74e4951 updating property in predefined active tasks 2018-04-12 21:17:29 -07:00
Srinath Tupil Muralidharan 78ac8e03f2 renaming bool property per objc conventions 2018-04-12 21:09:28 -07:00
David Evans acc5ff2ba9 Update ORKRangeOfMotionStepViewController.m 2018-04-05 22:20:47 +01:00
David Evans 28d431c664 Update ORKRangeOfMotionStepViewController.m 2018-04-05 22:18:03 +01:00
Ricardo Sanchez-Saez 9f980e1144 [Tests] Fix ORKHTMLPDFWriter tests 2018-04-05 00:22:06 -07:00
Ricardo Sanchez-Saez 259446fc8c [Misc] Rename methods to be more Obj-C compliant 2018-04-04 23:56:40 -07:00
Ricardo Sanchez-Saez 95223d3011 [Projects] Update Swift version to 4.0 2018-04-04 23:31:34 -07:00
Ricardo Sanchez-Saez b61f071020 [Xcode 9.3] Update all projects to avoid warnings 2018-04-04 22:50:24 -07:00
Ricardo Sanchez-Saez be31c5784d [ORKHTMLPDFWriter] Fix nullability warning and rename method 2018-04-04 22:26:01 -07:00
Ricardo Sanchez-Saez 14f8d7ee6c [Xcode 9.3] Add new shared data file 2018-04-04 22:16:41 -07:00
Ricardo Sanchez-Saez b32f3db623 [ORKHTMLPDFPageRenderer] Fix warning 2018-04-04 22:16:22 -07:00
Ricardo Sanchez-Saez 19a3cd7074 [ORKPieChart] Fix delegate optionality 2018-04-04 22:01:37 -07:00
Ricardo Sanchez-Saez fe8f0a2234 [ORKPieChart] Reuse more code 2018-04-04 21:57:27 -07:00
srinathtm-apple 4b9c70ed73 Merge pull request #1103 from srinathtm-apple/FixForIssue1102
fix for issue #1102
2018-04-04 15:08:23 -07:00
Ricardo Sanchez-Saez 5592966027 [ORKPieChartView] Allow skipping segment legend labels 2018-04-04 03:20:43 -07:00
Srinath Tupil Muralidharan a9a0946c7e removing duplicate code 2018-04-03 20:18:44 -07:00
Srinath Tupil Muralidharan 8ff4db8384 fix for issue #1102 2018-04-03 01:33:24 -07:00
srinathtm-apple 4019c380eb Merge pull request #1093 from srinathtm-apple/FixForIssue1014
fix for #1014
2018-03-22 03:02:43 -07:00
Srinath Tupil Muralidharan fe7fc48901 fix for #1014 2018-03-19 13:53:43 -07:00
srinathtm-apple 7634eabd0a Merge pull request #1090 from srinathtm-apple/FixForIssue1022
fix for #1022
2018-03-16 15:51:58 -07:00
srinathtm-apple 3089a3bef5 Merge pull request #1075 from srinathtm-apple/timedWalkTaskCleanup
Timed walk task cleanup
2018-03-12 10:58:40 -07:00
Srinath Tupil Muralidharan cc3afe5102 include turnAroundTimeStep only for positive values 2018-03-12 10:50:22 -07:00
srinathtm-apple d75ba09918 Merge pull request #1092 from MacroYau/patch/passcode-input-overflow
Suppress ORKPasscodeTextField input overflow
2018-03-12 10:32:52 -07:00
Macro Yau 5376359c1f Suppress ORKPasscodeTextField input overflow 2018-03-10 15:11:16 +08:00
Srinath Tupil Muralidharan 9102800ced fix for #1022 2018-03-07 12:14:46 -08:00
David Evans 3133dd38df Merge pull request #1 from davwillev/davwillev-patch-1
Changes to angle calculations in Range of Motion active tasks
2018-03-05 13:28:28 +00:00
David Evans bd8ca78ed1 Add files via upload
Added quaternion to Euler definitions for Roll and Yaw.
Replaced the attitude.roll implementation for the device in landscape orientation with the quaternion for Roll.
Modified the calculation for 'flexed' and 'extended' angles.
2018-03-05 13:21:18 +00:00
srinathtm-apple 92fdcf46a6 Merge pull request #1065 from akshay-yadav-apple/defaultAnswerProperty
Adding default answer property to ORKTextAnswerFormat and ORKNumericA…
2018-03-04 22:42:57 -08:00
srinathtm-apple 2134d5fe3a Merge pull request #1081 from srinathtm-apple/consentSignatureFix
fix for #1071
2018-03-04 22:28:40 -08:00
srinathtm-apple 44a5e21fd0 Merge pull request #1080 from susom/Fix-For-1019-Toolbar
[ResearchKit] fix for issue #1019 - toolbar
2018-02-23 12:56:11 -08:00
Srinath Tupil Muralidharan 2aa0463673 fix consent name and date layout 2018-02-21 15:20:16 -08:00
Paweł Kowalczyk f39f8b01a5 [ResearchKit] fix for issue #1019 - toolbar 2018-02-21 23:05:51 +01:00
akshay-yadav-apple b28b37c4ed Merge pull request #1062 from ninoguba/picker_dynamic_type
Added support for Dynamic Types to answer formats that use picker views
2018-02-21 02:26:15 -08:00
akshay-yadav-apple d7ddf072aa Merge pull request #1074 from srinathtm-apple/FixForIssue1073
Fix for issue 1073: error in localization
2018-02-21 02:23:58 -08:00
Srinath Tupil Muralidharan 0610718029 using non-localized string as value, based on feedback 2018-02-20 01:42:52 -08:00
Srinath Tupil Muralidharan 2d4b6a566a any negative value will bypass turnAroundTime step 2018-02-20 01:42:13 -08:00
srinathtm-apple b71a07c108 Merge pull request #1069 from Br35Ba56/master
Added phone number form item for ORKRegistrationStep #1068
2018-02-20 01:26:47 -08:00
Srinath Tupil Muralidharan 16bb829e6a create an array of ORKTextChoice instead of an array of NSString 2018-02-19 18:52:05 -08:00
Srinath Tupil Muralidharan 65985167c0 deprecating one of the initializers for timedWalkTask to avoid duplicate code paths 2018-02-19 18:14:40 -08:00
srinathtm-apple 0f0e95473a Merge pull request #1064 from CareEvolution/camera-layout
Make the ORKImageCaptureCameraPreviewView take the full width of the screen.
2018-02-19 15:21:37 -08:00
akshay-yadav-apple 0032b6708a Merge pull request #1067 from danielemden/bugs/ShowTimeLeftLabelForAudioTask
Show time-left-label for audio task
2018-02-19 15:21:14 -08:00
Srinath Tupil Muralidharan 425b858206 reverting to using ternary operator to determine key based on limb type 2018-02-19 14:50:10 -08:00
Anthony Schneider 5787764eaf Added .includePhoneNumber to ORKCatalog accountCreationTask. 2018-02-14 20:04:48 -06:00
Anthony Schneider b829641bd0 Issue #1068 Added option for phone number to ORKRegistrationStep. 2018-02-14 19:53:16 -06:00
Daniel Emden ac7cab60dd Show time-left-label for audio task
Probably due to a typo. The formatter which is used to format the string showing the remaining time for the audio task is always nil.
2018-02-13 23:41:09 +01:00
Akshay 5fe7c7f49e Adding default answer property to ORKTextAnswerFormat and ORKNumericAnwerFormat 2018-02-12 15:26:57 -08:00
Kevin Dang 403d93d064 Fix capturedImageView layout 2018-02-12 14:35:55 -08:00
Kevin Dang ca68d65605 Fix capturedImageView layout 2018-02-12 14:26:39 -08:00
Kevin Dang 4c6ff1c90c Make the ORKImageCaptureCameraPreviewView take the full width of the screen rather than being dependent on templateImage size. 2018-02-12 12:14:40 -08:00
Nino Guba c463359725 Added support for Dynamic Types to ORKMultipleValuePicker 2018-02-10 14:02:58 -08:00
Nino Guba decab237e8 Added support for Dynamic Types to ORKHeightPicker and ORKWeightPicker 2018-02-10 13:52:10 -08:00
Nino Guba 6577436bd4 Added support for Dynamic Types to ORKValuePicker 2018-02-10 13:44:10 -08:00
srinathtm-apple 4132c20897 Merge pull request #1054 from rsanchezsaez/rss/reviewing-guidelines
[docs] Add first draft of the ResearchKit Reviewing Guidelines
2018-02-09 11:06:36 -08:00
Ricardo Sanchez-Saez d520f2963d [docs] Add first draft of the ResearchKit Reviewing Guidelines 2018-01-25 20:13:47 -08:00
kelseydedoshka-apple 6da912d08a Merge pull request #1041 from srinathtm-apple/master
[ResearchKit] fix for issue #1024
2018-01-11 14:40:06 -08:00
srinathtm-apple 4e61599b1f Merge pull request #1052 from akshay-yadav-apple/Fix-For-1019
[ResearchKit] fix for issue #1019
2018-01-11 14:39:22 -08:00
Akshay c8566b00bf [ResearchKit] fix for issue #1019 2018-01-10 10:32:18 -08:00
kelseydedoshka-apple e567a5071c Merge pull request #1025 from tobiasjungnickel/attributedInstructionStep
WIP: ORKInstructionStep detailText as NSAttributedString
2017-12-19 15:48:30 -08:00
Tobias Jungnickel 87fec7ce3a adding additional attributed detail text that overrides detail text if set 2017-12-19 21:25:41 +01:00
Tobias Jungnickel 51e4761e27 Merge branch 'master' into attributedInstructionStep 2017-12-19 19:02:07 +01:00
srinathtm-apple 774e638ca7 Merge pull request #1046 from akshay-yadav-apple/master
[ResearchKit] Fix for issue #1043
2017-12-18 10:22:51 -08:00
srinathtm-apple 79b2095fbd Merge pull request #856 from chrisortman/pdf-interface-1.4.1
Allow customization of rendered PDF
2017-12-15 14:39:17 -08:00
Chris Ortman 05d716c5a2 Remove .swift-version file 2017-12-15 16:10:36 -06:00
Akshay 3a1f004452 Removing duplicate code 2017-12-13 14:23:56 -08:00
Akshay f0db5c3a11 [ResearchKit] Fix for issue #1043 2017-12-13 12:38:23 -08:00
Srinath Tupil Muralidharan d513fbd6f3 [ResearchKit] fix for issue #1015 2017-12-06 15:34:42 -08:00
akshay-yadav-apple c2dfba9870 Merge pull request #1010 from ninoguba/weight_answer_format
Added ORKWeightAnswerFormat
2017-12-06 10:13:24 -08:00
Nino Guba 1dc28a703b Merge pull request #5 from rsanchezsaez/rss/weight-answer-format-merge-master-b
Merge master again
2017-12-06 07:16:46 -08:00
Ricardo Sanchez-Saez d43c1168e5 Merge branch 'master' of github.com:ResearchKit/ResearchKit into ninoguba/weight_answer_format
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
2017-12-06 01:01:30 -08:00
Srinath Tupil Muralidharan 1d2715afb4 [ResearchKit] fix for issue #1024 2017-12-05 17:30:05 -08:00
Pariece McKinney 33609c0fd8 Merge pull request #956 from Sage-Bionetworks/pr/split-ORKResult
Split ORKResult code files into separate files.
2017-12-04 14:03:17 -08:00
Shannon Young e2f178c0e9 Fix more issues that were accepted into master of buggy code.
Issues with ORKToneAudiometryResult and ORKWebViewStep discovered during unit testing of ORKTest.
2017-12-04 12:59:55 -08:00
Shannon Young 80720c1281 Fixes to classes introduces since last March that fail unit tests. 2017-12-04 12:36:46 -08:00
Shannon Young a118762015 Fix definition of the ORKQuestionStepViewController 2017-12-04 11:17:06 -08:00
Shannon Young 1a5d537030 Split out results for stroop and web view. 2017-12-04 10:53:01 -08:00
Nino Guba f1664e5901 Merge pull request #4 from rsanchezsaez/rss/weight-answer-format-merge-master
[Weight Answer Format] Merge master
2017-12-04 09:18:19 -08:00
Ricardo Sanchez-Saez 16dfd0e677 Merge branch 'master' of github.com:ResearchKit/ResearchKit into ninoguba/weight_answer_format
# Conflicts:
#	Testing/ORKTest/ORKTestTests/ORKESerialization.m
2017-12-03 22:31:08 -08:00
Shannon Young e10bb71e03 Merge branch 'master' into pr/split-ORKResult
# Conflicts:
#	ResearchKit/Common/ORKResult.h
#	ResearchKit/Common/ORKResult.m
2017-12-01 15:37:19 -08:00
kelseydedoshka-apple 580e8c9347 Merge pull request #1040 from Medable/issue992_htmlReviewContentNoSignature
Fixes #992. "Consent PDF with htmlReviewContent doesn't add signature page
2017-11-30 10:28:30 -08:00
Fer 51b4c2e539 Fixes #992. "Consent PDF with htmlReviewContent doesn't add signature page 2017-11-30 15:06:44 -03:00
kelseydedoshka-apple 715d5a7301 Merge pull request #1035 from CareEvolution/FormStepSkipFix
Fix for ORKFormStepViewController getting stuck in a "skipped" state
2017-11-29 09:00:38 -08:00
Mike Mertsock c8195bddbc ORKTest: Add shouldPresentStep validation example to exercise skip logic in form step 2017-11-28 18:05:20 -05:00
Mike Mertsock bd2319e74d Reset skipped state when user updates answers in form step 2017-11-28 18:04:00 -05:00
kelseydedoshka-apple ee443eadee Merge pull request #929 from tobiasjungnickel/tableStepSectionHeader
Extend ORKTableStepSource for custom section header
2017-11-26 15:41:44 -08:00
kelseydedoshka-apple 39056d50ab Merge pull request #965 from Medable/issue833_DateStep
Fixes #833. "Date Step - Mismatch between picker.date and what is shown in the UIDatePicker”.
2017-11-26 15:22:56 -08:00
kelseydedoshka-apple feebf2f932 Merge pull request #971 from benjamin-42/update-readme-swift-syntax
Update README.md Swift example code to latest Swift syntax
2017-11-22 13:16:14 -08:00
kelseydedoshka-apple f49b3015c1 Merge pull request #1032 from rsanchezsaez/rss/fix-additional-warnings
[Misc] Fix additional Xcode 9.1 warnings
2017-11-21 16:54:17 -08:00
kelseydedoshka-apple 470582b176 Merge pull request #1030 from CareEvolution/WebViewStep
Add "ORKWebViewStep"
2017-11-21 16:53:09 -08:00
chrisnowak 6c4075258b Add back to ORKTest 2017-11-21 16:44:58 -05:00
chrisnowak 4bf5df0a19 Merge flog 2017-11-21 16:40:02 -05:00
chrisnowak fbb39e1cc5 Fix merge flog 2017-11-21 16:37:54 -05:00
chrisnowak 6319d2861e Remove external url 2017-11-21 16:18:17 -05:00
chrisnowak 9c6c08380b Merge branch 'master' of https://github.com/ResearchKit/ResearchKit into WebViewStep2 2017-11-21 16:11:54 -05:00
Nino Guba 25a71c950d Merge pull request #3 from rsanchezsaez/rss/weight-answer-format-fix-tests
[ORKWeightAnswerFormat] Fix unit tests
2017-11-21 09:21:33 -08:00
Ricardo Sanchez-Saez 271bbba44b [ORKWeightAnswerFormat] Fix serialization tests 2017-11-20 22:39:27 -08:00
Ricardo Sanchez-Saez 83d28ede08 [ORKWeightAnswerFormat] Fix typos 2017-11-20 22:36:08 -08:00
Ricardo Sanchez-Saez f10573e71b Merge branch 'master' of github.com:ResearchKit/ResearchKit into ninoguba/weight_answer_format 2017-11-20 21:32:00 -08:00
Ricardo Sanchez-Saez 06a58fab3a [Misc] Fix additional Xcode 9.1 warnings 2017-11-20 21:30:58 -08:00
kelseydedoshka-apple b9c5ed66bb Merge pull request #1031 from rsanchezsaez/rss/fix-unit-tests
[Misc] Fix unit tests
2017-11-17 11:35:59 -08:00
Shannon Young db51765a9b Merge branch 'master' into pr/split-ORKResult 2017-11-17 09:39:52 -08:00
srinathtm-apple 5a05aed6ee Merge pull request #1029 from rsanchezsaez/rss/Xcode-9.1
[Projects] Update projects to recommended Xcode 9.1 settings and fix all the warnings
2017-11-16 20:56:27 -08:00
Ricardo Sanchez-Saez d50a51c769 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rss/Xcode-9.1
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2017-11-16 20:41:42 -08:00
Nino Guba d922ed87f5 Merge pull request #2 from rsanchezsaez/rss/weight_answer_format
[ORKWeightAnswerFormat] Merge master and resolve conflicts
2017-11-16 16:49:14 -08:00
Nino Guba 15cc58b874 Merge pull request #1 from rsanchezsaez/rss/weight_answer_format-no-merge
[ORKWeightAnswerFormat] Improvements
2017-11-16 12:48:58 -08:00
Ricardo Sanchez-Saez 18b730169f [ORKWeightAnswerFormat] Re-add ORKTest examples 2017-11-16 01:17:37 -08:00
Ricardo Sanchez-Saez 7a1d69a9d1 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rss/weight_answer_format
# Conflicts:
#	ResearchKit/Common/ORKTypes.h
#	ResearchKit/Common/ORKTypes.m
#	Testing/ORKTest/ORKTest/MainViewController.m
2017-11-16 01:10:40 -08:00
Ricardo Sanchez-Saez 2d6efeb430 [ORKCatalog] Capitalize displayed text for ORKWeightAnswerFormat examples 2017-11-16 00:50:22 -08:00
Ricardo Sanchez-Saez 9cbba81572 [ORKWeightPicker] Update localized measure string to ‘lb’ 2017-11-16 00:42:32 -08:00
Ricardo Sanchez-Saez 3108e24830 [ORKWeightPicker] Update ORKTest sample code placeholders 2017-11-16 00:40:39 -08:00
Ricardo Sanchez-Saez 2eefc77cbe [ORKWeightPicker] Rename fraction methods 2017-11-16 00:35:24 -08:00
Ricardo Sanchez-Saez e61c9463a5 [ORKWeightPicker] Add extra properties to NSSecureCoding and equality 2017-11-16 00:34:08 -08:00
Ricardo Sanchez-Saez c1567e8ae6 [ORKWeightPicker] Reuse more code in kg <-> lb converting options; increase conversion precision 2017-11-16 00:26:10 -08:00
Ricardo Sanchez-Saez af08beeb4c [ORKTests] Fix ORKImageChoice serialization tests 2017-11-16 00:03:25 -08:00
Ricardo Sanchez-Saez 86beb05399 [ORKNumericAnswerFormat] Rename ‘scale’ to ‘maximumFractionDigits’ and fix serialization tests 2017-11-15 23:47:52 -08:00
Ricardo Sanchez-Saez 7b8b4dd2ce [ORKRecorderTest] Decrease ork_doubleEqual() precision to pass location recorder tests on the simulator 2017-11-15 23:29:38 -08:00
Ricardo Sanchez-Saez b3dfb08f50 [ORKWeightAnswerFormat] Use ‘double’ instead of ’NSNumber’ for numeric parameters 2017-11-15 22:54:43 -08:00
Ricardo Sanchez-Saez b0bf985469 [ORKWeightAnswerFormat] Change order of parameters 2017-11-15 21:55:52 -08:00
akshay-yadav-apple 7e4967ca06 Merge pull request #959 from Sage-Bionetworks/pr/split-task-modules
Split out ORKOrderedTask task modules into a separate file.
2017-11-15 12:41:44 -08:00
kelseydedoshka-apple e8ed8d2c7e Merge pull request #953 from rsanchezsaez/rss/ORKTest-refactor-b
[ORKTest] Extract task-creating methods to new TaskFactory class
2017-11-15 10:10:51 -08:00
Ricardo Sanchez-Saez d55689dc5e [ORKWeightPicker] Replace ‘valueInterval’ and ‘additionalPrecision’ by ‘numericPrecision’ 2017-11-15 00:46:50 -08:00
Ricardo Sanchez-Saez e2a52c7188 [Height and Weight Pickers] Reuse code by leveraing answerFormat’s -stringForAnswer: method 2017-11-14 22:23:21 -08:00
Ricardo Sanchez-Saez c7ea76a983 [ORKWeightAnswerFormat] Simplify -stringForAnswer: method 2017-11-14 22:22:41 -08:00
Ricardo Sanchez-Saez 73aa1157e6 Revert "[Misc] Update my copyright"
This reverts commit cb94f06094.

# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2017-11-14 14:40:44 -08:00
chrisnowak 0a40250aea Add to ORKTest 2017-11-14 09:46:42 -05:00
chrisnowak c3e7db8c0f Revert "Remove invalid ResearchKit.framework references"
This reverts commit eba62c4857.
2017-11-14 09:07:35 -05:00
Ricardo Sanchez-Saez a0ef5b1715 [Assets] Xcode 9.1 insists on reordering some xcassets fields 2017-11-14 01:17:36 -08:00
Ricardo Sanchez-Saez 6f45964342 [ORKTextChoice] Remove deprecated code 2017-11-14 00:50:52 -08:00
Ricardo Sanchez-Saez 31a86204a9 [Misc] Fix ORKTextChoice warnings 2017-11-14 00:42:10 -08:00
Ricardo Sanchez-Saez 2844102696 [ORKAnswerFormat] Fix convenience initializer being marked as designated 2017-11-14 00:30:17 -08:00
Ricardo Sanchez-Saez 82bb27199a [Misc] Fix strict-prototypes warnings 2017-11-14 00:29:58 -08:00
Ricardo Sanchez-Saez a3f9680006 [Projects] Update all projects to the recommended Xcode 9.1 settings 2017-11-14 00:27:10 -08:00
chrisnowak f851397de0 Set appropriate end time 2017-11-12 11:25:05 -05:00
chrisnowak e998d0747c Add loading indicator 2017-11-12 11:22:47 -05:00
chrisnowak 3682da0aab Check answer for type information 2017-11-12 11:10:46 -05:00
chrisnowak 973beb0fa8 Add embedded html in sample webviewstep 2017-11-12 11:03:52 -05:00
chrisnowak e8e1c36692 Allow embedding html instaed of a url 2017-11-12 10:19:06 -05:00
chrisnowak b7ddc6d195 Add to ORKCatalog 2017-11-11 10:17:02 -05:00
chrisnowak 24dca514a7 Add web view step result 2017-11-11 09:50:42 -05:00
chrisnowak 60ccc4bfad Adding base web view step 2017-11-11 09:33:55 -05:00
kelseydedoshka-apple 9efac8e6a2 Merge pull request #1026 from corduroy/cameraMicrophonePermissions
Add Info.plist keys for microphone and camera access
2017-11-09 14:39:56 -08:00
Joshua McKinnon 0695468020 Add Info.plist keys for microphone and camera access 2017-11-02 16:49:40 +11:00
Tobias Jungnickel b5e625b46f migrating detailText from NSString to NSAttributedString 2017-10-31 06:24:59 +01:00
Pariece McKinney 3e39509af2 Merge pull request #1016 from ninoguba/image_choice_vertical
Added vertical layout option and multiple choice to ORKImageChoiceAnswerFormat
2017-10-09 15:36:42 -07:00
Srinath Tupil Muralidharan ea00c5862e Merge branch 'docs_august17' into 'master'
Docs august17

See merge request !83
2017-10-03 13:12:06 -07:00
Srinath Tupil Muralidharan e6b3ad79f0 [Docs] removing all references to Utility and adding back Passcode 2017-09-26 17:04:15 -07:00
Nino Guba ef1c55cb8e Added valueInterval attribute and defaulted .5 intervals to metric weight values to match Medical ID weight picker 2017-09-20 21:06:46 -07:00
Pariece McKinney b3b484ab61 Merge pull request #1013 from ninoguba/bugfix_height_answer_format
Fix for #1012 to prevent inch value from decrementing unexpectedly
2017-09-20 13:42:26 -07:00
Nino Guba 51acba1999 Added support for multiple choice in ORKImageChoiceAnswerFormat 2017-09-18 23:07:30 -07:00
Nino Guba a984ace443 Added vertical layout option to ORKImageChoiceAnswerFormat 2017-09-18 20:35:00 -07:00
Nino Guba b0a915a30c Fix for #1012 to prevent inch value from decrementing unexpectedly 2017-09-16 10:57:22 -07:00
Nino Guba 5d9bb6c833 Corrected the HK units to match corresponding canonical unit for Weight and Height 2017-09-16 10:25:58 -07:00
Nino Guba 87e9e49519 Fixed HealthKit data handling for Weight and Height; Added example steps using HealthKit quantities for Weight and Height in ORKCatalog 2017-09-16 10:18:54 -07:00
Nino Guba d772f3885a Fixed weight value conversion discrepancies; Limit ounce picker values from 0 to 15 2017-09-15 21:56:33 -07:00
Nino Guba 6b7277cf72 Added minimum and maximum value validations 2017-09-14 21:44:23 -07:00
Nino Guba 45e7f6b529 Added checking min and max values 2017-09-14 20:26:03 -07:00
Nino Guba feae58cde6 Added support for initializing ORKWeightAnswerFormat with default/min/max values and additional precision 2017-09-14 20:02:02 -07:00
Nino Guba 9a635b7227 Added ORKWeightAnswerFormat 2017-09-05 14:50:24 -07:00
Shannon Young 292ad92204 Merge branch 'master' into pr/split-task-modules
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
#	ResearchKit/Common/ORKOrderedTask.h
#	ResearchKit/Common/ORKOrderedTask.m
2017-09-05 10:20:23 -07:00
Shannon Young 2ba1e8a2fd Fix merge from master 2017-09-05 10:08:50 -07:00
Shannon Young 75d8e0d167 Merge branch 'master' into pr/split-ORKResult
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
#	ResearchKit/Common/ORKResult.h
#	ResearchKit/Common/ORKResult.m
2017-09-05 10:08:37 -07:00
Joanna Brodbeck 8e2d6a1f34 Removed example of Video Step 2017-08-22 15:39:29 -07:00
Joanna Brodbeck 30f434f18f update screenshot 2017-08-07 16:29:46 -07:00
Joanna Brodbeck 4645015361 Active Tasks: Edits per SM. Overview and Creating Surveys: new content. 2017-08-07 12:13:10 -07:00
Joanna Brodbeck aa15382dc1 Added screenshots and text to Active Tasks. 2017-08-03 19:38:37 -07:00
Akshay 1e8f90f0c8 Merge branch 'Github_master' into Gitlab_master 2017-07-24 12:26:34 -07:00
Pariece McKinney 6886f9345c Merge pull request #987 from Science37/feature/ORKNumericAnswerFormat-decimal-scale
Added decimal scale limit to `ORKNumericAnswerFormat`
2017-07-23 13:12:27 -07:00
Akshay f561f2c51d Merge remote-tracking branch 'origin/stable'
merging stable
2017-07-19 10:58:21 -07:00
Pariece McKinney 7b40d16da2 Merge pull request #974 from hasiniran/master
Issue #973
2017-07-17 11:38:02 -07:00
Akshay 184b1938e5 Version Fixes 2017-07-13 11:51:31 -07:00
Akshay 44c88877c5 Fix for CocoaPods 2017-07-13 11:42:25 -07:00
Akshay 6f2ac3f671 Fixes 2017-07-13 11:19:33 -07:00
Akshay a2d2b13d58 COnvergence 2017-07-06 18:15:56 -07:00
Akshay 007583929c Convergence 2017-07-06 18:08:13 -07:00
Akshay e52e22e8f5 Convergence 2017-07-06 15:48:38 -07:00
Akshay c97d6bd78c Convergence 2017-07-06 15:33:24 -07:00
Kelly Chu 56c3d19cb1 Added decimal scale limit to ORKNumericAnswerFormat 2017-06-28 14:20:06 -07:00
Ricardo Sánchez-Sáez 724dd34bac [ORKTest] Re-add Stroop Task 2017-06-21 00:48:32 -07:00
Ricardo Sánchez-Sáez 7c6e83a0fc Merge branch 'master' of github.com:ResearchKit/ResearchKit into rss/ORKTest-refactor-b
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
#	Testing/ORKTest/ORKTest/Tasks/TaskFactory.swift
2017-06-21 00:43:31 -07:00
kelseydedoshka-apple 11228283fa Merge pull request #972 from benjamin-42/fix-passcode-view-controller-layout-glitch
[ORKPasscodeStepViewController] Make sure the view has been laid out before showing the keyboard
2017-06-20 11:03:18 -07:00
kelseydedoshka-apple fa0f23320b Merge pull request #966 from cheif/master
Fix class visibility for new types of Steps, fixes #649
2017-06-19 22:49:03 -07:00
Akshay 05be5f9ae7 Convergence 2017-06-07 10:49:07 -07:00
Akshay e6e4698306 Convergence 2017-06-07 10:10:19 -07:00
Umer Khan 2efdb9d56f Merge pull request #976 from netbe/fix/bundle-version
Update bundle version
2017-05-04 13:45:40 -07:00
François Benaiteau 6907cedf95 Update bundle version 2017-05-02 19:20:49 +08:00
Akshay 113b29ba56 Merge branch 'master' of https://github.com/ResearchKit/ResearchKit
* 'master' of https://github.com/ResearchKit/ResearchKit: (95 commits)
  [Deprecation] Restore deprecated methods which are removed in other PRs
  [ORKTest] Fix serialization tests
  [Deprecation] Re-add ORKTextAnswerFormat and ORKRegistrationStep regex methods
  [Project] Remove unneeded podspec file
  [ORKLocation] Revert wrong 'copy' to 'assign' ivar change
  [Misc] Fix Xcode 8.3 warnings and error
  Closes #922 redefinition of module error
  Fix Redefinition of module error in Xcode 8.3
  Fixed bug with ORKTextChoice not using the correct tint color
  Changed upper duration limit from 120 to 1200
  [ORKESerialization] Fix typo
  [ORKJSONSerializationTests] Simplify property initialization by generalizing usage of the orktest_init helper
  [ORKAnswerFormat] Indentation fixes
  [ORKESerialization] Fix ORKTextAnswerFormat tests
  [ORKTextAnswerFormat] Replace 'validationRegex' (the patterm) and 'validationRegexOptions' properties by 'validationRegularExpression' (an NSRegularExpression object)
  [ORKRegistrationStep] Clarify 'passcodeValidation' serialization comments
  [ORKTextAnswerFormat] Change 'validationRegexOptions' default value to 0
  [ORKTextAnswerFormat] Fix merge issue
  Fix localization for formatted strings so that they will localize correctly left-to-right.
  Fix documentation
  ...
2017-04-28 00:48:57 -07:00
Chris Ortman 221996b73a Removing bundler files 2017-04-26 22:15:19 -05:00
Chris Ortman c309d69349 Update copyright 2017-04-26 22:13:47 -05:00
hasiniran 4dffafc10d Issue #973
in ORKPasscodeStepViewController, supported interface orientation is
set to UIInterfaceOrientationMaskPortrait. To support any orientation
this was changed to UIInterfaceOrientationMaskAll.
2017-04-13 12:43:09 -04:00
Benjamin Randazzo b46ebf3ded [ORKPasscodeStepViewController] Make sure the view has been laid out before showing the keyboard
This is a fix for issue #960, -viewDidAppear: is called but the view isn't on screen yet when the view controller is set in a UIPageViewController
2017-04-08 21:17:26 +02:00
Benjamin Randazzo b9351232fc Update README.md Swift example code to latest Swift syntax 2017-04-08 17:54:34 +02:00
Umer Khan b04a5aa6a4 Merge pull request #969 from rsanchezsaez/rss/deprecation
[Deprecation] Re-add ORKTextAnswerFormat and ORKRegistrationStep regex methods
2017-04-07 15:41:03 -07:00
Ricardo Sanchez-Saez 76cec79983 [Deprecation] Restore deprecated methods which are removed in other PRs
This partially reverts commit c3d25d6edc.
2017-04-07 00:48:08 -07:00
Ricardo Sanchez-Saez 3697e01b6f [ORKTest] Fix serialization tests 2017-04-06 02:15:26 -07:00
Ricardo Sanchez-Saez c3d25d6edc [Deprecation] Re-add ORKTextAnswerFormat and ORKRegistrationStep regex methods
Also, move every deprecated method to the new ORKDeprecated.h/.m files. Add specific deprecation attributes and comments.
2017-04-06 02:02:47 -07:00
Ricardo Sanchez-Saez 261bc598f0 [Project] Remove unneeded podspec file 2017-04-06 01:16:22 -07:00
Scott Guelich eba62c4857 Remove invalid ResearchKit.framework references
Was showing up as duplicate entry under ResearchKit/Products
and causing embedding this framework in other targets to fail
2017-04-04 07:33:49 -07:00
Dan Berglund a4e49d490d Fix class visibility for new types of Steps, fixes #649 2017-04-03 17:04:20 -04:00
Ricardo Sanchez-Saez 6bde09345f [ORKTest] Homogenize step and item identifiers 2017-04-02 23:13:11 -07:00
Ricardo Sanchez-Saez a81c577fc3 [ORKTest] Convert iterruptible example to block based interface 2017-04-01 01:13:02 -07:00
Shannon Young 2058936108 Fix equality for ORKLocation 2017-03-31 17:00:16 -07:00
Shannon Young 5be15107b3 Merge branch 'master' into pr/split-ORKResult
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
#	ResearchKit/Common/ORKResult.h
#	ResearchKit/Common/ORKResult.m
#	ResearchKit/Common/ORKResult_Private.h
2017-03-31 12:41:29 -07:00
Shannon Young fb6dd4782a Fix issues with ORKLocation merge from master 2017-03-31 11:23:34 -07:00
Shannon Young 4a944cc972 Merge branch 'master' into pr/split-task-modules 2017-03-31 10:51:07 -07:00
Fernando Waigandt 022144ad28 Fixes #833. "Date Step - Mismatch between picker.date and what is shown in the UIDatePicker”. 2017-03-31 10:59:54 -03:00
Ricardo Sanchez-Saez 238cae5d31 [ORKTest] Consolidate the rest of examples that use 'stepViewControllerWillAppear:' 2017-03-30 21:52:52 -07:00
Ricardo Sanchez-Saez 0870abc22b [ORKTest] Consolidate stepViewControllerWillAppear: examples in new "Step Will Appear" test
Also, reimplement 'stepViewControllerWillDisappear:' example using the block based approach; and delete a few no longer needed task helper properties.
2017-03-30 21:22:02 -07:00
Ricardo Sanchez-Saez 3b74dd93f6 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rss/ORKTest-refactor-b 2017-03-30 20:19:54 -07:00
Umer Khan d82eae5f94 Merge pull request #964 from rsanchezsaez/rss/xcode-8.3-warnings
[Misc] Fix Xcode 8.3 warnings and error
2017-03-30 14:33:51 -07:00
Umer Khan 14b27ada27 Merge pull request #963 from stevemoser/patch-5
Fix Redefinition of module error in Xcode 8.3
2017-03-30 14:33:01 -07:00
Ricardo Sanchez-Saez 56a261eb27 [ORKLocation] Revert wrong 'copy' to 'assign' ivar change 2017-03-30 10:48:51 -07:00
Tobias Jungnickel 988371fb28 Merge pull request #1 from syoung-smallwisdom/syoung-pr/tableStepSectionHeader
Fix the loop for the case where the UITableViewDelegate and this protocol clash
2017-03-30 19:25:03 +02:00
Ricardo Sanchez-Saez 0a377eda53 [ORKTest] Begin removal of taskViewController:stepViewControllerWillAppear: test code
Use a block associated to the relevant ORKStep instead.
2017-03-29 22:35:42 -07:00
Ricardo Sanchez-Saez 1fc013742a [ORKTest] Get rid of task identifier constants
It now uses the automatically generated task identifiers. This also adds a NSObject (TaskFactory) helper category for commicating task intent to the MainViewController.
2017-03-29 21:12:26 -07:00
Ricardo Sanchez-Saez 2a196bc768 [ORKTest] Update copyright headers for new files 2017-03-28 20:13:12 -07:00
Ricardo Sanchez-Saez 6bb2313a1f [TaskFactory+Forms] Resolve merge conflict 2017-03-28 20:07:55 -07:00
Ricardo Sanchez-Saez dcd0be1132 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rss/ORKTest-refactor-b
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2017-03-28 20:03:19 -07:00
Ricardo Sanchez-Saez 8ba80ac79d [Misc] Fix Xcode 8.3 warnings and error
Starting on Xcode 8.3, the 'module.modulemap' file caused the compilation error described in https://github.com/ResearchKit/ResearchKit/issues/922. Renaming it to 'ResearchKit.modulemap' seems to fix the issue.
2017-03-28 19:48:28 -07:00
Steve Moser ceca4baf42 Closes #922 redefinition of module error 2017-03-28 20:53:47 -04:00
Steve Moser e83c26208b Fix Redefinition of module error in Xcode 8.3 2017-03-28 20:50:02 -04:00
Umer Khan 30fd3c0cc6 Merge pull request #958 from ninoguba/textchoice_tintcolor_fix
Fixed bug with ORKTextChoice not using the correct tint color
2017-03-28 11:54:11 -07:00
Umer Khan 22f6aeb066 Merge pull request #952 from rsanchezsaez/rss/nsregularexpression-options
[ORKTextAnswerFormat] Replace the validation regex pattern by a NSRegularExpression object
2017-03-28 11:45:32 -07:00
Ricardo Sanchez-Saez 343be912d0 [ORKtest] Reorganize TaskFactory into categories
Also, reorganize some project files.
2017-03-28 01:23:30 -07:00
Ricardo Sanchez-Saez 0972a789a4 [ORKTest] Remove unneeded import 2017-03-27 22:13:22 -07:00
Ricardo Sanchez-Saez fe994cea75 [TaskFactory] Add missing 'introStep' on the Navigable Ordered Task 2017-03-23 21:47:13 -07:00
Ricardo Sanchez-Saez 7fe617e765 [ORKTest] Dynamically calculate the task identifier
This allows removing a bunch of boilerplattery '-itemTitleButtonTapped:' methods.

Also, reorder and rename task identifiers in the TaskFactory to support this.
2017-03-23 21:47:13 -07:00
Ricardo Sanchez-Saez d451b26788 [ORKTest] Remove 'Task' from all item names 2017-03-23 21:47:13 -07:00
Ricardo Sanchez-Saez 6632633322 [ORKTest] Replace coupled section arrays by array of dictionaries
This is easier to maintain.

Also:
- Set 'adjustsFontSizeToFitWidth' to YES for button labels.
- Improve Image Choice Task name and text.
2017-03-23 21:47:13 -07:00
Ricardo Sanchez-Saez 2841a8f348 [ORKTest] Reorganize main sections
Includes:
- Create a few new sections.
- Alphabetically order sections (except 'Miscellaneous' which is kept last).
- Alphabetically order items within each section.
- Rename some items for consistency.
2017-03-23 21:47:13 -07:00
Ricardo Sanchez-Saez a0e1317c22 [TaskFactory] Add missing CompletionStepTask to task switch 2017-03-23 21:46:56 -07:00
Shannon Young bfe3e691e1 Split the predefined Active Task modules into a separate file. 2017-03-22 11:42:00 -07:00
Shannon Young 392ee67733 Move temp file back to original file name. 2017-03-22 10:43:00 -07:00
Shannon Young a3b9ec6d3d Merge branch 'task/splitA' into pr/split-task-modules
# Conflicts:
#	ResearchKit/Common/ORKOrderedTask+TaskModules.h
#	ResearchKit/Common/ORKOrderedTask+TaskModules.m
#	ResearchKit/Common/ORKOrderedTask.h
#	ResearchKit/Common/ORKOrderedTask.m
#	ResearchKit/Common/ORKOrderedTask_temp.h
#	ResearchKit/Common/ORKOrderedTask_temp.m
2017-03-22 10:41:23 -07:00
Shannon Young 109f69b9df temp split of ORKOrderedTask 2017-03-22 10:23:14 -07:00
Shannon Young 79d61223c6 Split out ORKOrderedTask task modules into a separate file. 2017-03-22 10:20:55 -07:00
Shannon Young f97b4923b6 Fix nullable for ORKLocation 2017-03-21 23:46:12 -07:00
Nino Guba e391fbf254 Fixed bug with ORKTextChoice not using the correct tint color 2017-03-21 15:40:56 -07:00
Shannon Young 8de0d5c755 Split ORKPasscodeResult into a separate file. 2017-03-21 14:38:09 -07:00
Shannon Young e030fff263 Split ORKSignatureResult and ORKConsentSignatureResult into separate file. 2017-03-21 14:32:53 -07:00
Shannon Young f4753aacf1 Split ORKVideoInstructionStepResult into a separate file. 2017-03-21 14:17:50 -07:00
Shannon Young 2075cf8fb1 Split ORKQuestionResult subclasses into a separate file. 2017-03-21 14:00:34 -07:00
Shannon Young e9e165e10d Remove unused private ORKDataResult subclass. 2017-03-21 13:34:50 -07:00
Shannon Young 121507db1c Split ORKCollectionResult subclasses into separate file. 2017-03-21 13:33:04 -07:00
Shannon Young 139ad4f8b6 Split ORKResult into separate files for each active task result.
`ORKResult` is getting huge, difficult to maintain, and difficult to handle merge conflicts. I’ve separated out all the active task results into a file for each module result type. Additionally, I split out the `ORKQuestionResult` subclasses into a separate file and the `ORKCollectionResult` subclasses into a separate file.
2017-03-21 13:03:14 -07:00
Umer Khan 96712fcfcd Merge pull request #954 from rochoSC/bug-fix-917
Fix for issue #917
2017-03-21 11:30:04 -07:00
Roger Solis bac6fff8f1 Changed upper duration limit from 120 to 1200 2017-03-21 11:45:14 -05:00
Ricardo Sanchez-Saez cb94f06094 [Misc] Update my copyright 2017-03-20 22:18:51 -07:00
Ricardo Sanchez-Saez 377120ac38 [TaskFactory] Update copyright 2017-03-20 22:17:34 -07:00
Ricardo Sanchez-Saez 161e56c738 [ORKESerialization] Fix typo 2017-03-20 11:54:16 -07:00
Umer Khan ce50dbccea Merge pull request #951 from Sage-Bionetworks/pr/fix-localization-strings
Fix localization for formatted strings so that they will localize correctly left-to-right.
2017-03-20 11:04:15 -07:00
Ricardo Sanchez-Saez 4ff30c68fe [ORKTest] Extract task-creating methods to new TaskFactory class 2017-03-19 19:30:08 -07:00
Ricardo Sanchez-Saez 8e3aaa4246 [ORKJSONSerializationTests] Simplify property initialization by generalizing usage of the orktest_init helper 2017-03-19 18:30:21 -07:00
Ricardo Sanchez-Saez 4f087ce783 [ORKAnswerFormat] Indentation fixes 2017-03-19 18:05:13 -07:00
Ricardo Sanchez-Saez f03084534d [ORKESerialization] Fix ORKTextAnswerFormat tests
Adds NSRegularExpression serialization/deserialization. Note that the tests are ignoring the 'validationRegularExpression' for the hash test becuase it's purposefully not included there.

Also, slight fix to the CLCircularRegion serialization (a nil CLCircularRegion must be serialized into an empty dict, not into a nil object). Otherwise it'll crash if you try to add nil to the parent serialization dictionary.
2017-03-19 17:56:30 -07:00
Ricardo Sanchez-Saez 4da2747943 [ORKTextAnswerFormat] Replace 'validationRegex' (the patterm) and 'validationRegexOptions' properties by 'validationRegularExpression' (an NSRegularExpression object) 2017-03-19 17:53:40 -07:00
Ricardo Sanchez-Saez 10bb15f253 [ORKRegistrationStep] Clarify 'passcodeValidation' serialization comments 2017-03-19 15:35:48 -07:00
Ricardo Sanchez-Saez 15601c420a [ORKTextAnswerFormat] Change 'validationRegexOptions' default value to 0
And update documentation accordingly.
2017-03-19 15:34:45 -07:00
Ricardo Sanchez-Saez 8d8b2e3db6 [ORKTextAnswerFormat] Fix merge issue 2017-03-19 15:17:27 -07:00
Ricardo Sanchez-Saez 945d5e9f25 Merge branch 'master' of github.com:ResearchKit/ResearchKit into nsregularexpression-options
# Conflicts:
#	ResearchKit/Common/ORKAnswerFormat.m
#	Testing/ORKTest/ORKTestTests/ORKJSONSerializationTests.m
2017-03-19 15:15:17 -07:00
Shannon Young b87babb66c Fix localization for formatted strings so that they will localize correctly left-to-right.
When using string formatting, Apple’s recommendation is to use `localizedStringWithFormat:` for cases where the string may be displayed in a language that reads from left-to-right.
2017-03-16 10:56:10 -07:00
Chris Ortman c5d864dbb4 Updating license & copyright 2017-03-16 10:36:27 -05:00
Chris Ortman 9e9ba10a52 Add swift-version file for pod lint
pod lib lint --allow-warnings now passes
2017-03-16 09:50:03 -05:00
Chris Ortman 06fe8e8ce9 Add bundler to ensure consistent version of cocoapods 2017-03-16 09:50:03 -05:00
Chris Ortman 692d7b50a4 Allow the renderer to declare it's own width & height 2017-03-16 09:50:03 -05:00
Chris Ortman 55dd93238e Modify ORKConsentDocument to allow passing a renderer 2017-03-16 09:50:03 -05:00
Umer Khan 69e642792d Merge pull request #896 from Sage-Bionetworks/pr/add-multicomponent-picker-format
Add answer format for handling a multiple component picker.
2017-03-15 10:30:09 -07:00
Shannon Young 4c0afc0037 Merge branch 'master' into pr/add-multicomponent-picker-format
# Conflicts:
#	ResearchKit/Common/ORKAnswerFormat.h
#	ResearchKit/Common/ORKAnswerFormat.m
2017-03-15 10:27:20 -07:00
Umer Khan a8777b84b5 Merge pull request #947 from stevemoser/patch-4
Add NSHealthShareUsageDescription key
2017-03-15 10:16:06 -07:00
Umer Khan 5c4d36c398 Merge pull request #934 from Sage-Bionetworks/pr/fix-passcodeFlow-equality-coding-copying
Fix missing passcodeFlow serialization, copying, encoding and equality
2017-03-15 10:13:04 -07:00
Umer Khan c25a9954b2 Merge pull request #941 from MacroYau/feature/custom-boolean-answer
Add custom yes and no strings option for ORKBooleanAnswerFormat
2017-03-15 10:09:54 -07:00
Macro Yau a7bb837e4b Fix documentation 2017-03-15 12:05:42 +08:00
Macro Yau ca99dcbc2d Add example to ORKTest's Selection Survey 2017-03-15 11:53:52 +08:00
Macro Yau 9f06cc0575 Implement factory method in ORKAnswerFormat 2017-03-15 11:52:14 +08:00
Macro Yau 2dba4fd450 Add documentation 2017-03-15 11:30:27 +08:00
Macro Yau 47fc7c8475 Override hash() in ORKBooleanAnswerFormat 2017-03-15 11:18:31 +08:00
Macro Yau f7c9ad2692 Fix copyWithZone() implementation 2017-03-15 11:16:55 +08:00
Steve Moser a600a87480 Add NSHealthShareUsageDescription key
This prevents a crash during the fitness task.
2017-03-14 21:07:47 -04:00
Shannon Young 1cd821b2da Fix encoding to use ENUM instead. 2017-03-14 16:46:11 -07:00
Umer Khan 563a081168 Merge pull request #938 from MacroYau/feature/charts-decimal-place
Allow custom decimal places in ORKGraphChartView
2017-03-14 15:36:19 -07:00
Shannon Young b3f7f0ad90 Fixed code review issues with formatting 2017-03-14 14:12:35 -07:00
Umer Khan d3dd1934c6 Merge pull request #901 from Sage-Bionetworks/pr/open-navigation-rule
Allow interhitance of navigation rules outside ResearchKit
2017-03-14 13:53:22 -07:00
Shannon Young a133f6a3a0 Merge branch 'master' into pr/add-multicomponent-picker-format 2017-03-14 13:50:20 -07:00
Umer Khan 442968c622 Merge pull request #944 from stevemoser/fix-app-delegate-for-swift-3
Fix app delegate for swift 3
2017-03-14 13:23:02 -07:00
Umer Khan 4f6af4ed83 Merge pull request #865 from Sage-Bionetworks/pr/update-healthkit-answerformat
Add missing HealthKit characteristic types to answer format.
2017-03-14 13:21:59 -07:00
Umer Khan 47191bfdbc Merge pull request #915 from joshbruhin/Bridge-1684
Call becomeFirstResponder with dispatch to main queue after delay
2017-03-14 13:00:31 -07:00
Umer Khan 0f5dca38e4 Merge pull request #880 from faraz-hussain/pr/add-module-trailmaking-test
Add module for trail making test
2017-03-14 12:22:53 -07:00
Umer Khan 161001357d Merge pull request #902 from Sage-Bionetworks/pr/add-result-to-stepViewController
Add method to ORKStepViewController to allow adding a result
2017-03-14 12:04:13 -07:00
Umer Khan 2de86b189e Merge pull request #840 from Sage-Bionetworks/pr/ui-step-footnote
Add footnote label displayed at the bottom of an instruction or form step.
2017-03-14 11:55:57 -07:00
Umer Khan f739fed350 Merge pull request #804 from Sage-Bionetworks/pr/add-memory-copyright
There is a copyright that should be included with the memory game.
2017-03-14 11:54:10 -07:00
Umer Khan 3a6fc380cf Merge pull request #910 from Sage-Bionetworks/pr/add-primitive-number-to-equality-test
Added equality testing for primitive double, int and bool properties
2017-03-14 11:50:08 -07:00
Umer Khan 2208a8bcfd Merge pull request #940 from johnsaigle/readmeUpdate
Update README to reflect new ORK syntax
2017-03-14 10:30:30 -07:00
Steve Moser 76b6b1e995 Fix app delegate methods not being called
Because of the changes to Swift 3 the sample app’s delegate methods
were not being called which made the apps fail in ways that aren’t
apparent at first launch.
2017-03-12 13:51:50 -04:00
Steve Moser 56243d7cd6 Merge branch 'ResearchKit/master' 2017-03-12 13:42:58 -04:00
Macro Yau 28c5e75375 Fix serialization and add tests 2017-03-11 16:06:59 +08:00
Macro Yau df4be2f4c4 Add NSCoder support 2017-03-11 15:22:17 +08:00
Macro Yau 9a778eafcd Add example to ORKCatalog 2017-03-11 11:55:37 +08:00
Macro Yau 4c8a05251c Add custom yes and no strings option for ORKBooleanAnswerFormat 2017-03-11 11:42:52 +08:00
John Saigle c0851d8f2e Update README to reflect new ORK syntax 2017-03-09 13:52:01 -05:00
Macro Yau 5c69459f6b Add customizable decimal place option for ORKYAxisView value labels 2017-03-09 16:16:29 +08:00
Macro Yau 66adcfd387 Add customizable decimal place option for ORKGraphChartView scrubber label 2017-03-09 16:08:21 +08:00
Shannon Young 1a6f84b706 Fix the loop for the case where the UITableViewDelegate and this protocol clash
It you point the `ORKTableStepSource` at the view controller then this will result in an infinite loop of wacky madness. Change the protocol to match the other methods in the protocol that provide a pointer to the table view as the last parameter.
2017-03-07 22:04:47 -08:00
Shannon Young 82dc103bbf Fixes in response to code review. 2017-03-07 15:17:16 -08:00
Shannon Young c17e90d775 fix code review issue. 2017-03-07 14:26:13 -08:00
Shannon Young d649b4a14d Fixed code review issues 2017-03-07 14:23:56 -08:00
Shannon Young 7a6dd5c580 Fix code review issues. 2017-03-07 13:50:38 -08:00
Shannon Young 65537987df use self.footnote.hash 2017-03-07 13:23:50 -08:00
Shannon Young 1ae3f86279 Fix missing passcodeFlow serialization, copying, encoding and equality 2017-03-07 11:41:05 -08:00
Umer Khan e4d2187871 Merge pull request #877 from sroymdsol/Expose_passcode_flow_types
Expose passcode flow types
2017-03-06 11:25:35 -08:00
Shannon Young 9499035725 Update to check programmatically for iOS 10 or watchOS 3 availability 2017-03-03 13:37:11 -08:00
Shannon Young 3680d05f38 Fix HKCharacteristicTypeIdentifierWheelchairUse iOS10 issue 2017-03-03 12:33:42 -08:00
Shannon Young 42a2d0efb8 Check for iOS10 for HKCharacteristicTypeIdentifierWheelchairUse 2017-03-03 11:07:51 -08:00
Shannon Young 0a8165ca35 Fix tests for ORKVideoCaptureStep 2017-03-03 00:54:22 -08:00
Shannon Young 325142bec2 Merge branch 'master' into pr/add-primitive-number-to-equality-test 2017-03-03 00:39:57 -08:00
Shannon Young 9b137318e0 Add space between imports and @implementation 2017-03-01 14:11:01 -08:00
Shannon Young 2330a21426 Cleanup in response to code review. 2017-03-01 14:07:07 -08:00
Shannon Young a09b5f3a70 For direct inheritance from ORKStepViewController, use parent results rather than added results. 2017-03-01 10:00:50 -08:00
Shannon Young e57e99b290 Merge remote-tracking branch 'origin/master' into pr/add-result-to-stepViewController 2017-03-01 09:29:59 -08:00
Shannon Young 64780981f2 Merge branch 'master' into pr/add-multicomponent-picker-format
# Conflicts:
#	ResearchKit/Common/ORKAnswerFormat.m
2017-02-28 15:44:37 -08:00
Tobias Jungnickel 787844d2a0 extend ORKTableStepSource to return custom title and view for header in section 2017-02-28 11:17:19 +01:00
Umer Khan ac74dfc416 Merge pull request #899 from Medable/issue834_ContinuousScaleStep
Fixes #834. "Continuous Scale Step - UI value and result value mismatch when using fraction digits."
2017-02-27 13:12:29 -08:00
Umer Khan 8f9f2f6de5 Merge pull request #908 from joshbruhin/BridgeTask-1513
Adding specific images for Tremor test left and right hand
2017-02-27 13:11:10 -08:00
Akshay 56d45c3a96 Merging latest public master 2017-02-23 14:58:10 -08:00
Shannon Young f45a6f629f Merge branch 'master' into pr/update-healthkit-answerformat 2017-02-17 09:35:45 -08:00
Josh Bruhin 0d11c9f9fd Bridge-1684 call becomeFirstResponder with dispatch to main queue after delay to prevent invisible keyboard when user hits ‘cancel’ in touch ID context 2017-02-09 15:17:49 -07:00
Umer Khan 2843759bcc Merge pull request #913 from stevemoser/patch-3
Add missing height question
2017-02-09 10:15:58 -08:00
Steve Moser a6509da0b1 Add missing height question 2017-02-07 15:51:48 -05:00
Shannon Young fc8c18ec0a Move healthkit read permissions to ORKStep
# Conflicts:
#	ResearchKit/Common/ORKOrderedTask.m
2017-02-03 11:21:32 -08:00
Kelsey Dedoshka badfbf0ad1 [Update] ResearchKit (1.4.1) 2017-02-01 15:10:08 -08:00
Faraz Hussain 3a630b3959 Adding timer label and error scores to trail making test 2017-01-31 13:30:04 -06:00
Shannon Young a2a6fef6aa Added test for checking the hash to equality tests. 2017-01-30 14:04:39 -08:00
Shannon Young 2986d85f58 Added equality testing for primitive double, int and bool properties
This adds equality checking for primitive types for the double, int and bool properties.

Note: this *only* checks equality and does not test these properties for encoding, though I have also fixed the encoding for those classes that failed the equality tests.
2017-01-30 13:10:16 -08:00
Josh Bruhin 5ee602bbee Deleting previous Tremortest2 image, replaced by TremortestLeft and TremortestRight 2017-01-30 12:22:33 -07:00
Josh Bruhin ee317862bb Adding specific images for Tremor test left and right hand instead of simply flipping the right-handed image for use as the left. 2017-01-30 12:17:29 -07:00
Umer Khan 182cb27551 Merge pull request #904 from stevemoser/patch-2
Fix ORKTimedWalkResult isEqual: and copyWithZone:
2017-01-30 08:54:35 -08:00
Umer Khan e54f09d973 Merge pull request #903 from stevemoser/patch-1
Fix fashion typo
2017-01-30 08:52:35 -08:00
Steve Moser dd7eb78775 Fix ORKTimedWalkResult isEqual: and copyWithZone:
It appears this was most likely the result of a copy and paste error. IMHO tests should be created for this class to catch small bugs like this one.
2017-01-28 15:33:22 -05:00
Steve Moser eae5eb5458 Fix fashion typo 2017-01-28 14:59:08 -05:00
Shannon Young a70323b73a Add method to ORKStepViewController to allow adding a result
Add a result to the step view controller's `ORKStepResult`. By default, the property for the step view controller's result will instantiate a copy of the result each time it is called. Therefore, the result cannot be mutated by adding a result to it's result array.

This method can be called by a delegate to add a result to a given step in a way that will be retained by the step, but will allow both the step and the ORKResult to be immutable when passed to the task view controller.

We have been finding that many of the researchers and developers we work with assume that this is possible and then become frustrated and confused when it doesn’t work.
2017-01-27 16:05:55 -08:00
Shannon Young d36b53336b Fixed warnings about int cast. 2017-01-26 16:23:37 -08:00
Faraz Hussain 0a2c937ef2 Redrawing graphics in UIView
Lines connecting dots are now redrawn if orientation is changed from
portrait to landscape or vice versa to maintain line coherence
2017-01-26 16:01:23 -06:00
Shannon Young 3d5dfec624 Allow interhitance of navigation rules outside ResearchKit
This will still throw an exception if the developer attempts to initialize an instance of the base class without inheriting it but allows developers to create navigation rules that inherit directly from the base class.
2017-01-26 11:40:59 -08:00
Fernando Waigandt e9569123fd Pull request #899 - Requested changes - Added Medable Copyright. 2017-01-25 21:35:38 -03:00
Fernando Waigandt d5ac624b24 Pull request #899 - Requested changes. 2017-01-25 21:28:43 -03:00
Faraz Hussain 5aade34809 Clarified instruction wording for trail making test 2017-01-25 15:06:30 -06:00
Faraz Hussain d7b44f890e Merge branch 'master' into pr/add-module-trailmaking-test 2017-01-25 15:00:30 -06:00
Shannon Young 250a18ee26 Merge branch 'master' into pr/ui-step-footnote
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2017-01-25 10:54:55 -08:00
Umer Khan 1446df4559 Merge pull request #898 from rsanchezsaez/rss/ORKSignatureView-top
[ORKSignatureStepViewController] Fix not being able to start traces on the top part of the signature view
2017-01-25 10:45:32 -08:00
Umer Khan 1afe85b259 Merge pull request #769 from oliverschaefer/videoInstructionStep
Video Instruction Step
2017-01-25 10:43:52 -08:00
Steve Roy a93e0c15b8 Moved the passcodeFlow property and associated enums to be a property of ORKPasscodeStep instead of the view controller. 2017-01-25 11:01:51 -05:00
Fernando Waigandt d0c261b36b Medable - Fixes #834. "Continuous Scale Step - UI value and result value mismatch when using fraction digits." 2017-01-25 12:06:57 -03:00
Oliver Schäfer b1bc2e649d Merge pull request #7 from MacroYau/feature/videoinstructionstep
Implement requested changes in Video Instruction Step
2017-01-25 08:38:56 +01:00
Macro Yau 61eb619e3d Update ORKESerializer 2017-01-25 14:10:01 +08:00
Ricardo Sanchez-Saez 807d24b76e [ORKSignatureStepViewController] Rename 'ORKConsentSignatureWrapperView' to 'ORKSignatureWrapperView'
This makes all signature UI classes coherent. The result and data model classes still have the `ORKConsentSignature...` prefix (to differentiate from an automatically calculated electronic signature).
2017-01-24 20:57:19 -08:00
Ricardo Sanchez-Saez 80d707b094 [ORKSignatureView] Remove needless '_' prefix from method names 2017-01-24 20:48:35 -08:00
Ricardo Sanchez-Saez 601692b991 [ORKSignatureStepViewController] Fix not being able to start traces on the top part of the signature view 2017-01-24 20:46:27 -08:00
Macro Yau 4b143997b8 Implement requested changes 2017-01-25 11:02:42 +08:00
Macro Yau 6438c4770a Resolve merge conflicts 2017-01-25 10:56:39 +08:00
Shannon Young ab20d025e3 Merge branch 'master' into pr/add-multicomponent-picker-format
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
2017-01-24 14:16:20 -08:00
Shannon Young e8660e83ad Merge branch 'master' into pr/update-healthkit-answerformat
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
2017-01-24 14:13:33 -08:00
Shannon Young ddc90812d1 Merge branch 'master' into pr/ui-step-footnote
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
#	Testing/ORKTest/ORKTest/MainViewController.m
2017-01-24 14:06:01 -08:00
Umer Khan c024cbd503 Merge pull request #758 from Sage-Bionetworks/pr/ui-add-ORKPageStepViewController
Add ORKPageStep and ORKPageStepViewController
2017-01-24 13:49:10 -08:00
Umer Khan 0c9fb3b357 Merge pull request #848 from Sage-Bionetworks/pr/fix-tremor-navigation
Add ORKStepModifier to navigable task.
2017-01-24 13:23:35 -08:00
Umer Khan 7212f3c663 Merge pull request #845 from Sage-Bionetworks/pr/tablestep-source
ORKTableStepViewController improvements
2017-01-24 13:19:46 -08:00
Umer Khan 9a68704218 Merge pull request #894 from rsanchezsaez/rss/ORKSignatureView
[ORKSignatureView] Increase height and distance of signing line to bottom
2017-01-24 13:19:14 -08:00
Umer Khan b85949bf7b Merge pull request #897 from Sage-Bionetworks/pr/fix-regex-validation
Fix ORKTextAnswerFormat regex to be case sensitive.
2017-01-24 13:17:57 -08:00
Faraz Hussain a9d1ef573d Minor formatting changes requested during merge 2017-01-24 14:48:33 -06:00
Shannon Young dc185c69e4 Fix merge conflicts 2017-01-24 12:43:33 -08:00
Shannon Young 32abf1f6f5 Merge branch 'master' into pr/ui-add-ORKPageStepViewController
# Conflicts:
#	ResearchKit/Common/ORKResult_Private.h
#	ResearchKit/ResearchKit.h
#	ResearchKit/ResearchKit_Private.h
#	Testing/ORKTest/ORKTest/MainViewController.m
2017-01-24 12:17:18 -08:00
faraz-hussain 742b6f01ab Merge branch 'master' into pr/add-module-trailmaking-test 2017-01-24 14:13:54 -06:00
Shannon Young 2af14cfa68 Cleanup code style. 2017-01-24 12:03:39 -08:00
Umer Khan 2a3ffd2b18 Merge pull request #890 from rsanchezsaez/rss/ib-designable
[Charts] IBDesignable improvements
2017-01-24 11:56:11 -08:00
Shannon Young 2f72c15451 Cleaned up code style. 2017-01-24 11:55:52 -08:00
Shannon Young 74a8a0ec6d Merge branch 'master' into pr/tablestep-source 2017-01-24 11:52:00 -08:00
Shannon Young 06ce98338a Merge branch 'master' into pr/ui-step-footnote
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2017-01-24 11:51:02 -08:00
Umer Khan 541ae005b6 Merge pull request #807 from slichlyter12/master
Added gesture recognizer to MapView for ORKLocationAnswerFormat
2017-01-24 11:47:19 -08:00
Umer Khan 090877e5d9 Merge pull request #859 from rsanchezsaez/umbrella-headers
[Umbrella headers] Update #imports to framework format
2017-01-24 11:45:27 -08:00
Shannon Young 3b41a38158 Fix warnings about the designated initializer 2017-01-24 11:42:05 -08:00
Umer Khan f57ec43e1f Merge pull request #837 from Sage-Bionetworks/pr/ui-completion-step-done-button
Add a flag to allow displaying the continue button in the standard position for the compltion step.
2017-01-24 11:32:58 -08:00
Umer Khan e17fb8008d Merge pull request #828 from Sage-Bionetworks/pr/fix-navigation-result-loop
Fix navigation looping to return unique results for each step.
2017-01-24 11:31:49 -08:00
Oliver Schäfer e818d99489 Merge pull request #6 from MacroYau/feature/videoinstructionstep
Resolve merge conflicts
2017-01-24 09:33:21 +01:00
Macro Yau 2fe68f6ac0 Fix ORKCatalog example 2017-01-24 14:00:20 +08:00
Macro Yau ec839b490c Resolve merge conflicts 2017-01-24 13:54:07 +08:00
Macro Yau a2ae36e08c Resolve merge conflicts 2017-01-24 13:18:21 +08:00
Ricardo Sanchez-Saez e9e6e781ae Merge branch 'master' of github.com:ResearchKit/ResearchKit into umbrella-headers 2017-01-23 19:27:40 -08:00
Ricardo Sanchez-Saez b97d728f7a Merge branch 'master' of github.com:rsanchezsaez/ResearchKit into umbrella-headers
# Conflicts:
#	ResearchKit/ResearchKit.h
#	ResearchKit/ResearchKit_Private.h
2017-01-23 19:27:26 -08:00
Ricardo Sanchez-Saez b2ec0051ba [ORKSignatureView] Better fit on iPhone 4 sizes 2017-01-23 19:20:49 -08:00
Shannon Young 2769f3f880 Show a separator between components. 2017-01-23 15:54:59 -08:00
Shannon Young 99195db143 Fix ORKTextAnswerFormat regex to be case sensitive. 2017-01-23 14:39:51 -08:00
Umer Khan 44ba432e8a Merge pull request #854 from Sage-Bionetworks/pr/optional-previous-result-override
Allow optional check of default result source before using previous.
2017-01-23 11:50:13 -08:00
Umer Khan 33673f320a Merge pull request #814 from celteeka/bug/issue812
PR for fixing issue812.
2017-01-23 11:42:13 -08:00
Umer Khan d90c266151 Merge pull request #809 from oliverschaefer/issue784
ORKSignatureView invalid graphics context bugfix
2017-01-23 11:23:31 -08:00
Umer Khan a5115044eb Merge pull request #889 from rsanchezsaez/result-predicate-comment
[ORKResultPredicate] Clarify comment on '+ predicateForConsentWithRes…ultSelector:didConsent:' usage
2017-01-23 11:22:35 -08:00
Umer Khan d0fc7490fd Merge pull request #872 from Sage-Bionetworks/pr/fix-audio-task-start-resume-bug
Fix audio step duplicate file creation bug
2017-01-23 11:22:03 -08:00
Umer Khan e6c4055dec Merge pull request #892 from rsanchezsaez/rss/warning-fixes
[Misc] Fix warnings
2017-01-23 11:21:14 -08:00
Shannon Young 8c1a53cfdf Add answer format for handling a multiple component picker. 2017-01-20 15:48:12 -08:00
Shannon Young 1635216e5c Merge branch 'master' into pr/update-healthkit-answerformat 2017-01-19 13:20:03 -08:00
Ricardo Sanchez-Saez f616083f3c [ORKSignatureView] Increase height and distance of signing line to bottom 2017-01-18 19:54:27 -08:00
DanKeen a4991240e2 Merge pull request #893 from coreygans/patch-1
Update ChartsAndGraphs-template.markdown
2017-01-17 13:41:34 -08:00
coreygans ac0817adf1 Update ChartsAndGraphs-template.markdown
Needed to change the Chart1.png to chart1.png so that the link would resolve.
2017-01-17 10:14:32 -08:00
Ricardo Sanchez-Saez bdf5f25335 [Projects] Update last upgrade checks to Xcode 8.2 2017-01-09 23:35:09 -08:00
Ricardo Sanchez-Saez 849aba6a3d [ORKStepHeaderView] Fix nil attribute warning 2017-01-09 23:26:09 -08:00
Ricardo Sanchez-Saez 5e08420307 [Charts] Add IB sample data source for bar graph
Also, fix an issue in which each data source subclass needs its own 'sharedInstance' method.
2017-01-08 13:23:42 -08:00
Ricardo Sanchez-Saez ad08365514 [Charts] Better encapsulation of IB_DESIGNABLE sample data sources
Also, fix typos due to 'ORKRangedPoint' to 'ORKValueRange' rename.
2017-01-08 11:57:49 -08:00
Shannon Young 1f574ba055 Add missing method call that was lost by merge. 2017-01-06 00:00:28 -08:00
Ricardo Sanchez-Saez 956e338c98 [ORKResultPredicate] Clarify comment on '+ predicateForConsentWithResultSelector:didConsent:' usage 2017-01-05 19:56:56 -08:00
Shannon Young 017a28e736 Added unit test and additional comments for usage. 2017-01-05 14:32:39 -08:00
Shannon Young 48e5e0baf7 consolidate getting or creating a previous result. 2017-01-03 16:50:43 -08:00
Shannon Young 607c96b5d3 Change trailmaking identifiers to ork_extern 2016-12-22 19:51:39 -08:00
Shannon Young 8b7eb71b1f Update externally defined healthkit string enums. 2016-12-22 19:48:32 -08:00
Shannon Young c8a43499c5 Merge branch 'master' into pr/ui-step-footnote
# Conflicts:
#	ResearchKit/Common/ORKInstructionStep.m
#	Testing/ORKTest/ORKTest/MainViewController.m
2016-12-20 16:50:06 -08:00
Umer Khan 02828eff5a Merge pull request #763 from md0u80c9/predicateTests
PredicateTests
2016-12-20 18:14:26 -06:00
Umer Khan 06f16e780b Merge pull request #825 from Sage-Bionetworks/pr/fix-nil-startDate
Always set a date for non-nil ORKResult startDate
2016-12-19 18:02:54 -06:00
Umer Khan e4918e28bd Merge pull request #861 from rsanchezsaez/typos
[Misc] Fix some typos
2016-12-16 15:38:05 -08:00
Shannon Young 919ba1e7b2 Fix the class of the trialmaking task and remove duplicate text. 2016-12-15 11:09:10 -08:00
Shannon Young e8e00503a4 set type for the trailmaking result array of taps. 2016-12-14 23:37:10 -08:00
Shannon Young bf0450af0a Merge branch 'master' into third-party/add-module-trailmaking-test
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2016-12-14 15:32:57 -08:00
Shannon Young 7752710d0a Fix serialization tests 2016-12-14 15:30:58 -08:00
Shannon Young c7ac9c9a35 Merge branch 'master' into pr/update-healthkit-answerformat 2016-12-14 15:17:28 -08:00
Shannon Young e57fa02765 Fix serialization tests 2016-12-14 15:17:03 -08:00
Shannon Young d42cc93683 Merge branch 'master' into pr/ui-completion-step-done-button
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2016-12-14 15:01:14 -08:00
Shannon Young 4ad73b30e4 Fix serialization tests 2016-12-14 14:54:13 -08:00
Shannon Young f885de099b Merge branch 'master' into pr/ui-add-ORKPageStepViewController
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2016-12-14 14:46:40 -08:00
Shannon Young 8abaa9e3d7 Merge branch 'master' into pr/tablestep-source 2016-12-14 14:35:46 -08:00
Shannon Young f50bfc7ff6 Fix serialization tests 2016-12-14 14:28:59 -08:00
Shannon Young c737c14188 Merge branch 'master' into pr/fix-tremor-navigation 2016-12-14 12:24:34 -08:00
Umer Khan 67dbd30e87 Merge pull request #838 from Sage-Bionetworks/pr/ui-step-header-image
Added property to instruction set to allow setting icon image on header view.
2016-12-14 11:40:36 -08:00
Shannon Young 75b7c2d4e3 Merge branch 'master' into pr/ui-step-footnote 2016-12-14 11:31:15 -08:00
Shannon Young 449b4c056f Merge branch 'master' into pr/ui-step-header-image 2016-12-14 11:06:59 -08:00
Umer Khan 92d63e3a8b Merge pull request #862 from rsanchezsaez/serialization-tests
[ORKESerialization] Fix ORKLocation unit tests
2016-12-14 10:44:29 -08:00
Umer Khan 33dd18300d Merge pull request #831 from doreilly/correct-ios10-layout-bugs
Revert ResearchKit PR #806
2016-12-13 14:17:51 -08:00
Umer Khan b77119a510 Merge pull request #842 from 2020Deception/master
fixes crash when tapping results on ORKCatalog
2016-12-13 14:00:20 -08:00
Shannon Young ce0cfe50f3 More project keys 2016-12-13 13:02:54 -08:00
Shannon Young 69160ed4a4 More fixes for project pointers 2016-12-13 12:52:50 -08:00
Shannon Young 8819cefdd7 Remove references to private developer team 2016-12-13 12:46:06 -08:00
Shannon Young d238065e25 Fixed ORKTest serialization for trailmaking objects. 2016-12-13 11:48:20 -08:00
Faraz Hussain 89d1860902 Trail Making Test complete 2016-12-13 07:55:11 -08:00
Roland Rabien ea113f7b66 Make buttons tapped in error turn red 2016-12-12 16:36:28 -08:00
Roland Rabien 677e6db943 Adding the Trails active task to the ORKCatalog app 2016-12-10 08:46:32 -08:00
Roland Rabien aef19ea441 Add ORKTrailmakingStep to ResearchKit 2016-12-09 14:30:21 -08:00
Steve Roy c41536905e Fixed typo. 2016-12-09 10:33:36 -05:00
Steve Roy ba5e03e247 Replaced !(==) by !=. 2016-12-09 10:32:58 -05:00
Steve Roy e88c3ad800 Modify ORKPasscodeStepViewController to account for the flow type possibly being changed to authentication while in a task. 2016-12-09 10:30:46 -05:00
Shannon Young 97b680d61e Constrain the width of the icon image. 2016-12-08 16:39:50 -08:00
Shannon Young 2cb6fea5bd Correct the constraints for icon image with no title. 2016-12-08 14:58:25 -08:00
Shannon Young 2508623efa Added property to instruction set to allow setting icon image on header view.
This allows an instruction step to display an icon image *above* the title and text for the image.
2016-12-08 14:58:24 -08:00
Steve Roy dcf59ccd67 Moved the passcodeFlow property and associated enums out of the internal header. 2016-12-08 15:24:16 -05:00
Erin Mounts 7448431a3a Fix audio step duplicate file creation bug
Start was getting called in viewDidAppear:, creating an audio file, and meanwhile the superclass viewDidAppear: had dispatched a block to main that then saw the recorder was started and called resume, creating another audio file, only one of which was included in the results, leaving the other which the caller didn't know about and wasn't aware needed to be deleted, using up storage space over time. The fix is to use the shouldStartTimerAutomatically flag to let the superclass viewDidAppear: start the recorder, rather than override that method in the audio step view controller to start it explicitly.
2016-12-02 07:56:38 -08:00
Shannon Young 0779f9ca1a Added methods to transform ResearchKit enum to HealthKit enum 2016-12-01 22:51:59 -08:00
Shannon Young 883004f331 Fixed issues with the health kit result unit. 2016-11-18 16:19:34 -08:00
Andrew Hill ed2ffabb8e Change wording of predicate test 3 2016-11-17 06:16:10 +00:00
Shannon Young dd96c41fa5 Add missing HealthKit characteristic types to answer format.
This commit does a few changes:

1. Add the missing characteristics of Fitzpatrick Skin Type and Wheelchair Use to the `ORKHealthKitCharacteristicTypeAnswerFormat`

2. Add `shouldRequestAuthorization` flag to both defined HealthKit answer format subclasses to allow *not* requesting authorization for access to HealthKit if this does not meet the UI/UX requirements for the app.

3. Publicly expose the `impliedAnswerFormat` method to allow for subclasses to replace the default implied answer format with their own representation.
2016-11-15 11:28:18 -08:00
Andrew Hill a4f69dca57 Slight question changes (from R. Sanchez-Saez's review). 2016-11-15 07:33:00 +00:00
Andrew Hill 9eba881ce2 Removed unnecessary optional lines. 2016-11-14 23:55:55 +00:00
Shannon Young aa9596b4bb Fix typos 2016-11-14 11:18:05 -08:00
Andrew Hill e1103d8547 Style changes and fix to regular expressions following review by Ricardo Sanchez-Saez. 2016-11-14 07:06:55 +00:00
Ricardo Sanchez-Saez a0a74e83e7 [ORKDataCollectionTets] Fix '-testDelegateRejectDelivery' tests
Also:
- Rename 'testDelegateRejectDelivery' to 'testDataCollectionDelegateDeliveryRejection'.
- Reorder code for consistency between 'testDataCollection' and 'testDataCollectionDelegateDeliveryRejection'
- Rename 'testDataCollectionWithoutCollector' to 'testDataCollectionWithoutCollectors'.
- Remove needless whitespace and fix padding.
2016-11-13 20:10:59 -08:00
Ricardo Sanchez-Saez 8c8072cdec [ORKOperation] Fix error message typos 2016-11-13 20:04:15 -08:00
Umer Khan 7a4dd58df6 Merge pull request #746 from vtourraine/timed-walk-back-instructions
[ORKTimedWalkStepViewController] Add Turn Around step
2016-11-09 13:10:57 -08:00
Vincent Tourraine 8314e7d9a1 Update Swift syntax 2016-11-09 16:30:07 +01:00
Vincent Tourraine 7696d28f05 Merge upstream master 2016-11-09 16:26:09 +01:00
Umer Khan c4fe887fe5 Merge branch 'master' of https://github.com/ResearchKit/ResearchKit
* 'master' of https://github.com/ResearchKit/ResearchKit:
  templatized arrays
  [Projects] Update to Xcode 8.1 recommended settings
  Implementing @umerkhan-apple comments
  Fix typo in podspec version quoting characters.
  Touch Anywhere Active Task Range of Motion Active Tasks:       - Knee       - Shoulder
2016-11-08 17:44:12 -08:00
Umer Khan f38e31936e Merge pull request #863 from malhal/master
Templatized arrays in ORKOrderedTask.m
2016-11-08 11:58:02 -08:00
Umer Khan 339d364b40 Merge pull request #860 from rsanchezsaez/xcode-8.1
[Projects] Update to Xcode 8.1 recommended settings
2016-11-08 11:56:40 -08:00
Umer Khan 519ad1aaf9 Merge pull request #816 from darrenlevy/range-of-motion
Range of Motion Active Task
2016-11-08 11:52:45 -08:00
Malcolm Hall 203f48f8dc templatized arrays 2016-11-08 17:16:43 +00:00
Ricardo Sanchez-Saez a4cb2723da [ORKDataCollectionTests] Fix some typos 2016-11-08 01:11:11 -08:00
Ricardo Sanchez-Saez cb4e06a4c9 [ORKESerialization] Fix CLCircularRegion unit tests 2016-11-08 00:53:22 -08:00
Ricardo Sanchez-Saez 01f4312dce [Misc] Fix some typos 2016-11-07 22:50:24 -08:00
Ricardo Sanchez-Saez f1457b69b1 [Projects] Update to Xcode 8.1 recommended settings 2016-11-07 22:34:12 -08:00
Ricardo Sanchez-Saez 692ec6e007 [ORKESerialization] Add extra ResearchKit import to silence error 2016-11-07 22:30:33 -08:00
Ricardo Sanchez-Saez 28ceb9ebe5 [Umbrella headers] Change #imports to framework format 2016-11-07 22:14:17 -08:00
Darren Levy 9a69dbbd67 Implementing @umerkhan-apple comments 2016-11-07 18:08:15 -05:00
Shannon Young 9bd4df0996 Fix default initializer warnings. 2016-11-01 12:01:27 -07:00
Shannon Young 7dd98c8033 Fix init for ORKKeyValueStepModifier 2016-11-01 11:04:18 -07:00
Shannon Young b3934066ed Allow setting checkmark color and hide cancel. 2016-10-28 14:29:50 -07:00
Umer Khan 6089b09963 Merge pull request #853 from ryanschneider/podspec-fix
Fix typo in podspec version quoting characters.
2016-10-27 14:42:33 -07:00
Shannon Young 57058a66f5 Allow option check of default result source before using previous. 2016-10-27 12:29:53 -07:00
Ryan Schneider 87a7a6a718 Fix typo in podspec version quoting characters. 2016-10-27 11:26:15 -07:00
Umer Khan 0e5f58736a Merge branch 'master' of https://github.com/ResearchKit/ResearchKit
* 'master' of https://github.com/ResearchKit/ResearchKit: (113 commits)
  Updating podspec
  Updating podspec.
  convergence
  Convergence
  Fixed width constraint priority
  Make ORKInstructionStepViewController and ORKCompletionStepViewController public
  Add comment to the aux image.
  Add example use of the auxillary image.
  created the touchIdEnabled serializable encoding, confirm all tests pass
  Typo in function name
  Add ORKTappingButtonIdentifier rather than NSInteger
  added taskViewController didChangeResult implementation example to show how to get the ORKPasscodeResult information in the delegate
  Fix merge errors
  as per PR comment edited the ORKPasscodeResult to handle a new boolean property touchIdEnabled, in encoding/decoding, copying, and description
  removed the forced taskViewController delegate call from the ORKPasscodeStepViewCOntroller as its already calling it on its own, so no need for double
  added the delegate call when the prompt for touchID call is complete
  Erased asterisk/pointer from my last pull request
  Fixing bug where timer label did not display
  invalid pointer updates (warning fixes)
  Fix documentation typo
  ...

# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
#	ResearchKit/ActiveTasks/HKSample+ORKJSONDictionary.m
#	ResearchKit/Common/ORKTaskViewController.m
#	ResearchKit/Common/ORKTextButton.h
#	Testing/ORKTest/ORKTestTests/ORKJSONSerializationTests.m
2016-10-26 13:49:10 -07:00
Umer Khan c1493b9c5c Merge pull request #851 from ResearchKit/podspec
Podspec
2016-10-26 13:09:39 -07:00
Umer Khan d47e835e8e Merge branch 'master' into podspec
* master:
  convergence
  Update pod spec version number.
  Declare ORKScrollToTopAnimationDuration and ORKCGFloatInvalidValue as extern in ORKHelpers.h; fixes #679
2016-10-26 13:08:56 -07:00
Umer Khan 4b456ad2bb Merge pull request #850 from ResearchKit/stable
Stable
2016-10-26 12:48:49 -07:00
Umer Khan 125ff93795 Updating podspec 2016-10-26 12:40:56 -07:00
Umer Khan 2a1bbeefe8 Merge branch 'master' into stable
* master: (346 commits)
  Updating podspec.
  Convergence
  Fixed width constraint priority
  Make ORKInstructionStepViewController and ORKCompletionStepViewController public
  Add comment to the aux image.
  Add example use of the auxillary image.
  created the touchIdEnabled serializable encoding, confirm all tests pass
  Typo in function name
  Add ORKTappingButtonIdentifier rather than NSInteger
  added taskViewController didChangeResult implementation example to show how to get the ORKPasscodeResult information in the delegate
  Fix merge errors
  as per PR comment edited the ORKPasscodeResult to handle a new boolean property touchIdEnabled, in encoding/decoding, copying, and description
  removed the forced taskViewController delegate call from the ORKPasscodeStepViewCOntroller as its already calling it on its own, so no need for double
  added the delegate call when the prompt for touchID call is complete
  Erased asterisk/pointer from my last pull request
  Fixing bug where timer label did not display
  invalid pointer updates (warning fixes)
  Fix documentation typo
  Update ORKPicker.m
  Documented the ORKPicker functions.
  ...

# Conflicts:
#	ResearchKit.podspec
#	ResearchKit/ResearchKit.h
#	ResearchKit/ResearchKit_Private.h
2016-10-26 12:36:20 -07:00
Umer Khan ddc023fd4c Merge pull request #849 from ResearchKit/podspec
Updating podspec.
2016-10-26 11:31:58 -07:00
Umer Khan 160bb111f0 Updating podspec. 2016-10-26 11:31:36 -07:00
Shannon Young 737fa76bc9 Fix another typo in comment 2016-10-25 12:05:10 -07:00
Shannon Young a1b84fbf1e Fix typo in comment. 2016-10-25 11:05:40 -07:00
Shannon Young 82eb17de13 Add ORKStepModifier to navigable task.
`ORKStepModifier` was designed to allow optional modifications to an existing step in an  `ORKNavigableOrderedTask`. This allows changing the step based on navigation results. This class is used to fix a bug with the spoken instruction in the tremor task if the participant skips performing the task with one of their hands.
2016-10-25 10:00:04 -07:00
Shannon Young 5c3072b791 Remove TODO warning. 2016-10-24 11:17:30 -07:00
Shannon Young 740a7a4bf7 Fix resultForIdentifier to use reverse-enumeration to get last result. 2016-10-20 13:03:20 -07:00
Shannon Young 5029c7f3a8 Update to ORKTableStepViewController to use plain-style table for single section. 2016-10-20 11:29:13 -07:00
Shannon Young 4cac405737 Update the ORKTableStepViewController to use a protocol for the source
Replace the pointer in `ORKTableStepViewController` to `ORKTableStep` with a protocol. This will allow subclasses of `ORKStep` that do not subclass from `ORKTableStep` to implement the protocol instead. For example, a subclass of `ORKFormStep` that uses custom cells for the display of form items.
2016-10-18 12:11:56 -07:00
Brian Bowman 4025e0f427 fixes crash when tapping results
checks for results instead of assuming they are present
2016-10-15 13:50:04 -04:00
Shannon Young 67643271ae Add footnote label displayed at the bottom of an instruction or form step.
This is useful in displaying disclaimer or copyright information.
2016-10-13 12:40:04 -07:00
Shannon Young e207270b5d Add a flag to allow displaying the continue button in the standard position for the compltion step.
We are finding that many of our users are confused as to how to dismiss a task because the continue button is moved to the upper right corner for the last step.  This commit allows overriding the default behavoir of moving that button and places it in the standard position for a continue button.
2016-10-12 11:26:45 -07:00
Shannon Young cdc8edf78f Track the initial results separately from the mutating results set. 2016-10-03 11:35:42 -07:00
Darren Levy f5b3bbc4dd Touch Anywhere Active Task
Range of Motion Active Tasks:
      - Knee
      - Shoulder

    The Touch Anywhere Active Task was included to allow the user to get their device in the proper position before beginning the Range of Motion Step.

    Range of Motion's result contains two properties: flexed and extended. These correspond to the measurements a doctor may read when using a goniometer.
2016-10-02 15:39:46 -04:00
doreilly ef0164900a Revert ResearchKit PR #806
Reverted Pull Request #806 to fix errors identified in ResearchKit issue #824
2016-09-29 11:46:58 -04:00
Shannon Young b08a2a8627 Merge branch 'master' into pr/ui-add-ORKPageStepViewController
# Conflicts:
#	Testing/ORKTest/ORKTestTests/ORKJSONSerializationTests.m
2016-09-28 13:21:13 -07:00
Shannon Young 90c2ee018e Fix navigation looping to return unique results for each step.
Previous to this commit, `ORKTaskViewController` only tracked the *last* result, inserting that result into the returned array of results for each instance of the step result with that identifier. This commit fixes that bug so that an `ORKNavigableOrderedTask` with a looping navigation will return the unique result for each loop.
2016-09-28 12:59:53 -07:00
Shannon Young cc1bfbf7eb Always set a date for non-nil ORKResult startDate 2016-09-28 12:57:08 -07:00
Shannon Young ea6b1278ce Change memory copyright to be a learn more link 2016-09-28 12:55:28 -07:00
Shannon Young 956e846eb4 There is a copyright that should be included with the memory game. 2016-09-28 12:55:28 -07:00
Yuan Zhu 30742a5043 convergence 2016-09-27 13:42:56 -07:00
Yuan Zhu ead0650dfb Convergence 2016-09-26 22:23:17 -07:00
Yuan Zhu 358ffcab78 Update README.md 2016-09-26 14:56:43 -07:00
Vincent Tourraine cc6bfe72e5 [ORKTimedWalkStepViewController] Fix progress view layout 2016-09-06 12:01:44 +02:00
Vincent Tourraine 7fe111b750 [ORKTimedWalkStepViewController] Add distinct method for turn around step #746 2016-09-06 11:57:26 +02:00
Vincent Tourraine 043f6258a3 Merge branch 'master' into timed-walk-back-instructions 2016-09-06 11:42:05 +02:00
Sebastian Ricaldoni 2f55113c11 Fixes issue around 'symbol not found...' when subclassing ORKQuestionStepCellHolderView
See https://github.com/ResearchKit/ResearchKit/issues/812
2016-09-01 16:38:56 -03:00
Oliver Schäfer 01e6728926 PR changes 2016-08-31 07:18:12 +02:00
Oliver Schäfer 9f03f45d1b PR changes 2016-08-31 07:17:37 +02:00
Oliver Schäfer 08dfa3fa8d Initial commit 2016-08-31 07:15:06 +02:00
Sam Lichlyter 26f2563a1a Added gesture recognizer to MapView for ORKLocationAnswerFormat 2016-08-30 13:36:24 -07:00
Yuan Zhu 4f3d0f33df Merge pull request #803 from Sage-Bionetworks/pr/public-ORKCompletionStepViewController
Make ORKInstructionStepViewController and ORKCompletionStepViewController public
2016-08-30 13:14:46 -07:00
Yuan Zhu 608d954197 Merge pull request #806 from asynchrony/fixed_width_constraint
Fixed width constraint priority
2016-08-30 10:25:18 -07:00
Joe Carroll 74326baef4 Fixed width constraint priority 2016-08-30 12:16:19 -05:00
Oliver Schäfer ed1aa683df PR changes 2016-08-27 10:32:20 +02:00
Oliver Schäfer 22589511bb Merge remote-tracking branch 'apple/master' into videoInstructionStep 2016-08-27 10:19:03 +02:00
Oliver Schäfer 4a00ebb8c5 PR changes 2016-08-27 10:15:04 +02:00
Shannon Young 1e3b3f24fa Merge remote-tracking branch 'origin/master' into pr/ui-add-ORKPageStepViewController
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2016-08-26 11:25:40 -07:00
Shannon Young 5b1abe95c5 Make ORKInstructionStepViewController and ORKCompletionStepViewController public
We use a custom subclass of ORKInstructionStep which uses a custom implementation for learn more actions. By publicly exposing these view controllers, we can return the appropriate view controller (or subclass).
2016-08-25 15:37:48 -07:00
Yuan Zhu fe9c9e1fc5 Merge pull request #752 from Sage-Bionetworks/pr/add-module-hand-tremor
Add Hand Tremor Module
2016-08-24 11:06:16 -07:00
Shannon Young b8b7b80f09 Add comment to the aux image. 2016-08-26 10:46:57 -07:00
Oliver Schäfer c204c39daa play button with sharp edges 2016-08-23 13:12:58 +02:00
Oliver Schäfer d9198f5d13 PR changes 2016-08-23 13:07:10 +02:00
Oliver Schäfer 8c98958d17 PR changes 2016-08-23 13:02:30 +02:00
Umer Khan 1bcc12bd80 Merge pull request #792 from boland25/feature/touchIDReportResults
Feature/touch ID report results of if touchID was chosen in Passcode Setup
2016-08-22 14:21:40 -07:00
Shannon Young eb9464b6ce Add example use of the auxillary image. 2016-08-22 11:09:42 -07:00
Yuan Zhu c476ad838e Merge pull request #798 from gmw/master
Typo in function name
2016-08-22 10:06:28 -07:00
Gregory Boland c167e4d84c created the touchIdEnabled serializable encoding, confirm all tests pass 2016-08-22 11:01:15 -04:00
Oliver Schäfer cc18572956 Merge remote-tracking branch 'apple/master' 2016-08-21 18:31:30 +02:00
Oliver Schäfer fe2e5820c4 PR changes 2016-08-21 18:27:48 +02:00
Oliver Schäfer 85bea88d6a PR changes 2016-08-21 17:56:43 +02:00
Magnus Wissler 77eb12636a Typo in function name 2016-08-21 12:02:11 +02:00
Umer Khan 27f4197374 Merge pull request #654 from m1entus/master
Adding tap duration to Tapping Task Issue #561
2016-08-19 12:47:11 -07:00
Michal Zaborowski 34f473d8e5 Add ORKTappingButtonIdentifier rather than NSInteger 2016-08-19 20:47:01 +02:00
Shannon Young 396b9c8e13 Clean up and clearly differentiate between ORKPageStep and ORKNavigablePageStep 2016-08-18 22:37:44 -07:00
Shannon Young 937e615377 Hide the implementation detail of using a pageTask from the base class of ORKPageStep 2016-08-18 18:58:50 -07:00
Shannon Young 6e052a8b1a Fix back button for the case where this is the first step in the subtask 2016-08-18 17:11:48 -07:00
Steve Moser b71eb952b3 Merge branch 'ResearchKit/master' 2016-08-17 20:24:12 -04:00
Oliver Schäfer c6bb31f514 PR changes 2016-08-17 23:14:53 +02:00
Oliver Schäfer 24c540e70c Merge remote-tracking branch 'apple/master' 2016-08-17 23:11:12 +02:00
Oliver Schäfer 0361f242a0 PR changes 2016-08-17 21:51:45 +02:00
Oliver Schäfer 9d614ded2e Merge branch 'master' into videoInstructionStep 2016-08-17 21:41:35 +02:00
Gregory Boland 42b9907579 added taskViewController didChangeResult implementation example to show how to get the ORKPasscodeResult information in the delegate 2016-08-17 10:08:15 -04:00
Shannon Young 3e9cc99324 Fixed outdated comment 2016-08-16 13:46:19 -07:00
Shannon Young 43ce339890 Fix merge errors 2016-08-16 13:42:46 -07:00
Shannon Young 3be5fe1925 Merge remote-tracking branch 'origin/master' into pr/ui-add-ORKPageStepViewController
# Conflicts:
#	ResearchKit/ResearchKit.h
#	ResearchKitTests/ORKStepTests.m
2016-08-16 13:27:36 -07:00
Shannon Young 67a04562d6 Fix merge errors 2016-08-16 13:15:51 -07:00
Shannon Young f86668e8cb Merge branch 'master' into pr/add-module-hand-tremor 2016-08-16 12:46:10 -07:00
Yuan Zhu 33ca348856 Merge pull request #770 from rsanchezsaez/rsanchezsaez-charts
[Charts] Fix crashes
2016-08-16 12:22:22 -07:00
Gregory Boland bccef20ce5 as per PR comment edited the ORKPasscodeResult to handle a new boolean property touchIdEnabled, in encoding/decoding, copying, and description 2016-08-16 15:00:53 -04:00
Yuan Zhu 0f92862e52 Merge pull request #772 from md0u80c9/funcComments
Documented the ORKPicker functions.
2016-08-16 11:24:34 -07:00
Yuan Zhu c7a8cdd2c0 Merge pull request #764 from dephillipsmichael/bad_access_fix
bad_access_fix
2016-08-16 11:22:19 -07:00
Yuan Zhu 75142028b0 Merge pull request #648 from rsanchezsaez/rsanchezsaez-CodeHomogenization2
[Misc] #import section refactor to reduce header interdependency
2016-08-16 11:20:48 -07:00
Yuan Zhu d618d45635 Merge pull request #647 from weijentu/master
ORKQuestionResult could get truncated Chinese texts
2016-08-16 11:04:20 -07:00
Yuan Zhu 7a33c6b4a7 Merge pull request #789 from phantomkirby/patch-2
Erased asterisk/pointer from my last pull request
2016-08-16 10:46:50 -07:00
Gregory Boland add20301a1 removed the forced taskViewController delegate call from the ORKPasscodeStepViewCOntroller as its already calling it on its own, so no need for double 2016-08-16 11:48:22 -04:00
Gregory Boland fbc4dde858 added the delegate call when the prompt for touchID call is complete 2016-08-16 11:38:44 -04:00
Ricardo Sánchez-Sáez 18b6557cf3 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-CodeHomogenization2
# Conflicts:
#	ResearchKit/Charts/ORKGraphChartView.m
2016-08-13 10:56:09 -07:00
Cherry c195cf1a16 Erased asterisk/pointer from my last pull request
In my last pull request (#788) that was merged, I forgot to delete the "*" symbol. This actually caused the build to fail. The build should work now. Sorry about this!
2016-08-12 21:10:56 -04:00
Yuan Zhu 6679fb0922 Merge pull request #787 from 2020Deception/master
invalid pointer updates (warning fixes)
2016-08-12 15:23:46 -07:00
Yuan Zhu 740051812a Merge pull request #788 from phantomkirby/patch-1
Fixing bug where timerLabel did not display in ORKFitnessStep
2016-08-12 14:34:45 -07:00
Cherry 5c602d7850 Fixing bug where timer label did not display
in the updateTimerLabel function, the timer would be hidden if the labelString was null. The labelString was null everytime because the "formatter" object (an NSDateComponentsFormatter object) was null the whole time. This object was null because inside the "dispatch_once", we did not reference/edit the existing static formatter object outside of the dispatch_once, but rather, we instantiated a new formatter object.
2016-08-12 14:27:42 -04:00
Brian Bowman 0b4b2ae6e5 invalid pointer updates (warning fixes) 2016-08-12 11:41:02 -04:00
Yuan Zhu 0efee740e4 Merge pull request #778 from YuanZhu-apple/master_sliderGradient
Displaying a color gradient above the scale slider
2016-08-04 14:09:38 -07:00
Yuan Zhu 856d544fad Merge pull request #777 from YuanZhu-apple/master_lineGraphHideDots
Line graph hide dots
2016-08-04 14:09:03 -07:00
Yuan Zhu c257751d1d Merge pull request #776 from YuanZhu-apple/master_result_predicate_for_consentReviewStep
Result predicate for consent review step
2016-08-04 14:08:32 -07:00
Yuan Zhu 81e879e8f6 Merge pull request #775 from YuanZhu-apple/master_piechart_scale_factor
Piechart add scale factor support
2016-08-04 14:08:12 -07:00
Yuan Zhu ddeed599df Merge pull request #773 from ThreadResearch/master
Fix documentation typo
2016-08-01 13:44:03 -07:00
Jake Krog 65f525ff38 Fix documentation typo 2016-08-01 11:32:10 -07:00
Andrew Hill 60bfacf507 Merge remote-tracking branch 'origin/funcComments' into funcComments 2016-08-01 18:35:13 +01:00
Andrew Hill 0eae7e87f7 Update ORKPicker.m
Fixed a conflict.
2016-08-01 18:23:58 +01:00
Andrew Hill 26597eb334 Merge branch 'master' into funcComments 2016-08-01 18:21:32 +01:00
Andrew Hill 44c5535a8d Merge remote-tracking branch 'ResearchKit/master' into funcComments
# Conflicts:
#	ResearchKit/Common/ORKPicker.m
2016-08-01 18:14:35 +01:00
Andrew Hill d06f070e83 Documented the ORKPicker functions. 2016-07-31 23:48:27 +01:00
Andrew Hill 633d31be97 Merge branch 'ResearchKit/master' 2016-07-30 00:23:15 +01:00
Ricardo Sánchez-Sáez 6936eb34ac [ORKPieChartPieView] Add support for segments of 0 value
Avoids crash if the dataSource returns 0 for any segment value.
2016-07-29 23:40:40 +01:00
Ricardo Sánchez-Sáez 40891abb63 [ORKGraphChartView] Make '-numberOfPlotsInGraphChartView' non-optional and make it default to 0 plots.
Avoids crash if the graph chart view is laid out before the dataSource is set.
2016-07-29 23:26:23 +01:00
Oliver Schäfer 90d403e62b PR changes 2016-07-29 22:54:02 +02:00
Oliver Schäfer 7f0ca4ec88 PR changes 2016-07-29 21:53:13 +02:00
Oliver Schäfer fc36bca1bd PR changes 2016-07-29 21:49:37 +02:00
Oliver Schäfer 951193cdb8 PR changes 2016-07-28 23:13:23 +02:00
Oliver Schäfer 0cb0f5c8ff PR changes 2016-07-28 22:57:23 +02:00
Oliver Schäfer 2ff5a335e2 Initial commit 2016-07-27 17:14:13 +02:00
Oliver Schäfer 6a222529af Merged remote-tracking branch master 2016-07-27 16:32:08 +02:00
Oliver Schäfer fd2edde5a4 Merge remote-tracking branch 'apple/master' 2016-07-27 16:29:37 +02:00
Shannon Young 38c379476b Expose method for going to a given step 2016-07-26 23:33:17 -07:00
Yuan Zhu f9b8e39876 Adds support for displaying a color gradient above the slider for scale answer formats.
In the simple case this can be used to show a scale from bad to good by setting.
2016-07-25 17:05:17 -07:00
Yuan Zhu e14d327e3b Adds support for drawing plots within a chart without individual data point indicators. 2016-07-25 13:58:48 -07:00
Ricardo Sánchez-Sáez b9bcd6713c Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-CodeHomogenization2
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
#	ResearchKit/ActiveTasks/ORKCountdownStep.h
#	ResearchKit/Charts/ORKDiscreteGraphChartView.m
#	ResearchKit/Charts/ORKGraphChartView.m
#	ResearchKit/Charts/ORKGraphChartView_Internal.h
#	ResearchKit/Charts/ORKLineGraphChartView.m
#	ResearchKit/Charts/ORKPieChartLegendView.m
#	ResearchKit/Charts/ORKPieChartView.m
#	ResearchKit/Charts/ORKRangedPoint.h
#	ResearchKit/Charts/ORKRangedPoint.m
#	ResearchKit/Common/ORKAnswerFormat.h
#	ResearchKit/Common/ORKAnswerFormat_Internal.h
#	ResearchKit/Common/ORKAnswerTextView.m
#	ResearchKit/Common/ORKCompletionStep.h
#	ResearchKit/Common/ORKFormStep.m
#	ResearchKit/Common/ORKHeightPicker.h
#	ResearchKit/Common/ORKInstructionStep.h
#	ResearchKit/Common/ORKNavigableOrderedTask.m
#	ResearchKit/Common/ORKOrderedTask.m
#	ResearchKit/Common/ORKPasscodeStepViewController.m
#	ResearchKit/Common/ORKSignatureStepViewController.h
#	ResearchKit/Common/ORKSignatureStepViewController.m
#	ResearchKit/Common/ORKStepViewController.h
#	ResearchKit/Common/ORKTextButton.h
#	ResearchKit/Common/ORKTextFieldView.m
#	ResearchKit/Common/ORKTypes.h
#	ResearchKit/Consent/ORKConsentReviewStepViewController.m
#	ResearchKit/ResearchKit.h
#	ResearchKit/ResearchKit_Private.h
#	ResearchKitTests/ORKAnswerFormatTests.m
#	Testing/ORKTest/ORKTest/Charts/Charts.storyboard
#	Testing/ORKTest/ORKTest/DragonPokerStep.m
2016-07-25 21:52:13 +01:00
Shannon Young 45eb65e721 When going back to an ORKPageStep, go back to the last step with a result. 2016-07-25 13:08:31 -07:00
Yuan Zhu bc2801bb9e Result predicate for ORKConsentReviewStep
Add a result predicate for determining if the user selected accept or decline in a consent signature step, allowing for custom navigation rules, such as skipping to the end of a survey if the user does not consent.
2016-07-25 12:47:14 -07:00
Yuan Zhu ba78feb4dd Providing a scale factor property in ORKPieChartView. 2016-07-25 12:36:56 -07:00
Shannon Young 7099ed295a Add accessor for getting the individual step results 2016-07-21 16:00:09 -07:00
Shannon Young 963935d659 Allow initializing ORKPageStep with steps as a desgnated initializer 2016-07-21 10:36:02 -07:00
MDP 56a8bc1db3 added check if weak self vc has been dismissed 2016-07-18 14:28:02 -04:00
Andrew Hill 1aa39859e9 Added a series of Predicate tests to ORKTest. This should test a range of different predicate conditions and enable us to ensure that Predicates are working as expected.
NB predicate tests which use 'match' don't seem to be working as expected in these tests. In the choice match test we try to match against Cat*; but only an exact match for Cat seems to pass the test.

Test 7 - to check a text string for a match *og causes a SigAbt. This may be that the match strings are incorrect for these tests, or it may be an issue with the match predicate functions.
2016-07-17 04:54:10 +01:00
Ricardo Sánchez-Sáez e86ef34a75 Merge branch 'master' of github.com:rsanchezsaez/ResearchKit into rsanchezsaez-CodeHomogenization2
# Conflicts:
#	ResearchKit/Common/ORKSurveyAnswerCellForText.m
#	ResearchKit/Common/ORKTextFieldView.m
2016-07-14 23:58:01 +01:00
Shannon Young 64e6c8c9a7 Fix warnings and issues introduced with change to using a task. 2016-07-13 23:55:37 -07:00
Shannon Young 0f3c8a88b8 Update ORKPageStep default initializer to be json serializable. 2016-07-13 15:25:47 -07:00
Shannon Young b596e6580d Include a navigable task in the page step example. 2016-07-13 12:54:44 -07:00
Shannon Young ea848aacf9 Change ORKPageStep to use an ORKTask to navigate. 2016-07-13 12:35:43 -07:00
Shannon Young 99195dde40 Add ORKPageStep and ORKPageStepViewController
The ORKPageStep can be used to group a set of steps together and return a single flattened ORKStepResult for a group of steps. It uses a page step view controller to present the steps.
2016-07-12 18:08:03 -07:00
Shannon Young 912a8112fb Fix warning in ORKHeightAnswerFormat due to failure to properly cast 2016-07-11 15:04:58 -07:00
Shannon Young 27644a292c Fix merge conflicts 2016-07-11 15:04:19 -07:00
Shannon Young 3f2cb32b23 Merge branch 'master' into pr/add-module-hand-tremor
# Conflicts:
#	ResearchKit/Common/ORKOrderedTask.m
#	ResearchKit/Common/ORKSkin.m
2016-07-11 14:56:27 -07:00
Yuan Zhu d84944ac6a Merge pull request #702 from stevemoser/ipad-pro-12-9-support
Support for 12.9 inch iPad Pro
2016-07-11 12:54:15 -07:00
Yuan Zhu ebfbfcb900 Merge pull request #637 from rsanchezsaez/rsanchezsaez-CodeHomogenization
[Misc] Code homogenization
2016-07-11 12:49:30 -07:00
Ricardo Sánchez-Sáez 3bd27d6ebe Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-CodeHomogenization
# Conflicts:
#	ResearchKit/Common/ORKAnswerFormat.m
#	ResearchKit/Common/ORKAnswerFormat_Internal.h
#	ResearchKit/Common/ORKDefines.h
#	ResearchKit/Common/ORKHealthAnswerFormat.m
#	ResearchKit/Common/ORKHelpers.h
#	ResearchKit/Common/ORKQuestionStepViewController.m
2016-07-09 19:42:16 +02:00
Yuan Zhu e11440b036 Merge pull request #643 from rsanchezsaez/rsanchezsaez-ORKHeightAnswerFormat
[ORKAnswerFormat] Implement picker-based 'ORKHeightAnswerFormat'
2016-07-08 10:41:15 -07:00
Andrew Hill fdedb11fea Merge branch 'ResearchKit/master' 2016-07-08 17:09:29 +01:00
Ricardo Sánchez-Sáez 72a665b961 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-CodeHomogenization
# Conflicts:
#	ResearchKit/Consent/ORKConsentReviewStepViewController.m
2016-07-08 15:07:21 +02:00
Ricardo Sánchez-Sáez cfe04441ad Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-CodeHomogenization
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
#	ResearchKit/ActiveTasks/ORKHealthQuantityTypeRecorder.m
#	ResearchKit/Charts/ORKGraphChartView.m
#	ResearchKit/Charts/ORKRangedPoint.m
#	ResearchKit/Common/ORKHealthAnswerFormat.m
#	ResearchKit/Common/ORKNavigableOrderedTask.m
#	ResearchKit/Common/ORKOrderedTask.m
#	ResearchKit/Common/ORKPasscodeStepViewController.m
#	ResearchKit/Common/ORKSurveyAnswerCellForText.m
#	ResearchKit/Common/ORKTextButton.h
#	ResearchKit/Common/ORKTextFieldView.m
#	Testing/ORKTest/ORKTestTests/ORKJSONSerializationTests.m
2016-07-08 15:05:24 +02:00
Ricardo Sánchez-Sáez 7fe3e227ad [ORKHeightPicker] Fix issue returning empty 'selectedLabelText' 2016-07-08 13:34:17 +02:00
Yuan Zhu 4d8f4f3bb1 Merge pull request #753 from Sage-Bionetworks/pr/fix-signature-warning
Fix cast warning introduced with ORKSignatureResult
2016-07-07 15:39:47 -07:00
Shannon Young e29e7f2b73 Fix cast warning introduced with ORKSignatureResult 2016-07-07 13:24:25 -07:00
Allen Tu f2e133676b Merge remote-tracking branch 'ResearchKit/master' 2016-07-07 11:09:11 -07:00
Shannon Young 0c898b4abb Language updates to more closely match the wording approved by our IRB. 2016-07-07 10:26:22 -07:00
Ricardo Sánchez-Sáez c1fa1ea154 [ORKHeightPicker] Use cm as the internal answer unit regardless of chosen locale 2016-07-07 18:08:38 +02:00
Ricardo Sánchez-Sáez f659531d77 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-ORKHeightAnswerFormat
# Conflicts:
#	ResearchKit/Common/ORKHealthAnswerFormat.m
#	ResearchKit/Localized/en.lproj/ResearchKit.strings
2016-07-07 17:50:54 +02:00
Ricardo Sánchez-Sáez 6e22f94cf5 [ORKHeightPicker] Fix previous answer not being remembered
The _answerFormat ivar needs to be properly set before for the self.answer setter to work correctly.
2016-07-07 17:30:42 +02:00
Ricardo Sánchez-Sáez 88c7c87f28 [ORKHeightAnswerFormat] Fix documentation 2016-07-07 17:29:38 +02:00
Ricardo Sánchez-Sáez 6a9da73a8a [ORKCatalog] Add metric and USC height question step samples 2016-07-07 17:29:24 +02:00
Shannon Young 0f0448bff7 Fix ORKCatalog for updated tremor module 2016-07-07 00:28:21 -07:00
Shannon Young fd2c914b68 Add navigation rules to allow user to skip the steps for one hand. 2016-07-07 00:06:05 -07:00
Shannon Young 5122948de0 Add Tremot task to ORKTest 2016-07-06 16:51:25 -07:00
Erin-Mounts 19d3624658 Two-handed tremor task 2016-07-06 16:46:03 -07:00
Erin Mounts 4f68c2bf4e Allow excluding some active tasks from tremor test 2016-07-06 16:46:02 -07:00
Shannon Young 9e1ed9e070 Add initial tremor module 2016-07-06 16:46:01 -07:00
Shannon Young 9fb7562ce5 Add an auxillary image to the instruction view.
This is used in the tremor module to show a second image.
2016-07-06 16:46:01 -07:00
Yuan Zhu b1b25f9ac4 Merge pull request #751 from Sage-Bionetworks/pr/ui-public-signature-step
Add public ORKSignatureStep
2016-07-06 16:27:46 -07:00
Shannon Young a5b58c4c8e Add signaturePath to list of knownNotSerializedProperties 2016-07-06 16:23:31 -07:00
Yuan Zhu 66c7b86484 Merge pull request #743 from Sage-Bionetworks/pr/add-module-bilateral-tapping
Add task module for measuring bilateral tapping speed
2016-07-06 16:01:12 -07:00
Yuan Zhu 3ef94e0958 Merge branch 'master' of https://github.com/ResearchKit/ResearchKit
Conflicts:
	ResearchKit/ActiveTasks/ORKHealthQuantityTypeRecorder.m
	Testing/ORKTest/ORKTestTests/ORKJSONSerializationTests.m
2016-07-06 15:58:23 -07:00
Shannon Young 7b850951ef More syntax changes 2016-07-06 15:45:48 -07:00
Shannon Young bd5f5bb231 Retain signature state on back navigation 2016-07-06 15:44:16 -07:00
Shannon Young 2526450391 More syntax cleanup. 2016-07-06 15:11:06 -07:00
Shannon Young 289a45c3dd Change undefined hand to unspecified. 2016-07-06 14:38:35 -07:00
Shannon Young 931c7d7728 More curly brace changes. 2016-07-06 12:06:15 -07:00
Shannon Young 6d52269995 Fixed syntax, updated copyright and fixed localized formatting. 2016-07-06 11:49:25 -07:00
Shannon Young f69401cae9 Added task for showing just the signature step to ORKTest
Note: ORKCatalog uses this step in the consent flow example and displays the result.
2016-07-06 11:42:41 -07:00
Shannon Young 3d57bf65b8 Moved ORKSignatureStep into Common 2016-07-06 11:21:25 -07:00
Shannon Young e7b75b5f88 Move default title/text for signature to ORKSignatureStep 2016-07-06 09:29:55 -07:00
Shannon Young 590bb25559 Update text for tapping skip button and hide once tapping started. 2016-07-05 21:59:11 -07:00
Shannon Young f7345070a9 Add public ORKSignatureStep
Change the consent signature view controller to a step view controller that is instantiated using an ORKSignatureStep and outputs an ORKSignatureResult. This will allow for customization of the consent process and use of the signature gathering step in other task work flows.
2016-07-05 17:36:42 -07:00
Yuan Zhu 558b5391a3 Merge pull request #732 from Sage-Bionetworks/pr/ui-add-ORKStepTableViewController
Added a general purpose step table view controller
2016-07-05 15:10:28 -07:00
Shannon Young 4ea6fc7d46 Updated comment in ORKTableStep 2016-07-05 14:51:05 -07:00
Shannon Young 2289b01f7c Modified method signature for bilateral tapping task and updated ORKTest and ORKCatalog 2016-07-05 14:35:02 -07:00
Shannon Young 4899548438 Deprecated two-finger tapping test without hand specified 2016-07-05 14:25:37 -07:00
Shannon Young bcc85b9a2c Updated tapping unit test to explicitly check for reverse-compatibility 2016-07-05 14:23:54 -07:00
Shannon Young 613d3a676c Move the two-handed tapping test into ResearchKit
# Conflicts:
#	ResearchKitTests/ORKTaskTests.m
2016-07-05 14:23:54 -07:00
Shannon Young e5fa2374ab Add UIImage method for mirroring a collection of images
This is a utility method for flipping an image so that the same image can be used in both left-hand and right-hand orientations.
2016-07-05 14:21:01 -07:00
Erin Mounts 859bbb4e17 Modifications to ORKTappingContentView to support resizing the view if skippable.
cherry-pick d5011e37606365f794c377dad45e73a721d6db00 (with some manual intervention because of massive changes to ORKTappingContentView in RK 1.3)
2016-07-05 14:21:01 -07:00
Shannon Young 9fe59ca7a8 Default ORKTableStepViewController to allowsSelection=NO and simplify cell registration. 2016-07-05 14:19:50 -07:00
Shannon Young b3d72ce28a Add ORKTableStep with a default implementation for supporting a basic data source 2016-07-05 14:19:50 -07:00
Shannon Young e421214098 Add to the comments describing intended usage of this class. 2016-07-05 14:18:57 -07:00
Shannon Young 53e19548c4 Edited comments 2016-07-05 14:18:57 -07:00
Shannon Young f3fdb66cf8 Added comments and updated copyright. 2016-07-05 14:18:57 -07:00
Shannon Young ead682b402 Add files to project and update copyright date 2016-07-05 14:18:57 -07:00
Erin Mounts aeb3849fd7 Make ORKTableStepViewController visible...
...in release builds (RK sets symbols to hidden by default in release builds)
2016-07-05 14:18:57 -07:00
Shannon Young b9af6508ac Added a general purpose step table view controller 2016-07-05 14:18:57 -07:00
Yuan Zhu 2ff97e4558 Merge pull request #747 from Sage-Bionetworks/pr/add-module-walk-back-and-forth
Add module for walking back and forth
2016-07-05 14:17:05 -07:00
Shannon Young 26da4d8e34 Added serialized properties on ORKActiveStep to ORKTest 2016-07-05 13:53:15 -07:00
Shannon Young 6ee2b47dc1 Updated copyright and halfway count property name 2016-07-05 13:37:29 -07:00
Shannon Young 84f806ee11 Add walk back and forth task to ORKTest 2016-07-05 12:58:26 -07:00
Shannon Young a24dc1ac56 Added unit tests to check the identifiers and half-way spoken count. 2016-07-05 12:57:29 -07:00
Erin Mounts c3618bb104 update pocket image. phone should be inserted speaker-side-out 2016-07-05 12:56:37 -07:00
Shannon Young 119b5f19d2 Add halfway spoken instruction to countdown for walking back and forth 2016-07-05 12:56:37 -07:00
Shannon Young 5195ed44f1 Add back-and-forth walking task 2016-07-05 12:56:37 -07:00
Shannon Young 755db8b700 Add finishedSpokenInstruction to active step
The finished spoken instruction property allows a step to announce that it is completed. This is useful in the case where the phone screen is not visible such as a walking activity (where the phone is in the participant's phone) or a hand tremor measurement (where the screen is not facing the participant).
2016-07-05 12:56:37 -07:00
Yuan Zhu 3d95111ace Merge pull request #735 from Sage-Bionetworks/pr/method-add-stepvc-init
Allow steps to instantiate the view controller
2016-07-05 12:26:55 -07:00
Shannon Young 859fc28d8a Fix deprecation warning 2016-07-01 16:39:33 -07:00
Shannon Young ebc4ccacc0 Move example for initializing a custom step view controller into ORKTest 2016-07-01 16:31:53 -07:00
Shannon Young 1c3aab92c1 Update the unit test to make it a little more interesting. 2016-07-01 16:28:12 -07:00
Shannon Young 70093149b5 Updated comment to add additional description. 2016-07-01 16:28:12 -07:00
Shannon Young d595a0b199 Add unit test for instantiating a view controller and expose stepViewControllerClass method 2016-07-01 16:28:12 -07:00
Shannon Young 764b5f8691 Allow steps to instantiate the view controller 2016-07-01 16:28:12 -07:00
Yuan Zhu 395eb936d5 Merge pull request #721 from Sage-Bionetworks/pr/public-continue-button
Make the continue button public for UI consistency
2016-07-01 16:14:15 -07:00
Yuan Zhu dcab7194c1 Merge pull request #727 from Sage-Bionetworks/pr/ui-should-confirm-cancel
Added delegate method for discarding results without confirming cancel.
2016-07-01 15:39:48 -07:00
Yuan Zhu 9c271d87f6 Merge pull request #726 from Sage-Bionetworks/pr/fix-audio-prompts
Fix audio-prompts-coming-from-earpiece bug
2016-07-01 15:32:37 -07:00
Shannon Young d9ebc6d253 Fixed copyrights and removed commented out code 2016-07-01 15:26:20 -07:00
Yuan Zhu 2e555356a6 Merge pull request #722 from Sage-Bionetworks/pr/ui-forgot-passcode
Forgot passcode with delegate methods matching existing pattern
2016-07-01 14:53:49 -07:00
Shannon Young 69c830b8cd Code cleanup and fix alert in ORKTest 2016-07-01 14:24:12 -07:00
Shannon Young a5aa647ed0 Remove delegate method for setting the tintColor 2016-07-01 13:40:32 -07:00
Shannon Young d7d923e609 Forgot passcode with delegate methods matching existing pattern 2016-07-01 13:40:32 -07:00
Shannon Young 0cbb21d71d Add missing comma 2016-07-01 13:06:48 -07:00
Shannon Young f5fe7a47f3 Added files to ORKTest for creating example continue button 2016-07-01 13:02:13 -07:00
Shannon Young cbea809430 Add Continue Button to ORKTest project 2016-07-01 13:02:13 -07:00
Shannon Young a65d5da62f Add test for example usage of continue button. 2016-07-01 13:02:13 -07:00
Shannon Young 49f2914063 Mark ORKTextButton_Internal with project 2016-07-01 13:02:13 -07:00
Shannon Young f50340c7e1 Make the continue button public for UI consistency 2016-07-01 13:02:13 -07:00
Yuan Zhu dfcc02d75f Merge pull request #639 from rsanchezsaez/rsanchezsaez-ORKHealthKitCharacteristicTypeAnswerFormat
[ORKHealthKitCharacteristicTypeAnswerFormat] Expose date picker attributes
2016-06-29 12:36:18 -07:00
Ricardo Sánchez-Sáez 6ad71820d8 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-ORKHealthKitCharacteristicTypeAnswerFormat
# Conflicts:
#	Testing/ORKTest/ORKTestTests/ORKJSONSerializationTests.m
2016-06-29 20:22:23 +01:00
Ricardo Sánchez-Sáez 275cc3ae17 [ORKJSONSerializationTests] Remove unneeded whitespace 2016-06-29 20:18:57 +01:00
Yuan Zhu 5f643fdcde Merge pull request #731 from Sage-Bionetworks/pr/audio-level-check
Added a optional ambient noise check to the voice task.
2016-06-29 10:57:14 -07:00
Shannon Young e444c32eb5 Add missing ORK_CLASS_AVAILABLE to ORKPredicateSkipStepNavigationRule 2016-06-29 10:55:54 -07:00
Shannon Young 7c7dfc4861 Added missing ORK_CLASS_AVAILABLE to headers 2016-06-29 10:44:59 -07:00
Shannon Young 9b9e941299 Add ORKAudioLevelNavigationRule to the tests for ORKSerialization 2016-06-28 17:58:44 -07:00
Shannon Young 27a0755414 Fix typo in documentation for audioTask with sound check 2016-06-28 16:31:48 -07:00
Shannon Young 0dfb3455f7 Update documentation and added unit test 2016-06-28 15:04:41 -07:00
Shannon Young 47d6b5e0f9 Change method signature and deprecate the old audioTask constructor 2016-06-28 14:45:41 -07:00
Shannon Young dbb0fcf2b7 Change name of step identifier property to destinationStepIdentifier 2016-06-28 14:45:41 -07:00
Shannon Young 170ca3e0b6 Added audio wiith sound check to ORKCatalog 2016-06-28 14:45:41 -07:00
Shannon Young 2c868e3bb4 Update copyrights and method signature 2016-06-28 14:45:41 -07:00
Shannon Young 1abd8bf548 Throw exception if recordingSettings dictionary is nil 2016-06-28 14:45:41 -07:00
Shannon Young 5db0f6422e Update copyright dates 2016-06-28 14:45:41 -07:00
Shannon Young 47f1a3bfd1 Added a optional ambient noise check to the voice task. 2016-06-28 14:45:41 -07:00
Yuan Zhu 231ed3f90c Merge pull request #738 from Sage-Bionetworks/pr/ui-confirm-answer-format
Expose method for instantiating an answer format for confirmation of another field.
2016-06-28 13:33:08 -07:00
Yuan Zhu dd465a00e7 Merge pull request #728 from Sage-Bionetworks/pr/public-ordered-task-step-index
Expose method for getting the index of a step from ORKOrderedTask
2016-06-28 13:24:14 -07:00
Yuan Zhu 05325d6070 Merge pull request #644 from rsanchezsaez/rsanchezsaez-Cocoapods
[Cocoapods] Fix podspec to include swift files
2016-06-28 10:22:41 -07:00
Vincent Tourraine 38a0394005 [ORKTimedWalkStepViewController] Add turn around time limit parameter
As suggested in #606
2016-06-28 17:14:58 +02:00
Vincent Tourraine 541e159792 [ORKTimedWalkStepViewController] Add Turn Around step to Timed Walk active task
Transfer changes from shazino:timed-walk-back-instructions, as discussed in #606
2016-06-28 17:08:07 +02:00
Shannon Young ee446da653 Added test for indexOfStep == NSNotFound 2016-06-27 16:38:38 -07:00
Shannon Young b39c2ea10d Add unit test for indexOfStep 2016-06-27 16:38:38 -07:00
Shannon Young 106b2d969f Remove ORKOrderedTask_Internal 2016-06-27 16:37:47 -07:00
Shannon Young cd02eefff7 Expose method for getting the index of a step. 2016-06-27 16:37:47 -07:00
Yuan Zhu 55b97af36a Merge pull request #633 from rsanchezsaez/rsanchezsaez-ORKBarGraphChart
[Charts] Implement ORKBarGraphChart
2016-06-27 16:22:34 -07:00
Shannon Young fa50f74e9c Throw assert on multiple lines - not currently supported. 2016-06-27 16:20:16 -07:00
Shannon Young 903e1cbffe Added example usage of confirmation form item to ORKTest 2016-06-27 16:20:16 -07:00
Shannon Young 4cda98e896 Clean up tab spacing for readability. 2016-06-27 16:18:19 -07:00
Shannon Young 525d5b2350 Added additional comment and tests for the confirmation answer form item. 2016-06-27 16:18:19 -07:00
Shannon Young 191c17930d Move confirm answer to ORKFormItem 2016-06-27 16:18:19 -07:00
Shannon Young cfe39f8201 Fix issue with autocapitolization 2016-06-27 16:18:19 -07:00
Shannon Young 4b35370e80 Expose method for instantiating an answer format for confirmation of another field.
This answer format is intended to be used with an `ORKFormStep` in order to confirm a previous formItem input. Example usage includes a password or participant identifier that is used to anonymously identify a study participant.
2016-06-27 16:18:19 -07:00
Yuan Zhu 2404b20433 Merge pull request #739 from Sage-Bionetworks/pr/ui-task-delegate-vc-will-disappear
Add delegate method to task view controller for step will disappear
2016-06-27 14:59:45 -07:00
Shannon Young a20f953467 Add example that uses the step will disappear method. 2016-06-27 14:36:45 -07:00
Shannon Young f41480f5bb Add unit test of the delgate callback 2016-06-24 12:18:45 -07:00
Shannon Young ddef74e9cc Updated comment and added direction to the method signature. 2016-06-23 17:31:48 -07:00
Yuan Zhu a50f7cbc2f Merge pull request #736 from Sage-Bionetworks/pr/fix-HKQuantityTypeRecorder
Fix ORKHealthQuantityTypeRecorder to allow for iOS 10 and iOS 8 support
2016-06-23 16:47:52 -07:00
Shannon Young 5715ea13c5 Update comment to match method signature. 2016-06-23 16:33:04 -07:00
Shannon Young 41575b830c Add delegate method to task view controller for step will disappear 2016-06-23 16:27:47 -07:00
Shannon Young c6907b1e9e Add comment explaining why tracking both object and uint 2016-06-23 14:46:41 -07:00
Yuan Zhu 286f49bb5d Merge pull request #737 from Sage-Bionetworks/pr/task-copy-with-steps
Copy the properties of an ORKOrderedTask (or subclass) and mutate the steps.
2016-06-23 14:00:35 -07:00
Yuan Zhu 59ac9c3213 Merge pull request #729 from Sage-Bionetworks/pr/fix-result-nullable-date
ORKResult start/end dates should not be nullable
2016-06-23 13:29:31 -07:00
Shannon Young 0cfce94dd6 Copy the properties of an ORKOrderedTask (or subclass) and mutate the steps. 2016-06-22 22:56:00 -07:00
Ricardo Sánchez-Sáez cb4ff44859 [Charts] Rename 'pointForPlotIndex:' (and related methods) to 'dataPointForPlotIndex:'
Also rename 'ORKGraphChartType' to 'ORKValueCollectionType'.
2016-06-23 02:51:02 +01:00
Shannon Young 0375b70146 Wrap the interface for iOS 8 HKAnchoredObjectQuery init
Use a #ifdef __IPHONE_10_0 to only expose the interface if it would not otherwise be available.
2016-06-22 13:29:19 -07:00
Shannon Young e9e2434d5f Add deprecation warning into protocol work-around for HK iOS 10 support 2016-06-22 11:45:13 -07:00
Shannon Young 72fb6d5138 Updated implementation for iOS 8 compatibility to HealthKit for iOS 10 2016-06-22 11:45:05 -07:00
Shannon Young 60aa464b02 Add work-around for missing method for HKAnchoredObjectQuery 2016-06-22 11:44:57 -07:00
Ricardo Sánchez-Sáez 8474d39cdf Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-ORKBarGraphChart
# Conflicts:
#	ResearchKit/Charts/ORKGraphChartView.m
#	ResearchKit/Charts/ORKGraphChartView_Internal.h
#	ResearchKit/Charts/ORKLineGraphChartView.m
#	ResearchKit/Common/ORKHelpers.h
2016-06-22 03:09:42 +01:00
Erin Mounts 3f258d2c6c ORKResult start/end dates should not be nullable 2016-06-21 16:37:48 -07:00
Shannon Young aad49eac86 Added delegate method for discarding results without confirming cancel. 2016-06-21 16:12:25 -07:00
Shannon Young 4b610ee085 Log an error with restoring audio session but do not forward.
If an error occurs with restoring the saved audio session category, then log the error but otherwise ignore. Do not want to fail the task.
2016-06-21 15:49:05 -07:00
Yuan Zhu 78d59f7ed8 Merge pull request #636 from rsanchezsaez/rsanchezsaez-ORKNavigableOrderedTask
[ORKNavigableOrderedTask] Implement skip navigation rules
2016-06-21 15:12:32 -07:00
Shannon Young a147b2e6e3 Report error (if any) for restoring the saved audio session category 2016-06-21 14:54:46 -07:00
Yuan Zhu 78bc96956c Merge pull request #724 from Sage-Bionetworks/pr/update-module-voice-threshold
Audio ActiveTask View - add ability to define threshold value
2016-06-21 14:30:23 -07:00
Shannon Young 0e9ce26b82 Mark audio prompt property as copy rather than strong 2016-06-21 14:28:56 -07:00
Shannon Young e2f284a4cb Only update the view threshold if the view is loaded 2016-06-21 14:26:52 -07:00
Shannon Young 90af9211eb Only set the threshold if greater than 0 2016-06-21 14:25:15 -07:00
Shannon Young 1107bd9dba Do not set the initial threshold. Zero by default is ignored. 2016-06-21 14:22:04 -07:00
Yuan Zhu 4bcc83ecd3 Merge pull request #716 from king7532/swift3
Update `ORKPredicateStepNavigationRule` Swift 2.x formatting to match…
2016-06-21 14:19:27 -07:00
Ricardo Sánchez-Sáez aa86bf3bed [ORKNavigableOrderedTask] Return empty dictionaries instead of empty arrays 2016-06-21 21:51:00 +01:00
Erin Mounts 5de1888375 Fix audio-prompts-coming-from-earpiece bug
save the current AVAudioSession category before starting voice recording and then restore afterward
2016-06-21 13:20:51 -07:00
Everest Liu 01eab7bd0c PAN-98 - Audio ActiveTask View - add ability to define threshold value 2016-06-21 13:10:17 -07:00
Yuan Zhu 1da1d632b6 Merge pull request #718 from Sage-Bionetworks/pr/fix-defaultResultStore
Fix bug where the defaultResultSource is using ivar rather than public property accessor
2016-06-21 11:11:52 -07:00
Shannon Young 072d19c84b Fix bug where the defaultResultSource is using ivar rather than public property accessor 2016-06-21 11:06:27 -07:00
Yuan Zhu 11effe846e Merge pull request #625 from shazino/ib-graph-chart
Make chart and graph IBInspectable/IBDesignable
2016-06-21 10:18:53 -07:00
Umer Khan c185fce465 Merge pull request #583 from chb/feature/passcode-override
Improve Passcode View
2016-06-20 14:47:53 -05:00
Benjamin King 4863368e23 Update ORKPredicateStepNavigationRule Swift 2.x formatting to match the style guide 2016-06-20 15:07:39 -04:00
Yuan Zhu 1ce947395d Merge pull request #715 from king7532/swift3
Update extension to `ORKPredicateStepNavigationRule` to support Swift 3 and 2.x
2016-06-20 11:10:18 -07:00
Benjamin King c15b98e41a Update extension to ORKPredicateStepNavigationRule to support Swift 3 and 2.x 2016-06-18 21:32:37 -04:00
Andrew Hill 9341e85030 Merge branch 'ResearchKit/master' 2016-06-14 20:14:53 +01:00
Steve Moser 1934f143a5 Add suggested fixes for 12 iPad Pro metrics 2016-06-13 12:54:29 -04:00
Yuan Zhu 9b1efb8641 Merge pull request #707 from malhal/master
Fix for blank white screen when app activates back from viewing the N…
2016-06-10 14:30:59 -07:00
Malcolm Hall c1f30947be Fix for blank white screen when app activates back from viewing the NC or a privacy prompt 2016-06-08 20:09:11 +01:00
Steve Moser dc22fe8191 Add initial support for 12.9 inch iPad Pro
Needs feedback on naming and metrics
2016-06-03 15:11:43 -04:00
Yuan Zhu 4259a1cc92 Update pod spec version number. 2016-05-24 10:54:15 -07:00
Ben DiFrancesco 70d4532d0e Declare ORKScrollToTopAnimationDuration and ORKCGFloatInvalidValue as extern in ORKHelpers.h; fixes #679 2016-05-24 10:53:53 -07:00
Yuan Zhu 888ff9aea3 Merge branch 'bugfix/26015217' into 'master'
Fix for <rdar://problem/26015217> Building ResearchKit against a iOS 9.0 or high…

Added compile time checks for new iOS 9.0 APIs to that they are called if the base SDK is newer.

See merge request !42
2016-05-18 10:15:14 -07:00
Yuan Zhu 8e2313118f Merge pull request #680 from apbendi/header-fix
Fix declaration of constants in ORKHelpers
2016-05-17 11:12:34 -07:00
Ben DiFrancesco 354cee7e7a Declare ORKScrollToTopAnimationDuration and ORKCGFloatInvalidValue as extern in ORKHelpers.h; fixes #679 2016-05-12 16:18:20 -04:00
Rajit Shinh 427b1a3aea Fix a few things that Yuan pointed out from code reviewing the changes. 2016-05-05 19:48:14 -07:00
Ricardo Sánchez-Sáez 7cfb8960c9 [ORKHeightPicker] Rename variables in internal method 2016-05-05 01:36:04 +01:00
Ricardo Sánchez-Sáez cabaecb5d1 [ORKHeightAnswerFormat] Use ORK_DECODE_ENUM() and ORK_ENCODE_ENUM() 2016-05-05 01:08:37 +01:00
Ricardo Sánchez-Sáez 99bd214f23 [Misc] Rename 'ORKNumberFormatter' to 'ORKDecimalNumberFormatter' 2016-05-05 01:04:07 +01:00
Umer Khan ea7c941424 Merge pull request #662 from dukemike/issues/658
allow plot fill color of ORKLineGraphChartView to be set by the delegate
2016-05-04 13:17:02 -07:00
Umer Khan 75e880e1d9 Merge pull request #653 from samfalconer/master
Update ORKSignatureView to support pressure sensitive stroke widths.
2016-05-03 11:07:35 -07:00
Oliver Schäfer 711f39eca9 Merge remote-tracking branch 'apple/master' 2016-05-03 17:01:49 +02:00
Rajit Shinh 13cfe54a3e Fix for <rdar://problem/26015217> Building ResearchKit against a iOS 9.0 or higher deployment target results in warnings. 2016-05-02 16:40:41 -07:00
Andrew Hill a788e35d25 Merge branch 'ResearchKit/master' 2016-05-02 10:50:32 +01:00
Yuan Zhu e9d7b847da Merge pull request #638 from evands/improve-vertical-slider-layout
Improved flexibility for laying out a vertical ORKScaleSliderView.
2016-04-29 13:47:56 -07:00
Yuan Zhu b0f5e2cbb7 Merge pull request #650 from dwarfland/master
Typo/case fix in #include
2016-04-28 16:38:31 -07:00
Oliver Schäfer 2e6643022e Merge remote-tracking branch 'apple/master' 2016-04-20 15:43:47 +02:00
Yuan Zhu 2c4ef0f73e Merge pull request #664 from ResearchKit/stable
Merge class visibility fix from Stable to Master
2016-04-19 17:12:02 -07:00
Yuan Zhu 23900bed0e Merge pull request #663 from YuanZhu-apple/stable_class_visibility
Fix class visibility
2016-04-19 17:10:44 -07:00
Yuan Zhu 8c8a1adc47 Fix class visibility 2016-04-19 17:05:49 -07:00
Mike Revoir 4ada9cf5ff Merge pull request #1 from rsanchezsaez/dukemike-issue-658
[ORKLineGraphChartView] Improvements to new fill color method
2016-04-14 10:56:03 -04:00
Ricardo Sánchez-Sáez 7b23d8b21e [ORKLineGraphChartView] Fix issue where fill color wasn't correctly obtained on updatePlotColors method
Also:
- Have points and lines to be drawn above their corresponding fill
- Move fillColorForPlotIndex: to ORKLineGraphChartView.m
- Minor headerdoc improvement
2016-04-13 20:01:57 +01:00
Ricardo Sánchez-Sáez d2f26a5ab9 [ORKTest] Add ORKLineGraphChartView's graphChartView:fillColorForPlotIndex: method test 2016-04-13 19:58:58 +01:00
Mike Revoir c170a8c38a reformat whitespace. refs #658 2016-04-13 10:56:54 -04:00
Mike Revoir 934aa3283b allow plot fill color to be set. refs #658 2016-04-13 10:56:47 -04:00
Sam Falconer 639f75eaa6 Merge if statements.
In addition to checking for 3D touch, check for Apple Pencil
to see if we can get force from that.
2016-04-06 18:11:01 -04:00
Michal Zaborowski 5f969da0d7 Adding tap duration to Tapping Task Issue #561 2016-04-06 19:49:58 +02:00
Sam Falconer 080c69bd8b Update ORKSignatureView to support pressure sensitive stroke widths.
Add property for setting the stroke width variation (default to 3pts).

If the device supports 3D touch, use the true pressure to determine
how thick the line should be at a given point.

If the device does not support 3D touch, use the speed of the stroke
to determine how thick the line should be at a given point.
2016-04-05 14:36:53 -04:00
Oliver Schäfer 44db125626 Merge remote-tracking branch 'apple/master' 2016-03-30 06:45:54 +02:00
Ricardo Sánchez-Sáez 42c12ca73f [ORKHeightAnswerFormat] Replace 'BOOL useMetricSystem' by 'ORKMeasurementSystem measurementSystem'
Valid values are:
- ORKMeasurementSystemLocal
- ORKMeasurementSystemMetric
- ORKMeasurementSystemUSC
2016-03-30 00:56:12 +01:00
Ricardo Sánchez-Sáez 025581ad55 [ORKHealthKitQuantityTypeAnswerFormat] Use 'ORKHeightAnswerFormat' as the impliedAnswerFormat when the quantity type is 'HKQuantityTypeIdentifierHeight 2016-03-29 21:53:30 +01:00
Ricardo Sánchez-Sáez 65aee797ce [ORKHealthKitCharacteristicTypeAnswerFormat] Move 'defaultDate', 'minimumDate', 'maximumDate' and 'calendar' default value calculation to impliedAnswerFormat's initialization
This prevents archiving of stale date and calendar values.
2016-03-29 20:47:46 +01:00
Yuan Zhu f7ea0167b1 Merge pull request #641 from rsanchezsaez/rsanchezsaez-ORKStepResult.enabledAssistiveTechnology
[ORKStepResult] Add 'enabledAssistiveTechnology' property
2016-03-29 12:39:21 -07:00
Ricardo Sánchez-Sáez a5a8531fdf [ORKStepResult] Rename 'checkEnabledAssistiveTechnology' to 'updateEnabledAssistiveTechnology' 2016-03-29 20:23:58 +01:00
Yuan Zhu e60db320ed Merge pull request #645 from rsanchezsaez/rsanchezsaez-ORKCountdownStep
[Framework] Expose ORKCountdownStep and ORKCompletionStep publicly
2016-03-29 11:08:23 -07:00
marc hoffman 8a6895d762 ORKWaitStepViewController.h was marked as private and thus missing (but needed) from compiled .framework 2016-03-29 11:26:53 -04:00
marc hoffman 2ac579a610 Type/case fix in #include 2016-03-29 11:20:57 -04:00
Ricardo Sánchez-Sáez 4b9ae8e404 [ORKTest] Fix small indentation misalign 2016-03-29 14:12:14 +01:00
Ricardo Sánchez-Sáez f7d1591c19 [Misc] Change all framework #imports to @import
Also:
- Change some #imports to directly refer headers instead of going though the framework header because it enables it be included as a module through Cocoapods.
- Improve unit test encapsulation by making some classes (recorders) and methods available in the private header
2016-03-28 20:06:58 +01:00
Ricardo Sánchez-Sáez 9b539d7faf [Misc] Remove needless #imports from ORKVerticalContainerView 2016-03-28 16:05:34 +01:00
Ricardo Sánchez-Sáez e515278b4c [Misc] Perform #import section refactor to reduce header interdependency
Compilation time after you modify a header file has been greatly improved by avoiding including the umbrella headers (ResearchKit.h and ResearchKit_Private.h) in any of the framework files.

Also:
- Restructure .m files #import section into a hierarchy of alphabetically sorted subsections separated by one newline (1. local views and controls; 2. view controllers and recorders; 3. model files; 4. general files and helpers, 5. iOS frameworks). The #import order follows advice found here: http://qualitycoding.org/import-order/
- Remove needless and duplicate imports from .m files
- Make sure all headers include at least Foundation or UIKit; except Private or Internal headers which only include their own class header at the next public level
- Rename ORKHelpers.h to ORKHelpers_Internal.h (it is not public, and its name was misleading given that we also have ORKHelpers_Private.h).
- Add a few missing NS_ASSUME_NONNULL_BEGIN/NS_ASSUME_NONNULL_END annotation in headers
- Add a few missing double newline before and after import section
2016-03-28 15:34:27 +01:00
Oliver Schäfer c7be2b44ee Merge remote-tracking branch 'apple/master' 2016-03-28 13:20:22 +02:00
WEI-JEN TU e3b2d91a8b ORKQuestionResult could get truncated Chinese texts before textFieldDidEndEditing is called
ORKQuestionResult could get truncated Chinese texts before
textFieldDidEndEditing is called in UITextFieldDelegate

The repository “truncated-branch” is revised to be able to demonstrate
the scenario right away. Also uncomment line 202 in
ORKSurveyAnswerCellForText addresses the issue.

There are two videos as well to elaborate truncated Chinese texts and
difference between before and after.
Before: (Notice that the last character is always truncated before
textFieldDidEndEditing is called in UITextFieldDelegate)
https://db.tt/jHlCyr62

After:
https://db.tt/jeh1O20k
2016-03-26 12:07:17 -07:00
WEI-JEN TU da41b8a43b Merge remote-tracking branch 'ResearchKit/master' 2016-03-26 10:41:03 -07:00
Ricardo Sánchez-Sáez 86273181ac [Framework] Expose ORKCountdownStep and ORKCompletionStep publicly 2016-03-24 17:29:05 +00:00
Ricardo Sánchez-Sáez 930d94f804 [ORKSpatialSpanMemoryTask] Rename methods to avoid abbreviations and add step documentation
(Missing step documentation was causing broken links in the documentation.)
2016-03-24 17:08:56 +00:00
Ricardo Sánchez-Sáez d783c0b2b6 [Cocoapods] Fix podspec to include swift files 2016-03-24 15:23:50 +00:00
Ricardo Sánchez-Sáez 92cc2c0ef9 [ORKTest] Add 'ORKHeightAnswerFormat' step to review example
Fix review step text output which was showing total inches instead of decomposed feet and inches.
2016-03-24 15:20:57 +00:00
Ricardo Sánchez-Sáez 275b7b5ff9 [ORKAnswerFormat] Implement picker-based 'ORKHeightAnswerFormat'
Details:
- Metric and imperial measuring systems support
- Standalone question steps and on form steps support
- Serialization unit tests implemented

Notes:
- For input it uses the newly added 'ORKHeighPicker' class
- Height limits and default value are hardcoded into the picker, taking the same values as the Health App: [0 ft, 0 in - 9 ft, 11 in] range, default: 5 ft, 4 in; [0 cm - 299 cm] range, default: 162 cm
- Results are output as an 'ORKNumericResult' object, with the unit canonically set to 'in' or 'cm' depending on the chosen measuring system (on the imperial system, feet and inches always get converted to total inches when stored in the outputted result)
- Visually, the picker and the chosen answer in form steps display the 'cm' and decomposed 'ft in' values, with their units localized if applicable (unlike the canonical result units which are never localized)
2016-03-24 14:51:36 +00:00
Ricardo Sánchez-Sáez 642f87576a [Misc] Avoid some abbreviations and needless intermediate variables 2016-03-23 17:43:44 +00:00
Ricardo Sánchez-Sáez 4735bc5d47 [Misc] Add missing whitespace around '!=' operator 2016-03-22 18:43:59 +00:00
Ricardo Sánchez-Sáez 0e29f50f77 [ORKStepResult] Add 'enabledAssistiveTechnology' property
The property can have the following values:
 - `UIAccessibilityNotificationVoiceOverIdentifier` if Voice Over was active
 - `UIAccessibilityNotificationSwitchControlIdentifier` if Switch Control was active
2016-03-22 18:34:09 +00:00
Ricardo Sánchez-Sáez daac3505b4 [ORKSample] Small improvement to 40x40 app icon 2016-03-22 12:45:09 +00:00
Ricardo Sánchez-Sáez 89838d63bd [Misc] Update to Swift 2.2 code (Xcode 7.3 only)
(Avoid using newly deprecated methods)
2016-03-22 12:22:33 +00:00
Ricardo Sánchez-Sáez 1337dbf851 [ORKDirectionView] Avoid CGMutablePath leak 2016-03-22 12:15:24 +00:00
Ricardo Sánchez-Sáez 0c60532068 [ORKTextScaleAnswerFormat] Fix issue potentially causing 'nil' to try to be added to an array 2016-03-22 12:12:07 +00:00
Ricardo Sánchez-Sáez ea0fb64319 [ORKHealthKitCharacteristicTypeAnswerFormat] Expose 'defaultDate', 'minimumDate', 'maximumDate' and 'calendar'
Used to customize the presented date picker, only applicable to the 'HKCharacteristicTypeIdentifierDateOfBirth' characteristic type.
2016-03-21 18:50:27 +00:00
Ricardo Sánchez-Sáez 14bb563d26 [ORKPieChartView] Implement new ORKPieChartLegendCollectionViewLayout
It evenly distributes the cells between all the rows, and lays them out as compactly possible along the center by increasing leading and trailing padding.
2016-03-18 18:04:02 +00:00
Ricardo Sánchez-Sáez 09b7adc981 [Charts] Make scrubber to be shown on a static long press
Adds public UILongPressGestureRecognizer property.
2016-03-18 11:57:03 +00:00
Ricardo Sánchez-Sáez 412f30652f [Charts] Adjust reference line boundaries so they rest on full pixels on iPhone 6 and 6 Plus 2016-03-17 16:46:56 +00:00
Ricardo Sánchez-Sáez 9ef8b4a980 [Charts] Make sure ORKBarGraphChartView bars and ORKLineGraphChartView fill start at whole pixel coordinates 2016-03-17 15:47:20 +00:00
Ricardo Sánchez-Sáez ce365bbe10 [Charts] Make auto-calculated reduced-alpha colors opaque, so reference lines don't show below bar graphs 2016-03-16 21:15:15 +00:00
Ricardo Sánchez-Sáez 778bcf71e0 [ORKValueStack] Rename '-initWithStackedValueArray:' to '-initWithStackedValues:' and fix documentation 2016-03-16 18:05:15 +00:00
Ricardo Sánchez-Sáez bf94333d32 [ORKChartTypes] Make 'stackedValues' property to have copy semantics 2016-03-16 17:45:56 +00:00
Yuan Zhu 9f5caad71d Merge pull request #445 from rsanchezsaez/rsanchezsaez-HomogenousORKTextFieldView
[ORKTextField] Coherent placeholder handling
2016-03-16 10:07:20 -07:00
Ricardo Sánchez-Sáez 14fce4445f [Charts] Minor documentation improvements 2016-03-16 16:48:30 +00:00
Ricardo Sánchez-Sáez 1984b46efb [ORKNavigableOrderedTask] Add nullability annotations when returning individual rules; make sure the rule dictionary property always returns a proper non-mutable dictionary 2016-03-16 16:20:40 +00:00
Ricardo Sánchez-Sáez 02a822baef [Misc] Make sure -isEqual: method always uses the property format when accessing the variables to compare 2016-03-16 16:02:01 +00:00
Ricardo Sánchez-Sáez cdaa4d4c91 [Misc] Make sure +(instancetype)new is NS_UNAVAILABLE when init is so.
Also, throw exception on unavailable methods where appropriate. Make sure ORKTest unit tests continue to pass.
2016-03-16 15:55:09 +00:00
Ricardo Sánchez-Sáez 6e4a4560d8 [Misc] Use property syntax for accessing 'hash' 2016-03-16 14:04:46 +00:00
Ricardo Sánchez-Sáez 657bcab2f7 [Misc] Use 'error' instead of the non-standard 'err' abbreviation
(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/APIAbbreviations.html#//apple_ref/doc/uid/20001285-BCIHCGAE)
2016-03-16 13:34:41 +00:00
Ricardo Sánchez-Sáez b8a999995f [Misc] Remove explicit __autoreleasing annotation in indirect parameters to avoid noisy code
Indirect parameters are __autoreleasing implicitly: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#indirect-parameters
Also, add _Nullable annotation to indirect parameters in headers, and homogenize whitespace surrounding it.
2016-03-16 13:31:50 +00:00
Ricardo Sánchez-Sáez 28ee60beb7 [Coding Style Guide] Add some whitespace notes, and favor '_Nullable' over '__nullable. 2016-03-16 13:21:02 +00:00
Ricardo Sánchez-Sáez e305e3c4b2 [ORKNavigationContainerView] Use explicit struct initialization 2016-03-16 13:17:03 +00:00
Ricardo Sánchez-Sáez 90f5a2cc62 [Misc] Avoid needless returns from void functions 2016-03-16 13:16:58 +00:00
Ricardo Sánchez-Sáez 75c75901a3 [Misc] Use __typeof instead of typeof
(Avoids pedantic warning)
2016-03-16 13:16:53 +00:00
Ricardo Sánchez-Sáez c5396e8ae6 [ORKHelpers] Remove needless struct casts 2016-03-16 13:16:46 +00:00
Ricardo Sánchez-Sáez 942a092bd1 [Misc] Remove extraneous ; symbols 2016-03-16 13:16:41 +00:00
Ricardo Sánchez-Sáez 1cb09d68d3 [Charts] Draw reference lines for Bar Graph Chart View on ORKCatalog example 2016-03-15 18:32:25 +00:00
Evan D. Schoenberg, M.D fd11ee1e89 Improved flexibility for laying out vertical ORKScaleSliderView. This allows longer text labels by setting constraints to allow the slider to move as far left as 25% the width of the view, and allows the text labels to expand to the edge of the view (less a SideLabelMargin margin width). 2016-03-15 13:32:19 -04:00
Ricardo Sánchez-Sáez 878acecad6 [ORKSpatialSpanTargetView] Remove needsless '_' prefix from static variable name 2016-03-15 17:07:20 +00:00
Ricardo Sánchez-Sáez 5d1fe51b42 [Coding Style Guide] Add 'Spaces in array and dictionary literals' subsection 2016-03-15 16:31:34 +00:00
Ricardo Sánchez-Sáez 077dfcc4ab [Misc] Additional whitespace homogenization regarding space before dictionary keys and around the tertiary operator (?:) 2016-03-15 16:09:19 +00:00
Ricardo Sánchez-Sáez f24c371541 [Misc] Rename STRONGTYPE() to ORKStrongTypeOf() and introduce ORKWeakTypeOf() for homogeneity 2016-03-15 15:31:26 +00:00
Ricardo Sánchez-Sáez 7a0101c12b [Project] Rename ORKDefines_Private.h to ORKHelpers_Private.h
(Since it has fuctions, not macros.)

Also, move localization functions from ORKHelpers_Private.h to ORKHelpers.h (the latter is an internal file, so encapsulation is better).
2016-03-15 14:54:55 +00:00
Ricardo Sánchez-Sáez 887f8dd6bd [Project] Extract type definitions from 'ORKDefines.h' into the new 'ORKTypes.h' file 2016-03-15 12:42:16 +00:00
Ricardo Sánchez-Sáez f6c8bc939b [ORKHelpers] Use ORK_INLINE macro 2016-03-15 12:14:44 +00:00
Ricardo Sánchez-Sáez b6cc2f3add [ORKGraphChartView] Use ORK_INLINE macro 2016-03-15 11:47:36 +00:00
Ricardo Sánchez-Sáez 24929ca8b1 [ORKHelpers] Rename STRINGIFY to ORK_STRINGIFY 2016-03-14 15:35:15 +00:00
Ricardo Sánchez-Sáez 8c270dca89 [ORKHelpers] Avoid using the reserved '__' prefix 2016-03-14 15:31:56 +00:00
Ricardo Sánchez-Sáez 129ee6baef [ORKKeychainWrapper]: Use '_Nullable' instead of '__nullable' (Xcode 7 style) 2016-03-14 15:23:26 +00:00
Ricardo Sánchez-Sáez a2e4b5aa1c [Misc] Always add space before '__autoreleasing' 2016-03-14 15:22:15 +00:00
Ricardo Sánchez-Sáez 75047cabb2 [ORKHolePegTest] Replace 'can not' by 'cannot' in exception messages 2016-03-14 15:09:58 +00:00
Ricardo Sánchez-Sáez 8a3fea6488 [Misc] Make some code to conform to code homogenization
- Remove space after unary '!' operator
- Remove space after pointer '*' start
2016-03-14 15:08:45 +00:00
Ricardo Sánchez-Sáez 57cbebae64 [ORKNavigableOrderedTask] Implement skip navigation rules
Introduce the ORKSkipStepNavigationRule and ORKPredicateSkipStepNavigationRule classes, and the appropriate 'ORKNavigableOrderedTask' methods to insert, view and remove them.
Implement ORKTest example code within the Navigable Loop Task Items.
Implement unit tests for the new functionality, and makes sure all serialization tests continue to pass.
2016-03-11 18:41:32 +00:00
Andrew Hill b13a470348 Merge branch 'ResearchKit/master' 2016-03-11 12:45:54 +00:00
Ricardo Sánchez-Sáez 2ea828e29e [ORKBarGraphChartView] Made BarWidth constant static 2016-03-11 11:56:08 +00:00
Ricardo Sánchez-Sáez 7efb9ecb36 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-ORKBarGraphChart 2016-03-10 18:10:44 +00:00
Ricardo Sánchez-Sáez ea777873af [Charts] Make 'ORKValueRange' and 'ORKValueStack' to use 'double' instead of 'CGFloat' 2016-03-10 17:58:46 +00:00
Ricardo Sánchez-Sáez fc7c55c3ab [ORKValueRange] Raname 'isEmpty' property to 'isEmptyRange' 2016-03-10 17:24:13 +00:00
Ricardo Sánchez-Sáez df05877256 [Charts] Rename 'ORKFloatRange' and 'ORKFloatStack' to 'ORKValueRange' and 'ORKValueStack' 2016-03-10 17:20:13 +00:00
vtourraine 9025045a4c [Charts] Add sample graph chart data source for Interface Builder 2016-03-10 15:47:14 +01:00
vtourraine 0571b6e960 [Charts] Add sample pie chart data source for Interface Builder 2016-03-10 15:01:09 +01:00
Yuan Zhu d1fbc178a1 Merge pull request #591 from rsanchezsaez/rsanchezsaez-master-ORKSampleIcon
[ORKSample] Add app icon
2016-03-09 16:12:08 -08:00
Yuan Zhu 6a2f18af4d Merge pull request #629 from evands/vertical-slider-multiline
Allow 2 lines of text on vertical scale sliders
2016-03-09 16:10:45 -08:00
Yuan Zhu cc352493f9 Merge pull request #626 from weijentu/master
About ORKQuestionType for ORKTextAnswerFormat?
2016-03-09 11:00:42 -08:00
Yuan Zhu 43a4379c8e Merge pull request #621 from pra85/patch-1
[RELEASE-NOTES.md] Fix a typo
2016-03-09 10:30:43 -08:00
Evan D. Schoenberg, M.D 5c3db570f7 Allow unlimited lines for vertical scale slider views rather than 2 as per discussion in #629 2016-03-08 21:15:00 -05:00
Ricardo Sánchez-Sáez 0980410b95 [ORKFloatRange] Throw exception if 'maximumValue' is lower than 'minimumValue 2016-03-08 18:05:42 +00:00
Ricardo Sánchez-Sáez 2e5d784608 [ORKFloatStack] Add comma before the 'and' separator 2016-03-08 17:56:15 +00:00
Ricardo Sánchez-Sáez 288d710e51 [ORKGraphChartView] Fix issue with wrong UIAccessibilityIsVoiceOverRunning() check
The issue prevented accessibility elements to be properly set.
2016-03-08 17:49:21 +00:00
Ricardo Sánchez-Sáez cc46125c69 [ORKFloatStack] Implement accessibilityLabel method
(Used by Voice Over)
2016-03-08 17:48:37 +00:00
Ricardo Sánchez-Sáez ca94aa7468 [ORKChartTypes] Conform ORKFloatRange and ORKFloatStack descriptions to ObjC conventions 2016-03-08 17:46:09 +00:00
Ricardo Sánchez-Sáez d0293a0ee7 [ORKBarGraphChartView] Fix display animation implementation
Also, add ORKTest appearance tests, and make other graph tests more comprehensive by adding empty points at the middle.
2016-03-08 17:45:47 +00:00
Ricardo Sánchez-Sáez b8c80c70c7 [ORKBarGraphChartView] Implement most of bar graph chart functionality
Some details:
- Added ORKCatalog example and ORKTest test
- Conform ORKFloatRange and ORKFloatStack to the new ORKGraphChartType protocol. Move them to the ORKChartTypes.h/m files.
- ORKLineGraphChartView and ORKDiscreteGraphChartView now inherit from the abstract ORKFloatRangeGraphChartViewClass.
- There are now two concrete protocolsL ORKFloatRangeGraphChartViewDataSource (used by ORKLineGraphChartView and ORKDiscreteGraphChartView) and ORKFloatStackGraphChartViewDataSource (used by ORKBarGraphChartView). Both inherit from the abstract ORKGraphChartViewDataSource protocol.

Things yet to do:
- Implement appearing animations
- Implement ORKTest appearance-properties testing
- Implement and test bar chart view accessibility
2016-03-08 17:45:04 +00:00
Evan D. Schoenberg, M.D 40e328e29e Allow 2 lines of text on vertical scale sliders, as there is plenty of space for this to fit comfortably. 2016-03-05 09:51:20 -08:00
Ricardo Sánchez-Sáez 3f89fba2cf [Charts] Implement first steps for ORKBarGraphChartView
Also, makes ORKTest's 'ORKDiscreteGraphChartView' tests more comprehensive.
2016-03-01 17:14:55 +00:00
Ricardo Sánchez-Sáez bece29b351 [ORKGraphChartView] Fix global appearance proxy tintColor taking over custom local tintColor 2016-03-01 16:02:43 +00:00
Allen Tu 4d1601a787 Set questionType for ORKEmailAnswerFormat with ORKQuestionTypeText
Discussion: An ORKEmailAnswerFormat object is implied with
ORKTextAnswerFormat and produces an ORKTextQuestionResult object, too.
Could it be better to set its questionType to ORKQuestionTypeText?
2016-02-26 21:59:13 +08:00
Allen Tu 80d7685ab3 Merge remote-tracking branch 'ResearchKit/master' 2016-02-26 21:43:36 +08:00
vtourraine 6e1334a2fc Make chart and graph IBDesignable 2016-02-26 14:39:16 +01:00
vtourraine 3c550b54b4 Fix IBInspectable for readonly properties 2016-02-26 14:13:38 +01:00
vtourraine 7ca7079522 Make chart and graph properties IBInspectable 2016-02-26 10:49:19 +01:00
Prayag Verma e4af7fe7fe [RELEASE-NOTES.md] Fix a typo
Remove extra `the`
2016-02-18 13:07:24 +05:30
Jared Crawford 8c3b5ce81f Update delegate method documentation 2016-02-17 17:27:34 -08:00
Jared Crawford 783ad4c6b4 Adds support for drawing plots within a chart without individual data point indicators 2016-02-17 17:17:40 -08:00
Jared Crawford b85182b372 Fix typos 2016-02-12 12:27:58 -08:00
Jared Crawford 6e075cbfe3 Add a result predicate for determining if the user selected accept or decline in a consent signature step, allowing for custom navigation rules, such as skipping to the end of a survey if the user does not consent. 2016-02-11 18:07:08 -08:00
Yuan Zhu 410affbf5d Merge pull request #619 from rsanchezsaez/rsanchezsaez-UnitTests
[ORKNavigableOrderedTask] Fix 'shouldReportProgress' being ignored by NSSecureCoding and NSCopying
2016-02-08 15:34:57 -08:00
Ricardo Sánchez-Sáez 182960a263 [ORKGraphChartView] Fix small documentation issues 2016-02-08 18:24:51 +00:00
Ricardo Sánchez-Sáez 0971ef71f4 [ORKSample] Fix typos in variable names 2016-02-08 17:52:46 +00:00
Ricardo Sánchez-Sáez 92ca8f86a5 [ORKGraphChartView] Fix error in accessibility string key 2016-02-08 17:50:45 +00:00
Ricardo Sánchez-Sáez 24c46898e8 [ORKLineGraphChartView] Go back to consistently using minimumValue as main plotted data 2016-02-08 16:40:34 +00:00
Ricardo Sánchez-Sáez 065a02eff1 [ORKNavigableOrderedTask] Fix 'shouldReportProgress' being ignored by NSSecureCoding and NSCopying
Also, fix ORKTest's unit tests.
2016-02-08 16:33:22 +00:00
Ricardo Sánchez-Sáez 2db99d6152 [Charts] Rename ORKRangedPoint to ORKFloatRange
Also:
- Improve documentation.
- Fix ORKFloatRange's 'hasEmptyRange' property being always 'NO'.
- Fix typo in ORKGraphChartView's 'colorForPlotIndex:' method.
2016-02-08 16:24:33 +00:00
Ricardo Sánchez-Sáez f6cb8b09f0 [ORKGraphChartView] Make the discrete graph to snap on the actual chosen plot index when scrubbing 2016-02-07 18:51:06 +00:00
Ricardo Sánchez-Sáez f9d49594fe [ORKGraphVhartView] Fix scrubber not being correctly positioned for last data point in discrete graphs 2016-02-07 15:41:07 +00:00
Yuan Zhu 62a31b087a Merge pull request #618 from rsanchezsaez/rsanchezsaez-ReleaseNotes
[RELEASE-NOTES.md] Improvements
2016-02-05 12:27:31 -08:00
Ricardo Sánchez-Sáez 70fd57488d [RELEASE-NOTES.md] Fix some typos, rewrite some sentences and improve formatting 2016-02-05 18:29:06 +00:00
Yuan Zhu 1f457e1d54 Merge pull request #615 from apbendi/nav-ordered-progress
Allow user to opt-in to linear progress reporting on ORKNavigableOrderedTask
2016-02-03 10:21:30 -08:00
Ben DiFrancesco 729247cfcd Allow user to opt-in to linear progress reporting on ORKNavigableOrderedTask 2016-01-29 10:50:25 -05:00
Yuan Zhu 218b8af66a Merge pull request #604 from rsanchezsaez/rsanchezsaez-ORKTestTests
[ORKTestTests] Fix unit tests
2016-01-27 14:21:42 -08:00
Ricardo Sánchez-Sáez 069c388cb3 [ORKTest] Remove README.md from target 2016-01-27 19:34:13 +00:00
Ricardo Sánchez-Sáez e199db13b4 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-ORKTestTests 2016-01-27 19:30:50 +00:00
Ricardo Sánchez-Sáez a96c8b9540 [ResearchKit] Fix unit tests
- Fixes tests to reflect the new empty answer for a Choice Answer Format being ORKNullAnswerValue() instead of an empty array (introduced on the Review Step feature).
- Fixes test for task step identifier uniqueness validation (it now takes place on task init).
2016-01-27 13:21:05 +00:00
Ricardo Sánchez-Sáez 865275d3aa [Projects] Fix ResearchKit framework linkage for all 3 apps
This links and embeds the workspace instance of ResearchKit from the three subprojects.

Also:
- Remove ResearchKit subproject reference from ORKCatalog.
- Link HealthKit framework from ORKSample.
- Link HealthKit and MapKit in an optional way.
- Reorganise frameworks into Framework group for each subproject.
2016-01-27 12:39:55 +00:00
Yuan Zhu a1d29fe225 Merge pull request #612 from CareEvolution/ORKWaitStepView-header-fix
Revert ORKWaitStepView.h to Project visibility
2016-01-26 11:32:03 -08:00
Scott Guelich 67bcc93947 Remove Private attribute from internal headers 2016-01-26 11:29:18 -08:00
Yuan Zhu 8e8fabf79f Merge pull request #605 from rsanchezsaez/rsanchezsaez-ORKStepNavigationRule
[ORKStepNavigationRule] Improve documentation
2016-01-26 11:27:30 -08:00
Yuan Zhu 292727ad91 Merge pull request #611 from CareEvolution/remove-chart-no-data-label
ORKGraphChartView - Remove the "No Data" label when there is data
2016-01-26 10:46:57 -08:00
Scott Guelich 2f1e58e234 Revert ORKWaitStepView.h to Project visibility 2016-01-26 08:47:41 -08:00
Scott Guelich 86226e9ba8 Remove noDataLabel when no data
Fix simple logic error
2016-01-26 08:37:13 -08:00
Yuan Zhu d40e8193d5 Providing a scale factor property in ORKPieChartView.
One reasoning this might be needed is incase the labels in the pie chart don't fit.
2016-01-22 13:39:59 -08:00
Yuan Zhu 525f2c6efb Merge branch 'master' of https://github.com/ResearchKit/ResearchKit 2016-01-22 13:20:39 -08:00
Oliver Schäfer a4777c8a42 Merge remote-tracking branch 'apple/master' 2016-01-17 11:34:26 +01:00
Ricardo Sánchez-Sáez ad52da287c [ORKStepNavigationRule] Improve documentation
- Improve whitespace
- Specify that passing 'ORKNullStepIdentifier' (instead of 'nil') ends the task for direct and predicate step navigation rules.
2016-01-16 21:46:18 +00:00
Ricardo Sánchez-Sáez 8d0fd95ad0 [ORKTestTests] Fix failing tests (mainly due ORKReviewStep) 2016-01-16 21:36:55 +00:00
Ricardo Sánchez-Sáez 46c78c08a4 [Workspace] Remove duplicated ResearchKit subproject references from ORKSample and ORKTest
They're not needed since ResearchKit is already in the Workspace.
2016-01-16 21:35:53 +00:00
Yuan Zhu 54927408bf Merge pull request #601 from rsanchezsaez/rsanchezsaez-ORKSample
[ORKSample] Allow onboarding to proceed on the Simulator despite HealthKit not being present
2016-01-14 16:27:36 -08:00
Yuan Zhu f325310d77 Merge pull request #451 from rsanchezsaez/rsanchezsaez-documentationformatting
README.md formatting
2016-01-14 16:11:13 -08:00
Yuan Zhu dd4e4fdbce Merge pull request #596 from shazino/timed-walk-optional-form
Add includeAssistiveDeviceForm parameter to timed walk task
2016-01-14 16:00:33 -08:00
Yuan Zhu 063cde7656 Merge pull request #602 from rsanchezsaez/rsanchezsaez-ORKGraphChartView
[Charts] Fix crash when displaying graph chart with no data source
2016-01-14 15:53:48 -08:00
Ricardo Sánchez-Sáez fb1ef39165 [Charts] Add reloadData methods
The developer can call this method if the data provided by the dataSource changes.
2016-01-14 22:26:59 +00:00
Ricardo Sánchez-Sáez c570771b4d [ORKGraphChartView] Avoid crash when displaying a graph with no dataSource set 2016-01-14 21:55:50 +00:00
Ricardo Sánchez-Sáez 00ff2f3402 [ORKSample] Allow onboarding to proceed on the Simulator despite the lack of HealthKit 2016-01-14 21:15:59 +00:00
Ricardo Sánchez-Sáez 407de8ed11 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-HomogeneousORKTextFieldView 2016-01-14 20:59:10 +00:00
Ricardo Sánchez-Sáez 6474ebfff7 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-documentationformatting
# Conflicts:
#	ResearchKit/ActiveTasks/ORKTowerOfHanoiStep.h
#	ResearchKit/Common/ORKAnswerFormat_Private.h
2016-01-14 20:57:48 +00:00
Yuan Zhu 340ba7210d Merge branch 'master' of gitlab.sd.apple.com:y_zhu/GitHub-ResearchKit-Fork into convergence_regex_api_change 2016-01-14 10:29:03 -08:00
Yuan Zhu 8c86b8d80d Merge pull request #463 from oliverschaefer/master
Review Step: API Design v1.2
2016-01-13 17:14:58 -08:00
Oliver Schäfer 7ceda4a9c3 PR updates 2016-01-12 17:23:12 +01:00
Oliver Schäfer 21c89256fa Merge remote-tracking branch 'apple/master' 2016-01-12 17:19:49 +01:00
Pascal Pfiffner 62ae57bb11 Merge branch 'master' into feature/passcode-override 2016-01-12 14:20:38 +01:00
Yuan Zhu fbc4191081 Merge pull request #599 from ResearchKit/stable
Merge `Stable` into `Master`
2016-01-11 15:50:58 -08:00
Yuan Zhu 429c3c9886 Update the versioning and pod spec 2016-01-11 15:20:01 -08:00
Yuan Zhu 4228cf46c6 Merge pull request #598 from YuanZhu-apple/convergence_batch2
Doc updates and other fixes for convergence
2016-01-11 11:25:46 -08:00
Yuan Zhu 674e06cebc Merge pull request #597 from evliu/master
Samples - ORKCatalog/Charts/ChartListViewController - set prop on dis…
2016-01-08 13:17:32 -08:00
Umer Khan ce31ebd366 Merge branch 'releaseNotes' into 'convergence'
Release notes

See merge request !35
2016-01-08 12:17:11 -08:00
Umer Khan 135ec4a3f2 Minor edits. 2016-01-08 12:10:56 -08:00
Umer Khan a30119aa0d Merge branch 'convergence_active_task_should_resume_properly' into 'convergence'
Convergence active task should resume properly

Fix for <rdar://problem/24095971> ResearchKit: progress for 2 finger tapping stopped after the passcode auth.

Stop using background delivery in health recorder.

See merge request !37
2016-01-07 16:12:36 -08:00
Yuan Zhu 31526c6664 Disable background delivery in health recorder. 2016-01-07 15:29:59 -08:00
Yuan Zhu e5ac62f298 Fix for progress for 2 finger tapping stopped after the passcode auth 2016-01-07 15:29:21 -08:00
Everest Liu ade7f99010 Samples - ORKCatalog/Charts/ChartListViewController - set prop on discreteGraphChartView instead of lineGraphChartView 2016-01-07 13:29:27 -08:00
Yuan Zhu bb1be965a2 Merge branch 'convergence_incorporate_documentation' into 'convergence'
Convergence incorporate documentation

Incorporate documentation update from devpubs.

See merge request !36
2016-01-06 17:42:42 -08:00
Yuan Zhu 3fb266139e More doc update. 2016-01-06 13:59:38 -08:00
Yuan Zhu 0b2216c6cf Update for review. 2016-01-06 13:56:39 -08:00
Yuan Zhu c90d8c7fbd One more merge conflict 2016-01-06 11:06:09 -08:00
Yuan Zhu 3cb705c123 Fix appledoc warnings 2016-01-06 11:03:26 -08:00
vtourraine 94fbd3a6d1 Add includeAssistiveDeviceForm parameter to timed walk task
Make timed walk assistive device form items non-optional
2016-01-06 16:47:31 +01:00
Oliver Schäfer f24a74006a PR updates 2016-01-06 13:27:38 +01:00
Oliver Schäfer 040b9d2220 Merge remote-tracking branch 'apple/master' 2016-01-06 13:18:34 +01:00
Oliver Schäfer 2e1749a14d alert controller bugfixes 2016-01-06 13:09:30 +01:00
Yuan Zhu 1817398f61 Merge branch 'convergence' into convergence_incorporate_documentation
Conflicts:
	ResearchKit/Charts/ORKGraphChartView.h
	ResearchKit/Common/ORKAnswerFormat.h
	ResearchKit/Common/ORKDefines.h
	ResearchKit/Common/ORKNavigableOrderedTask.h
	ResearchKit/Common/ORKResult.h
	ResearchKit/Common/ORKResultPredicate.h
	ResearchKit/Consent/ORKConsentReviewController.m
2016-01-05 23:18:21 -08:00
Umer Khan b542c46189 Formatting fixes. 2016-01-05 18:36:46 -08:00
Umer Khan b6cc636975 Minor fixes. 2016-01-05 18:30:24 -08:00
Umer Khan 1844a0774c Added Sample App info. 2016-01-05 18:29:27 -08:00
Yuan Zhu 6a1343622d Update charts documentation. 2016-01-05 18:00:56 -08:00
Yuan Zhu a3b45b6268 Merge branch 'convergence' of https://github.com/ResearchKit/ResearchKit into convergence 2016-01-05 16:34:20 -08:00
Yuan Zhu 204d5dbf40 Merge pull request #595 from rsanchezsaez/rsanchezsaez-ORKOrderedTask
[ORKOrderedTask] Validate step identifier uniqueness on init
2016-01-05 16:17:59 -08:00
Yuan Zhu f076b69a98 Merge pull request #594 from rsanchezsaez/rsanchezsaez-convergence-ORKGraphChartView
[ORKGraphChartView] Fix wrong selector check on accessibility (convergence)
2016-01-05 16:15:25 -08:00
Yuan Zhu 908b9cb713 Merge pull request #593 from rsanchezsaez/rsanchezsaez-ORKGraphChartView
[ORKGraphChartView] Fix wrong selector check on accessibility
2016-01-05 16:14:23 -08:00
Yuan Zhu ff2c5ad055 Merge pull request #592 from rsanchezsaez/rsanchezsaez-ORKChoiceAnswerFormatHelper
[ORKChoiceAnswerFormatHelper] Relax class checking so choice answer formats can be subclassed
2016-01-05 15:47:05 -08:00
Umer Khan 39e17e7867 Added RK 1.3 notes. 2016-01-05 14:52:53 -08:00
Oliver Schäfer 66fa232ca7 PR updates 2016-01-05 17:09:44 +01:00
Pascal Pfiffner 75ad7512b8 Merge branch 'master' of github.com:ResearchKit/ResearchKit 2016-01-05 10:46:51 +01:00
Ricardo Sánchez-Sáez 8b521477dd [docs] Fix some headerdoc warnings 2016-01-05 03:05:42 +00:00
Ricardo Sánchez-Sáez d60c81b004 [docs] Remove extraneous line from the Programming Guide 2016-01-05 02:52:22 +00:00
Ricardo Sánchez-Sáez a44f2db8fd [ORKOrderedTask] Validate step identifier uniqueness on init 2016-01-05 02:32:56 +00:00
Ricardo Sánchez-Sáez 663426250f [ORKGraphChartView] Fix wrong selector check on accessibility 2016-01-05 02:27:50 +00:00
Ricardo Sánchez-Sáez 58d377d9ab [ORKGraphChartView] Fix wrong selector check on accessibility 2016-01-05 02:24:52 +00:00
Ricardo Sánchez-Sáez e56bf7d217 [ORKChoiceAnswerFormatHelper] Relax class checking so choice answer formats can be subclassed 2016-01-05 01:49:17 +00:00
Ricardo Sánchez-Sáez 28ff1415dd Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-documentationformatting
# Conflicts:
#	README.md
2016-01-05 00:19:28 +00:00
Ricardo Sánchez-Sáez 8cbe836bb2 ORKTextFieldView: proper fix for animation glitch
The text frame sometimes animated from left to right (e.g., in ORKTest's MiniForm, tap 4th text field, type any number and tap any other text field).
Also remove needless period on latest placeholder text.
2016-01-05 00:14:49 +00:00
Ricardo Sánchez-Sáez 2289abf03a ORKFormItemTextFieldBasedCell: Allow temporarily leaving the text field empty without triggering answer validity checking
This fixes a regression. It restores the behavior in which you are allowed to edit a different text field in a form if you leave the current text field blank. E.g., on ORKTest's 'Mini Form', tapping on the first cell text field and then tapping on second cell text field without having written anything should not trigger the alert.
2016-01-04 23:09:35 +00:00
Ricardo Sánchez-Sáez 44ee48fa54 ORKTextField: Hide placeholder when editing a field which has a suffix 2016-01-04 23:00:18 +00:00
Ricardo Sánchez-Sáez b704be75b5 ORKAnswerTextView: fix comment typo 2016-01-04 22:30:54 +00:00
Ricardo Sánchez-Sáez 4048e34530 ORKAnswerTextFieldView: fix whitespace 2016-01-04 22:30:13 +00:00
Ricardo Sánchez-Sáez b34fb01350 ORKAnswerTextView: use the same placeholder approach as in ORKTextFieldView
This creates a non-interactive 'UITextView' for displaying the placeholder at the exact same position as the 'ORKAnswerTextView' text.

It improves encapsulation, the 'ORKAnswerTextView' class handles the placeholder internally.

Also: some minor naming convention improvenets in 'ORKTextFieldView'.
2016-01-04 22:30:09 +00:00
Ricardo Sánchez-Sáez 1b266c3652 ORKTextFieldView: conform to naming and whitespacing conventions 2016-01-04 22:23:58 +00:00
Ricardo Sánchez-Sáez 8ab052577d ORKTextFieldView: fix active unit color being off when there's no placeholder 2016-01-04 21:58:51 +00:00
Ricardo Sánchez-Sáez 1e34cf6d35 ORKTextFieldView: fix unit frame animation glitch
To reproduce, tap on an empty field with unit label and no placeholder (first form item of first step in ORKTest's Miniform).
2016-01-04 21:58:35 +00:00
Ricardo Sánchez-Sáez d39a72e535 ORKTextField: reduce left paddingGuess 2016-01-04 21:58:13 +00:00
Ricardo Sánchez-Sáez 135e2209c8 ORKTextFieldView: whitespace 2016-01-04 21:58:07 +00:00
Ricardo Sánchez-Sáez b865da3a75 ORKTextFieldView: make placeholder behave like 'UITextFieldView' placeholder
# Conflicts:
#	ResearchKit/Common/ORKTextFieldView.m
2016-01-04 21:57:53 +00:00
Ricardo SaÃÅnchez-SaÃÅez 40111a1431 ORKTextFieldView: remove '_unitWithPlaceholder' ivar which was producing extra unneeded padding between the placeholder and the unit 2016-01-04 21:55:34 +00:00
Ricardo Sánchez-Sáez cc45d92266 [ORKSample] Add app icon 2016-01-04 20:00:33 +00:00
Umer Khan 197eb8422a Merge branch 'convergence_fix_responder_check' into 'convergence'
Fix "ORKGraphChartView checks wrong delegate method for respondsToSelector"

Use the correct `respondsToSelector:` checking.

This is an issue reported by https://github.com/ResearchKit/ResearchKit/issues/589

See merge request !34
2016-01-04 11:53:14 -08:00
Yuan Zhu fe10cd8a71 Merge branch 'convergence' of https://github.com/ResearchKit/ResearchKit into convergence 2016-01-04 11:40:16 -08:00
Yuan Zhu 63dfad2b0d Merge pull request #590 from rsanchezsaez/rsanchezsaez-convergence-ORKSampleFix
ORKSample fixes
2016-01-04 11:39:36 -08:00
Yuan Zhu 886605e013 Use the correct respondsToSelector: checking 2016-01-04 10:43:49 -08:00
Oliver Schäfer 1619428bb0 Accessibility updates 2015-12-29 22:07:22 +01:00
Oliver Schäfer 3ae773049a PR updates 2015-12-29 12:20:54 +01:00
Oliver Schäfer 76eb4f97d9 Merge remote-tracking branch 'apple/master' 2015-12-28 17:45:52 +01:00
Ricardo Sánchez-Sáez 4c0a4a1e51 [ORKSample] Fix project
- Add ResearchKit as an embed framework (otherwise it won't run on the device)
- Remove extraneous Development Team
2015-12-23 20:38:24 +00:00
Pascal Pfiffner 12326634db Spaces instead of tabs 2015-12-23 17:30:06 +01:00
Pascal Pfiffner 36b90b813c Merge branch 'master' of https://github.com/ResearchKit/ResearchKit into feature/passcode-override 2015-12-23 17:28:41 +01:00
Yuan Zhu 22b769b786 Merge pull request #588 from YuanZhu-apple/convergence_merge_master
Merge convergence code into master
2015-12-22 14:21:49 -08:00
Yuan Zhu 0afc2027d7 Merge branch 'master' of https://github.com/ResearchKit/ResearchKit into convergence
Conflicts:
	samples/ORKCatalog/ORKCatalog/Results/ResultTableViewProviders.swift
2015-12-22 14:09:54 -08:00
Yuan Zhu aa2b1f9e61 Merge pull request #587 from YuanZhu-apple/convergence_batch
Convergence patch
2015-12-22 12:35:23 -08:00
Pascal Pfiffner a78878c712 Allow to enforce a certain passcode
Comes in handy when moving to ResearchKit's passcode entry from a custom implementation or AppCore.
2015-12-18 11:21:04 +01:00
Pascal Pfiffner f6fd29087b Use instancetype instead of id 2015-12-18 10:48:32 +01:00
Pascal Pfiffner 4517cd445e Merge branch 'master' of github.com:ResearchKit/ResearchKit 2015-12-18 09:38:50 +01:00
Andrew Hill d151e11004 Merge branch 'ResearchKit/master' 2015-12-17 23:23:09 +00:00
John Earl fed9fb9ce6 Merge branch 'convergence_fix_progress_is_missing_on_first_step' into 'convergence'
Fix task progress is missing on first step.

Fix for <rdar://problem/23940893> Question form does not show "1 of 6" progress at the top when the modal is displayed

Since we pulled `currentStepViewController` into `shouldDisplayProgressLabel`, we also need to move progressLabel generation after `currentStepViewController` has been assigned.

Today's `shouldDisplayProgressLabel`:
```
- (BOOL)shouldDisplayProgressLabel {
    return self.showsProgressInNavigationBar && [_task respondsToSelector:@selector(progressOfCurrentStep:withResult:)] && self.currentStepViewController.step.showsProgress;
}
```

See merge request !33
2015-12-17 13:47:00 -08:00
Yuan Zhu 6a786cfb37 Fix task progress is missing on first step. 2015-12-17 13:27:39 -08:00
Umer Khan 39d76c8ed6 Merge branch 'convergence_fix_orksample_dependency' into 'convergence'
Add RK as ORKSample's dependency.

See merge request !31
2015-12-16 16:05:26 -08:00
Yuan Zhu ec9b1c9108 Change regex api to accept NSRegularExpression. 2015-12-16 15:56:28 -08:00
Yuan Zhu 7059bd39a6 Add RK as ORKSample's dependency. 2015-12-16 14:52:28 -08:00
Umer Khan dddc633e3a Merge branch 'convergence_ax_wait_step' into 'convergence'
AX for wait step

From Ryan, even through `UIProgressView` is not accessible.

See merge request !30
2015-12-16 11:18:36 -08:00
Umer Khan 9e358e7fc5 Merge branch 'convergence_fix_catalog_after_verification_step_change' into 'convergence'
API changed after verification step update, need to update ORKCatalog as well.

See merge request !29
2015-12-16 11:10:45 -08:00
Yuan Zhu 0aacde2057 AX for wait step 2015-12-16 10:59:56 -08:00
Yuan Zhu 5bdd973315 Fix unit tests. 2015-12-16 10:30:09 -08:00
Yuan Zhu d7bf7a6ec3 Merge pull request #581 from Sage-Bionetworks/master-sage
Added method to create a copy of a step with a new identifier
2015-12-16 10:03:20 -08:00
Shannon Young 4342caae71 Updated in response to code review. 2015-12-15 18:10:26 -08:00
Yuan Zhu cb4514328e API changed after verification step update, need to update ORKCatalog as well. 2015-12-15 17:49:33 -08:00
Umer Khan 84710f773f Merge branch 'convergence_update_pod_spec' into 'convergence'
Update pod spec to include `swift` files

According to
https://github.com/ResearchKit/ResearchKit/pull/383#issuecomment-161036351

See merge request !28
2015-12-15 16:54:04 -08:00
Yuan Zhu 42005af39c Update pod spec to include swift files
According to
https://github.com/ResearchKit/ResearchKit/pull/383#issuecomment-161036351
2015-12-15 16:51:46 -08:00
Shannon Young f7d7355c49 Added method to create a copy of a step with a new identifier 2015-12-15 14:48:38 -08:00
Yuan Zhu 9c847f8fe6 Merge branch 'passcodeIcon' into 'convergence'
Adding app icon to ORKPasscodeStep.

See merge request !27
2015-12-15 13:06:06 -08:00
Umer Khan aac584b2f1 Resolving merge conflicts. 2015-12-15 11:05:09 -08:00
Yuan Zhu 4be283e888 Localization strings update. 2015-12-14 17:36:31 -08:00
Umer Khan 4d37142873 Merge branch 'convergence_new_sample_app' into 'convergence'
Checkin the new sample app

New app was added as `ORKSample` under `samples` folder.

See merge request !23
2015-12-14 17:06:30 -08:00
Umer Khan 08b48589da Added new metric for icon on vertical container view to support iPad. 2015-12-14 17:04:34 -08:00
Umer Khan 6ba85a1504 Merge branch 'convergence_accessibility_fix_value_picker' into 'convergence'
Accessibility fix value picker

R=me.

From Ryan:
This next issue is with VoiceOver speaking the wrong words when changing ORKValuePicker’s value.  Ultimately, we need to fix this on our side:
<rdar://problem/23885294> UITextField AX broken when connected as the firstResponder to a UIPicker.

I have attached a workaround patch to rdar://problem/23710698. The problem is that when we change the value of the picker and a text field is the firstResponder, VoiceOver thinks this is a selection changed event and reads the delta change. For example, going from Male to Female, the delta is “LE.” The workaround is, since this textfield is not editable, to keep the selectedTextRange as 0,0 so that VO doesn’t do the selection changed behavior.

Please let me know if you have any questions!

See merge request !26
2015-12-14 16:54:18 -08:00
Yuan Zhu 5fc4316e22 Auto deselect selected cell on profile page. 2015-12-14 16:54:18 -08:00
Yuan Zhu 287dcd979c Merge branch 'verificationRedesign' into 'convergence'
Verification Step redesign.

Verification step redesign as per HI.

See merge request !20
2015-12-14 16:47:48 -08:00
Umer Khan 29f2d16676 Adding app icon to ORKPasscodeStep. 2015-12-14 16:46:33 -08:00
Yuan Zhu b022ae3589 Limit minimum date in answer format to current time. 2015-12-14 16:46:02 -08:00
Umer Khan 76bbbbe604 Delegate callback refactor for keyboard on ORKPasscodeStepViewController. 2015-12-14 16:40:32 -08:00
Umer Khan a322f0b17f Minor refactor. 2015-12-14 16:32:55 -08:00
Yuan Zhu f11d17752f Accessibility fix value picker
From Ryan:
This next issue is with VoiceOver speaking the wrong words when changing ORKValuePicker’s value.  Ultimately, we need to fix this on our side:
<rdar://problem/23885294> UITextField AX broken when connected as the firstResponder to a UIPicker.

I have attached a workaround patch to rdar://problem/23710698. The problem is that when we change the value of the picker and a text field is the firstResponder, VoiceOver thinks this is a selection changed event and reads the delta change. For example, going from Male to Female, the delta is “LE.” The workaround is, since this textfield is not editable, to keep the selectedTextRange as 0,0 so that VO doesn’t do the selection changed behavior.

Please let me know if you have any questions!
2015-12-14 14:32:10 -08:00
Umer Khan 14a815d63e Merge branch 'convergence_fix_merge_crash_bug' into 'convergence'
The `break` was in wrong place which let `confirmAnswerFormat` use a `scaleCell` instead.

It is used to crash `registration test`.

See merge request !25
2015-12-14 14:18:09 -08:00
Yuan Zhu 1b4b0166b8 The break was in wrong place which let confirmAnswerFormat use a scaleCell instead. 2015-12-14 14:13:01 -08:00
Umer Khan 669269fd45 Merge branch 'convergence_full_length_seperator_line' into 'convergence'
Apply full width section separator on from/question page (including location question)

![Simulator_Screen_Shot_Dec_10__2015__5.49.40_PM](https://gitlab.sd.apple.com/y_zhu/GitHub-ResearchKit-Fork/uploads/e6dc184239617bcde03b39a8d8588ca8/Simulator_Screen_Shot_Dec_10__2015__5.49.40_PM.png)
![Simulator_Screen_Shot_Dec_10__2015__5.49.37_PM](https://gitlab.sd.apple.com/y_zhu/GitHub-ResearchKit-Fork/uploads/74494292d8cdffb621c1d7b9fa4266d6/Simulator_Screen_Shot_Dec_10__2015__5.49.37_PM.png)
![Simulator_Screen_Shot_Dec_10__2015__5.49.24_PM](https://gitlab.sd.apple.com/y_zhu/GitHub-ResearchKit-Fork/uploads/50e45d20f29ac510f927d823fb9ede2e/Simulator_Screen_Shot_Dec_10__2015__5.49.24_PM.png)
![Simulator_Screen_Shot_Dec_10__2015__5.49.33_PM](https://gitlab.sd.apple.com/y_zhu/GitHub-ResearchKit-Fork/uploads/e0e80fe5241088ed55c1d1878e01497b/Simulator_Screen_Shot_Dec_10__2015__5.49.33_PM.png)
![Simulator_Screen_Shot_Dec_10__2015__5.49.06_PM](https://gitlab.sd.apple.com/y_zhu/GitHub-ResearchKit-Fork/uploads/b42e3e4005363bd00e4e7f6c144ddde9/Simulator_Screen_Shot_Dec_10__2015__5.49.06_PM.png)
![Simulator_Screen_Shot_Dec_10__2015__5.49.07_PM](https://gitlab.sd.apple.com/y_zhu/GitHub-ResearchKit-Fork/uploads/fb4889714cfa2c1ed6bf7ca80b2d9cf7/Simulator_Screen_Shot_Dec_10__2015__5.49.07_PM.png)
![Simulator_Screen_Shot_Dec_10__2015__5.48.59_PM](https://gitlab.sd.apple.com/y_zhu/GitHub-ResearchKit-Fork/uploads/11232d3553fd1b5d477f81212f5981c4/Simulator_Screen_Shot_Dec_10__2015__5.48.59_PM.png)

See merge request !22
2015-12-11 16:01:59 -08:00
Yuan Zhu 3f7c1d15d5 Checkin the new sample app 2015-12-11 15:46:30 -08:00
Yuan Zhu ca136a9ce1 Merge branch 'convergence' of gitlab.sd.apple.com:y_zhu/GitHub-ResearchKit-Fork into convergence_full_length_seperator_line
Conflicts:
	ResearchKit/Common/ORKFormStepViewController.m
2015-12-11 14:11:29 -08:00
Yuan Zhu fe2ea1e3d8 Merge branch 'eligFix' into 'convergence'
Removed eligibility module.

As per HI, the eligibility module should re-use the text choice answer format look and feel. This PR removes the current `ORKEligbilityAnswerFormat` and updates `ORKTest` and `ORKCatalog` examples of eligibility using `ORKTextChoiceAnswerFormat`.

See merge request !17
2015-12-11 13:30:50 -08:00
Yuan Zhu eedcff0ab0 Merge branch 'passcodeFix' into 'convergence'
Passcode keyboard orientation fix.

The orientation for the passcode step was not being registered from `supportedInterfaceOrientations`, so this fix forwards that instance method to a class method of the same name to retrieve the value. This allows the Task View Controller to retrieve the values before the class is initialized.

See merge request !16
2015-12-11 13:24:28 -08:00
Yuan Zhu 00bd267c1b Apply full width section separator on from/question page (including location question) 2015-12-10 17:52:28 -08:00
Umer Khan d9c005aa18 Refactored eligibility survey also. 2015-12-10 16:40:27 -08:00
Umer Khan be02e1a22a Refactored eligibility task. 2015-12-10 16:38:59 -08:00
Umer Khan b474f6f12d Added additional documentation. 2015-12-10 14:45:33 -08:00
Yuan Zhu bc263d92af Merge branch 'convergence_accessibility_fix_for_account_creation' into 'convergence'
Accessibility fix for password field

<rdar://problem/23829496> RK Accessibility Account creation control issues

I looked, it is good to me.

See merge request !21
2015-12-10 13:13:39 -08:00
Yuan Zhu 0575f21c3e Accessibility fix for password field: <rdar://problem/23829496> RK Accessibility: Account creation control issues 2015-12-09 17:58:57 -08:00
Umer Khan 88543a14d6 Verification Step redesign. 2015-12-09 17:11:35 -08:00
Yuan Zhu cd8a801738 Merge branch 'verificationRedesign' into 'convergence'
Added new strings for verification step and removed old strings.

See merge request !19
2015-12-09 15:04:26 -08:00
Umer Khan 30af7f46f7 Merge branch 'convergence_new_icon_from_hi' into 'convergence'
Use the new icon for ORKTest app

See merge request !18
2015-12-09 14:59:46 -08:00
Umer Khan 1e889ad7dc Added new strings for verification step and removed old strings. 2015-12-09 14:58:06 -08:00
Umer Khan 839c8eca53 Removed class method forwarding. 2015-12-09 14:40:14 -08:00
Yuan Zhu 48ed4b3771 Use the new icon for ORKTest app 2015-12-09 14:23:07 -08:00
Umer Khan e6f4c1deb8 Merge branch 'convergence_peg_test_missing_spoken_instruction_on_last_step' into 'convergence'
All other three of four testing steps has spoken instruction.

For <rdar://problem/23778535> [Clout]: US: RedRiver7M1453: No VoiceOver speaks at the Page of 'Put the peg behind the line using your left hand.'

See merge request !13
2015-12-09 12:47:24 -08:00
Umer Khan ae2bff43fa Merge branch 'convergence_support_multiline_in_form_header' into 'convergence'
Wrap text in form header view if the text is long.

Wrap text in form header view if the text is long.

![Simulator_Screen_Shot_Dec_8__2015__6.00.30_PM](https://gitlab.sd.apple.com/y_zhu/GitHub-ResearchKit-Fork/uploads/84632e2b1a3e61e56983168ddfa4e3c7/Simulator_Screen_Shot_Dec_8__2015__6.00.30_PM.png)

See merge request !14
2015-12-09 12:45:53 -08:00
Umer Khan 14260e0df1 Merge branch 'convergence_add_icon_for_ipad_pro' into 'convergence'
Add app icons for iPad pro

See merge request !15
2015-12-09 12:40:06 -08:00
Umer Khan 4153702c2d Removed eligibility answer format, survey cell, form item cell, and implementations from ORKTest and ORKCatalog. 2015-12-09 12:08:34 -08:00
Umer Khan a9494ce5d8 Passcode keyboard orientation fix. 2015-12-09 11:04:13 -08:00
Yuan Zhu 0b06d4c18a Add app icons for iPad pro 2015-12-09 10:41:22 -08:00
Yuan Zhu 2b6d1fcab9 Wrap text in form header view if the text is long. 2015-12-08 17:59:25 -08:00
Oliver Schäfer 610ce5aefd Merge remote-tracking branch 'apple/master' 2015-12-08 22:01:56 +01:00
Oliver Schäfer bd52a14196 Minor PR updates 2015-12-08 22:01:44 +01:00
Yuan Zhu eb52acefa9 All other three of four testing steps has spoken instruction. 2015-12-08 12:55:14 -08:00
Pascal Pfiffner 423a89c879 Merge branch 'master' of github.com:ResearchKit/ResearchKit 2015-12-07 16:51:07 -05:00
Oliver Schäfer e444086399 PR updates 2015-12-06 13:13:33 +01:00
Umer Khan 82de8783bd Merge branch 'convergence_fix_wait_step_progessview_size' into 'convergence'
Fix the size of progress view in wait step.

Also documented the view hierarchy of ORKVerticalContainerView

See reopened radar:
<rdar://problem/23638006> ResearchKit: updateText of ORKWaitStepViewController does not work as expected

See merge request !12
2015-12-04 16:39:52 -08:00
Yuan Zhu 0dea3dd673 Localization strings update 2015-12-04 13:51:39 -08:00
Yuan Zhu 6f4c072f93 Fix the size of progress view in wait step.
Also documented the view hierarchy of ORKVerticalContainerView
2015-12-04 12:17:13 -08:00
Oliver Schäfer 0ed1df3945 PR changes 2015-12-04 13:36:38 +01:00
Yuan Zhu fee0d2d7b6 Merge branch 'regexFix' into 'convergence'
Added validation checking for Text Survey Cell.

Currently, text validation from ORKTextAnswerFormat is only applied to ORKFormItemCell.
This patch adds the validation checking to ORKSurveyAnswerCellForText.

This is in response to a radar generated by QA.
radar://23695918

See merge request !9
2015-12-03 13:26:55 -08:00
Oliver Schäfer d71ab9538c PR updates 2015-12-03 22:08:37 +01:00
Oliver Schäfer 7caaf525e3 PR updates 2015-12-03 13:05:22 +01:00
Umer Khan 610a1fd93f Minor fix. 2015-12-02 16:05:44 -08:00
Umer Khan 36bda05556 Merge branch 'convergence_ax_scale_question_fix' into 'convergence'
Fix for <rdar://problem/23710807> RK Accessibility: Scale Question

`swipe up` by passed the normal `touch to assign value` process, thus, set `showThumb = YES;` is required.

From Ryan:
1. Tap the slider
(No value is read)
(VoiceOver cursor is moved to the slider element)

2. Swipe up to increment the value (i.e. calls accessibilityIncrement which calls axBumpValue)

Expected Behavior:
Now that we incremented the slider, it has a value and should be spoken.

Actual Behavior:
No value is spoken.
(In the debugger, I can see showThumb is NO, thus we don’t speak an accessibilityValue).

Conclusion:
It seems to me once you made a change to the slider’s value (via accessibilityIncrement or accessibilityDecrement), showThumb should become YES.

See merge request !11
2015-12-02 16:03:43 -08:00
Yuan Zhu 069ea16731 Merge branch 'passcodeFix' into 'convergence'
Locked Passcode View Controllers to portrait only.

The Passcode View Controllers truncate the passcode text field in landscape mode.
To avoid this problem, this PR locks the passcode view controller orientation to portrait only.
This solves the stated problem and provides a more intuitive UI for passcode entry.

This is in response to the radar generated by QA.
radar://23713589

See merge request !10
2015-12-02 15:35:22 -08:00
Umer Khan a1ed3ea711 Refactored continue button logic and removed validation logic from textfield delegate. 2015-12-02 15:27:12 -08:00
Yuan Zhu d910062bb9 Merge branch 'dobFix' into 'convergence'
Add current date to maximum date for ORKRegistrationStep's dob answer format.

See merge request !7
2015-12-02 14:57:02 -08:00
Yuan Zhu ba5d80c6c1 Fix for <rdar://problem/23710807> RK Accessibility: Scale Question
`swipe up` by passed the normal `touch to assign value` process, thus, set `showThumb = YES;` is required.

From Ryan:
1. Tap the slider
(No value is read)
(VoiceOver cursor is moved to the slider element)

2. Swipe up to increment the value (i.e. calls accessibilityIncrement which calls axBumpValue)

Expected Behavior:
Now that we incremented the slider, it has a value and should be spoken.

Actual Behavior:
No value is spoken.
(In the debugger, I can see showThumb is NO, thus we don’t speak an accessibilityValue).

Conclusion:
It seems to me once you made a change to the slider’s value (via accessibilityIncrement or accessibilityDecrement), showThumb should become YES.
2015-12-02 14:38:54 -08:00
Umer Khan 21ada70ae4 Locked Passcode View Controllers to portrait only. 2015-12-02 14:28:53 -08:00
Umer Khan 9be3f057be Added validation checking for Text Survey Cell. 2015-12-02 13:43:02 -08:00
Umer Khan 51c23ccf17 Changed dispatch_once to an ivar. 2015-12-01 16:20:22 -08:00
Umer Khan 113b7422a0 Added additional initializer. 2015-12-01 16:09:08 -08:00
Umer Khan c852c62262 Added static, updated formItems to generate today's date for maximumDate, and fixed serialization issues. 2015-12-01 15:50:52 -08:00
Yuan Zhu c27b784870 Merge branch 'convergence' of https://github.com/ResearchKit/ResearchKit into convergence 2015-12-01 15:31:58 -08:00
Yuan Zhu c3102d6183 Merge branch 'convergence' 2015-12-01 15:31:04 -08:00
Andrew Hill 2510bc7f97 Correct Destionation
Changed all instances of Destionation to Destination
2015-12-01 15:30:04 -08:00
Tom Welsh de7860b60a Allow ORKLoginStepViewController to be subclassed by making the class symbol visible 2015-12-01 15:28:35 -08:00
Yuan Zhu 37c65bdc55 Merge branch 'convergence' of https://github.com/ResearchKit/ResearchKit into convergence 2015-12-01 14:40:52 -08:00
Umer Khan 4fe13d0b27 Minor refactor. 2015-12-01 13:29:29 -08:00
Umer Khan 853d4384fd Refactored registration form items generation. 2015-12-01 13:16:43 -08:00
Yuan Zhu f9669508dc Merge branch 'tappingResultBugFix' into 'convergence'
Tapping sample result bug fix.

See merge request !8
2015-12-01 10:29:32 -08:00
Umer Khan e1ea72b861 Tapping sample result bug fix. 2015-11-30 17:58:46 -08:00
Umer Khan 1cf445af09 Add current date to maximum date for ORKRegistrationStep's dob answer format. 2015-11-30 14:03:53 -08:00
Yuan Zhu fc1c328b68 localized strings update on convergence branch. 2015-11-30 13:26:47 -08:00
Umer Khan 7b7a851cca Merge branch 'convergence_fix_pie_chart_label_overlap' into 'convergence'
Fix issue https://github.com/ResearchKit/ResearchKit/issues/558

Corrected the calculation inside `ORKCenteredCollectionViewLayout`

To test, update `ChartDataSources.swift`'s `pieChartView` method to be like this:
```
     func pieChartView(pieChartView: ORKPieChartView, titleForSegmentAtIndex index: Int) -> String {
        switch index {
        case 0:
            return "Steps"
        case 1:
            return "Tasks"
        case 2:
            return "Surveys completed"
        default:
            return "test"
        }
     }

```

After this fix:

![Screen_Shot_2015-11-19_at_6.02.59_PM](https://gitlab.sd.apple.com/y_zhu/GitHub-ResearchKit-Fork/uploads/d574cf99032e90264eee6afaf3370ad9/Screen_Shot_2015-11-19_at_6.02.59_PM.png)

See merge request !3
2015-11-30 13:16:44 -08:00
Umer Khan 37ac134b5e Merge branch 'convergence_change_activity_indicator' into 'convergence'
Change to use system activity indicator in wait step.

![Simulator_Screen_Shot_Nov_20__2015__3.26.51_PM](https://gitlab.sd.apple.com/y_zhu/GitHub-ResearchKit-Fork/uploads/20c83818ac6c6be1debef7bef0f8be9c/Simulator_Screen_Shot_Nov_20__2015__3.26.51_PM.png)

See merge request !5
2015-11-30 13:16:21 -08:00
Umer Khan 067f8f8e3d Merge branch 'convergence_add_ORKWaitStepViewController_to_RK.h' into 'convergence'
Make WaitStepVC public and add it to `ResearchKit.h`

This is a fix for `<rdar://problem/23621910> ResearchKit: ORKWaitStepViewController.h is not included in the <ResearchKit/ResearchKit.h>`

See merge request !4
2015-11-30 13:13:25 -08:00
Umer Khan 7d30dd09f3 Merge branch 'convergence_loc_two_lines' into 'convergence'
Fix for rdar://problem/23574379 [Clout]: RS: RedRiver7M1408: Clipping string…

Make buttons and labels multilines.

See merge request !2
2015-11-30 12:55:28 -08:00
Oliver Schäfer 73495244be PR change 2015-11-30 21:31:52 +01:00
Yuan Zhu 85dd559217 Merge pull request #575 from UberJason/master
Fixed build error in ResultTableViewProviders.swift caused by an outdated property.
2015-11-30 10:44:03 -08:00
Jason Ji 81c8c10ebc Fixed build error in ResultTableViewProviders.swift caused by an outdated property. 2015-11-24 20:12:48 -05:00
Yuan Zhu 19921baf55 Merge pull request #569 from shazino/convergence
Fix PSAT progress indicator tint color.
2015-11-23 14:24:36 -08:00
Yuan Zhu 63a7e30049 Merge pull request #573 from tomihisaw/master
Allow ORKLoginStepViewController to be subclassed by making the class…
2015-11-23 14:23:47 -08:00
Tom Welsh 8fa839a66b Allow ORKLoginStepViewController to be subclassed by making the class symbol visible 2015-11-23 14:02:47 -05:00
Julien Therier ffd8552aa8 Fix PSAT progress indicator tint color. 2015-11-21 11:48:42 +01:00
Yuan Zhu 140e1ebae0 Fix for rdar://problem/23638006 ResearchKit: updateText of ORKWaitStepViewController does not work as expected 2015-11-20 17:33:05 -08:00
Yuan Zhu 9338ea8b59 Use RK native layout instead of custom layout. 2015-11-20 16:15:33 -08:00
Yuan Zhu 63d56e44f8 Change to use system activity indicator in wait step. 2015-11-20 15:22:23 -08:00
Ryan J. Liljestrom 24a03d6ecf Expose NSRegularExpressionOptions for ORKTextAnswerFormat and via a transparent property in ORKRegistrationStep 2015-11-20 14:31:11 -05:00
Yuan Zhu 3daf9484c4 Make WaitStepVC public and add it to ResearchKit.h 2015-11-20 11:21:26 -08:00
Yuan Zhu d87372923b Fix issue https://github.com/ResearchKit/ResearchKit/issues/558
Corrected the calculation inside `ORKCenteredCollectionViewLayout`
2015-11-19 17:58:53 -08:00
Yuan Zhu 3dccc6d438 Fix radar <rdar://problem/23574379> [Clout]: RS: RedRiver7M1408: Clipping string RESEND_EMAIL_BUTTON_TITLE.
Make buttons and labels multiline.
2015-11-19 14:32:03 -08:00
Oliver Schäfer f8a77a1b1e Read only message 2015-11-19 20:24:11 +01:00
Oliver Schäfer ddc0016bd1 Disable skip button 2015-11-19 20:00:57 +01:00
Yuan Zhu 50cf8171f5 Change english string for "LOCATION_ERROR_TITLE" 2015-11-18 17:03:23 -08:00
Yuan Zhu d2c51201ef Strings update 2nd round 2015-11-18 15:53:49 -08:00
Yuan Zhu 8a320f0b72 Use seperate string for left and right hand. 2015-11-18 14:03:54 -08:00
Oliver Schäfer 8b81a8c5f1 Merge remote-tracking branch 'apple/master' 2015-11-18 22:55:22 +01:00
Oliver Schäfer ff673f0ad4 Fixed header comment typos 2015-11-18 22:50:03 +01:00
Oliver Schäfer 116a8e08ad Changed animation direction 2015-11-18 22:40:24 +01:00
Yuan Zhu 2988cb0fa6 Change circle to peg 2015-11-18 13:07:34 -08:00
Yuan Zhu 59788e53ec change the string of "PASSCODE_INVALID_ALERT_TITLE" 2015-11-18 10:52:31 -08:00
Yuan Zhu 09e717c69f Merge pull request #564 from md0u80c9/CorrectDestionation
CorrectDestionation
2015-11-18 10:34:49 -08:00
Oliver Schäfer 9b1bdd390c PR changes, added documentation 2015-11-18 15:28:23 +01:00
Yuan Zhu af823d1f63 Change WiFi to Wi-Fi 2015-11-17 18:09:59 -08:00
Yuan Zhu 75ac5d3366 Fix typo. 2015-11-17 17:50:56 -08:00
Oliver Schäfer b113ef0ee3 PR updates 2015-11-17 21:52:23 +01:00
Andrew Hill 8e49cbc733 Correct Destionation
Changed all instances of Destionation to Destination
2015-11-17 13:47:25 +00:00
Andrew Hill 37cfadf81a Merge branch 'ResearchKit/master' 2015-11-16 22:29:18 +00:00
Yuan Zhu 932024c4af Loc en string fixes 2015-11-13 15:16:15 -08:00
Yuan Zhu 26cf7e4d64 add ORK_CLASS_AVAILABLE for ORKLoginStepViewController 2015-11-13 15:12:24 -08:00
Yuan Zhu fa2b18da42 1st round localization 2015-11-13 12:52:07 -08:00
Oliver Schäfer fb778eefcf Bug fix 2015-11-13 09:41:25 +01:00
Oliver Schäfer f384f9137d Bug fixes 2015-11-12 22:24:12 +01:00
Oliver Schäfer 2f19a3e089 PR updates, bug fix 2015-11-12 21:44:04 +01:00
Oliver Schäfer b112945365 PR update 2015-11-11 21:13:38 +01:00
Oliver Schäfer 58c12a025b Changed review step ui for better navigation 2015-11-11 18:56:31 +01:00
Yuan Zhu 304d93a79a Add charts sections 2015-11-10 14:21:39 -08:00
Yuan Zhu a57a8d8370 Merge pull request #383 from rsanchezsaez/rsanchezsaez-navigationrules
Add Swift tuple initializer overlay to ORKPredicateStepNavigationRule
2015-11-09 10:31:44 -08:00
Oliver Schäfer 2aa09084c8 PR updates 2015-11-06 22:16:43 +01:00
Oliver Schäfer 4d16e39f73 Merge remote-tracking branch 'apple/master' 2015-11-06 21:21:13 +01:00
Yuan Zhu d44676d816 Merge pull request #559 from umerkhan-apple/localizationBug
ORKCatalog Localization Files
2015-11-05 11:10:08 -08:00
Yuan Zhu 18d50721cc Merge pull request #556 from rsanchezsaez/rsanchezsaez-ORKTestNamingConventions
ORKTest: improve some class and method names
2015-11-05 10:52:21 -08:00
Yuan Zhu 967518a576 Merge pull request #557 from umerkhan-apple/readme
Updating README for RK Forum.
2015-11-05 10:39:09 -08:00
Yuan Zhu ef8c1e1b3a Merge pull request #553 from YuanZhu-apple/master_location_question_enhancement
Switch `ORKLocationResult`'s answer from `ORKPlacemark` to `ORKLocation`
2015-11-05 10:38:57 -08:00
Yuan Zhu 6563ebdca4 Clean up NSLog 2015-11-05 10:38:34 -08:00
Yuan Zhu f85faecb49 Merge branch 'master' of github.com:ResearchKit/ResearchKit into master_location_question_enhancement 2015-11-05 10:28:08 -08:00
Umer Khan 0341e511ab Adding localization files for all other supported languages. No translations, only placeholder files in order to enable localization for RK Framework strings. 2015-11-04 17:07:53 -08:00
Oliver Schäfer 59d2ed7a39 PR updates 2015-11-04 21:54:53 +01:00
Umer Khan 8f9ab33897 Updating README for RK Forum. 2015-11-04 10:52:47 -08:00
Oliver Schäfer e5a4d01039 Merge remote-tracking branch 'apple/master' 2015-11-04 05:45:38 +01:00
Oliver Schäfer e7aac14571 PR update to fix ORKTextScaleAnswerFormat crash and re-connect embedded and standalone review step in ORKTest 2015-11-04 05:41:11 +01:00
Yuan Zhu 372fbaaaa4 Merge pull request #546 from huguesbr/master
Fix localization when using  ResearchKit as Pod (Localizable.strings > ResearchKit.strings)
2015-11-03 16:19:48 -08:00
Hugues Bernet-Rollande a3c28f666c re-add missing white space 2015-11-04 01:01:33 +01:00
Ricardo Sánchez-Sáez 4c34d1e8a3 ORKCatalog: improve naming conventions and documentation for VerificationViewController and LoginViewController subclass examples 2015-11-03 23:08:17 +00:00
Ricardo Sánchez-Sáez 50c0d4b3c0 ORKTest: improve code for Wait Task progress update 2015-11-03 22:24:35 +00:00
Oliver Schäfer 746b0866b0 PR changes related to displaying results 2015-11-03 22:23:27 +01:00
Hugues Bernet-Rollande 4b269b8c21 Updating docs to reflect new name of localized strings (ResearchKit.strings) 2015-11-03 09:30:19 +01:00
Hugues Bernet-Rollande 143b474aff Rename Localizable.strings file to ResearchKit.strings and use table name in localization, avoiding conflict when including ResearchKit as a pod (the Localizable.strings files conflict with project one) 2015-11-03 09:30:19 +01:00
Yuan Zhu ca11a8def0 Merge branch 'master' of github.com:ResearchKit/ResearchKit into master_location_question_enhancement
Conflicts:
	ResearchKit.xcodeproj/project.pbxproj
2015-11-02 17:42:22 -08:00
Yuan Zhu 09cb204a24 Add copyright line. 2015-11-02 11:01:21 -08:00
Ricardo Sánchez-Sáez 20204946bc ORKTest: change case in comments 2015-11-01 22:20:20 +00:00
Ricardo Sánchez-Sáez 74dc33a654 ORKTest: improve some class and method names 2015-11-01 22:18:17 +00:00
Andrew Hill 11a29435cd Merge branch 'ResearchKit/master' 2015-11-01 09:01:21 +00:00
Yuan Zhu f738f18570 Update to PR to improve UI experience. 2015-10-30 12:43:31 -07:00
Nidhi Gupta 7af35c7c35 Replace old PAVSAT screen shoots to reflect PASAT 2015-10-29 11:00:46 -07:00
Yuan Zhu ca2f7848f8 Merge pull request #538 from umerkhan-apple/account
Onboarding - Account Module
2015-10-28 13:48:21 -07:00
Umer Khan 85097a5e20 PR updates. 2015-10-28 13:20:48 -07:00
Yuan Zhu 60af4ce1e5 Address PR feedback, remove location question from selection survey 2015-10-27 17:56:36 -07:00
Umer Khan 8c10abfd74 Removing cancel button customization for Registration step. 2015-10-27 15:13:24 -07:00
Umer Khan 0f97c0704a Update cancel button actions for Login and Registration step. 2015-10-27 14:56:36 -07:00
Nidhi Gupta a9ea108054 Incorporated edits for the new features. 2015-10-27 14:35:32 -07:00
Yuan Zhu ac0a9a25d6 Merge branch 'master' of github.com:ResearchKit/ResearchKit into master_location_question_enhancement 2015-10-27 13:07:38 -07:00
Yuan Zhu 4ca0197532 Switch ORKLocationResult's answer from ORKPlacemark to ORKLocation
Create location questions task in ORKTest
2015-10-27 13:07:24 -07:00
Yuan Zhu e021f815ca Merge pull request #551 from umerkhan-apple/imageCaptureBug
IOI # 517 - Image capture no permissions bug
2015-10-26 17:11:46 -07:00
Yuan Zhu 1492ab82c1 Merge pull request #550 from umerkhan-apple/eligFix
IOI # 549 - Eligibility Tint Color Fix
2015-10-26 17:11:40 -07:00
Umer Khan 61408fc5f6 Consolidated tint color change method. 2015-10-26 16:28:38 -07:00
Ricardo Sánchez-Sáez 0459818613 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules
# Conflicts:
#	Testing/ORKTest/ORKTest.xcodeproj/project.pbxproj
#	Testing/ORKTest/ORKTest/MainViewController.m
2015-10-26 22:43:35 +00:00
Umer Khan 99bdc3cbbc Merging upstream/master 2015-10-26 15:38:23 -07:00
Umer Khan c0b751d05a Fixed error handling bug for image capture step. 2015-10-26 15:29:33 -07:00
Nidhi Gupta d3ed706680 Merge branch 'stable1.2_documentation' of https://gitlab.sd.apple.com/y_zhu/GitHub-ResearchKit-Fork into stable1.2_documentation 2015-10-26 15:02:48 -07:00
Nidhi Gupta d5175083ef Incorporated edits for the rest of the classes. 2015-10-26 15:02:20 -07:00
Umer Khan 721572a533 Minor update. 2015-10-26 12:44:42 -07:00
Umer Khan 2494895cf9 Tint color toggle bug fix. 2015-10-26 12:23:15 -07:00
Oliver Sch√§fer 00886afe69 Displaying results for ORKLocationAnswerFormat 2015-10-26 17:53:24 +01:00
Oliver Schäfer fdd608fee4 Merge remote-tracking branch 'apple/master' 2015-10-26 17:30:54 +01:00
Andrew Hill b630dff27e Merge branch 'ResearchKit/master' 2015-10-25 20:28:57 +00:00
Oliver Sch√§fer c41fac8023 Displaying results 2015-10-25 18:27:34 +01:00
Yuan Zhu 160b7c5f71 Merge pull request #478 from QuintilesRK/LocationQuestion
Location Question Type
2015-10-23 16:50:57 -07:00
Brandon McQuilkin 1b5ea88e0f Fixed issue causing tests to fail. 2015-10-22 15:13:48 -04:00
Brandon McQuilkin dd42f4740e Accidentally removed required import on merge. 2015-10-22 12:21:05 -04:00
Brandon McQuilkin 1f26d5c5a1 Merge branch 'master' of https://github.com/ResearchKit/ResearchKit into LocationQuestion
Conflicts:
	ResearchKit/Common/ORKResult.m
2015-10-22 12:16:54 -04:00
Brandon McQuilkin 0a07f24bea Removed unused error message. 2015-10-22 08:27:44 -04:00
Brandon McQuilkin 224146f7fd Handle errors that can be returned by the CLLocationManager that do not apply to the functionality of the selection view by silently absorbing the error. 2015-10-22 08:27:06 -04:00
Brandon McQuilkin 5e7768483e Forgot to add localizable strings. 2015-10-22 08:24:36 -04:00
Andrew Hill 2819b7714d Merge branch 'ResearchKit/master' 2015-10-22 07:55:27 +01:00
Oliver Schäfer 81ec1f0056 Merge remote-tracking branch 'apple/master' 2015-10-22 00:10:02 +02:00
Oliver Sch√§fer 36f710739d PR updates 2015-10-22 00:05:11 +02:00
Yuan Zhu 66884c045b Merge pull request #513 from rsanchezsaez/rsanchezsaez-NavigableOrderedTask
Use results for backwards navigation in 'ORKNavigableOrderedTask'
2015-10-21 13:47:55 -07:00
Oliver Sch√§fer 04f5a9e9f6 PR changes 2015-10-21 20:14:18 +02:00
Brandon McQuilkin e7ca832c3d Updated error handling. 2015-10-21 08:59:33 -04:00
Umer Khan af3285f5f0 Bug fix for confirm answer format. 2015-10-20 22:17:41 -07:00
Umer Khan 50cd9055ac PR updates and added example to ORKTest. 2015-10-20 19:48:53 -07:00
Umer Khan d0226f29f7 Merge remote-tracking branch 'upstream/master' into account 2015-10-20 18:37:00 -07:00
Umer Khan eceeab053d PR feedback changes. 2015-10-20 18:36:30 -07:00
Andrew Hill aa2e83e2b5 Merge branch 'ResearchKit/master' 2015-10-20 19:09:40 +01:00
Yuan Zhu de0019054a Merge pull request #533 from md0u80c9/ORKFormItem-optionalConvenienceInit
ORKFormItem optionalConvenienceInit
2015-10-20 10:47:44 -07:00
Brandon McQuilkin cbf9d7284f Removed location question from form example. 2015-10-20 08:40:52 -04:00
Brandon McQuilkin 00183879ce Removed if statement left over from debugging. 2015-10-20 08:39:04 -04:00
Brandon McQuilkin 58453f5df9 Pulled edge to edge presentation logic into init. 2015-10-20 08:37:50 -04:00
Umer Khan 9c65780911 Updated confirm text answer format validation logic. 2015-10-19 18:47:23 -07:00
Ricardo Sánchez-Sáez f7f8e12d9d ORKResult: add indentation for collection classes description 2015-10-20 02:41:30 +01:00
Ricardo Sánchez-Sáez ee494c5ed1 ORKResult: add 'numberOfPaddingSpacesForIndentationLevel' constant 2015-10-20 02:30:08 +01:00
Ricardo Sánchez-Sáez 12a2d556c9 ORKHelpers: simplify 'ORKPaddingWithNumberOfSpaces' function by using Foundation API 2015-10-20 02:27:44 +01:00
Yuan Zhu ce6d4fe3ac Fix links in survey page. 2015-10-19 18:19:22 -07:00
Umer Khan 05f2fe9db4 Minor update to DOB form item in ORKRegistrationStep. 2015-10-19 15:24:52 -07:00
Umer Khan 7e8175b8a2 Added more error checking and updated registration step to adjust given & family name for locale. 2015-10-19 14:49:09 -07:00
Umer Khan c3460d8aaa Refactored string constants for login step form items. 2015-10-19 14:09:23 -07:00
Umer Khan 886bca74bf PR review modifications. 2015-10-19 14:03:36 -07:00
Andrew Hill 79deaaa4b2 Merge branch 'ResearchKit/master' 2015-10-19 19:11:34 +01:00
Umer Khan 53bb638c69 Minor fix. 2015-10-19 11:07:25 -07:00
Umer Khan 3d40007df9 Minor documentation updates. 2015-10-19 10:57:48 -07:00
Brandon McQuilkin 5070517ba3 Removed unnecessary lines. 2015-10-19 13:17:00 -04:00
Brandon McQuilkin 5bca8eb66d Updated ORKLocationQuestionResult's copy method. 2015-10-19 08:25:05 -04:00
Brandon McQuilkin 4dff0189df Removed unnecessary hash method override. 2015-10-19 08:24:09 -04:00
Brandon McQuilkin 9e1e855b70 Fixed ORKLocationQuestionResult's answer format. 2015-10-19 08:21:20 -04:00
Brandon McQuilkin 4e7f24f1c2 Reverted indentation changes to ORKESerialization. 2015-10-19 08:20:11 -04:00
Brandon McQuilkin 3229df2a48 Updated the default location place holder string's key. 2015-10-19 08:18:41 -04:00
Ricardo Sánchez-Sáez 7bc407ee90 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules 2015-10-19 01:50:43 +01:00
Ricardo Sánchez-Sáez 96e94155d7 ORKTest: fix serialization tests 2015-10-19 01:49:15 +01:00
Ricardo Sánchez-Sáez b8b5648c71 ORKResult: improve indentantion of collection results' 'description' 2015-10-19 01:42:30 +01:00
Ricardo Sánchez-Sáez 0471bf61d4 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-NavigableOrderedTask
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2015-10-18 20:24:10 +01:00
Andrew Hill a0ca62ec23 Reordered the initialisers per YuanZhu's feedback. 2015-10-18 00:02:30 +01:00
Oliver Sch√§fer a581d58243 Bug fixes 2015-10-17 16:44:59 +02:00
Oliver Sch√§fer 718a4d3ed7 PR changes 2015-10-17 12:49:24 +02:00
Oliver Sch√§fer 9241848bc3 PR changes 2015-10-17 11:09:35 +02:00
Oliver Sch√§fer 913be47d6d Fixed corruption of project.pbxproj 2015-10-17 11:00:46 +02:00
Oliver Sch√§fer 88a94e106b PR Changes 2015-10-17 10:47:17 +02:00
Oliver Schäfer 2469bfe5a3 Merge remote-tracking branch 'apple/master' 2015-10-17 10:45:19 +02:00
Oliver Sch√§fer 6ec5df751d PR changes 2015-10-17 10:40:14 +02:00
Umer Khan aac14a3a1a Minor formatting fixes. 2015-10-16 18:38:53 -07:00
Umer Khan 696758bdc2 Added more validation checks. 2015-10-16 18:26:05 -07:00
Umer Khan 43b6585bfa Minor updates. 2015-10-16 16:38:34 -07:00
Umer Khan f47f9d824c Updates 2015-10-16 16:23:13 -07:00
Oliver Sch√§fer 7ef55e55e7 Bug fux 2015-10-16 21:51:00 +02:00
Brandon McQuilkin 9b4152ec6e Aligned text field and map with the rest of the form question cells. 2015-10-16 15:23:39 -04:00
Brandon McQuilkin b58ae6139b Adjusted map size to ensure that the text field was visible on all devices.
Removed the code to scroll the text field into view as the scroll offset change was being overriden by the animation of the keyboard changing the table view offset.
2015-10-16 15:12:57 -04:00
Brandon McQuilkin 7ba97f4089 Removed unnecessary cast. 2015-10-16 14:33:55 -04:00
Brandon McQuilkin a2bfb9a15d Switched to using predefined vertical margin. 2015-10-16 14:33:06 -04:00
Umer Khan 17b7d7d4f9 Merge remote-tracking branch 'upstream/master' into account 2015-10-16 10:47:20 -07:00
Andrew Hill d9e2f54c41 Changes made per UmerKhan-apple's suggestions 2015-10-16 08:19:34 +01:00
Umer Khan 9347ef6573 Updated serialization. 2015-10-15 18:03:49 -07:00
Nidhi Gupta ed4a50dacc Few API edits. 2015-10-15 11:47:16 -07:00
Nidhi Gupta d8d3882a1c Update ORKScaleAnswerFormat Class Reference 2015-10-15 11:43:47 -07:00
Nidhi Gupta ec8308b8bd Code snippet for ORKNavigableOrderedTask, and Email answer format. 2015-10-15 11:28:43 -07:00
Brandon McQuilkin 9296fe90bc Moved map view initialization 2015-10-15 09:16:36 -04:00
Brandon McQuilkin df9170f9cf Removed extra method. 2015-10-15 09:06:58 -04:00
Brandon McQuilkin 0deb8ba55e Switched the focus of the form cell from the map view to the text field. 2015-10-15 09:05:49 -04:00
Brandon McQuilkin b24310adbc Removed unnecessary variable. 2015-10-15 08:57:13 -04:00
Brandon McQuilkin c138f6aa02 Marked constant span values as constants. 2015-10-15 08:56:28 -04:00
Brandon McQuilkin 49e541d1b7 Set the map region's coordinate directly. 2015-10-15 08:55:28 -04:00
Brandon McQuilkin f22676a8e7 Switched isEqual to ORKEqualObjects 2015-10-15 08:54:17 -04:00
Brandon McQuilkin d34749e1ef Copy answer before setting the answer property 2015-10-15 08:52:34 -04:00
Brandon McQuilkin 0e4251d511 Directly use string from ABCreateStringWithAddressDictionary 2015-10-15 08:50:07 -04:00
Brandon McQuilkin 06ff988941 Removed unnecessary casts. 2015-10-15 08:49:26 -04:00
Brandon McQuilkin 3b3c907d39 Removed extra class from ORKResult.h 2015-10-15 08:47:27 -04:00
Brandon McQuilkin b1515e0fc2 Removed unnecessary method. 2015-10-15 08:46:43 -04:00
Brandon McQuilkin f9924ddbc0 Removed debug log from tests. 2015-10-15 08:44:24 -04:00
Brandon McQuilkin bbde9865ee suggestedCellHeightForView now returns a height based off of the screen metric. 2015-10-15 08:35:39 -04:00
Nidhi Gupta cfa9e90d76 Corrected ORKOrderedTask description. 2015-10-15 00:13:12 -07:00
Andrew Hill 851bd4e2c5 Added ORKFormStep optional convenience initialiser.
Updated the optional form test to confirm all is working.
2015-10-15 04:13:05 +01:00
Yuan Zhu 9fbabf8f3b Merge pull request #528 from rsanchezsaez/rsanchezsaez-ChartsPerformanceTest
ORKTest: add 'Test Charts Performance' item
2015-10-14 18:04:34 -07:00
Yuan Zhu 536a22f733 Merge pull request #526 from YuanZhu-apple/master_should_able_to_contine_with_default_value_on_scale
Refractor scale answer format
2015-10-14 17:42:31 -07:00
Yuan Zhu e51c9b708a Should set currentNumberValue to nil if passed in currentTextChoiceValue is not match any of the text choices. 2015-10-14 17:41:10 -07:00
Yuan Zhu b45425ba72 Update API doc 2015-10-14 17:38:06 -07:00
Yuan Zhu 181651b365 Update string. 2015-10-14 17:35:00 -07:00
Yuan Zhu b8d2c6bf86 Address review feedback 2015-10-14 17:33:42 -07:00
Ricardo Sánchez-Sáez feb5f11e3e CharDataSources.swift: add PerformanceLineGraphChartDataSource 2015-10-15 00:54:10 +01:00
Yuan Zhu 8d4b73ae8f Style adjustment 2015-10-14 16:31:57 -07:00
Yuan Zhu 81e67dc6fa Use _textChoices instead of self.textChoices 2015-10-14 16:30:24 -07:00
Yuan Zhu e873af81d6 Style adjustment. 2015-10-14 16:24:19 -07:00
Yuan Zhu 59681fbab5 Other review feedback update. 2015-10-14 16:11:41 -07:00
Yuan Zhu a3a53b7c68 Make separate ORKTextScaleAnswerFormatProvider to carry the methods for ORKTextScaleAnswerFormat 2015-10-14 15:59:28 -07:00
Yuan Zhu a28e2596bd Change protocol method from defaultNumber to defaultAnswer to better work with ScaleSliderView. 2015-10-14 15:50:04 -07:00
Yuan Zhu f5e8b40f6d Style update 2015-10-14 15:36:10 -07:00
Umer Khan 55bc242896 Removed disabled confirm textfield feature. 2015-10-14 14:51:18 -07:00
Umer Khan d3dee01678 Refactored to view controller parameter rather than Class parameter. 2015-10-14 14:47:15 -07:00
Umer Khan a6445546fd Updated confirm text answer format. 2015-10-14 14:30:38 -07:00
Brandon McQuilkin 44a786d51d Switch returned error message to localizedFailureReason. 2015-10-14 15:19:21 -04:00
Brandon McQuilkin 5954a6b254 Moved size of map to screen metric. 2015-10-14 15:15:04 -04:00
Brandon McQuilkin 06eecb054c Updated serialization and unit tests of ORKPlacemark.
- Added ORKPlacemark to public header.
- Added NSSecureCoding, NSCopying, isEqual: to ORKPlacemark
- Finished replacing MKPlacemark to ORKPlacemark
- Updated ORKTestTests
2015-10-14 14:53:50 -04:00
Brandon McQuilkin c38da58f6b Added open source license. 2015-10-14 08:45:32 -04:00
Brandon McQuilkin 17c35e6765 Updated horizontal margins. 2015-10-14 08:44:34 -04:00
Umer Khan 1074eefbbe Added confirm text answer format and cell. 2015-10-13 20:16:47 -07:00
Nidhi Gupta 6c54eea404 API reference edits incorporated (part 1) 2015-10-13 15:05:56 -07:00
Ricardo Sánchez-Sáez daa267b8f0 ORKTest: add 'Test Charts Performance' item 2015-10-13 22:43:30 +01:00
Andrew Hill 7f66623c59 Merge branch 'ResearchKit/master' 2015-10-13 22:18:32 +01:00
Umer Khan 7854c619a3 Added LoginStep and refactored minor things. 2015-10-13 14:10:21 -07:00
Brandon McQuilkin deef811bc9 Moved where the initial coordinate region is set. 2015-10-13 10:38:05 -04:00
Brandon McQuilkin b9fff0e4c0 Removed extra text color change. 2015-10-13 10:23:05 -04:00
Brandon McQuilkin f35e84189c Removed extra answerDidChange call.
Fixed extra annotations bug.
2015-10-13 09:57:42 -04:00
Brandon McQuilkin 5ff0f9324a Updated error message. 2015-10-13 09:48:44 -04:00
Brandon McQuilkin 35d33709b2 Added support for ORKNullAnswerValue to the selection view. 2015-10-13 09:46:28 -04:00
Brandon McQuilkin 0d9c98dd56 Fixed the selection view's first responder being ignored. 2015-10-13 08:14:39 -04:00
Yuan Zhu 2ac5e30d85 Refractor scale answer format.
1. fix for #511 "Continue button is disabled on scale with default values"
2. refactor ORKScaleSliderView to work better with three scale related answer format.
2015-10-12 16:23:22 -07:00
Umer Khan d1e246bba4 Adding wait step to account creation task. 2015-10-12 14:46:00 -07:00
Yuan Zhu 0dc31e4593 Merge pull request #512 from md0u80c9/restorationData
RestorationData
2015-10-12 12:01:57 -07:00
Brandon McQuilkin 521dba3d4e Removed invalid location answer error creation as it is not possible for the user to create an invalid coordinate. 2015-10-12 10:40:52 -04:00
Brandon McQuilkin 07e05298a0 Removed the MKPlacemark string conversion and replaced with a subclass of MKPlacemark. 2015-10-12 10:33:05 -04:00
Brandon McQuilkin 9214c48d41 Added ORKPlacemark class. 2015-10-12 10:06:38 -04:00
Brandon McQuilkin ebdc7a218a Added MKPlacemark serialization tests. 2015-10-12 09:47:03 -04:00
Brandon McQuilkin 3d9cc15c0b Fixed issue where previously entered answer would be overridden with current location after coming back to the question. 2015-10-12 08:42:50 -04:00
Oliver Sch√§fer 41d6a415ad Bug fixes 2015-10-12 11:59:10 +02:00
Ricardo Sánchez-Sáez f45722366c ORKNavigableOrderedTask: add loop support information to headerdocs 2015-10-11 13:16:58 +01:00
Ricardo Sánchez-Sáez 10152cfb79 ORKNavigableOrderedTask: reverse backwards navigation iteration
This fixes the behavior correct when you have visited the same step more than once (otherwise you'd get the previous step on your first visit).

Also, stop iteration as soon as possible, and improve loop warning
2015-10-11 12:50:47 +01:00
Ricardo Sánchez-Sáez 038794df0d ORKTaskViewController: make _managedStepIdentifiers array again
This is the original behavior, it follows the pop/push model. All the backward navigation stack is preserved, but older results which are ovewritten if you revisit the same step on a loop. Thus, going over a loop will produce duplicate results for the steps that are seen more than once (all the duplicate step results will point to the same result instance: the one corresponding to the last time you visited the step).
2015-10-11 12:46:53 +01:00
Ricardo Sánchez-Sáez d74bfe956f ORKResult: improve results' description
Also, use description to print task results in 'ORKTest'.
2015-10-11 12:42:47 +01:00
Oliver Sch√§fer a3b2d68b7a State restoration bugfix #2 2015-10-11 12:43:52 +02:00
Oliver Sch√§fer 87560025c8 State restoration bugfix 2015-10-11 12:34:08 +02:00
Steve Cadwallader af9588fd93 Revert to property notation. 2015-10-10 16:13:47 -04:00
Steve Cadwallader 80ee2b8792 Mark three ORKLocationSelectionViewDelegate event callbacks as optional. 2015-10-10 16:12:10 -04:00
Steve Cadwallader 8dffe81ea7 Replace ORKNullAnswerValue test with more complete ORKIsAnswerEmpty. 2015-10-10 15:48:29 -04:00
Steve Cadwallader 95099e34de Initialize the subview earlier, and access the placeholder directly from the form. 2015-10-10 15:42:47 -04:00
Steve Cadwallader 9dc22ff97e Remove unimplemented applyAnswerFormat from ORKFormItemLocationCell. 2015-10-10 15:15:27 -04:00
Steve Cadwallader df7a5d2ae4 Remove blank line in import statements. 2015-10-10 15:11:14 -04:00
Steve Cadwallader 475d84de73 Implement copyWithZone for ORKLocationAnswerFormat 2015-10-10 15:10:30 -04:00
Steve Cadwallader cc6380af67 Utilize constants for JSON keys. 2015-10-10 14:29:42 -04:00
Ricardo Sánchez-Sáez ebf3a5474d Unit tests: test new navigable ordered task navigation model 2015-10-10 17:04:21 +01:00
Ricardo Sánchez-Sáez f8a94a0f66 ORKTest: update unit tests 2015-10-10 16:47:48 +01:00
Ricardo Sánchez-Sáez 1afb67bf9e Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-NavigableOrderedTask
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2015-10-10 16:17:02 +01:00
Ricardo Sánchez-Sáez 258afcb7df ORKTest: direclty call TaskFactory method 2015-10-10 16:07:05 +01:00
Ricardo Sánchez-Sáez 8a3882d85c Fix ResearchKit unit tests not running due to Swift code 2015-10-10 16:06:46 +01:00
Ricardo Sánchez-Sáez 2bd667bc6f ORKTest: rename Swift 'TestHelpers' to 'TaskFactory' 2015-10-10 15:39:11 +01:00
Ricardo Sánchez-Sáez 7a4715dd72 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2015-10-10 15:37:12 +01:00
Umer Khan 8f7047220f Merging master and resolving merge conflicts. 2015-10-09 14:58:04 -07:00
Yuan Zhu fda01e8dd0 Merge pull request #518 from YuanZhu-apple/master_fix_First_Last_Name_logic_in_consent
Fix Issue #516: Consent required name logic is invalid
2015-10-09 14:56:10 -07:00
Steve Cadwallader 8042df3127 Documentation tweak. 2015-10-09 17:40:50 -04:00
Steve Cadwallader 153726633f Rename conversion methods to be more explicit about JSON strings. 2015-10-09 17:40:10 -04:00
Nidhi Gupta 4040d962a0 Added rules for scale answer format. 2015-10-09 12:07:26 -07:00
Steve Cadwallader 861211fa3b Integrate MKPlacemark JSON serialization. 2015-10-09 10:28:03 -04:00
Steve Cadwallader a8f6be61f3 Copyright updates 2015-10-09 08:38:43 -04:00
Steve Cadwallader 7c01903108 Replace spaces with tabs, to follow convention. 2015-10-09 08:05:25 -04:00
Steve Cadwallader 848800bcd6 Reintroduce Wait Step, resolution of merge conflict. 2015-10-09 07:58:51 -04:00
Steve Cadwallader caa324ec79 Merge branch 'master' into LocationQuestion 2015-10-09 07:56:21 -04:00
Steve Cadwallader 27bf948f6d Merge remote-tracking branch 'ResearchKit/master' 2015-10-09 07:45:26 -04:00
Nidhi Gupta ed60c84a2d Added vertical slider answer format. 2015-10-08 20:01:49 -07:00
Nidhi Gupta e70d56142d Incorporated active task's feedback.
Added ORKNavigableOrderedTask.
2015-10-08 19:40:49 -07:00
Yuan Zhu a4c9286f29 Merge pull request #520 from umerkhan-apple/waitTask
Rearranging ORKTest and ORKCatalog for WaitTask.
2015-10-08 18:26:59 -07:00
Umer Khan 97c5ada28f Rearranging ORKTest and ORKCatalog for WaitTask to comply with alphabetic ordering. 2015-10-08 18:21:11 -07:00
Umer Khan fd0d4af750 Merge pull request #477 from QuintilesRK/WaitTask
Wait Task
2015-10-08 18:11:18 -07:00
Steve Cadwallader dc81d8af3a Remove identifier serialization from ORKPasscodeStep as well. 2015-10-08 21:05:05 -04:00
Steve Cadwallader deac6b5de0 Remove incorrect serialization of identifier for ORKWaitStep (defined in base class). 2015-10-08 21:04:25 -04:00
Steve Cadwallader 2c504f4b01 Merge remote-tracking branch 'ResearchKit/master' 2015-10-08 20:58:39 -04:00
Steve Cadwallader db4b19b229 Add ORKQuestionTypeLocation to section types. 2015-10-08 20:51:57 -04:00
Steve Cadwallader 129d2ac3df Add Apple to copyright headers 2015-10-08 20:37:46 -04:00
Steve Cadwallader 0790e52a5a Replace remaining reference to indicatorType with indicatorMask, resolving unit test issue. 2015-10-08 20:31:09 -04:00
Umer Khan 9784c1425a Merge pull request #476 from QuintilesRK/ValidatedText
Validated Text
2015-10-08 17:26:20 -07:00
Steve Cadwallader df13dca4d9 Update two copyright headers. 2015-10-08 20:20:39 -04:00
Steve Cadwallader acfce230b4 Re-implement the cached percent formatter. 2015-10-08 20:19:10 -04:00
Steve Cadwallader bfac86d706 Merge pull request #1 from umerkhan-apple/waitStep
Wait Step
2015-10-08 20:14:08 -04:00
Steve Cadwallader c2e2951d6f Cache the regular expression. 2015-10-08 19:52:39 -04:00
Steve Cadwallader 36a578549b Refactor common initialization code out into a commonInit method. 2015-10-08 19:34:35 -04:00
Yuan Zhu 165e107ddc Fix Issue #516: Consent required name logic is invalid
#516

Should update this code after we adding in #443 .
2015-10-08 15:43:44 -07:00
Yuan Zhu e32efc4ec2 Merge pull request #515 from YuanZhu-apple/master_fix_unit_test
Clear unexpected exceptions from unit tests.
2015-10-08 14:40:53 -07:00
Yuan Zhu 3479c35fb3 Code refactor 2015-10-08 13:32:07 -07:00
Umer Khan 74fbc9af77 Merge branch 'waitStep' of https://github.com/umerkhan-apple/ResearchKit into waitStep 2015-10-08 12:57:00 -07:00
Yuan Zhu ec91b7b139 Clear unexpected exceptions from unit tests.
- `HTMLForSignature:` would throw exception on a nil `signature.title`
2015-10-08 12:56:46 -07:00
Umer Khan d4403704ce Re-ordering wait task in ORKTest to stay consistent with alphabetic ordering. 2015-10-08 12:52:57 -07:00
Umer Khan 4919e0fc0c Refactoring WaitStep logic and formatting. 2015-10-08 12:48:33 -07:00
Oliver Sch√§fer dc3c6e011c PR changes 2015-10-08 20:47:55 +02:00
Andrew Hill 4c49283504 removed duplicate self.delegate allocation 2015-10-08 19:31:48 +01:00
Brandon McQuilkin 26a094e05f Merge branch 'master' of https://github.com/ResearchKit/ResearchKit into WaitTask
Conflicts:
	samples/ORKCatalog/ORKCatalog/Tasks/TaskListRow.swift
2015-10-08 14:23:27 -04:00
Brandon McQuilkin d6504c68ef Undo deletion of MKPlacemark category. 2015-10-08 14:15:08 -04:00
Brandon McQuilkin f90af1ce01 Added MapKit Framework to ORKTest project. 2015-10-08 14:10:21 -04:00
Steve Cadwallader ae6fcf4ce4 Re-insert ValidatedTextQuestion cases that were incorrectly merged out in 52d5fca 2015-10-08 14:07:33 -04:00
Brandon McQuilkin 8730a26be1 Updated initializer for ORKLocationSelectionView. 2015-10-08 11:57:00 -04:00
Brandon McQuilkin 20d6defb6f Added property to enable/disable automatically retrieving the user's current location. 2015-10-08 11:37:26 -04:00
Brandon McQuilkin cf917dc208 Added serialization tests for location step and result. 2015-10-08 11:12:13 -04:00
Brandon McQuilkin 47ad36d906 Added the location permission request string to ORKTest to enable automatic location retrieval. 2015-10-08 09:40:51 -04:00
Brandon McQuilkin e69228445a Updated ORKCatalog's info.plist with the new location permission request string. 2015-10-08 09:35:52 -04:00
Brandon McQuilkin 90619ac2af Removed unnecessary method that caused the wrong value to be set to the ORKLocationQuestionResult's locationAnswer property. 2015-10-08 09:34:00 -04:00
Brandon McQuilkin 43c4b892b2 Added new lines before and after imports. 2015-10-08 09:05:11 -04:00
Brandon McQuilkin 1c2028ce5d Updated legal headers in MKPlacemark category. 2015-10-08 09:03:06 -04:00
Brandon McQuilkin 29942a01d5 Added address field placeholder to localized strings. 2015-10-08 09:02:01 -04:00
Brandon McQuilkin c159d6db61 Updated cell expansion animation. 2015-10-08 09:00:51 -04:00
Brandon McQuilkin 7635528b2f Removed extra line from localized strings. 2015-10-08 08:56:39 -04:00
Brandon McQuilkin d5b6b0f87a Refactored ORKSurveyAnswerCellDelegate method name to be in line with the ORKFormItemCell. 2015-10-08 08:55:54 -04:00
Brandon McQuilkin 328b8421a3 Switched constants from #define to static const CGFloat 2015-10-08 08:52:35 -04:00
Brandon McQuilkin b4a2cbebd0 Removed prefixes from location selection view constants. 2015-10-08 08:51:27 -04:00
Brandon McQuilkin 9a749c5489 Added non null assumptions. 2015-10-08 08:49:06 -04:00
Brandon McQuilkin 09272a78df Removed second unused method. 2015-10-08 08:47:06 -04:00
Brandon McQuilkin 92ae7cf071 Removed unused method. 2015-10-08 08:46:36 -04:00
Brandon McQuilkin b5568e278b Renamed ORKFormItemLocationCell's constraint set up method. 2015-10-08 08:46:03 -04:00
Brandon McQuilkin 33864f1012 Updated error strings for invalid coordinates. 2015-10-08 08:44:28 -04:00
Brandon McQuilkin 2534e6b20e Fixed syntax error. 2015-10-08 08:21:44 -04:00
Andrew Hill 56b50e9296 Removed a wandering ')' seemed to have slipped the net. 2015-10-08 11:09:44 +01:00
Steve Cadwallader 8eb756b96c Merge conflicts 2015-10-07 22:07:17 -04:00
Steve Cadwallader 52d5fcabe7 Merge branch 'master' into ValidatedText 2015-10-07 22:05:11 -04:00
Steve Cadwallader bf07984430 Merge remote-tracking branch 'ResearchKit/master' 2015-10-07 21:56:53 -04:00
Steve Cadwallader 0554cbd6f1 Implement serialization, copying, and equality logic for regex and invalidMessage. Resolves unit test failures. 2015-10-07 21:55:47 -04:00
Ricardo Sánchez-Sáez b34d1ecd29 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules 2015-10-07 23:23:08 +01:00
Ricardo Sánchez-Sáez f3c7c53e21 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-NavigableOrderedTask 2015-10-07 23:14:38 +01:00
John Earl 59045b27a5 Revert changes from bad merge at c113deb 2015-10-07 14:59:59 -07:00
Umer Khan 14ea5cc282 Updated changes to ORKLoginStep. 2015-10-07 14:05:14 -07:00
Ricardo Sánchez-Sáez ec04a5c633 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-NavigableOrderedTask 2015-10-07 22:03:27 +01:00
Ricardo Sánchez-Sáez f1e4941f3f ORKNavigableOrderedStack: use task results for backwards navigation
This commits removes ORKNavigableOrderedTask's '_stepIdentifierStack' ivar (used for backwards navigation) and uses the managed task results instead. The managed task result will only show results for the steps that have been previously visited, so it can be used to simulate the backwards navigation stack.

The ORKTaskViewController's '_managedStepIdentifiers' ivar has been converted into an 'NSMutableOrderedSet'. When an already visited step is shown (either by going back, or by following a loop in a navigable ordered task), all the managed step identifiers which come later than the step being shown are removed.

This commit also updates the 'ORKTest' to remove the "Save For Later" task archiving (which is no longer needed) and updates the 'Ordered Loop Task' example to be more comprehensive by featuring a branched question.
2015-10-07 22:03:03 +01:00
Steve Cadwallader bb01f0bb4d Utilize string formatting for error messages. Update comments. Change location of ORKTest URL test to in-line beneath e-mail. 2015-10-07 16:53:50 -04:00
Andrew Hill 7ebc03c93f Ensure we set up the delegate. 2015-10-07 21:43:38 +01:00
Andrew Hill 413bc6682a Amended ORKTaskViewController initWithTask to take a nullable restorationData field.
Updated ORKTest to allow us to test this out.
tested with NavigableOrderedTask.
2015-10-07 21:22:26 +01:00
Andrew Hill 9ccf4fb743 Merge branch 'ResearchKit/master' 2015-10-07 21:12:31 +01:00
Andrew Hill 723075a61f Merge branch 'ResearchKit/master' into restorationData 2015-10-07 21:11:53 +01:00
Ricardo Sánchez-Sáez c659539a45 ORKResult: homogenize results 'description' strings
Also: add result description for 'ORKCollectionResult' and 'ORKQuestionResult'.
2015-10-07 20:29:46 +01:00
Ricardo Sánchez-Sáez 48661fe670 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2015-10-07 19:54:33 +01:00
Ricardo Sánchez-Sáez b9fadc1b87 ORKTest: add 'Navigable Loop Task'
The 'Navigable Loop Task' allows testing of optional 'ORKNavigableOrderedTask' looping (when you loop, all the navigation history after the targeted step is discareded).

Also:
- Improve style and conform to naming conventions in MainViewController.m.
2015-10-07 19:17:08 +01:00
Yuan Zhu 11dc10e66e Merge pull request #509 from YuanZhu-apple/master_fix_save_for_later
If a task in ORKTest has been cancelled and saved, the output directory should be kept.
2015-10-07 10:32:42 -07:00
Yuan Zhu 6911fe614f Update for feedback. 2015-10-07 10:26:10 -07:00
Brandon McQuilkin 452665de14 Merge ResearchKit/master into ResearchKit/LocationQuestion 2015-10-07 10:43:32 -04:00
Brandon McQuilkin 1f352c39d2 Updated ORKWaitStep serialization. 2015-10-07 09:23:34 -04:00
Brandon McQuilkin e42c92004a Fixed syntax error. 2015-10-07 09:18:57 -04:00
Brandon McQuilkin 17ac3f5177 Updated changed method name in ORKTest. 2015-10-07 09:09:53 -04:00
Brandon McQuilkin 400da43f42 Cached the percent formatter. 2015-10-07 09:07:23 -04:00
Brandon McQuilkin c0aed6d641 Merge branch 'master' of https://github.com/ResearchKit/ResearchKit into WaitTask
Conflicts:
	samples/ORKCatalog/ORKCatalog/Tasks/TaskListRow.swift
2015-10-07 09:05:22 -04:00
Brandon McQuilkin f7e9c672e2 Added serialization tests for the wait step. 2015-10-07 08:26:48 -04:00
Yuan Zhu 7f106898e2 Merge pull request #462 from rsanchezsaez/rsanchezsaez-changelog
Add CHANGELOG.md
2015-10-06 15:58:12 -07:00
Yuan Zhu d3da59a4f6 In ORKTest, if a task has been cancelled and saved, the output directory should be kept.
ORKURLFromBookmarkData() fails to return a valid URL, when the resolving directory is not exist.
2015-10-06 14:33:47 -07:00
Umer Khan 8a78e95ebb Added Login step and updated documentation. 2015-10-06 13:55:28 -07:00
Umer Khan c113deb1a3 Merge branch 'master' of https://github.com/ResearchKit/ResearchKit 2015-10-06 13:36:09 -07:00
Brandon McQuilkin 3097232bd5 Converted weakSelf to strongSelf in block. 2015-10-06 15:13:14 -04:00
Brandon McQuilkin 04a55343bc Cleaned up imports. 2015-10-06 15:07:06 -04:00
Brandon McQuilkin 485e6035e0 Updated percent string to use NSNumberFormatter 2015-10-06 14:59:29 -04:00
Brandon McQuilkin 785ea40fc4 Constraint handling updated.
Static constraints now set up in setUpConstraints
Changing constraints now set up in updateConstraints if needed.
2015-10-06 14:55:07 -04:00
Ricardo Sánchez-Sáez 69319a3c5e RELEASE-NOTES.md: fix typo 2015-10-06 20:47:39 +02:00
Brandon McQuilkin c10ab44036 Consolidated indicator mask view creation. 2015-10-06 14:47:01 -04:00
Brandon McQuilkin 3fdbad88b2 Updated framework headers. 2015-10-06 14:27:35 -04:00
Brandon McQuilkin 2287b99b86 Moved wait task creation code in ORKTest 2015-10-06 14:23:02 -04:00
Brandon McQuilkin 3d6a7fa481 Updated accessibility to read out the progress value. 2015-10-06 14:16:03 -04:00
Brandon McQuilkin 0759764889 Added hard line wraps. 2015-10-06 14:07:05 -04:00
Brandon McQuilkin e3ab9d75ef Removed unnecessary tint color management 2015-10-06 14:03:12 -04:00
Brandon McQuilkin f401dcf94d Moved the wait step classes into the common folder. 2015-10-06 13:57:01 -04:00
Brandon McQuilkin b941379779 Refactored the wait step into a normal step. 2015-10-06 13:54:16 -04:00
Steve Cadwallader f2d13d1305 Reordered Validated Text Question between Value Picker and Image Capture per @rsanchezsaez feedback. 2015-10-06 11:59:33 -04:00
Brandon McQuilkin 96e5f26f7d Updated the result to return a placemark 2015-10-06 11:17:36 -04:00
Steve Cadwallader cecef562a9 Update localizedInvalidValueStringWithAnswerString to check both string length and regex validity when building a string. 2015-10-06 10:44:27 -04:00
Steve Cadwallader 7d2d04239f Remove emailAddress from ORKTextAnswerFormat. 2015-10-06 10:28:44 -04:00
Steve Cadwallader 2b649f9e12 Split out method for isTextRegexValidWithString. Update initializers to match recent argument changes. 2015-10-06 10:22:30 -04:00
Steve Cadwallader a9478c3cb0 Remove assignment to local variables per review feedback. 2015-10-06 09:23:11 -04:00
Steve Cadwallader 9b64b9c0f0 Change the argument name for textAnswerFormatWithValidationExpression. Reorder properties to be grouped together. Correct outdated documentation. 2015-10-06 09:18:51 -04:00
Ricardo Sánchez-Sáez ac0f3c542c RELEASE-NOTES.md: take care of internal review feedback
Also:
- Encode '(' and ')' symbols in URL (they interferred with markdown syntax).
- Use Title Capitalization for all section titles.
- Mention "General stability and performance improvements" on each release introducion instead of as a separate section.
2015-10-06 14:36:53 +02:00
Umer Khan 2e356cac03 Added confirm passcode field. 2015-10-05 16:55:51 -07:00
Yuan Zhu 91d4fa7890 Merge pull request #498 from ResearchKit/localizationFix
IOI # 495 - Localization fallback language
2015-10-05 13:37:42 -07:00
Yuan Zhu 18504e9ffe Merge pull request #493 from umerkhan-apple/touchID
Passcode updates
2015-10-05 13:21:46 -07:00
Umer Khan d80ca89094 PR update. 2015-10-05 13:11:32 -07:00
Umer Khan 706900ff07 Updated ORKVerificationStepView controls and constraints. 2015-10-05 13:03:17 -07:00
Brandon McQuilkin 20cfa9f588 Fixed layout constraint errors
Note: The height of the cell separator needs to be accounted for, it is
subtracted from the cell height returned/calculated by the UITableView.
2015-10-05 14:49:08 -04:00
Steve Cadwallader 76aef1a069 Naming tweak from setupConstraints to setUpConstraints for consistency. 2015-10-05 14:18:11 -04:00
Steve Cadwallader 4afe6dcf77 Merge from master 2015-10-05 14:11:07 -04:00
Steve Cadwallader 4d82dcb8f3 Merge branch 'master' into WaitTask 2015-10-05 14:09:58 -04:00
Steve Cadwallader d2c381fefb Merge remote-tracking branch 'ResearchKit/master' 2015-10-05 13:51:34 -04:00
Brandon McQuilkin fbfeb233fa Clearing the text field now resets the map view to its initial state 2015-10-05 09:51:14 -04:00
Brandon McQuilkin 2a4b1b370a Automatically obtain user's location upon presenting the map view 2015-10-05 09:37:28 -04:00
Brandon McQuilkin 52ef002a67 Address now updated immediately after search 2015-10-05 09:34:05 -04:00
Brandon McQuilkin 65e2946cba Keyboard dismissed on search 2015-10-05 09:33:28 -04:00
Brandon McQuilkin 52fbba25b8 Fixed layout issues for the ORKQuestionStep 2015-10-05 09:27:21 -04:00
Brandon McQuilkin 73c59a40b9 Added location question result to the result table view. 2015-10-05 08:09:49 -04:00
Brandon McQuilkin 87c6feceaa Removed current location button 2015-10-05 08:09:15 -04:00
Oliver Schäfer 0180500607 Merge remote-tracking branch 'apple/master' 2015-10-03 12:02:33 +02:00
Oliver Sch√§fer 42e6c97ee2 API changes 2015-10-03 12:02:18 +02:00
Brandon McQuilkin 4bfc412626 Sorted the location question alphabetically in the catalog 2015-10-02 22:49:27 -04:00
Brandon McQuilkin 8621b38a89 Added array contents to constraints array 2015-10-02 22:33:29 -04:00
Brandon McQuilkin 8517354463 Fixed missing metric values. 2015-10-02 22:29:12 -04:00
Brandon McQuilkin 250d016306 Switch true/false to YES/NO 2015-10-02 22:28:13 -04:00
Steve Cadwallader a2a73b1661 Merge latest ResearchKit/master 2015-10-02 16:57:35 -04:00
Nidhi Gupta 46e61011a2 Active tasks revised. 2015-10-02 13:26:34 -07:00
Steve Cadwallader 13ab769dd8 Add suportsSecureCoding to ORKWaitStep, addressing unit test issue. 2015-10-02 16:10:40 -04:00
Steve Cadwallader 30f3900307 Copyright statement updates 2015-10-02 15:52:42 -04:00
Brandon McQuilkin f85a4c0c06 Moved coordinate translator into a helper method. 2015-10-02 15:51:15 -04:00
Steve Cadwallader 32fc46f896 Remove ORKProgressIndicatorMaskNone option, and add additional documentation. 2015-10-02 15:50:34 -04:00
Umer Khan f15940f83e Modified task view controller and ORKStep to allow for custom class variable. 2015-10-02 11:38:03 -07:00
Steve Cadwallader 310080fc8e Switched ORKEmailAnswerFormat to utilize ORKTextAnswerFormat with EmailValidationRegex. Removed isEmailAddressValidWithString. Disabled spell checking and auto correction. 2015-10-02 14:31:33 -04:00
Pavel Kanzelsberger b41e0be80f More refactoring, weakSelf / strongSelf and others... 2015-10-02 09:26:49 +02:00
Pavel Kanzelsberger c7d1d99b32 Switched from UIActivityIndicator to ORKProgressView 2015-10-02 08:55:07 +02:00
Umer Khan 684dd82c15 Added constraints. 2015-10-01 20:56:00 -07:00
Umer Khan c0ff5bc6e0 Minor update. 2015-10-01 18:14:20 -07:00
Umer Khan d2381657fa Adding ORKVerificationStepView foundation. 2015-10-01 18:09:27 -07:00
Umer Khan 3463f1a16f Added ORKVerificationStepViewController foundation. 2015-10-01 17:26:31 -07:00
Umer Khan 9878b34c2a Added Verification Step. 2015-10-01 17:08:30 -07:00
Umer Khan 81bc7221d1 Nit fix. 2015-10-01 16:45:40 -07:00
Umer Khan a5bb7b5506 PR updates. 2015-10-01 16:38:37 -07:00
Nidhi Gupta 921b280a3b Added all the new task in Active task module. 2015-10-01 16:04:51 -07:00
Yuan Zhu d313ab3a45 Merge pull request #497 from oliverschaefer/issue471
IOI 471
2015-10-01 15:32:59 -07:00
Umer Khan 73657854d4 Adding localization fallback to be U.S. English. 2015-10-01 15:18:05 -07:00
Umer Khan 7dc91f531d Quick fix. 2015-10-01 14:44:04 -07:00
Oliver Sch√§fer 294ec34d47 IOI 471 2015-10-01 23:38:01 +02:00
Oliver Sch√§fer ce6c79a60f Minor changes 2015-10-01 23:01:54 +02:00
Oliver Sch√§fer 86bcdaa3ee Minor changes 2015-10-01 22:57:32 +02:00
Umer Khan bcfb0b4dbb Minor keyboard fix. 2015-10-01 13:45:12 -07:00
Umer Khan 82c325d6c7 Updating serialization files. 2015-10-01 10:42:26 -07:00
Oliver Schäfer 6d2c1400b1 Merge remote-tracking branch 'apple/master' 2015-10-01 17:02:45 +02:00
Oliver Sch√§fer 8fa8dbae9e Changed progress label appearance when reviewing a step 2015-10-01 16:50:10 +02:00
Yuan Zhu c7bd1f5c41 Merge pull request #490 from YuanZhu-apple/master_fix_section_title_misalignment
Fixed the section header misalignment in form page.
2015-09-30 22:42:39 -07:00
Yuan Zhu bdb6849ab5 Merge pull request #483 from YuanZhu-apple/master_improve_json_unit_test
Make the test for ORKESerialization to catch unregistered classes.
2015-09-30 22:41:45 -07:00
Yuan Zhu 6d1d22d9fa Fixed the section header misalignment in form page.
1. Created `ORKFormSectionHeaderView` to update it constraint when screen rotates.
2. Use `dequeueReusableHeaderFooterViewWithIdentifier:` to cache created header views.
3. Other code refactoring.
2015-09-30 17:56:52 -07:00
Umer Khan 393a2bf404 Updates to Registration Step. 2015-09-30 17:18:48 -07:00
Yuan Zhu f828fbd8c4 Merge pull request #488 from rsanchezsaez/rsanchezsaez-ORKTest
ORKTest: add 'Passcode' section and sort items alphabetically
2015-09-30 16:15:22 -07:00
Ricardo Sánchez-Sáez 27193727e9 ORKTest: add 'Passcode' section and sort items alphabetically 2015-10-01 00:10:10 +01:00
Yuan Zhu a7173cc746 Merge branch 'master' of github.com:ResearchKit/ResearchKit into master_improve_json_unit_test
Conflicts:
	Testing/ORKTest/ORKTest/ORKESerialization.m
2015-09-30 15:15:42 -07:00
Yuan Zhu b0977b55e0 Merge pull request #487 from umerkhan-apple/touchID
Passcode Module Update
2015-09-30 15:06:40 -07:00
Yuan Zhu 6d792cfd83 Merge pull request #486 from YuanZhu-apple/master_fix_audio_UI
Fix audio task layout problem
2015-09-30 14:57:54 -07:00
Umer Khan fb6b1ab2c5 PR updates. 2015-09-30 14:48:38 -07:00
Yuan Zhu ab729432b4 Merge pull request #456 from umerkhan-apple/screening
Screening Module ⎯ Eligibility Answer Format
2015-09-30 14:29:18 -07:00
Umer Khan 5b5e53bdc3 Minor update. 2015-09-30 14:28:25 -07:00
Umer Khan 2b6c69e01d Resolving merge conflicts. 2015-09-30 14:26:08 -07:00
Umer Khan fb1c5e9b9a Resolving merge conflicts 2015-09-30 14:11:59 -07:00
Umer Khan f4b4d2aee1 Minor fixes. 2015-09-30 14:08:06 -07:00
Umer Khan 96478c583d Error handling updates to Passcode. 2015-09-30 14:04:26 -07:00
Yuan Zhu a796e6cc1e Merge pull request #373 from shazino/9hpt-task
Hole Peg Test task
2015-09-30 14:03:51 -07:00
Umer Khan 8599553a79 Updates to passcode 2015-09-30 11:41:10 -07:00
Yuan Zhu 8197c147e1 Fix audio task layout problem. 2015-09-30 11:19:54 -07:00
Umer Khan 8bdb32fc7a Updates 2015-09-30 10:42:43 -07:00
Julien Thérier 16f9b1dbe1 Merge remote-tracking branch 'origin/9hpt-task' into 9hpt-task 2015-09-30 17:00:14 +02:00
Julien Thérier 9459e330d5 Merge branch 'master' of ResearchKit/ResearchKit 2015-09-30 16:42:27 +02:00
Julien Thérier 78be958aea Fix ORKTest issue. 2015-09-30 16:22:23 +02:00
Pavel Kanzelsberger 3c9291ed24 Refactored code as requested 2015-09-30 09:24:38 +02:00
Yuan Zhu 5454cf83e1 Merge branch 'master' of github.com:ResearchKit/ResearchKit into master_improve_json_unit_test
Conflicts:
	ResearchKit.xcodeproj/project.pbxproj
2015-09-29 23:48:54 -07:00
Yuan Zhu b4e8a91474 Merge pull request #444 from umerkhan-apple/touchID
IOI # 88 - Passcode w/TouchID
2015-09-29 23:45:15 -07:00
Pavel Kanzelsberger 829f93523a Refactored code as requested 2015-09-30 08:22:59 +02:00
Umer Khan 98b0acaeb7 Disabling init for ORKPasscodeViewController. 2015-09-29 20:39:43 -07:00
Umer Khan 91a9acb9ef Modifying question text for eligibility task to the generic example question. 2015-09-29 20:31:50 -07:00
Umer Khan 71bdaab7be Updates to registration step. 2015-09-29 20:27:17 -07:00
Umer Khan 3e18a08690 Added registration step. 2015-09-29 18:07:18 -07:00
Yuan Zhu 63b8bea246 Enhance the test for ORKESerialization to catch unregistered classes.
Also add the missing class registrations.
2015-09-29 18:01:23 -07:00
Ricardo Sánchez-Sáez 7a1a1c6cdd Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-changelog 2015-09-30 01:25:19 +01:00
Ricardo Sánchez-Sáez 2b7f05fd96 RELEASE-NOTES.md: minor improvements 2015-09-30 01:25:08 +01:00
Ricardo Sánchez-Sáez d26712e5a1 README.md: add 'Charts' section
Also add information about the chart examples in ORKCatalog.
2015-09-30 01:23:22 +01:00
Ricardo Sánchez-Sáez 0eba3970b5 README.md and Programming Guide: fix minor formatting issues 2015-09-30 01:20:42 +01:00
Ricardo Sánchez-Sáez 20e9cb24d4 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-documentationformatting
# Conflicts:
#	docs/Overview/GuideOverview-template.markdown
2015-09-29 22:37:51 +01:00
Umer Khan 234f40306a Merging master 2015-09-29 14:00:49 -07:00
Umer Khan 66218e4e28 Added serialization. 2015-09-29 13:56:38 -07:00
Umer Khan 130898cafd Added serialization. 2015-09-29 13:47:10 -07:00
Yuan Zhu 7db4bf50c8 Merge pull request #481 from matteocrippa/pdfsignaturenullable
signature.title exception on null
2015-09-29 13:01:45 -07:00
Pavel Kanzelsberger feb26fa506 Refactored code as requested 2015-09-29 18:15:53 +02:00
Umer Khan c317b30e82 Minor documentation update. 2015-09-28 14:41:46 -07:00
Umer Khan af6b027b7c Added Passcode Task into ORKCatalog and minor fixes. 2015-09-28 14:25:21 -07:00
Matteo Crippa 3c715cc211 fixed Signature capitalized 2015-09-28 23:09:32 +02:00
Matteo Crippa c7bddcf4d5 signature.title exception on null 2015-09-27 15:02:06 +02:00
Julien Therier ad9eefb19a Remove spoken instruction. 2015-09-25 21:01:48 +02:00
Julien Thérier 537e67af78 Fix ORKTest issue. 2015-09-25 11:11:14 +02:00
Julien Thérier 1c16398bc7 Change ORKSide to ORKBodySagittal 2015-09-25 10:09:14 +02:00
Umer Khan ca292c1987 Nits 2015-09-24 18:26:15 -07:00
Umer Khan 7a9009759e Minor fix. 2015-09-24 18:22:09 -07:00
Umer Khan 2040bbd095 Updated documentation in answer format and adde eligibility task example in ORKCatalog. 2015-09-24 18:18:53 -07:00
Umer Khan 111ac5627a Minor refactoring fix. 2015-09-24 15:45:29 -07:00
Umer Khan 57f911a4bb Refactoring ORKEligibilityAnswerFormat after PR discussion. 2015-09-24 15:42:50 -07:00
Eric Rolf 17776d04a4 Merge branch 'master' into LocationQuestion
* master: (114 commits)
  ResearchKit Project: add explicit 'ORK_LOG_LEVEL_WARNING=1'
  ORKImageSelectionView: resolve merge conflict
  ORKTest: fix column width not being updated after rotation
  ORKImageCaptureStepViewController: restore 'queue_' method prefix
  ORKTappingContentView: slight constraint refactor
  ORKSkin: hide 'ORKGetMetricForScreenType()' function; use 'ORKGetMetricForWindow()' instead
  Misc: remove extra newlines before 'else'
  Misc: remove additional space after '!' unary operator
  Misc: homegenize whitespace between consecutive closing and opening brackets
  ORKTaskViewController: whitespace
  Misc: homogenize for the more common 'cannot' instead of 'can not' in exception messages
  Misc: whitespace between '==' operator
  Misc: some additional constraint homogeneization of recently merged active tasks
  Misc: remove needless empty class extensions
  Misc: use 'has' instead of 'have' when refering to singular noun
  ORKFormItemCell: use VerticalMargin and HorizontalMargin const names
  Misc: remove space between '!' unary operator and operand
  Misc: use property syntax for accessing 'font', 'ascender', 'descender', and 'window'
  Misc: use property syntax for 'allValues' and 'allKeys'
  ORKDataLogger: use previous configuration file key for backwards compatibility
  ...
2015-09-24 07:19:45 -04:00
Eric Rolf 66b7806bce Merge branch 'master' into ValidatedText
* master: (114 commits)
  ResearchKit Project: add explicit 'ORK_LOG_LEVEL_WARNING=1'
  ORKImageSelectionView: resolve merge conflict
  ORKTest: fix column width not being updated after rotation
  ORKImageCaptureStepViewController: restore 'queue_' method prefix
  ORKTappingContentView: slight constraint refactor
  ORKSkin: hide 'ORKGetMetricForScreenType()' function; use 'ORKGetMetricForWindow()' instead
  Misc: remove extra newlines before 'else'
  Misc: remove additional space after '!' unary operator
  Misc: homegenize whitespace between consecutive closing and opening brackets
  ORKTaskViewController: whitespace
  Misc: homogenize for the more common 'cannot' instead of 'can not' in exception messages
  Misc: whitespace between '==' operator
  Misc: some additional constraint homogeneization of recently merged active tasks
  Misc: remove needless empty class extensions
  Misc: use 'has' instead of 'have' when refering to singular noun
  ORKFormItemCell: use VerticalMargin and HorizontalMargin const names
  Misc: remove space between '!' unary operator and operand
  Misc: use property syntax for accessing 'font', 'ascender', 'descender', and 'window'
  Misc: use property syntax for 'allValues' and 'allKeys'
  ORKDataLogger: use previous configuration file key for backwards compatibility
  ...

Conflicts:
	ResearchKit/Common/ORKAnswerFormat.m
2015-09-24 07:18:44 -04:00
Eric Rolf c79b228fba Merge branch 'master' into WaitTask
* master: (114 commits)
  ResearchKit Project: add explicit 'ORK_LOG_LEVEL_WARNING=1'
  ORKImageSelectionView: resolve merge conflict
  ORKTest: fix column width not being updated after rotation
  ORKImageCaptureStepViewController: restore 'queue_' method prefix
  ORKTappingContentView: slight constraint refactor
  ORKSkin: hide 'ORKGetMetricForScreenType()' function; use 'ORKGetMetricForWindow()' instead
  Misc: remove extra newlines before 'else'
  Misc: remove additional space after '!' unary operator
  Misc: homegenize whitespace between consecutive closing and opening brackets
  ORKTaskViewController: whitespace
  Misc: homogenize for the more common 'cannot' instead of 'can not' in exception messages
  Misc: whitespace between '==' operator
  Misc: some additional constraint homogeneization of recently merged active tasks
  Misc: remove needless empty class extensions
  Misc: use 'has' instead of 'have' when refering to singular noun
  ORKFormItemCell: use VerticalMargin and HorizontalMargin const names
  Misc: remove space between '!' unary operator and operand
  Misc: use property syntax for accessing 'font', 'ascender', 'descender', and 'window'
  Misc: use property syntax for 'allValues' and 'allKeys'
  ORKDataLogger: use previous configuration file key for backwards compatibility
  ...
2015-09-24 07:12:18 -04:00
Julien Thérier 0398fb3767 Add margins using ORKStandardHorizontalMarginForView. 2015-09-24 12:19:41 +02:00
Julien Thérier f168e02e9e Merge master and fix conflicts. 2015-09-24 11:44:43 +02:00
Julien Thérier 5d1ed481e3 Add margin for pegs. 2015-09-24 10:17:22 +02:00
Umer Khan 7cd75c4d40 PR updates. 2015-09-23 18:01:33 -07:00
Umer Khan aa58b643a0 Merge remote-tracking branch 'upstream/master' into screening 2015-09-23 16:53:20 -07:00
Umer Khan 3b0ce6478b PR changes. 2015-09-23 16:53:04 -07:00
Yuan Zhu c545aa8cbb Merge pull request #449 from rsanchezsaez/rsanchezsaez-logging
Revamp logging system
2015-09-23 16:37:24 -07:00
Ricardo Sánchez-Sáez 74ff026b92 ResearchKit Project: add explicit 'ORK_LOG_LEVEL_WARNING=1'
Adds explicit warning log level to 'Debug' and 'Release' 'Preprocessor Macros' setting in Xcode's Build Settings.
2015-09-24 00:07:40 +01:00
Umer Khan 257ee610b7 Added authenticationPasscodeType property for factory view controller support. 2015-09-23 15:29:06 -07:00
Ricardo Sánchez-Sáez 79b9351433 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules 2015-09-23 21:38:23 +01:00
Ricardo Sánchez-Sáez 359f8f3387 ORKImageSelectionView: resolve merge conflict 2015-09-23 21:37:50 +01:00
Ricardo Sánchez-Sáez 1f7c856fdb Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-logging
# Conflicts:
#	ResearchKit/ActiveTasks/ORKHealthQuantityTypeRecorder.m
#	ResearchKit/ActiveTasks/ORKTowerOfHanoiStep.m
#	ResearchKit/Common/ORKImageSelectionView.m
#	ResearchKit/Common/ORKTaskViewController.m
#	ResearchKit/Consent/ORKEAGLMoviePlayerView.m
2015-09-23 21:37:24 +01:00
Yuan Zhu 58a5a2c3b2 Merge pull request #474 from rsanchezsaez/rsanchezsaez-ORKTest
ORKTest: fix column width not being updated after rotation
2015-09-23 12:50:26 -07:00
Yuan Zhu 54f064247e Merge pull request #343 from rsanchezsaez/rsanchezsaez-constraints
Constraint code homogenization
2015-09-23 12:50:17 -07:00
Ricardo Sánchez-Sáez 3f35a49f50 ORKTest: fix column width not being updated after rotation
Also: make scroll view to use 3 columns for view widths equal or greater than the iPhone 6 in landscape (667 points).
2015-09-23 20:24:12 +01:00
Eric Rolf c16c929054 Updated Attributions. 2015-09-23 10:08:58 -04:00
Eric Rolf be6a922554 Updated Attributions. 2015-09-23 10:07:40 -04:00
Ricardo Sánchez-Sáez 3711ab342c Release Notes: split iPad and iPhone Landscape support into two items 2015-09-23 00:36:07 +01:00
Ricardo Sánchez-Sáez 908f7b0f5f ORKImageCaptureStepViewController: restore 'queue_' method prefix 2015-09-23 00:30:49 +01:00
Ricardo Sánchez-Sáez 1be6949c2d Release Notes: added contributions attribution 2015-09-23 00:21:17 +01:00
Umer Khan fc4e8a9915 PR updates. 2015-09-22 16:15:07 -07:00
Umer Khan 413e607258 PR changes. 2015-09-22 16:08:01 -07:00
Eric Rolf 7847c813a5 Added Location Question to ORKTest. 2015-09-22 18:39:23 -04:00
Eric Rolf 956549c320 Initial commit for location question.
Includes:
Location Question
Location Question Answer Format
Location Question Form Cell
Location Survey Answer
2015-09-22 18:16:08 -04:00
Eric Rolf 709e4b818c Merge branch 'master' into WaitTask
* master:
  Fixes #465
2015-09-22 16:44:23 -04:00
Eric Rolf 8a6f0a35bd Merge branch 'master' into ValidatedText
* master:
  Fixes #465
2015-09-22 16:44:12 -04:00
Umer Khan b218db0f63 Merging master 2015-09-22 12:52:33 -07:00
Umer Khan 8fe483a5e0 Merging master 2015-09-22 12:44:31 -07:00
Umer Khan 3a555592ff PR changes. 2015-09-22 12:38:13 -07:00
Ricardo Sánchez-Sáez 4fb39abac9 Release Notes: indent Result Predicates-related paragraph 2015-09-22 19:50:50 +01:00
Ricardo Sánchez-Sáez fbaf85ae9b Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-changelog 2015-09-22 19:48:54 +01:00
Yuan Zhu 11a0427883 Merge pull request #470 from shazino/fix-#465
Increase tapping timestamp precision
2015-09-22 10:55:16 -07:00
Julien Thérier d23e188d64 Fixes #465 2015-09-22 09:39:55 +02:00
Eric Rolf d70ee216c8 Added Validated text to ORKTest App, updated to support validators. 2015-09-21 21:14:26 -04:00
Eric Rolf 0cd42556f5 Initial Validated Text Commit 2015-09-21 21:07:52 -04:00
Eric Rolf 3daec83a7f ORKTest App updated with WaitTask. 2015-09-21 20:41:21 -04:00
Ricardo Sánchez-Sáez ed44fd84d9 ORKTappingContentView: slight constraint refactor 2015-09-22 01:28:30 +01:00
Eric Rolf be9d2e3486 Wait Task Initial Commit 2015-09-21 20:21:01 -04:00
Ricardo Sánchez-Sáez dc78de8fdd ORKSkin: hide 'ORKGetMetricForScreenType()' function; use 'ORKGetMetricForWindow()' instead
This is simpler to understand and easier to maintain. It handles all 'nil' window cases in one place.
2015-09-22 01:14:07 +01:00
Ricardo Sánchez-Sáez 21f1dbb5af Misc: remove extra newlines before 'else' 2015-09-22 00:55:14 +01:00
Ricardo Sánchez-Sáez 7bc31391fa Misc: remove additional space after '!' unary operator 2015-09-22 00:53:22 +01:00
Ricardo Sánchez-Sáez e932d118b9 Misc: homegenize whitespace between consecutive closing and opening brackets 2015-09-22 00:52:36 +01:00
Ricardo Sánchez-Sáez 874386987a ORKTaskViewController: whitespace 2015-09-22 00:49:00 +01:00
Ricardo Sánchez-Sáez 2b27a9d038 Misc: homogenize for the more common 'cannot' instead of 'can not' in exception messages 2015-09-22 00:47:17 +01:00
Ricardo Sánchez-Sáez 293e0ed23c Misc: whitespace between '==' operator 2015-09-22 00:43:04 +01:00
Ricardo Sánchez-Sáez c322e0455d Misc: some additional constraint homogeneization of recently merged active tasks 2015-09-22 00:41:04 +01:00
Ricardo Sánchez-Sáez 9960b4376f Misc: remove needless empty class extensions 2015-09-22 00:29:24 +01:00
Ricardo Sánchez-Sáez 1d3adbba45 Misc: use 'has' instead of 'have' when refering to singular noun 2015-09-22 00:26:46 +01:00
Ricardo Sánchez-Sáez 07d1aba216 ORKFormItemCell: use VerticalMargin and HorizontalMargin const names 2015-09-22 00:09:16 +01:00
Ricardo Sánchez-Sáez b69d40a86b Misc: remove space between '!' unary operator and operand 2015-09-21 23:49:18 +01:00
Ricardo Sánchez-Sáez 633f9eaaef Misc: use property syntax for accessing 'font', 'ascender', 'descender', and 'window' 2015-09-21 23:44:50 +01:00
Ricardo Sánchez-Sáez 2edf7bc481 Misc: use property syntax for 'allValues' and 'allKeys' 2015-09-20 17:30:22 +01:00
Ricardo Sánchez-Sáez 92620b782b ORKDataLogger: use previous configuration file key for backwards compatibility 2015-09-20 17:09:01 +01:00
Ricardo Sánchez-Sáez 06ca255bb1 Misc: remove 'k' prefix from constants (as per the Coding Style Guide) 2015-09-20 16:51:29 +01:00
Ricardo Sánchez-Sáez 5baa3a423a Misc: more binary operator whitespace fixes 2015-09-20 16:37:39 +01:00
Ricardo Sánchez-Sáez b56e622ea0 Misc: use property format for accessing screen 'scale' 2015-09-20 16:34:33 +01:00
Ricardo Sánchez-Sáez 9fad01dd0c Misc: homogenize whitespace around binary operators
Also remove the 'k' prefix on some constants.
2015-09-20 16:32:34 +01:00
Ricardo Sánchez-Sáez f2c751a71f Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints 2015-09-20 16:08:43 +01:00
Ricardo Sánchez-Sáez 06d9244c80 RELEASE-NOTES.md: add notes about 'scale answer format' and 'result predicate' improvements in v1.2
Also use the proper 'Scale Answer Format' name (instead of 'Slider Answer Format').
2015-09-20 15:35:28 +01:00
Ricardo Sánchez-Sáez 6004058c50 RELEASE-NOTES.md: add notes on required Xcode version 2015-09-20 15:13:18 +01:00
Oliver Sch√§fer 29f883b04b Refactored for ResearchKit 1.2 Compatibility 2015-09-20 09:12:01 +02:00
Ricardo Sánchez-Sáez cc1e1ae435 RELEASE-NOTES.md: fix indentation of task descriptions 2015-09-18 12:34:42 +01:00
Yuan Zhu be6d351bb3 Merge pull request #459 from YuanZhu-apple/master_fix_consent_animation
Fix consent animation.
2015-09-17 17:58:02 -07:00
Yuan Zhu eac89e0119 Fix typo and rearrange some restoreGLContext code 2015-09-17 17:56:12 -07:00
Ricardo Sánchez-Sáez e035236314 Add 'RELEASE-NOTES.md' 2015-09-18 00:56:10 +01:00
Pascal Pfiffner 870a9f6ac5 Merge branch 'master' of https://github.com/ResearchKit/ResearchKit 2015-09-17 13:10:03 +02:00
Ricardo Sánchez-Sáez ea0c6a1cf8 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints
# Conflicts:
#	ResearchKit/Consent/ORKConsentReviewController.m
2015-09-17 02:00:00 +01:00
Ricardo Sánchez-Sáez 48cc58f04c Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules 2015-09-17 01:46:03 +01:00
Ricardo Sánchez-Sáez 30a346e94d Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-documentationformatting 2015-09-17 01:45:30 +01:00
Ricardo SaÃÅnchez-SaÃÅez 6c97c550ed ORKEAGLMoviePlayerView: promote OpenGL failure messages from warning to error 2015-09-17 01:20:03 +01:00
Ricardo SaÃÅnchez-SaÃÅez 50b3f1d170 ORKTaskViewController, ORKStepViewController: replace 'NSLog' by 'ORK_Log_Warning' 2015-09-17 01:19:24 +01:00
Umer Khan 601b16a985 Refactored PasscodeTextField logic. 2015-09-16 14:27:09 -07:00
Julien Thérier ecb0fde9c5 Merge remote-tracking branch 'ResearchKit/master' 2015-09-16 17:40:17 +02:00
Yuan Zhu 81be7627eb Fix consent animaton.
Root cause: old playerView's dealloc happens on the new EAGLContext(wrong) of new playerView.

Save/Restore EAGLContext in each of the methods which do GL drawing.
This make more than one GLContext lives together.
2015-09-15 18:18:56 -07:00
Umer Khan f94929daae Added optional error message property. 2015-09-15 11:03:43 -07:00
Ricardo Sánchez-Sáez 8d7ab7861c Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-logging 2015-09-15 15:03:05 +02:00
Yuan Zhu ce3f17d45f Release 1.2.1 with Fix blank consent html review page. 2015-09-14 15:53:06 -07:00
Yuan Zhu 1354181f84 Merge pull request #457 from YuanZhu-apple/master_fix_blank_consent_review
Fix `blank` consent html review page.
2015-09-14 15:41:17 -07:00
Ricardo Sánchez-Sáez 395d2727c6 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints 2015-09-14 23:49:40 +02:00
Yuan Zhu 7f67d9c4da Merge pull request #440 from rsanchezsaez/rsanchezsaez-master-charts
Charts: add 'graphChartView:drawsVerticalReferenceLineAtPointIndex:' method
2015-09-14 14:20:19 -07:00
Yuan Zhu 2c5b5cda7d Merge pull request #438 from rsanchezsaez/rsanchezsaez-master-ORKTest
ORKTest: add icon and launch xib
2015-09-14 14:19:48 -07:00
Yuan Zhu 4fd95efe57 Merge pull request #450 from rsanchezsaez/rsanchezsaez-documentation
ORKAnswerFormat: fix headerdoc warnings
2015-09-14 14:19:03 -07:00
Yuan Zhu fb223bb1bb Fix blank consent html review page. 2015-09-14 13:58:30 -07:00
Umer Khan 831f136cd1 Added ability to recover answer and changed label type for form item cell. 2015-09-14 13:27:05 -07:00
Umer Khan 6ad9ad52af Minor fix. 2015-09-13 14:47:25 -07:00
Umer Khan b28d5e6456 Minor fixes. 2015-09-13 14:45:15 -07:00
Umer Khan d7f9987ede Added eligibility answer format. 2015-09-13 14:19:14 -07:00
Ricardo Sánchez-Sáez 86aaeae857 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints
# Conflicts:
#	ResearchKit/ActiveTasks/ORKAudioContentView.m
#	ResearchKit/Common/ORKImageCaptureView.m
2015-09-11 00:45:38 +01:00
Ricardo Sánchez-Sáez 642bc3db80 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules
# Conflicts:
#	Testing/ORKTest/ORKTest/MainViewController.m
2015-09-11 00:36:07 +01:00
Ricardo Sánchez-Sáez 7361442a04 Programming Guide: add formatting for keywords and hard-wrap at line 100 2015-09-11 00:03:54 +01:00
Ricardo Sánchez-Sáez 398ae8029f README.md: add formatting to keywords such 'ResearchKit framework', 'iOS', 'Xcode', etc.
Also: hard-wrap documentation at line 100.
2015-09-10 23:58:38 +01:00
Ricardo Sánchez-Sáez af0ca497d5 ORKAnswerFormat: fix headerdoc wanings
Also: hard wrap documentation at line 100.
2015-09-10 23:47:31 +01:00
Yuan Zhu 75f62ee5f7 Merge pull request #448 from YuanZhu-apple/master_add_workspace
Add a single workspace that includes RK,  ORKTest, and ORKCatalog for convenience
2015-09-10 15:26:08 -07:00
Umer Khan bd63d1576b Minor fix. 2015-09-10 15:22:28 -07:00
Yuan Zhu a4c521203c Merge pull request #443 from rsanchezsaez/rsanchezsaez-OptionalFormItems
ORKFormItem: implement 'optional' property
2015-09-10 14:58:17 -07:00
Umer Khan b8aba5459e Refactored keychain wrapper and added unit tests. 2015-09-10 14:51:49 -07:00
Ricardo Sánchez-Sáez f0507b973f ORKHelpers: add my copyright info to the header 2015-09-10 22:44:34 +01:00
Ricardo Sánchez-Sáez 58a9366bf5 Programming Guide: rename logging section to Logging Errors and Warnings 2015-09-10 22:35:23 +01:00
Ricardo Sánchez-Sáez 5b298d17a7 ORKHelpers: fix 'ORK_LOG_LEVEL_NONE' not working 2015-09-10 22:12:37 +01:00
Ricardo Sánchez-Sáez bca3ceae78 Programming Guide: add 'Logging Level' section 2015-09-10 22:06:45 +01:00
Ricardo Sánchez-Sáez d8c0ecbd1d ORKHelpers: revamped logging system
Also:
- Changes some (mildly) serious error messages from the DEBUG to the WARNING level.
- Remove the line number from ORK logging as it's noisy (we already have the function).

---

There are now four logging levels controlled by 4 preprocessor macros and their corresponding logging macros:
- ORK_LOG_LEVEL_NONE
- ORK_LOG_LEVEL_DEBUG, ORK_Log_Debug()
- ORK_LOG_LEVEL_WARNING, ORK_Log_Warning()
- ORK_LOG_LEVEL_ERROR, ORK_Log_Error()

Setting the ORK_LOG_LEVEL_NONE macro to 1 completely silences all RK logs. Setting ORK_LOG_LEVEL_DEBUG, or one of the higher levels, to 1, enables logging at that level and at all the higher levels.

If you do not specify a log level, 'ORK_LOG_LEVEL_WARNING=1' is used by default.

You have to set this preprocessor macros to your ResearchKit subproject, not to your main project. You can do so in Xcode by adding any of them to the 'Preprocessor Macros' list on your ResearchKit target's Build Settings.

See this resources if you are using ResearchKit through CocoaPods and need to change the log level:
- http://www.mokacoding.com/blog/cocoapods-and-custom-build-configurations/
- http://stackoverflow.com/a/30038120/269753
2015-09-10 21:39:15 +01:00
Yuan Zhu 133b154023 Add a single workspace that includes RK, ORKTest, and ORKCatalog for convenience 2015-09-10 13:10:51 -07:00
Yuan Zhu 95baa8b943 Update README.md
Stable branch works with Xcode 7.0 compatible now.
2015-09-09 17:14:52 -07:00
Yuan Zhu 0e433640c4 Merge branch 'stable' 2015-09-09 17:12:21 -07:00
Yuan Zhu e1faf6587c Release 1.2 2015-09-09 17:02:51 -07:00
Yuan Zhu 939d298809 Update RK and its apps bundle version to 1.2 2015-09-09 16:28:08 -07:00
Ricardo Sánchez-Sáez 1ae771ee80 ORKFormStep: rename 'non-optional' to 'required' on headerdocs and ORKTest's visible strings
It's the recommended practice for expressing non-optionality according to RFC 2119 (https://www.ietf.org/rfc/rfc2119.txt).
2015-09-09 10:49:20 +01:00
Julien Thérier c5b14925bd Merge remote-tracking branch 'ResearchKit/master'
Syncing fork
2015-09-09 10:30:36 +02:00
Umer Khan fa40e30ee3 Updated documentation. 2015-09-08 18:37:13 -07:00
Umer Khan 8736dd5165 Merge remote-tracking branch 'upstream/master' into touchID 2015-09-08 17:54:40 -07:00
Ricardo Sánchez-Sáez 4917b34291 ORKFormItem: set 'optional' default value to 'YES'
Also adds headers to the 'Optional Form' example.
2015-09-09 01:51:36 +01:00
Umer Khan 29d3e0da89 Renamed ORKKeychainStore to ORKKeychainWrapper. 2015-09-08 17:49:11 -07:00
Umer Khan 9b68f5188f Enhancements to keychain store. 2015-09-08 17:31:59 -07:00
Ricardo Sánchez-Sáez ed3503370d ORKDiscreteGraphChartView: fix small typo 2015-09-09 01:20:49 +01:00
Ricardo Sánchez-Sáez 43480170aa ORKFormItem: implement 'optional' property
Also add 'ORKCatalog' example.
2015-09-08 23:52:11 +01:00
Umer Khan fdaf18198f Consolidated delegates, updated API, and minor fixes. 2015-09-08 13:57:36 -07:00
Ricardo Sánchez-Sáez aee5c48875 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-master-charts
# Conflicts:
#	ResearchKit/Charts/ORKGraphChartView.h
#	Testing/ORKTest/ORKTest/Charts/ChartDataSources.swift
#	samples/ORKCatalog/ORKCatalog/Charts/ChartDataSources.swift
2015-09-08 20:38:33 +01:00
Umer Khan 521715f7dd Added keychain for passcode storing. 2015-09-08 11:12:06 -07:00
Yuan Zhu 68572aefe2 Merge branch 'convergence' 2015-09-08 10:50:52 -07:00
Yuan Zhu f179e15e5c Merge pull request #442 from rsanchezsaez/rsanchezsaez-convergence-charts
Charts: update ORKCatalog to use new data source method (convergence)
2015-09-08 10:18:10 -07:00
Ricardo Sánchez-Sáez 731b65d65c ORKCatalog: update graphChartView(graphChartView:, titleForXAxisAtPointIndex:)' method to use new name 2015-09-08 10:00:10 +01:00
Yuan Zhu b584258946 Use ORKLocalizedStringFromNumber()
# Conflicts:
#	Testing/ORKTest/ORKTest/Charts/ChartDataSources.swift
2015-09-08 09:55:28 +01:00
Ricardo Sánchez-Sáez 6ff53717a4 ORKCatalog: update graphChartView(graphChartView:, titleForXAxisAtPointIndex:)' method to use new name 2015-09-08 09:51:46 +01:00
Yuan Zhu d123688395 Merge pull request #441 from YuanZhu-apple/convergence_crash_fix_2
Use `ORKLocalizedStringFromNumber()`
2015-09-08 00:50:35 -07:00
Yuan Zhu ca4a954d08 Use ORKLocalizedStringFromNumber() 2015-09-08 00:47:46 -07:00
Yuan Zhu 57fbde9b46 Merge pull request #439 from rsanchezsaez/rsanchezsaez-convergence-charts
ORKGraphChartView: fix accessibility crash when 'graphChartView:titleForXAxisAtPointIndex:' is not implemented
2015-09-08 00:37:58 -07:00
Ricardo Sánchez-Sáez d46ab216f4 ORKGraphChartView: implement 'graphChartView:drawsVerticalReferenceLineAtPointIndex:' method 2015-09-08 01:55:55 +01:00
Ricardo Sánchez-Sáez b6bee7e9de ORKGraphChartView: fix accessibility crash when 'graphChartView:titleForXAxisAtPointIndex:' is not implemented
# Conflicts:
#	ResearchKit/Charts/ORKGraphChartView.h
2015-09-08 01:55:41 +01:00
Ricardo Sánchez-Sáez 0dd06a572b ORKGraphChartView: fix accessibility crash when 'graphChartView:titleForXAxisAtPointIndex:' is not implemented 2015-09-08 00:53:33 +01:00
Ricardo Sánchez-Sáez 7272291eb7 ORKTest: add new icon 2015-09-07 23:08:09 +01:00
Ricardo Sánchez-Sáez 57be36482c ORKTest: nicer LaunchScreen 2015-09-07 00:34:38 +01:00
Ricardo Sánchez-Sáez c7d180b3ad Misc: update '__nullable' annotations to '_Nullable' (Xcode 7 style)
Also remove unneeded nullability annotations from implementation files.
2015-09-07 00:05:42 +01:00
Ricardo Sánchez-Sáez ed6913e2ad ORKHeadlineLabel: access 'windows' using property syntax 2015-09-06 23:29:13 +01:00
Ricardo SaÃÅnchez-SaÃÅez 9f79e144ce ORKScaleAnswerFormat: small whitespace fix 2015-09-06 23:18:39 +01:00
Ricardo Sánchez-Sáez 185789dfb3 ORKScaleSliderView: homogenize text choice slider constraints
Also, related to text choice slider:
 - Move label-creating code to init.
 - Do not create needless views on init.
 - Other small improvements.
2015-09-06 23:08:50 +01:00
Ricardo Sánchez-Sáez 5445b67b41 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints
# Conflicts:
#	ResearchKit/Common/ORKScaleSlider.m
#	ResearchKit/Common/ORKScaleSliderView.m
2015-09-06 22:28:08 +01:00
Yuan Zhu 66286a80c9 Merge pull request #435 from YuanZhu-apple/master_add_text_init
Add another convenient constructor for ORKQuestionStep
2015-09-04 15:42:44 -07:00
Yuan Zhu a2e4d559bc Merge pull request #437 from rsanchezsaez/rsanchezsaez-convergence-iPadLayout
iPad: fix separator inset in 'numeric' and 'text' questions
2015-09-04 15:42:34 -07:00
Umer Khan d9addcf469 Removing custom keyboard. 2015-09-04 12:32:40 -07:00
Ricardo Sánchez-Sáez f32c069be5 ORKSurveyAnswerCell: clip overflow separator inset (iPad) 2015-09-04 20:05:10 +01:00
Ricardo Sánchez-Sáez c55ce91fb9 ORKTableViewCell: fix wrong separator inset on numeric and text questions (iPad) 2015-09-04 20:03:30 +01:00
Yuan Zhu 7ba00fb853 Remove extra . 2015-09-04 11:29:43 -07:00
Yuan Zhu e4e2626823 Add another convenient constructor for ORKQuestionStep
The `text` attribute is easy missed by developers.
2015-09-04 11:27:56 -07:00
Umer Khan 48178b01c2 Merged master and added accessibility support. 2015-09-04 10:57:35 -07:00
Yuan Zhu 8b847e4de0 Merge pull request #392 from umerkhan-apple/textSlider
IOI # 230 - Text scale slider
2015-09-04 10:54:37 -07:00
Ricardo Sánchez-Sáez 2a76ff2a2e Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints
# Conflicts:
#	ResearchKit/ActiveTasks/ORKTappingContentView.m
#	ResearchKit/ActiveTasks/ORKToneAudiometryContentView.m
#	ResearchKit/ActiveTasks/ORKTowerOfHanoiTowerView.m
#	ResearchKit/Common/ORKFormItemCell.m
#	ResearchKit/Common/ORKHelpers.m
#	ResearchKit/Common/ORKScaleSliderView.m
#	ResearchKit/Common/ORKSkin.h
#	ResearchKit/Common/ORKSkin.m
#	ResearchKit/Common/ORKVerticalContainerView.m
#	ResearchKit/Consent/ORKConsentReviewController.m
#	ResearchKit/Consent/ORKConsentSignatureController.m
#	ResearchKit/Consent/ORKSignatureView.m
#	Testing/ORKTest/ORKTest/MainViewController.m
2015-09-04 18:38:40 +01:00
Julien Thérier caa24b9ae6 Restore Tapping Content View. 2015-09-04 16:45:27 +02:00
Julien Thérier 0a3d938f8a Restore Tapping Content View. 2015-09-04 16:43:08 +02:00
Julien Thérier 1ea4960c29 Merge remote-tracking branch 'ResearchKit/master'
Sync with remote repo.
2015-09-04 15:36:40 +02:00
Julien Thérier 7013e954bc Merge remote-tracking branch 'origin/master' into 9hpt-task
Merge master to fix conflicts.
2015-09-04 15:29:07 +02:00
Julien Thérier ec8c36260c Improve legibility. 2015-09-04 15:17:34 +02:00
Julien Therier cfeb39ef5c Merge pull request #1 from rsanchezsaez/rsanchezsaez-holepegtask
Hole Peg Test Task images
2015-09-04 11:37:28 +02:00
Umer Khan b56bda5aaa Updating constraint merge conflict. 2015-09-03 23:53:30 -07:00
Umer Khan a9857da213 Minor formatting updates. 2015-09-03 23:44:56 -07:00
Umer Khan 3b3ec14acd Merge master 2015-09-03 23:35:26 -07:00
Umer Khan c499309897 Minor formatting updates. 2015-09-03 22:24:59 -07:00
Umer Khan b813690c67 Minor enhancements 2015-09-03 21:29:18 -07:00
Yuan Zhu 714f29e185 Merge pull request #432 from rsanchezsaez/rsanchezsaez-master-ORKTest
ORKTest: project files reorganization
2015-09-03 18:26:58 -07:00
Yuan Zhu d752d4d926 Merge pull request #420 from rsanchezsaez/master-Catalog
Reorganize 'ORKCatalog' into subsections
2015-09-03 18:15:50 -07:00
Umer Khan 050cea0c51 Refactored protocol method name. 2015-09-03 17:55:45 -07:00
Umer Khan 5a20aeab03 Added custom numeric pad keyboard. 2015-09-03 17:54:49 -07:00
Ricardo SaÃÅnchez-SaÃÅez 748d13e56e ORKCatalog: update 'readme.md' to add formatting and information about sections 2015-09-04 00:54:23 +01:00
Ricardo SaÃÅnchez-SaÃÅez e9f3bc919b ResultTableViewProviders: reorder code to match TaskListRow 2015-09-04 00:53:34 +01:00
Ricardo Sánchez-Sáez b17dda9697 ORKCatalog: reorganize project files so they are easier to browse 2015-09-04 00:32:56 +01:00
Ricardo Sánchez-Sáez 729ef4fa58 TaskListRow: reorder 'form task' in front of 'survey task' (alphabetically) 2015-09-04 00:22:57 +01:00
Ricardo Sánchez-Sáez e9cc5ea800 Merge branch 'master' of github.com:ResearchKit/ResearchKit into master-Catalog
# Conflicts:
#	samples/ORKCatalog/ORKCatalog/Tasks/TaskListRow.swift
2015-09-04 00:21:00 +01:00
Ricardo Sánchez-Sáez 090b976083 ResearchKit unit tests: remove needless framework directory
(It caused a warning when running them.)
2015-09-03 22:32:57 +01:00
Ricardo Sánchez-Sáez bd32b0ad24 ORKTest: remove needless framework directory
(It caused a warning when running unit tests.)
2015-09-03 22:32:30 +01:00
Ricardo Sánchez-Sáez d86edbc3f2 ORKTest: file structure reorganization so the project is easier to browse 2015-09-03 22:31:40 +01:00
Umer Khan a7c7aa7466 Adding UI foundation for custom numeric keyboard. 2015-09-03 13:40:43 -07:00
Yuan Zhu 60d2cbeb69 Loc string update (930 12-3) 2015-09-03 13:09:05 -07:00
Yuan Zhu 7bd76e6b5e Merge pull request #418 from YuanZhu-apple/convergence_fix_NaN_in_Chart
Convergence fix NaN crash in chart
2015-09-02 18:19:52 -07:00
Yuan Zhu 9f198a12b6 Merge pull request #423 from YuanZhu-apple/convergence_fix_audio_task_overlapping
Fixed the graph view and time label overlapping.
2015-09-02 18:18:23 -07:00
Yuan Zhu 86634b140c Merge pull request #425 from umerkhan-apple/splitViewFix
Fix for starting image capture step in split view.
2015-09-02 18:01:05 -07:00
Yuan Zhu 72da218778 Add Accessibility section to CONTRIBUTING.md 2015-09-02 17:44:47 -07:00
Yuan Zhu 89571ef876 Merge pull request #426 from rsanchezsaez/rsanchezsaez-master-ORKTest
Use sectioned 'UICollectionView' for presenting buttons in 'ORKTest'
2015-09-02 17:27:07 -07:00
Yuan Zhu b925584f9c Merge pull request #428 from rsanchezsaez/rsanchezsaez-charts-convergence
Charts: add lightweight generics to all array declarations
2015-09-02 17:13:01 -07:00
Yuan Zhu dc6bb27f57 Merge pull request #416 from rsanchezsaez/rsanchezsaez-FormPredicates
Result predicates: add support for form item results and nil results
2015-09-02 17:12:43 -07:00
Ricardo SaÃÅnchez-SaÃÅez 1c200251e8 ORKResultPredicate: update remaining headerdoc comments to reflect the new 'result selector' name 2015-09-03 01:11:50 +01:00
Yuan Zhu 6f0decb0ff Merge pull request #429 from rsanchezsaez/rsanchezsaez-convergence-ChartsHeaderdocs
Charts: additional headerdoc improvements
2015-09-02 17:11:36 -07:00
Ricardo SaÃÅnchez-SaÃÅez 812151c51d Charts: additional headerdoc improvements
Also added my copyright info.
2015-09-03 01:00:06 +01:00
Ricardo SaÃÅnchez-SaÃÅez 14715e2c32 ORKGraphChartView: remove remaining cast 2015-09-03 00:31:46 +01:00
Ricardo SaÃÅnchez-SaÃÅez bdad58b3a7 ORKCatalog: add copyright info and fix leading space omission to the copyright headers 2015-09-03 00:14:53 +01:00
Ricardo SaÃÅnchez-SaÃÅez c79b0eebe9 ORKTest: move 'Mini Form' and 'Selection Survey' to the 'Question Steps' section
Also adds copyright information.
2015-09-03 00:11:43 +01:00
Ricardo Sánchez-Sáez 1a7efab0e6 Merge branch 'convergence' of github.com:ResearchKit/ResearchKit into rsanchezsaez-charts-convergence 2015-09-03 00:02:34 +01:00
Ricardo SaÃÅnchez-SaÃÅez 5df57bcbda Charts: add lightweight generics to all arrays declarations
This allows to remove all the array-accessing casts.
Detected and fixed a few incorrect CALayer to CAShapeLayer casts.
I have also removed the 'dataPointAtPlotIndex:pointIndex:' method since it no longer provides any advantage over directly accessing the generics-parametrized array.
2015-09-03 00:02:08 +01:00
Yuan Zhu a6cea16fef Merge pull request #427 from YuanZhu-apple/convergence_doc_update
Small header doc update
2015-09-02 15:36:25 -07:00
Yuan Zhu 76d4555f74 Small header doc update 2015-09-02 15:35:38 -07:00
Ricardo SaÃÅnchez-SaÃÅez de05c7a632 ORKTest: use sectioned UICollectionView to organize test buttons 2015-09-02 23:21:54 +01:00
Ricardo SaÃÅnchez-SaÃÅez 0d07828edc ORKTest: fix storyboard warnings 2015-09-02 23:19:19 +01:00
Umer Khan bb50755b2e Fix for starting image capture step in split view. 2015-09-02 14:55:01 -07:00
Yuan Zhu 527609982a Merge branch 'convergence' 2015-09-02 14:35:36 -07:00
Yuan Zhu 32b5e37486 Merge branch 'convergence' of github.com:ResearchKit/ResearchKit into convergence_fix_NaN_in_Chart
Conflicts:
	ResearchKit/Charts/ORKGraphChartView.m
2015-09-02 11:15:44 -07:00
Umer Khan 01cb0e77be PR updates. 2015-09-02 11:13:50 -07:00
Yuan Zhu 419f209346 Merge pull request #422 from YuanZhu-apple/convergence_fix_uuid
Fix recorder file naming
2015-09-02 10:58:41 -07:00
Yuan Zhu 2338e097c4 Use dot access 2015-09-02 10:57:48 -07:00
Umer Khan 1fdd29c308 Adding example in main view controller and minor updates. 2015-09-02 10:54:02 -07:00
Yuan Zhu c6a2660a2e Fixed the graph view and time label overlapping.
Some how it works after I removed the constraints in GraphView.
2015-09-01 18:23:20 -07:00
Umer Khan b6e185284b Minor update to consent. 2015-09-01 17:44:05 -07:00
Umer Khan ade8879d54 Refacted factory methods of ORKPasscodeStepViewController into ORKPasscodeViewController 2015-09-01 17:35:08 -07:00
Yuan Zhu 04a1ec81d7 Should use [_recorderUUID uuidString] instead of [_recorderUUID description] 2015-09-01 17:09:10 -07:00
Ricardo SaÃÅnchez-SaÃÅez 015be2da3a ORKCatalog: replace 'Survey Questions' indentation by a new section 2015-09-02 00:56:20 +01:00
Ricardo SaÃÅnchez-SaÃÅez 2650360476 ORKCatalog: reorganize into alphabetically-sorted sections mirroring the project's readme 2015-09-02 00:02:53 +01:00
Yuan Zhu a786a661b2 Loc string update (905 11-5) 2015-09-01 14:48:51 -07:00
Umer Khan d42e7eca38 Adding protocol methods. 2015-09-01 14:42:00 -07:00
Ricardo SaÃÅnchez-SaÃÅez 074a00e2ae ORKResultPredicate: refactor 'ORKResultIdentifier' class by renaming it to 'ORKResultSelector'
Also:
- Improve documentation.
- Update ORKTest example and unit tests.
2015-09-01 22:34:21 +01:00
Yuan Zhu f7b8901fd2 Merge pull request #384 from rsanchezsaez/rsanchezsaez-codingstyleguide
Coding Style Guide: add 'Nullability Annotations' section
2015-09-01 14:04:24 -07:00
Yuan Zhu db5e374880 Merge pull request #403 from rsanchezsaez/rsanchezsaez-iPadLayoutFixes
iPad: constraint and layoutMargin code fixes
2015-09-01 14:03:14 -07:00
Yuan Zhu d2fed86772 Merge pull request #408 from rsanchezsaez/rsanchezsaez-charts-convergence
Charts improvements
2015-09-01 14:02:56 -07:00
Yuan Zhu a8b1c3658e Merge pull request #417 from YuanZhu-apple/convergence_loc_AB_RTL
Should adjust PageViewControllerNavigationDirection for RTL
2015-09-01 14:01:45 -07:00
Ricardo SaÃÅnchez-SaÃÅez c01d530cde ORKCatalog: use new enum to String conversion for identifiers 2015-09-01 20:53:07 +01:00
Yuan Zhu 85598e297b numberOfXAxisPoints should be NSInteger 2015-09-01 12:00:00 -07:00
Yuan Zhu 71b00ba7f6 Fix NaN crash in chart 2015-09-01 11:56:03 -07:00
Ricardo SaÃÅnchez-SaÃÅez 82acd5aedb ORKGraphChartView subclasses: use helper method for accessing data points 2015-09-01 02:23:50 +01:00
Ricardo Sánchez-Sáez 81f4b1e4cc Merge branch 'convergence' of github.com:ResearchKit/ResearchKit into rsanchezsaez-charts-convergence 2015-09-01 01:27:27 +01:00
Yuan Zhu 7c80613f1b Should adjust PageViewControllerNavigationDirection for RTL 2015-08-31 17:23:03 -07:00
Ricardo SaÃÅnchez-SaÃÅez d2c7ac3cd8 ORKGraphChartView: add helper method for accessing data points 2015-09-01 01:16:00 +01:00
Ricardo SaÃÅnchez-SaÃÅez ceec6adf1a ORKResultPredicate: greatly simplified API by introducing the 'ORKResultIdentifier' wrapper class
Also:
- Update tests.
- Update 'Navigable ordered task' example.
2015-09-01 00:56:22 +01:00
Yuan Zhu 2f6247a0ed Merge pull request #411 from YuanZhu-apple/convergence_loc_text_alignment
Fix text label layout problem in right-to-left UI.
2015-08-31 15:01:32 -07:00
Yuan Zhu 87034055b4 Merge pull request #414 from YuanZhu-apple/convergence_consider_placeholder_in_ORKFormItemTextFieldBasedCell_layout
Fix placeholder get truncated in FormItemCell.
2015-08-31 15:00:43 -07:00
Yuan Zhu 0093289888 Refactor the code and add documentation. 2015-08-31 14:03:56 -07:00
Yuan Zhu f8037c08df Merge pull request #413 from YuanZhu-apple/convergence_show_family_name_first_for_Vietnamese
Show family name first for Vietnamese
2015-08-31 13:57:31 -07:00
Yuan Zhu 24a7d469da Format adjustment 2015-08-31 13:54:49 -07:00
Ricardo SaÃÅnchez-SaÃÅez dffbaeee6b ORKResultPredicate: make ORKChoiceQuestionResult predicates to accept any kind of answer object (instead of just strings)
Also:
- Fixed problem in nil answer result predicate methods.
- Updated 'ORKTest' example.
- Updated test cases.
- Removed needless predicate convenience method test cases.
2015-08-31 21:45:54 +01:00
Yuan Zhu 2507aa5804 Merge pull request #410 from YuanZhu-apple/convergence_loc_AB_RTL
Add right arrow backbutton to support `UIUserInterfaceLayoutDirectionRightToLeft`
2015-08-31 13:18:34 -07:00
Ricardo SaÃÅnchez-SaÃÅez c45d2cb856 ORKResultPredicate: use '==' instead of 'like' for plain string comparisons
(We don't generally want to match wildcard characters.)
2015-08-31 20:38:41 +01:00
Umer Khan 7e5b5b45ec Minor updates for authentication flow. 2015-08-31 12:34:09 -07:00
Ricardo Sánchez-Sáez 739d22b5d3 ORKResultPredicate: small headerdoc improvement 2015-08-31 05:53:46 +01:00
Umer Khan 070f449c57 Added more passcode flows. 2015-08-30 20:58:25 -07:00
Ricardo SaÃÅnchez-SaÃÅez 43c544b4d0 ORKGraphChartView: use fixed yAxisView width instead of proportional sizing
It was getting too wide on the landscape orientation and on iPad. I think the developer should be able to size the graph chart view as they wish without that affecting the yAxisView size.
2015-08-31 01:03:30 +01:00
Ricardo SaÃÅnchez-SaÃÅez f76c960846 ORKResultPredicate: add 'predicateForNilQuestionResultWithTaskIdentifier:stepIdentifier:resultIdentifier:' method to match results with a nil answer (skipped steps or unanswered form questions) 2015-08-31 00:31:01 +01:00
Ricardo SaÃÅnchez-SaÃÅez a5640cb4b1 ORKResultPredicate: add optional 'stepIdentifier' argument to all method, to allow matching form item results.
Also: use new methods in newly added form predicate.

Result predicates without a supplied 'stepIdentifier' argument now only match the corresponding question step result, but not any form item result.
2015-08-31 00:03:41 +01:00
Pascal Pfiffner 1c0ac116d1 Backport slider fixes for Xcode 6 2015-08-30 23:36:52 +01:00
Ricardo SaÃÅnchez-SaÃÅez 222c017e0d ORKTaskTests: add some form result predicate tests 2015-08-30 21:14:51 +01:00
Ricardo SaÃÅnchez-SaÃÅez 90c9e1de94 ORKCatalog: fix form step using wrong identifier 2015-08-30 21:13:57 +01:00
Yuan Zhu 38e9b14a87 Fix placeholder get truncated in FormItemCell.
Take _textFieldView.estimatedWidth into consideration.
2015-08-28 18:03:37 -07:00
Umer Khan e8bd259952 Merge remote-tracking branch 'upstream/master' into textSlider 2015-08-28 16:57:35 -07:00
Umer Khan 07736ac5f3 Fixed secureCoding initializer warning. 2015-08-28 16:54:55 -07:00
Umer Khan 21bb2884b5 Laying foundation for different types of passcode flows. 2015-08-28 16:47:47 -07:00
Yuan Zhu be6811d311 Show family name first for Vietnamese 2015-08-28 16:09:23 -07:00
Umer Khan b323bd8980 Added Touch ID and other minor updates. 2015-08-28 16:07:41 -07:00
Yuan Zhu fb609dba72 Fix text label layout problem in right-to-left UI.
- Make the checkmark always in the choiceCell, hide it when the cell is unselected.
So layout code get consistent bounds to calculate label's rect.
2015-08-28 15:43:21 -07:00
Yuan Zhu 7445f7388a Add right arrow backbutton to support UIUserInterfaceLayoutDirectionRightToLeft 2015-08-28 14:39:03 -07:00
Umer Khan f5e2f54979 Removed step progress from navigation item title. 2015-08-28 12:55:01 -07:00
Umer Khan 39ef6a21f0 Overriding vertical class keyboard methods. 2015-08-28 12:17:23 -07:00
Yuan Zhu 0edc9292b3 Merge pull request #409 from YuanZhu-apple/convergence_fix_NSRangeException_in_Hanoi_task
Fix NSRangeException in Hanoi Task
2015-08-28 10:57:15 -07:00
Umer Khan 215e4d6008 PR updates. 2015-08-27 21:23:09 -07:00
Umer Khan 674a131060 Added foundation for Passcode Step 2015-08-27 18:54:29 -07:00
Yuan Zhu 28e1b2092e Fix NSRangeException in Hanoi Task
Tower could be empty, so it is not safe to call `tower.disks[index];` without a check.
Accessibility announcement is only applicable when the both donor and recipient are valid.
2015-08-27 18:38:26 -07:00
Yuan Zhu f8f30d681f Merge pull request #407 from YuanZhu-apple/convergence_fix_multiline_desc_on_slider
Convergence fix multiline desc on slider
2015-08-27 17:47:32 -07:00
Yuan Zhu 35471350a2 Limit the height of description label in sliderView 2015-08-27 17:46:42 -07:00
Ricardo Sánchez-Sáez 2da1b843d0 ORKPieChartView: move 'sharedInit' to original position for easier review 2015-08-28 01:11:04 +01:00
Ricardo Sánchez-Sáez f10195edc4 ORKGraphChartView: move 'sharedInit' to original position for easier review 2015-08-28 01:07:27 +01:00
Ricardo SaÃÅnchez-SaÃÅez 770bec9c31 ChartListViewController: more interesting discrete graph chart test 2015-08-28 01:01:18 +01:00
Ricardo SaÃÅnchez-SaÃÅez 3eea308ed4 ORKGraphChartView: fix animation glitch when you scrub over the graph end, raise the finger, and start scrubbing over the opposite end
Also improve code reuse.
2015-08-28 00:59:40 +01:00
Ricardo SaÃÅnchez-SaÃÅez fda79e945f ORKGraphChartView: fix miscalculation in line animation duration if there is only 1 layer 2015-08-28 00:59:32 +01:00
Ricardo SaÃÅnchez-SaÃÅez b20fd5755b Charts: fix more NSUInteger/NSInteger instances 2015-08-28 00:58:06 +01:00
Ricardo SaÃÅnchez-SaÃÅez 1d5461a037 ORKPieChartView: fix legend content size not being properly calculated after a rotation 2015-08-28 00:57:59 +01:00
Ricardo SaÃÅnchez-SaÃÅez fab251e623 ORKPieChartView: make sure the legendView is not added more than once 2015-08-28 00:57:36 +01:00
Ricardo Sánchez-Sáez 0d914c493a Chart swift files: add my copyright info 2015-08-28 00:57:24 +01:00
Ricardo Sánchez-Sáez d4a20a79d5 ORKPieChartView: make properties with default values 'null_resetable'
Also improve documentation.
2015-08-28 00:56:20 +01:00
Ricardo Sánchez-Sáez 58eaa1d182 ORKGraphChartView: rename 'axisTitleColor' to 'verticalAxisTitleColor' and improve comment 2015-08-28 00:55:44 +01:00
Ricardo Sánchez-Sáez a6f5c39e2c ORKGraphView: make properties with default values 'null_resetable' 2015-08-28 00:55:30 +01:00
Ricardo Sánchez-Sáez 9da358a1f5 ORKGraphChartView: implement 'scrubbingPlotIndexForGraphChartView:' method 2015-08-28 00:51:14 +01:00
Ricardo Sánchez-Sáez a1db939515 ORKGraphChartView: implement 'graphChartView:colorForPlotIndex:' dataSource method 2015-08-28 00:50:48 +01:00
Ricardo Sánchez-Sáez 9462839950 ORKPieChartView: fix animation not working when 'showsPercentageLabels' was set to 'NO' 2015-08-28 00:44:13 +01:00
Ricardo Sánchez-Sáez 29a6e21e49 ORKPieChartView: use tintColor as base for auto-generated colors when the dataSource doesn't provide custom colors 2015-08-28 00:44:02 +01:00
Ricardo Sánchez-Sáez 5739faffe6 ORKGraphChartView: remove debug NSLog() 2015-08-28 00:43:17 +01:00
Yuan Zhu e6e1f49c00 Merge branch 'convergence' of github.com:ResearchKit/ResearchKit into convergence_fix_multiline_desc_on_slider 2015-08-27 15:53:03 -07:00
Yuan Zhu 88ea180068 Fix #381 - description label not showing in vertical scale slider.
Make slider's view bottom greater than slider's bottom, also greater than lower descriptionLabel's bottom.
Make current value above slider's top, also above upper descriptionLabel's top.
2015-08-27 15:52:43 -07:00
Yuan Zhu fb50458d67 Merge pull request #406 from YuanZhu-apple/convergence_fix_crash_caused_by_omitted_fillLayer
Fixed a crash cause by omitted `fillLayer`
2015-08-27 15:38:23 -07:00
Yuan Zhu 9fd9ea3783 remove some newlines 2015-08-27 15:37:33 -07:00
Yuan Zhu 9b4aeab0a1 Fixed a crash cause by omitted fillLayer
`shouldDrawLinesForPlotIndex:` skips certain fillLayers with less than 2 valid data points. Crashed on line 149 `CAShapeLayer *fillLayer = _fillLayers[plotIndex];`.

- Use NSMutableDictionary (instead of a NSMutableArray) to store _fillLayers
- `plotIndex` is used as key in the dictionary.
- Improved _fillLayers iteration
2015-08-26 18:07:58 -07:00
Yuan Zhu 6afa92169d Merge pull request #404 from YuanZhu-apple/convergence_fix_charts_for_loops
Fixed a bug: updating array during a for loop cause incorrect behavior(cause crash)
2015-08-26 15:43:40 -07:00
Yuan Zhu b2496438bf Merge pull request #1 from rsanchezsaez/yuanzhu-convergence_fix_charts_for_loops
Charts mini-improvement
2015-08-26 15:37:26 -07:00
Ricardo SaÃÅnchez-SaÃÅez 238d8a17fe Charts: make sure 'numberOfXAxisPoints' is always used as an 'NSInteger' property; and 'numberOfPlots' as an 'NSInteger' returning method 2015-08-26 23:31:39 +01:00
Yuan Zhu cea248f433 Fixed a bug: updating array during a for loop cause incorrect behavior(leads to crash)
Improved the code quality of `for loops` in charts code.
2015-08-26 13:57:24 -07:00
Ricardo SaÃÅnchez-SaÃÅez 778e8571d2 ORKStepNavigationRule: make ObjC separate array initializers unavailable in Swift (in favor of the array of tuples initializer) 2015-08-26 21:52:01 +01:00
Ricardo Sánchez-Sáez e71356805c Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules
# Conflicts:
#	ResearchKit/Common/ORKStepNavigationRule_Private.h
2015-08-26 21:40:52 +01:00
Ricardo SaÃÅnchez-SaÃÅez 1b4569f316 Constraint and layoutMargin code fixes
- Make sure iPad wide margins are enforced when not in Split View mode.
- Make sure all views resize correctly when going in and out of Split View mode.
2015-08-26 18:35:42 +01:00
Yuan Zhu 1c5cab61aa Merge pull request #398 from YuanZhu-apple/convergence_fixCharts_crash
Fix a crash by adding a boundary check
2015-08-25 18:10:49 -07:00
Yuan Zhu b01c7166c4 Also, it is more safe to just use _dataPoints.count to loop plots 2015-08-25 18:09:38 -07:00
Yuan Zhu 49166b553f Fix a crash by adding a boundary check 2015-08-25 18:03:20 -07:00
Yuan Zhu ddb815d2cb Merge pull request #397 from YuanZhu-apple/convergence_apply_loc
Initial Localization update
2015-08-25 16:52:47 -07:00
Yuan Zhu 30aafbd50f Initial Localization update 2015-08-25 16:43:00 -07:00
Ricardo Sánchez-Sáez 25612dc872 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints
# Conflicts:
#	ResearchKit/ActiveTasks/ORKFitnessContentView.m
#	ResearchKit/ActiveTasks/ORKTappingContentView.m
#	ResearchKit/ActiveTasks/ORKToneAudiometryContentView.m
#	ResearchKit/ActiveTasks/ORKTowerOfHanoiTowerView.m
#	ResearchKit/ActiveTasks/ORKWalkingTaskStepViewController.m
#	ResearchKit/Common/ORKContinueButton.m
#	ResearchKit/Common/ORKFormItemCell.m
#	ResearchKit/Common/ORKFormStepViewController.m
#	ResearchKit/Common/ORKHeadlineLabel.m
#	ResearchKit/Common/ORKImageCaptureStepViewController.m
#	ResearchKit/Common/ORKImageCaptureView.m
#	ResearchKit/Common/ORKInstructionStepView.m
#	ResearchKit/Common/ORKQuestionStepViewController.m
#	ResearchKit/Common/ORKResult.m
#	ResearchKit/Common/ORKSkin.m
#	ResearchKit/Common/ORKStepHeaderView.m
#	ResearchKit/Common/ORKSubheadlineLabel.m
#	ResearchKit/Common/ORKVerticalContainerView.m
#	ResearchKit/Common/ORKVerticalContainerView_Internal.h
#	ResearchKit/Consent/ORKConsentSignatureController.m
#	ResearchKit/Consent/ORKVisualConsentStepViewController.m
#	Testing/ORKTest/ORKTest/DynamicTask.m
2015-08-26 00:41:48 +01:00
Yuan Zhu 6ce92f19e0 Merge pull request #391 from YuanZhu-apple/convergence
Fix #390 PSAT Visual mode: digits only appears briefly if set `duration` very close to `interval`
2015-08-25 14:58:54 -07:00
Yuan Zhu 18adca5396 Merge pull request #396 from umerkhan-apple/consentLocKeys
Refactoring consent localization keys
2015-08-25 13:36:35 -07:00
Ricardo Sánchez-Sáez 8087810ac2 Coding Style Guide: improve 'Spaces in Declarations' subsection 2015-08-25 20:59:13 +01:00
Ricardo Sánchez-Sáez 3e99ad04c7 Coding Style Guide: add 'Lightweight Generics' section 2015-08-25 20:57:15 +01:00
Ricardo Sánchez-Sáez 0a1eb9c8a2 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-codingstyleguide 2015-08-25 20:23:43 +01:00
Umer Khan 5e0b696fef Refactoring consent localization keys. 2015-08-25 12:10:58 -07:00
Yuan Zhu adacb612a4 Merge pull request #393 from YuanZhu-apple/convergence_loc_improvement
Improve localization string for accessibility of Hanoi Tower
2015-08-25 11:20:06 -07:00
Yuan Zhu f19fd6187a Remove the initial space from disksString 2015-08-25 11:08:37 -07:00
Yuan Zhu 82630bdbf5 Improve localization string for accessibility of Hanoi Tower 2015-08-24 15:09:30 -07:00
Umer Khan c11e70585a Minor updates. 2015-08-24 14:35:14 -07:00
Umer Khan 045abdd919 Adding type to textChoices and removing NSArray validation for textChoices. 2015-08-24 14:23:05 -07:00
Umer Khan f9ffd5e5f1 Minor changes. 2015-08-24 12:12:24 -07:00
Umer Khan 407a3da80e Added serialization and secure coding tests, with some minor fixes. 2015-08-24 11:57:54 -07:00
Yuan Zhu 68e3f11a74 Fix #390 PSAT Visual mode: digits only appears briefly if set stimulusDuration very close to stimulusInterval
- Improved the naming of the timer
- Used a delay on `ORKActiveStepTimer` to replace the extra `dispatch_after`
- Don't show `-` if the difference between `stimulusDuration` and `interStimulusInterval` is less than timer's resolution (0.05s).

#390
2015-08-24 11:12:08 -07:00
DanKeen c786ed06e1 Merge pull request #389 from rsanchezsaez/rsanchezsaez-readme
README.md improvements
2015-08-23 21:25:51 -07:00
Ricardo Sánchez-Sáez 2765fa5575 README.md: improvements
- Simplify introduction bullet list links.
- Use proper sentences surrounding links to in-depth documentation.
- Replace all instances of 'researchkit.github.io' by 'researchkit.org'.
2015-08-24 02:43:24 +01:00
Ricardo Sánchez-Sáez 835df17c5a README.md: small improvements 2015-08-24 02:23:28 +01:00
Ricardo Sánchez-Sáez 68e0c685db Hole Peg Test Task: improve introduction image 2015-08-24 02:11:55 +01:00
Ricardo Sánchez-Sáez 352fa46668 Hole Peg Test Task: add new instruction images
(Adds pinching fingers to the diagrams.)
2015-08-24 01:41:56 +01:00
Ricardo Sánchez-Sáez 87d8db3218 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-codingstyleguide 2015-08-24 00:15:09 +01:00
Ricardo Sánchez-Sáez 458f290956 Coding Style Guide: fix small grammar issue 2015-08-23 20:13:52 +01:00
Yuan Zhu 0c268974f6 Merge pull request #387 from YuanZhu-apple/convergence
Accessibility enhancement for Charts
2015-08-20 18:08:09 -07:00
Yuan Zhu 33927b17c7 Accessibility enhancement for Charts 2015-08-20 15:19:48 -07:00
Umer Khan f8c492aadd Merge remote-tracking branch 'upstream/master' into textSlider 2015-08-20 11:31:41 -07:00
Umer Khan 22bcc07047 Added ORKTextScaleAnswerFormat 2015-08-20 11:31:20 -07:00
Yuan Zhu ca7479609c Update README.md 2015-08-20 11:31:14 -07:00
Yuan Zhu d1adbf1f50 Merge branch 'convergence' 2015-08-20 11:13:06 -07:00
Ricardo Sánchez-Sáez 321b19adbe Coding Style Guide: add 'Nullability Annotations' section
Also:
- Make new separate section for Header File Example.
- Other very small fixes.
2015-08-19 23:42:28 +01:00
Ricardo Sánchez-Sáez d86fba5c56 ORKPredicateStepNavigationRule: add Swift initializer that takes an array of tuples (result predicate, destination step identifier) instead of two arrays
Add sample code to ORKTest: move Navigable Ordered Task creation to Swift and use the overlay Swift initializer for creating the predicate step navigation rules.
2015-08-19 21:58:24 +01:00
Yuan Zhu 9f00bb182d Add bundle identifier for orktest 2015-08-19 11:44:50 -07:00
Yuan Zhu e69751361a Merge pull request #382 from YuanZhu-apple/convergence
Add strings for accessibility of charts
2015-08-19 00:45:14 -07:00
Yuan Zhu 57447fb562 Add strings for accessibility of charts 2015-08-19 00:43:32 -07:00
Yuan Zhu 9c022c300e Merge branch 'master' into ios9
Conflicts:
	ResearchKit.xcodeproj/xcshareddata/xcschemes/ResearchKit.xcscheme
	ResearchKit.xcodeproj/xcshareddata/xcschemes/docs.xcscheme
	ResearchKit/Common/ORKHelpers.h
	ResearchKit/Common/ORKHelpers.m
	ResearchKit/Common/ORKImageCaptureStepViewController.m
	Testing/ORKTest/ORKTest.xcodeproj/project.pbxproj
	Testing/ORKTest/ORKTest.xcodeproj/xcshareddata/xcschemes/ORKTest.xcscheme
	samples/ORKCatalog/ORKCatalog.xcodeproj/project.pbxproj
	samples/ORKCatalog/ORKCatalog/Results/ResultTableViewProviders.swift
2015-08-18 23:28:57 -07:00
Yuan Zhu 9614d50af9 Merge pull request #377 from chb/feature/consent-signing
Consent section: avoid headers without body
2015-08-18 21:54:27 -07:00
Pascal Pfiffner 42f9f6f03d Merge branch 'master' into feature/consent-signing 2015-08-19 06:47:00 +02:00
Yuan Zhu 445d8af2e3 Merge PSAT. Thanks @julientherier. 2015-08-18 21:22:27 -07:00
Yuan Zhu 2769b268e8 Merge pull request #178 from coxy1989/coxy-graphs
Charts for ResearchKit (Issue #92)
2015-08-18 18:15:08 -07:00
Yuan Zhu 5a4c9e172e Merge pull request #378 from newbyman/master
Performance, Consolidation of Operations, and Formatting
2015-08-18 17:43:52 -07:00
Coxy1989 1c0595f1dc Merge pull request #6 from rsanchezsaez/coxy-graphs
Fix headerdoc typos
2015-08-19 00:13:40 +01:00
Newbyman Enterprises 61ba198cc2 - Reintroduced NSUInteger index with break 2015-08-18 19:06:43 -04:00
Ricardo Sánchez-Sáez 43e4ae11b2 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints
# Conflicts:
#	ResearchKit/ActiveTasks/ORKWalkingTaskStepViewController.m
#	ResearchKit/Common/ORKScaleSliderView.m
#	Testing/ORKTest/ORKTest/CustomRecorder.m
2015-08-18 22:34:31 +01:00
Newbyman Enterprises 54d0ab0e3f - Additional Conditional Formatting, extended out. 2015-08-18 17:18:44 -04:00
Yuan Zhu b74048502f Merge pull request #380 from rsanchezsaez/ios9-towerofhanoi
Alternate fix for Tower of Hanoi iOS 9 constraint crash
2015-08-18 14:01:49 -07:00
Ricardo Sánchez-Sáez e86f3b6491 ORKTowerOfHanoiTowerView: alternate fix for iOS 9 constraint crash 2015-08-18 21:05:27 +01:00
Ricardo Sánchez-Sáez 64a68729a5 Merge branch 'coxy-graphs' of github.com:coxy1989/ResearchKit into coxy-graphs 2015-08-18 20:07:56 +01:00
Ricardo Sánchez-Sáez a289453eaf ORKGraphChartView: fix headerdoc typos 2015-08-18 20:07:43 +01:00
Pascal Pfiffner 848c4dee8b Whitespace fix, thanks Xcode :P 2015-08-18 11:23:22 +02:00
Pascal Pfiffner a750b2718d Add omitFromDocument property to consent section 2015-08-18 11:21:21 +02:00
Pascal Pfiffner 071242f217 Fix whitespace 2015-08-18 00:25:00 +02:00
Coxy1989 ceefc62cf0 Merge pull request #5 from rsanchezsaez/coxy-graphs
Latest charts changes
2015-08-17 23:24:45 +01:00
Yuan Zhu 738c6972a4 Merge pull request #375 from YuanZhu-apple/ios9
Accessibility enhancement of Tower of Hanoi
2015-08-17 14:33:43 -07:00
Ricardo Sánchez-Sáez e8ab35abb8 Charts: refactor 'ORK*GraphView' to 'ORK*GraphChartView' 2015-08-17 21:02:56 +01:00
Ricardo Sánchez-Sáez efba2dabb3 ORKGraphView: call 'setNeedsLayout' from overrided 'setBounds:' rather than from 'traitCollectionDidChange:'
(Fixes a rare bug in which sometimes view width is not correct during 'layoutSubviews' after a portrait to landscape rotation. E.g.: bug is present in ORKTest, but not in ORKCatalog.)
2015-08-17 20:13:01 +01:00
Newbyman Enterprises 64cb0d88bd - Removed the __nonnull declaration in the implementation file, was added back in May/15, keeping with coding style, didn't see any others. 2015-08-17 14:47:53 -04:00
Ricardo Sánchez-Sáez 4bfed38f92 ORKGraphView: share verticalReferenceLineLayer's contents (improves memory usage and performance)
Also, add slight top padding so drawn are doesn't overflow graph view bounds at default text size.
2015-08-17 19:36:51 +01:00
Ricardo Sánchez-Sáez 96fd5872a7 Chart.storyboard: nicer top background color 2015-08-17 19:34:10 +01:00
Newbyman Enterprises b53cdbc27a - Minor formatting updates of condensed if() statements. 2015-08-17 13:58:56 -04:00
Newbyman Enterprises ebdd27d251 - Code formatting updates in accordance with the provided coding style guide 2015-08-17 13:05:44 -04:00
Ricardo Sánchez-Sáez 7b97e2d9bb ORKGraphView: more efficient tintColor change; make sure secondary graph color is updated when changing referenceLineColor 2015-08-17 16:36:42 +01:00
Ricardo Sánchez-Sáez afe1d8a8ee Charts: use NSUIntegers/NSIntegers instead of int 2015-08-17 16:24:57 +01:00
Ricardo Sánchez-Sáez 8833aa841c Charts: minor headerdoc comments improvements 2015-08-17 16:12:55 +01:00
Pascal Pfiffner 52aed1a5b6 Use section title in “Learn More” screen 2015-08-17 16:58:33 +02:00
Pascal Pfiffner 2e736a7306 Consent section: avoid headers without body 2015-08-17 16:21:43 +02:00
Ricardo Sánchez-Sáez b6f2ce945d ORKGraphView: correctly handle tint color
Also fixes a occasional crash if line/point layout is tried before obtaining the normalized y axis points.
2015-08-17 04:46:08 +01:00
Ricardo Sánchez-Sáez 9fc539ec59 Merge branch 'master' of github.com:ResearchKit/ResearchKit into coxy-graphs
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
#	ResearchKit/Common/ORKHelpers.h
#	ResearchKit/Common/ORKHelpers.m
#	Testing/ORKTest/ORKTest.xcodeproj/project.pbxproj
#	Testing/ORKTest/ORKTest/MainViewController.m
2015-08-17 03:52:57 +01:00
Newbyman Enterprises 14e96bce38 - Simplification of operation 2015-08-16 22:40:30 -04:00
Ricardo Sánchez-Sáez 9b8ae3de92 ORKCatalog: simplify chart example to make it more visually compeling 2015-08-17 03:38:20 +01:00
Ricardo Sánchez-Sáez 445eb7deb1 ORKTest: add close button to charts example 2015-08-17 03:37:32 +01:00
Ricardo Sánchez-Sáez 149e341352 ORKTest: add charts example/test 2015-08-17 03:18:32 +01:00
Newbyman Enterprises 1350a20f15 - Formatting Consistency 2015-08-16 22:03:58 -04:00
Newbyman Enterprises aaf9d7dde4 - Leveraged mutable string directly to prevent another string builder request. 2015-08-16 21:58:51 -04:00
Newbyman Enterprises 852102eb99 - Performance consolidation of formatter string building. 2015-08-16 21:57:53 -04:00
Newbyman Enterprises c1f4392dca - Performance breaks, and returns. 2015-08-16 21:49:08 -04:00
Ricardo Sánchez-Sáez 335f887932 ORKPieChartView: implement showsPercentageLabels property
Also:
- Some property renames.
- Make text property of 'copy' type.
- Remove unneeded 'hidesLegend' property.
2015-08-17 02:36:15 +01:00
Ricardo Sánchez-Sáez 3ec1a1385b ORKGraphView: make sure all property changes propagate correctly and cause an immediate layout pass of the appropriate elements 2015-08-17 02:05:42 +01:00
Ricardo Sánchez-Sáez d35cfaacb0 ORKGraphView: make all fonts dependent on user selected contentSizeCategory
Also:
- Remove axisTitleFont property (it was the only font property).
- Extract some magic numbers as constants.
- Slightly tweaks to _scrubberLabel appearance.
- Better handling of _noDataLabel
2015-08-17 00:39:34 +01:00
Ricardo Sánchez-Sáez 1ce5cedd7e ORKPieChartView: dynamically adjust content size category fonts of the legend 2015-08-16 22:47:33 +01:00
Ricardo Sánchez-Sáez 1dc55d1a0c ORKPieChartView: move animation call to 'viewWillAppear:' and update documentation
(The new static constrained cell legend supports animation being triggered there.)
2015-08-16 22:42:20 +01:00
Ricardo Sánchez-Sáez 6939af6599 ORKPieChartLegend: reuse sizing cell instead of creating a new one each time 2015-08-16 22:37:32 +01:00
Ricardo Sánchez-Sáez 6dd1a9d3f1 ORKPieChart: new legend layout 2015-08-16 21:57:15 +01:00
Ricardo Sánchez-Sáez ab281c75ce ORKPieChartView: avoid pure white and pure black in default auto-generated pie chart colors 2015-08-16 21:51:55 +01:00
Ricardo Sánchez-Sáez 291a6fdd0f ChartListViewController: update to use graph animation method 2015-08-16 21:25:20 +01:00
Ricardo Sánchez-Sáez 9ba1f76e53 ChartDataSources: add an empty line after the last value for testing purposes 2015-08-16 21:24:16 +01:00
Ricardo Sánchez-Sáez 5abdbd97dd ORKPieChartView: extract pie, legend and titleText subviews into their own files 2015-08-16 21:23:11 +01:00
Ricardo Sánchez-Sáez b0011de863 ORKGraphView: go back to transparent plotView (it obscures xAxisView tick layers) 2015-08-16 20:54:52 +01:00
Ricardo Sánchez-Sáez be8ecb84f4 ORKGraphView, ORKPieChartView: improve headerdoc comments 2015-08-16 20:46:10 +01:00
Ricardo Sánchez-Sáez 82eb38c815 ORKPieChartView: fix liver updating of percentage labels text size category 2015-08-16 20:22:46 +01:00
Ricardo Sánchez-Sáez 6d9d488fb4 ORKPieChartView: nicer default text, title and legend text color 2015-08-16 20:11:31 +01:00
Ricardo Sánchez-Sáez 6f995d1092 ORKPieChartView: implement support for legend-less pie (when the dataSource's pieChart:titleForSection: method is not implemented) 2015-08-16 19:45:22 +01:00
Ricardo Sánchez-Sáez 02603ee8d7 ORKPieChartView: add titleTextView animation 2015-08-16 19:07:25 +01:00
Ricardo Sánchez-Sáez 70e6a7c58e ORKGraphView: honor animation duration
Now all plots start animating at the same time in multi-plot graphs.
2015-08-16 19:05:11 +01:00
Ricardo Sánchez-Sáez 8ea3ef21a9 ORKGraphView: cache pointLayer contents for points of the same color (increases rotation performance) 2015-08-16 18:24:17 +01:00
Ricardo Sánchez-Sáez 5f627812f5 ORKGraphView: replace shouldAnimate property with optional animation method 2015-08-16 16:42:33 +01:00
Ricardo Sánchez-Sáez 758988e1e5 ORKGraphView: set plotView backgroundColor to white 2015-08-16 00:56:54 +01:00
Ricardo Sánchez-Sáez a988b4dcfb ORKGraphView: store points and line layers in bi-dimensional array for better code encapsulation 2015-08-16 00:34:46 +01:00
Ricardo Sánchez-Sáez 6784af13ed ORKGraphView: split point, line and fill layers creation from layout so layers are reused instead of re-generated each time 2015-08-15 23:37:32 +01:00
Ricardo Sánchez-Sáez b4e9f2ef81 ChartDataSource: start first graph with an empty point to make sure it handles leading blank data correctly 2015-08-15 23:34:49 +01:00
Ricardo Sánchez-Sáez 825241001b Merge branch 'coxy-graphs' of github.com:coxy1989/ResearchKit into coxy-graphs 2015-08-15 06:19:28 +01:00
Ricardo Sánchez-Sáez fae45fe36a ORKGraphView: use local data points for min and max calculation 2015-08-15 05:51:14 +01:00
Ricardo Sánchez-Sáez 8716c92a30 ORKGraphView: directly add reference layers to plotView 2015-08-15 05:44:47 +01:00
Ricardo Sánchez-Sáez ae2ae485db ORKGraphView: remove ORKCircleView class and use layers instead for performance 2015-08-15 05:43:21 +01:00
Ricardo Sánchez-Sáez 8d0c13d09d ORKGraphView: remove needless array 2015-08-15 05:17:58 +01:00
Ricardo Sánchez-Sáez b869eebe9a ORKGraphView: reuse reference line layers instead of recreating them at each draw 2015-08-15 04:56:56 +01:00
Ricardo Sánchez-Sáez 655ff5a50e ORKPieChart: rename some properties; make sure layout is triggered if clockwise property changes 2015-08-15 04:55:39 +01:00
Ricardo Sánchez-Sáez e3bc0ecc4e ORKGraphView: encapsulate yAxisView layout into its own class 2015-08-15 04:06:10 +01:00
Ricardo Sánchez-Sáez b35fbae894 ORKXAxisView: fix issue with caused ticks not to draw 2015-08-15 03:39:42 +01:00
Ricardo Sánchez-Sáez 5cb8ad525f ORKPieChartView: simplify subview initializer methods 2015-08-15 03:04:07 +01:00
Ricardo Sánchez-Sáez 586f9950d2 ORKGraphView: encapsulate ORKXAxisView drawing and layout inside its own implementation 2015-08-15 03:02:59 +01:00
Ricardo Sánchez-Sáez 14afba5f60 ORKGraphView & friends: refactoring with some improvements in performance and safety
Changes:
- X canvas positions are dynamically calculated (instead of constantly packing and unpacking NSNumbers).
- _dataPoints and _yAxisPoints are now a bi-dimensional array holding all the plot values
- Now scrubbing happens over the primary plot (instead of the last one)
- ORKGraphView refreshes itself on traits change without having to manually call setNeedsLayout and refreshGraph
- Fix ORKRangedPoint isUnset method name error
2015-08-15 00:46:15 +01:00
Ricardo Sánchez-Sáez 5b0dc979de ORKAxisView: tintColor management improvements
Also: make _titleLabels an ivar.
2015-08-15 00:36:59 +01:00
Coxy1989 e270ac4c4d Merge pull request #4 from rsanchezsaez/coxy-graphs
Graphs: additional fixes
2015-08-15 00:11:55 +01:00
Yuan Zhu 3afd7ed5e4 Leave only one - after #pragma mark 2015-08-14 15:20:49 -07:00
Umer Khan 217f40e6ec Merge remote-tracking branch 'upstream/master' into textSlider 2015-08-14 15:10:24 -07:00
Yuan Zhu e8d4a17265 Update pragma mark 2015-08-14 14:45:43 -07:00
Yuan Zhu 6dc4f5f714 Add one second delay to avoid Accessibility Notification being canceled. 2015-08-14 14:43:46 -07:00
Yuan Zhu f2447ad1dc Accessibility enhancement of Tower of Hanoi 2015-08-14 13:49:36 -07:00
Yuan Zhu 6064dc8253 Merge branch 'master' into ios9
Conflicts:
	samples/ORKCatalog/ORKCatalog/ResultTableViewProviders.swift
2015-08-14 13:35:09 -07:00
Ricardo Sánchez-Sáez 59cbbf845a ORKPieChartView: call super in '-traitCollectionDidChange:' 2015-08-14 20:58:38 +01:00
Ricardo Sánchez-Sáez fac25d9a1f ORKGraphView: fix crash when trying to scrub over empty areas 2015-08-14 03:19:55 +01:00
Ricardo Sánchez-Sáez 3a277a1658 ORKGraphView: move some ivars from the internal header to the implementation file 2015-08-14 02:52:00 +01:00
Ricardo Sánchez-Sáez d23f8ee8da ChartDataSources: more compact swift 2015-08-14 02:25:01 +01:00
Ricardo Sánchez-Sáez 4dde26d7fd ORKGraphView: adjust Y axis rule length and padding 2015-08-14 02:20:53 +01:00
Ricardo Sánchez-Sáez c3bb0ec1f8 ORKGraphView, ORKPieChartView: fix localization issues of 'noDataText' 2015-08-14 02:15:06 +01:00
Ricardo Sánchez-Sáez a36035f4fa ORKGraphView: fix bugs
1) avoid crash when 'numberOfDivisionsInXAxisForGraphView:' returns a value lower than the number of data points.
2) calculate maximum and minimum value taking all plots into account.
2015-08-14 02:01:23 +01:00
Ricardo Sánchez-Sáez b4ad468974 ORKGraphView: fix bug when secondary plots have more points than primary plot 2015-08-14 01:22:02 +01:00
Ricardo Sánchez-Sáez 04ae04d928 ORKGraphView: using ivars directly instead of property accessors 2015-08-14 00:46:27 +01:00
Ricardo Sánchez-Sáez 24cd69c075 Project: move chart files to their own folder 2015-08-13 23:59:54 +01:00
Ricardo Sánchez-Sáez 597d3c6433 ChartDataSources: change graph sample values 2015-08-13 23:58:49 +01:00
Ricardo Sánchez-Sáez 3b588e39b3 ChartListViewController: caching graph cells to avoid regenerating them on device rotation; add ORKPieChartView appearing animation example code 2015-08-13 20:52:15 +01:00
Ricardo Sánchez-Sáez 60d273db6e ORKPieChartView: extensive refactor improving performance
- Subdivides ORKPieChartView into ORKPieChartTileTextView, ORKPieChartPieView and ORKPieChartLegendView, and uses autolayout to set their sizes.
- Avoids regenerating layers and percentage labels each time layoutSubviews is called.
- Makes appearing animation optional by adding the '- animateWithDuration:' method.
2015-08-13 20:50:38 +01:00
Yuan Zhu 7ee10516db Merge pull request #329 from shazino/timed-walk
Timed-Walk active task
2015-08-13 12:48:40 -07:00
Ricardo Sánchez-Sáez 9468b6e806 PieChartDataSource: show n pie segments rather than n+1 2015-08-13 20:38:33 +01:00
Yuan Zhu 56d76705ff Merge pull request #372 from umerkhan-apple/splitViewFix
iOS9: Split view fix for image capture step.
2015-08-13 10:28:00 -07:00
Julien Thérier 3353ff3dd0 Merge remote-tracking branch 'ResearchKit/master' 2015-08-13 16:30:32 +02:00
Julien Thérier 9e45652356 Fix conflict. 2015-08-13 15:52:19 +02:00
Julien Thérier d83e859d84 Fix conflicts. 2015-08-13 15:47:18 +02:00
Julien Thérier 4195dfe755 Fix conflicts. 2015-08-13 14:57:56 +02:00
Julien Thérier 55aa48b544 Merge remote-tracking branch 'ResearchKit/master' into 9hpt-task 2015-08-13 14:45:43 +02:00
Julien Thérier 78593561d2 Fix merge conflicts. 2015-08-13 11:48:04 +02:00
Julien Thérier 0075ae973c Merge remote-tracking branch 'ResearchKit/master' into timed-walk 2015-08-13 11:34:44 +02:00
Julien Thérier 5d3c846ed7 Add french localisation. 2015-08-13 11:01:11 +02:00
Julien Thérier 17c82175c2 Show time. 2015-08-13 10:50:59 +02:00
Julien Thérier ddeea33a02 Add tests. 2015-08-13 10:45:18 +02:00
Yuan Zhu 85384bbc1d Merge pull request #357 from umerkhan-apple/imageSlider
IOI #356 - Scale slider with images.
2015-08-12 13:14:04 -07:00
Yuan Zhu e322c39942 Merge pull request #370 from YuanZhu-apple/split_view_support
iOS9 iPad split view support
2015-08-12 13:12:14 -07:00
Yuan Zhu 64e8560bca Update CONTRIBUTING.md 2015-08-12 11:01:13 -07:00
Julien Thérier f4d8224164 Add icons. 2015-08-12 14:46:04 +02:00
Umer Khan ae99b8254e Refactored logic for split view error to use setError method. 2015-08-11 15:32:33 -07:00
Umer Khan c62274c103 Adding accessibility hint to image views on scale slider. 2015-08-11 11:12:24 -07:00
Umer Khan 70d449ba1c Refactored UI state code in updateAppearance. 2015-08-11 10:41:38 -07:00
Julien Thérier aa5e5b8394 Add distance result. 2015-08-11 10:36:28 +02:00
Julien Thérier f914263d0e Improve gesture recognition. 2015-08-11 09:30:21 +02:00
Yuan Zhu a2987a4bea Use vertical metrics for ORKScreenMetricTopToIllustration 2015-08-10 17:10:38 -07:00
Yuan Zhu 064af84e38 Remove NSLog 2015-08-10 16:22:23 -07:00
Umer Khan 462543c95d Removed redundant check. 2015-08-10 14:47:27 -07:00
Umer Khan b1ff602e74 Fix for image capture step while in split view. 2015-08-10 14:41:15 -07:00
Yuan Zhu 2d80083177 Merge pull request #342 from rsanchezsaez/rsanchezsaez-customrecorderfix
Fix CustomRecorder example: green filler view and orange tappable button layout
2015-08-10 10:45:10 -07:00
Yuan Zhu f14d775a78 Merge pull request #365 from umerkhan-apple/secureCodingFix
Secure coding fix and delegate fix.
2015-08-10 10:15:07 -07:00
Julien Thérier d3634439af Add results and samples. 2015-08-10 18:18:00 +02:00
Yuan Zhu f0083a3227 Add split view support.
1. Rename `ORKGetScreenTypeForWindow` to `ORKGetVerticalScreenTypeForWindow`
    And introduce `ORKGetHorizontalScreenTypeForWindow`

Use vertical screen type for most the metrics.
Except:
        ORKScreenMetricContinueButtonWidth
        ORKScreenMetricHeadlineSideMargin
        ORKScreenMetricLearnMoreButtonSideMargin
        ORKScreenMetricTopToIllustration

2. Update `layoutMargin` in vertical container view's `updateConstraintConstants`
2015-08-09 01:40:57 -07:00
Julien Thérier b509908b2a Start at first move. 2015-08-07 14:07:29 +02:00
Julien Thérier 6490a7a8c3 Dominant / Non Dominant. 2015-08-07 13:23:16 +02:00
Julien Thérier 162764e508 Right / Left orientation. 2015-08-07 13:17:58 +02:00
Julien Thérier 5d99a54c58 Update text description when fail. 2015-08-07 12:40:54 +02:00
Julien Thérier 7252b83ef2 Rename to "Place" Step. 2015-08-07 11:40:49 +02:00
Julien Thérier a0011f8e90 Comply with spacing guidelines. 2015-08-07 09:36:31 +02:00
Yuan Zhu 04ce2a3be9 Merge pull request #360 from rsanchezsaez/rsanchezsaez-navigationrules
ORKTest: add form step to Navigable Ordered Task example
2015-08-06 16:35:42 -07:00
Ricardo Sánchez-Sáez a10816efd4 ORKTest: remove CustomRecorder example 2015-08-07 01:31:02 +02:00
Umer Khan d47d1cc221 Minor refactoring. 2015-08-06 15:20:32 -07:00
Umer Khan 79a2005505 Added nullable to delegate. 2015-08-06 14:11:29 -07:00
Umer Khan 5f7a28ff3a Add a new line at the end of class. 2015-08-06 14:06:24 -07:00
Umer Khan 5029179b83 PR fixes. 2015-08-06 12:47:34 -07:00
Yuan Zhu 8d65a9e01e Merge pull request #362 from YuanZhu-apple/ios9
Fix a crash case in HanoiTowerView for iOS9
2015-08-06 12:16:23 -07:00
Yuan Zhu e00fc4461c Fix a crash case in HanoiTowerView for iOS9 2015-08-06 10:38:48 -07:00
Julien Thérier 98b6269f11 Update take with translation/rotation thresholds. 2015-08-06 14:50:19 +02:00
Ricardo Sánchez-Sáez 1bfb6f49e1 ORKTest: add form step to ORKNavigableOrderedTask example
Also: rename the button text to "Navigable Ordered Task".
2015-08-06 12:10:18 +02:00
Ricardo Sánchez-Sáez b8ee219a5f Merge branch 'master' of github.com:rsanchezsaez/ResearchKit into rsanchezsaez-constraints 2015-08-06 11:32:16 +02:00
Yuan Zhu 40db9f36d5 Fix a error in Xcode 7 beta 4 2015-08-05 16:36:25 -07:00
Yuan Zhu c2f1c033c8 Merge branch 'master' into ios9 2015-08-05 16:33:46 -07:00
Yuan Zhu d8764a7be6 Merge pull request #347 from oliverschaefer/master
Implementation of issue #346
2015-08-05 16:31:30 -07:00
Yuan Zhu 33879662e8 Merge pull request #358 from YuanZhu-apple/fix_numberOfDisks
Should use `NSUInteger` instead of `int` in the API
2015-08-05 15:59:04 -07:00
Yuan Zhu 6be21169c6 Should use NSUInteger instead of int in the API 2015-08-05 15:54:02 -07:00
Umer Khan 2f00fa57b2 Refactored some code. 2015-08-05 15:44:25 -07:00
Yuan Zhu 7a8780a59a Merge pull request #348 from rsanchezsaez/rsanchezsaez-codingstyleguide
Coding Style Guide improvements
2015-08-05 15:30:25 -07:00
Umer Khan 230e07cc83 Minor fixes 2015-08-05 14:21:33 -07:00
Umer Khan 5dd9e4ae24 Updated serialization and secure coding code. 2015-08-05 14:16:37 -07:00
Umer Khan 3194d9fcc9 Merge remote-tracking branch 'upstream/master' into imageSlider 2015-08-05 13:47:28 -07:00
Yuan Zhu 5145a38e8d Merge pull request #355 from umerkhan-apple/secureCodingFix
Secure coding fix for TowerOfHanoiStep
2015-08-05 13:44:25 -07:00
Umer Khan c32eff2947 Merge remote-tracking branch 'upstream/master' into secureCodingFix 2015-08-05 13:42:47 -07:00
Umer Khan 4070552d36 Secure coding fix for TowerOfHanoiStep 2015-08-05 13:37:56 -07:00
Umer Khan ad1c024455 Updated Documentation and refactored constants for ORKScaleRangeImageView 2015-08-05 13:30:25 -07:00
Umer Khan 66b3f9689d Modified constraints for vertical scale slider and updated example in ORKTest. 2015-08-05 13:21:27 -07:00
Umer Khan 7598debcf6 Adding images to scale 2015-08-05 11:30:05 -07:00
Yuan Zhu 41a24aeffd Merge pull request #351 from YuanZhu-apple/ios9
Merge branch 'master' into ios9
2015-08-05 10:41:20 -07:00
Julien Thérier 01e8c561bb Better UI. 2015-08-05 17:24:36 +02:00
Julien Thérier 71a0646065 Add check success. 2015-08-05 12:23:46 +02:00
Julien Thérier 515bf1de51 Remove notification for distanceLabel locale. 2015-08-05 09:17:28 +02:00
Julien Thérier c8f5a1ccb6 Add 3 arrows. 2015-08-05 09:14:39 +02:00
Oliver Schäfer 014be09d5b Added helper method shouldDisplayProgressLabel 2015-08-05 06:14:40 +02:00
Ricardo Sánchez-Sáez a5072c457c ORKGraphView: fix typo in delegate method name 2015-08-05 05:37:55 +02:00
Yuan Zhu dab245a415 Merge pull request #353 from YuanZhu-apple/issue_352
Expose `secureTextEntry` on ORKTextAnswerFormat
2015-08-04 17:35:48 -07:00
Yuan Zhu ad88999c7b Expose secureTextEntry on ORKTextAnswerFormat 2015-08-04 16:48:21 -07:00
Yuan Zhu 1ab959d8a8 Merge branch 'master' into ios9
Conflicts:
	samples/ORKCatalog/ORKCatalog/ResultTableViewProviders.swift
	samples/ORKCatalog/ORKCatalog/TaskListRow.swift

Also fixed secure coding for `ORKTowerOfHanoiStep`
2015-08-04 13:52:15 -07:00
Yuan Zhu 92028763ad Merge pull request #350 from rsanchezsaez/rsanchezsaez-towerofhanoifixes
Fix small Tower of Hanoi issues
2015-08-04 13:16:41 -07:00
Umer Khan cd43c68dc6 Added image support for scale slider 2015-08-04 11:09:00 -07:00
Ricardo Sánchez-Sáez 714ba82c0c ORKPieChartViewDataSource: add support for multiple pie charts sharing the same data source 2015-08-04 18:47:58 +02:00
Oliver Schäfer fee323588e Added Custom Navigation Item Example 2015-08-04 16:16:56 +02:00
Ricardo Sánchez-Sáez d906b07c55 ORKTowerOfHanoiTowerView: make sure tintColor is honored 2015-08-04 15:52:28 +02:00
Ricardo Sánchez-Sáez 20739d6df5 ORKTowerOfHanoiResult: fix ORKTest's serialization unit test failure due to improper array unarchiving 2015-08-04 15:29:48 +02:00
Ricardo Sánchez-Sáez 2d1c697402 ORKESerialization: refactor NSNumber, NSValue and NSString '*value' methods to property syntax 2015-08-04 15:23:03 +02:00
Ricardo Sánchez-Sáez c96a94c164 Refactor NSNumber, NSValue and NSString '*value' methods to property syntax 2015-08-04 15:22:47 +02:00
Ricardo Sánchez-Sáez 41d346853e Refactor 'value' method syntax to property syntax 2015-08-04 14:16:08 +02:00
Ricardo Sánchez-Sáez ad919639c7 Refactor 'bounds' method syntax to property syntax 2015-08-04 14:10:42 +02:00
Ricardo Sánchez-Sáez 5ebcc6d6b5 Refactor 'bytes/mutableBytes/userInfo' method syntax to property syntax 2015-08-04 14:07:30 +02:00
Ricardo Sánchez-Sáez 27c084707e Refactor 'length' method syntax to property syntax 2015-08-04 14:03:50 +02:00
Ricardo Sánchez-Sáez eeae8f3c1d Refactor 'firstObject/lastObject' method syntax to property syntax 2015-08-04 13:58:46 +02:00
Ricardo Sánchez-Sáez 36f86eb607 Refactor '[object description]' method syntax to 'object.description' property syntax 2015-08-04 13:52:23 +02:00
Ricardo Sánchez-Sáez e69460acfe Refactor '[array count]' method syntax to 'array.count' property syntax 2015-08-04 13:50:00 +02:00
Julien Thérier f7be4f6ae2 Add direction indicator. 2015-08-04 13:40:59 +02:00
Ricardo Sánchez-Sáez ffd404ff6b Coding Style Guide: improve Dot Notation section 2015-08-04 11:20:50 +02:00
Julien Thérier b99ec7b5ca Remove the distanceLabel. 2015-08-04 09:33:13 +02:00
Julien Thérier d7975ec9f2 Add arrow view. 2015-08-04 09:08:19 +02:00
Umer Khan 0405f813a2 Added ORKAnswerFormat support for ORKTextScaleSlider 2015-08-03 15:46:20 -07:00
Ricardo Sánchez-Sáez ee66c66521 Coding Style Guide: add 'Constant Declarations' section 2015-08-04 00:36:03 +02:00
Ricardo Sánchez-Sáez 6e0ee1d079 Coding Style Guide: update property/method syntax section 2015-08-04 00:04:48 +02:00
Ricardo Sánchez-Sáez cda4216d0d Coding Style Guide: better, more interesting, examples 2015-08-03 23:53:29 +02:00
Oliver Schäfer c2dd0a827c Implementation of issue #346 2015-08-03 21:34:32 +02:00
Julien Thérier 8492334353 Improve design. 2015-08-03 15:57:49 +02:00
Coxy1989 9a7d04b684 Merge pull request #3 from rsanchezsaez/coxy-graphs
Apple review improvements
2015-08-02 16:58:17 +01:00
Ricardo Sánchez-Sáez d90cd52913 ORKPieChartView: fix spacing 2015-07-31 23:17:12 +02:00
Ricardo Sánchez-Sáez ce7ff64000 ORKPieChartView: use ORKPieChartLabel class instead of custom dictionary for passing pieLabel/angle pairs 2015-07-31 23:15:30 +02:00
Ricardo Sánchez-Sáez 5f37a4d360 Graphs: use '[array count]' method syntax instead of 'array.count' property syntax 2015-07-31 21:31:41 +02:00
Ricardo Sánchez-Sáez 4215498fbc Graphs: some minor improvements 2015-07-31 21:10:05 +02:00
Ricardo Sánchez-Sáez f15b095e15 Graphs: use newly defined ORKCGFloatInvalidValue constant (CGFLOAT_MAX) as an invalid value 2015-07-31 20:50:25 +02:00
Ricardo Sánchez-Sáez 1e0c22e364 ORKGraphView: better code reuse when adding layer animations 2015-07-31 20:30:26 +02:00
Ricardo Sánchez-Sáez fa66666033 ORKGraphView: better code reuse by using block 2015-07-31 20:22:54 +02:00
Ricardo Sánchez-Sáez b034f195d3 ORKGraphView: coding style and spacing improvements 2015-07-31 20:20:28 +02:00
Ricardo Sánchez-Sáez 8b943730b4 ORKGraphView: more general removal of notification observing 2015-07-31 20:01:55 +02:00
Ricardo Sánchez-Sáez fae4cbfb80 ORKGraphView: make the constants which are unused by subclasses static to the implementation file
Also rename some non-static constants.
2015-07-31 19:56:53 +02:00
Ricardo Sánchez-Sáez a4966c12e6 ORKDiscreteGraphView: extract constant 2015-07-31 19:26:16 +02:00
Ricardo Sánchez-Sáez 378befbf4f ORKCircleView: remove unused property 2015-07-31 19:25:03 +02:00
Ricardo Sánchez-Sáez c9292ca9c3 Rename ORKCentredCollectionViewLayout files to ORKCenteredCollectionViewLayout 2015-07-31 19:24:18 +02:00
Ricardo Sánchez-Sáez 579917ff58 ORKAxisView: extract LastLabelPadding constant 2015-07-31 19:22:45 +02:00
Ricardo Sánchez-Sáez 399da05c61 Add James Cox copyright line to all graph related files 2015-07-31 19:08:40 +02:00
Ricardo Sánchez-Sáez 20e5e6db03 ORKTowerOfHanoiTowerView & ORKTowerOfHanoiStepViewController: homogenize constraint code 2015-07-30 20:56:09 +02:00
Ricardo Sánchez-Sáez ca442e748d Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints
# Conflicts:
#	ResearchKit/Common/ORKContinueButton.m
#	ResearchKit/Common/ORKNavigationContainerView.m
2015-07-30 20:44:23 +02:00
Ricardo Sánchez-Sáez 4e6e3c9ad3 ORKFormItemCell: remove needless screenType property and init method argument 2015-07-30 20:25:12 +02:00
Yuan Zhu 09d7f1f9e4 Merge pull request #337 from umerkhan-apple/decimal
Fixed bug in ORKNumericAnswerFormat so the value shown is the full decimal
2015-07-30 11:21:19 -07:00
Yuan Zhu 7e6b7ba6f4 Merge pull request #318 from coxy1989/coxy-toh
Add Tower of Hanoi Task
2015-07-30 11:20:47 -07:00
Yuan Zhu aad109b533 Merge pull request #338 from oliverschaefer/master
Implementation of issue #336
2015-07-30 11:20:20 -07:00
Ricardo Sánchez-Sáez eeee427c97 Remaining minor constraint code refactoring 2015-07-30 20:16:49 +02:00
Ricardo Sánchez-Sáez 2bc714f05f ORKScaleSliderView: add informative NSLayoutFormatOptions cast for empty options 2015-07-30 20:16:25 +02:00
Ricardo Sánchez-Sáez a07aa08fd4 ORKQuestionStepViewController: add informative NSLayoutFormatOptions cast for empty options 2015-07-30 20:15:43 +02:00
Ricardo Sánchez-Sáez 00ca93e14d ORKActiveStepViewController: add informative NSLayoutFormatOptions cast for empty options 2015-07-30 20:15:13 +02:00
Ricardo Sánchez-Sáez a5e641185b ORKTableContainerView: constraint method rename 2015-07-30 20:13:17 +02:00
Ricardo Sánchez-Sáez ba7433dade ORKSurveyAnswerCellForText: remove needless setNeedsUpdateConstraints 2015-07-30 20:12:39 +02:00
Ricardo Sánchez-Sáez 99f4263417 ORKSurveyAnswerCellForScale: constraint code alignment 2015-07-30 19:55:56 +02:00
Ricardo Sánchez-Sáez a5c16f9d0b ORKSurveyAnswerCellForScale: set layoutMargins outside setUpConstraints 2015-07-30 19:53:54 +02:00
Ricardo Sánchez-Sáez 2d82a2a904 ORKImageChoiceLabel: fix error in calculating the intrinsicContentSize 2015-07-30 19:50:57 +02:00
Ricardo Sánchez-Sáez 286366333f ORKSurveyAnswerCellForImageSelection: homogenize constraint code 2015-07-30 19:34:58 +02:00
Ricardo Sánchez-Sáez a90abe74ae ORKSurveyAnswerCell: constraint code alignment 2015-07-30 19:25:29 +02:00
Ricardo Sánchez-Sáez 9e72e3aaeb ORKStepHeaderView: constraint code alignment 2015-07-30 19:24:01 +02:00
Ricardo Sánchez-Sáez 0af4b33056 ORKSpatialSpanMemoryGameView: use ORKScreenMetricMaxDimension instead of magic number 2015-07-30 19:23:44 +02:00
Ricardo Sánchez-Sáez 62fc9cc6ea ORKSignatureView: move width constraint from ORKConsentSignatureWrapperView 2015-07-30 19:17:00 +02:00
Ricardo Sánchez-Sáez 2b54f90b97 ORKSkin: guard against nil window on ORKWidthForSignatureView() 2015-07-30 19:08:03 +02:00
Ricardo Sánchez-Sáez cfd1724cb0 ORKConsentSignatureController: fix unsatisfiable constraint warning 2015-07-30 19:07:38 +02:00
Ricardo Sánchez-Sáez f6d9feda07 ORKScaleSliderView: use ivars instead of internal properties and refactor constraint code. 2015-07-30 18:39:57 +02:00
Ricardo Sánchez-Sáez be44b0c39a ORKReactionTimeContentView: use ivar instead of internal property 2015-07-30 18:38:22 +02:00
Ricardo Sánchez-Sáez 5e3f4acd78 ORKQuestionStepViewController: homogenize constraint code 2015-07-30 18:26:14 +02:00
Ricardo Sánchez-Sáez fd4557a8e6 ORKNavigationContainerView: refactor constraint code
- Make constraint ivar name clearer.
- Rename updateConstraintConstants to 'updateSkipToContinueButtonConstraint' to reflect that the constraint can get activated/deactivated.
- Call 'setNeedsUpdateConstraints' after 'updateContinueAndSkipEnabled'.
2015-07-30 17:48:26 +02:00
Ricardo Sánchez-Sáez 28f4205bcd ORKInstructionStepView: homogenize constraint code 2015-07-30 17:37:29 +02:00
Ricardo Sánchez-Sáez 7b70f5c362 ORKChoiceButtonView & ORKImageSelectionView: refactor constraint code
- Homogenize constraint code.
- Simplify ORKImageSelectionView by dropping _invisibleLabel (_choiceLabel takes its functionality).
- Extract constraint setup to its own method.
2015-07-30 17:30:40 +02:00
Ricardo Sánchez-Sáez 7f25099acd ORKImageChoiceLabel: make intrinsicContentSize not to change the label itself
(Allows to drop ORKImageSelectionView invisible label.)
2015-07-30 17:25:00 +02:00
Ricardo Sánchez-Sáez fd84d8d893 ORKImageCaptureView: align constraints so they are easier to read 2015-07-30 16:32:28 +02:00
Ricardo Sánchez-Sáez 49bee20f8e ORKImageCaptureStepViewController: extract constraint setup to separate method 2015-07-30 16:29:09 +02:00
Ricardo Sánchez-Sáez 49cbb27222 ORKImageCaptureStepViewController: use ivars instead of internal properties
Also, rename some variables and method names by naming conventions.
2015-07-30 16:25:34 +02:00
Ricardo Sánchez-Sáez 90b4c7b1b6 ORKImageCaptureCameraPreviewView: extract constraint setup to separate method 2015-07-30 16:05:47 +02:00
Ricardo Sánchez-Sáez aa57b8223c ORKImageCaptureCameraPreviewView: use ivars instead of internal properties 2015-07-30 16:00:03 +02:00
Ricardo Sánchez-Sáez db93a6ddc8 ORKFormStepViewController: homogenize constraint code 2015-07-30 15:57:00 +02:00
Ricardo Sánchez-Sáez 41457846e2 ORKFormItemTextCell, ORKFormItemImageSelectionCell & ORKFormItemScaleCell: extract constraint setup to separate method 2015-07-30 15:32:28 +02:00
Ricardo Sánchez-Sáez 08f1b8e3d9 ORKFitnessContentView: better constraint onscreen align 2015-07-30 15:31:50 +02:00
Ricardo Sánchez-Sáez dc5460c120 ORKFitnessContentView: homogenize constraint code 2015-07-30 15:21:01 +02:00
Ricardo Sánchez-Sáez 6a6cb929e1 ORKQuestionStepCellHolderView: homogenize constraint code 2015-07-30 15:07:46 +02:00
Ricardo Sánchez-Sáez fb56d6b64b ORKCountdownView: extract constraint setup to its own method 2015-07-30 15:00:45 +02:00
Ricardo Sánchez-Sáez 2ed0111866 ORKConsentReviewController: homogenize constraint code 2015-07-30 14:53:58 +02:00
Ricardo Sánchez-Sáez ccc615cea6 ORKConsentLearnMoreViewController: homogenize constraint code 2015-07-30 14:51:17 +02:00
Ricardo Sánchez-Sáez 97be632ed8 ORKCompletionStepView: use translatesAutoresizingMaskIntoConstraints property syntax instead of method 2015-07-30 14:49:51 +02:00
Ricardo Sánchez-Sáez 588d9b6528 ORKAudioGraphView: extract constraint setup to its own method 2015-07-30 14:48:34 +02:00
Ricardo Sánchez-Sáez 4d791e96e3 ORKActiveStepViewController: homogenize constraint code 2015-07-30 14:40:00 +02:00
Ricardo Sánchez-Sáez deaa85ad09 ORKActiveStepQuantityView: add space between binary operators 2015-07-30 14:36:03 +02:00
Ricardo Sánchez-Sáez 415a937a7e ORKTest's MainViewController: homogenize constraint code 2015-07-30 14:31:51 +02:00
Ricardo Sánchez-Sáez e15906aeb8 CustomRecorder: homogenize constraint code 2015-07-30 14:14:11 +02:00
Ricardo Sánchez-Sáez 61f9470d84 CustomRecorder: fix green filler view and orange tappable button layout 2015-07-30 14:12:13 +02:00
Ricardo Sánchez-Sáez 853adebbcd ORKVerticalContainerView: rename constraint methods 2015-07-30 12:56:43 +02:00
Julien Thérier 0c39747462 Add first views. 2015-07-30 09:13:30 +02:00
Jamie Cox 311789b4dc resolve merge conflict 2015-07-30 00:12:27 +01:00
Oliver Schäfer 6c52fec789 Changed hasBeenPresented implementation to be a property 2015-07-29 21:47:13 +02:00
Oliver Schäfer 8b18c901f4 Added hasBeenPresented method to address issue #326 2015-07-29 21:30:53 +02:00
Umer Khan a50ae54c6a Fixed bug in ORKNumericAnswerFormat where the value shown is the full decimal. 2015-07-29 11:09:21 -07:00
Ricardo Sánchez-Sáez 7d9e48a8a6 ORKVerticalContainerView: refactor constraint code
- Homogenize code.
- Add constraints by activation.
- Enable autolayout only once for container views.
- Extract static constraint setup to its own method
- Use direct constraint variables instead of dictionary for adjustable constraints.
- Extract some constraint activation/deactivation out from updateConstraintConstants method.
2015-07-29 19:23:10 +02:00
Ricardo Sánchez-Sáez e75f76a1e6 ORKVerticalContainerView: first pass at constraint code homogenization 2015-07-29 18:13:40 +02:00
Julien Thérier 6026246a4b Remove shouldContinueOnFinish override. 2015-07-29 10:03:31 +02:00
Julien Thérier e5ac86f029 First draft for hpt task. 2015-07-29 09:29:51 +02:00
Yuan Zhu 51f9006a59 Merge pull request #331 from rsanchezsaez/rsanchezsaez-compactcontinuebutton
Reduce continue button height on compact vertical size classes
2015-07-27 12:48:51 -07:00
Ricardo Sánchez-Sáez 1ef8b48d2a ORKWalkingContentView: make constraints static 2015-07-25 14:21:44 +02:00
Ricardo Sánchez-Sáez b19f2e06a8 ORKToneAudiometryContentView: refactor constraint code
- Homogenize code.
- Make constraints update after moving to a new window.
2015-07-25 14:13:04 +02:00
Ricardo Sánchez-Sáez 8912749a75 ORKTextFieldView: make constraints static 2015-07-24 21:16:30 +02:00
Yuan Zhu 7c37a54bb2 Merge pull request #312 from umerkhan-apple/iss261
IOI # 261 - Exposing keyboard type property
2015-07-24 10:50:35 -07:00
Umer Khan 537c0a03d5 Updated comment for URL keyboard example. 2015-07-24 10:40:00 -07:00
Ricardo Sánchez-Sáez 033719036f ORKTappingContentView: make constraints static and homogenize code 2015-07-24 18:10:39 +02:00
DanKeen 6e5552d929 Merge pull request #333 from rsanchezsaez/rsanchezsaez-typos
Fix small typos (deleagte -> delegate)
2015-07-24 08:27:54 -07:00
Ricardo Sánchez-Sáez 58edda4a9c Fix small typos 2015-07-24 16:18:51 +02:00
Julien Thérier 78a32cacc9 Change distance to distanceInMeters. 2015-07-24 09:33:23 +02:00
Julien Thérier 2a77a97cc2 Use copy for NSArray properties. 2015-07-24 09:10:52 +02:00
Julien Thérier 07f41ae7d1 Fix timed-walkingman-return@2x.png stopwatch orientation. 2015-07-24 09:05:49 +02:00
Julien Thérier 4bde825ba0 Create task in the list 2015-07-24 09:01:43 +02:00
Umer Khan f222b97ca1 Refactored logic for a textField delegate callback. 2015-07-23 15:04:52 -07:00
Ricardo Sánchez-Sáez 48387caea9 ORKContinueButton: add constraints comments
Also, avoid activating constraints multiples times.
2015-07-23 20:44:17 +02:00
Yuan Zhu 8832fc1a0c Merge pull request #330 from rsanchezsaez/rsanchezsaez-navigationrules
Enhance argument validation for Predicate Step Navigation Rule
2015-07-23 11:20:41 -07:00
Ricardo Sánchez-Sáez ad5aa9912b ORKStepHeaderView: use constraint ivars instead of dictionary (clearer and safer) 2015-07-23 20:13:19 +02:00
Ricardo Sánchez-Sáez 43c6e8b72b ORKStepHeaderView: fix issue in which constraints were not correctly updated for the after moving to a new window 2015-07-23 20:02:01 +02:00
Ricardo Sánchez-Sáez 650c9154b5 ORKSurveyAnswerCellForTextField: make constraints static 2015-07-23 19:42:33 +02:00
Ricardo Sánchez-Sáez deeec06e03 ORKTableContainerView: make constraints static 2015-07-23 19:09:46 +02:00
Ricardo Sánchez-Sáez 2737e60305 ORKSurveyAnswerCellForText: make constraints static and homogenize code 2015-07-23 19:02:24 +02:00
Ricardo Sánchez-Sáez 662e2f746b ORKSurveyAnswerCellForPicker: make constraints static 2015-07-23 18:56:45 +02:00
Ricardo Sánchez-Sáez 43488a1145 ORKSurveyAnswerCellForNumber: refactor constraint code
- Homogenize code.
- Make constraints static.
- Add constraints by activation.
2015-07-23 16:29:07 +02:00
Ricardo Sánchez-Sáez 6d0bd6a66d ORKStepHeaderView: refactor constraint code
- Homogenize code.
- Move initial constraint creation to their own method.
- Add constraints by activation.
- Remove unneeded ivars.
2015-07-23 16:17:13 +02:00
Ricardo Sánchez-Sáez da76a7a174 ORKContinueButton: reduce button height on compact vertical size class on all devices except iPhone 6 Plus 2015-07-23 15:27:16 +02:00
Ricardo Sánchez-Sáez 36d57c9419 ORKSpatialSpanMemoryContentView: make constraints static 2015-07-23 14:40:10 +02:00
Ricardo Sánchez-Sáez 43c75d6d76 ORKNavigationContainerView: refactor constraint code
- Make sure [super updateConstraints] runs last.
- Make most constraints static.
- Add constraints by activation.
- Homogenize code.
2015-07-23 14:25:15 +02:00
Ricardo Sánchez-Sáez e5165b8aa5 ORKTest: slight rewrite to ORKNavigableOrderedTask example so it's easier to read 2015-07-23 13:37:35 +02:00
Ricardo Sánchez-Sáez 28b52a7114 ORKPredicateStepNavigationRule: add validation checking if objects in the passed arrays are of the correct class 2015-07-23 13:36:34 +02:00
Umer Khan 8f4bf262b6 Updated const formatting and added a fix for a bug in textfield cells. 2015-07-22 13:06:06 -07:00
Umer Khan c83351c201 PR updates. 2015-07-22 11:25:35 -07:00
Julien Thérier e9306c8965 Timed-walk active task. 2015-07-22 16:01:15 +02:00
Julien Thérier b0ca0c79db Create walking group. 2015-07-22 15:11:18 +02:00
Julien Thérier 71912aeb1d Update ORKWalkingTaskStepViewController. 2015-07-22 15:08:34 +02:00
Julien Thérier 62827cfefe Extract ORKProgressView. 2015-07-22 15:08:16 +02:00
Coxy bfd209d238 remove spaces 2015-07-21 23:23:50 +01:00
Coxy a6359e176a Add title to active step view 2015-07-21 22:57:15 +01:00
Umer Khan 25378ac9e0 Moved UITextFieldDelegate implementation into superclass UITextFieldBasedCell. 2015-07-21 14:13:18 -07:00
Umer Khan 0fc9bc54af Added PR changes. 2015-07-21 13:33:10 -07:00
Yuan Zhu d89734a682 Merge pull request #306 from brucehappy/issue_228
Implementation of issue #228
2015-07-21 13:15:27 -07:00
Yuan Zhu 318377993c Merge pull request #327 from YuanZhu-apple/issue_294
Fix issue 294, adaptive UI for non-optional single choice step
2015-07-20 15:26:12 -07:00
Yuan Zhu 97ed959b62 Fix issue 294, adaptive UI for non-optional single choice step
- Show choice cells with nextButton on step has an answer
- Show arrowed choice cells without next button on step has no answer
2015-07-20 12:59:17 -07:00
Coxy de40dd7802 rename TOWER_OF_HANOI_TASK_TASK_INTRO_TEXT_FORMAT for correctness 2015-07-18 10:55:38 +01:00
Coxy a6d032db7b prefix constant with k, revert spacing change 2015-07-17 00:51:40 +01:00
Coxy 9453a0c4f7 fix result hierarchy issue, refactor lazy instantiations, adhere to if else code style convention, other small refactorings 2015-07-17 00:46:28 +01:00
Yuan Zhu 39138f818b Merge pull request #326 from umerkhan-apple/iss325
IOI # 325 - Delegate bug in ORKTaskViewController with restorationData
2015-07-16 12:46:26 -07:00
Yuan Zhu ba62daa43c Merge pull request #324 from umerkhan-apple/iss323
IOI # 323 - Refactored ORKRecorder's logName
2015-07-16 11:17:02 -07:00
Ricardo Sánchez-Sáez d146c50cf0 ORKFormItemTextCell, ORKFormItemImageSelectionCell, ORKFormItemScaleCell: refactor constraint code
- Add constraints by activation.
- Homogenize code.
2015-07-16 18:51:09 +02:00
Ricardo Sánchez-Sáez bd6d36fa31 ORKFormItemTextFieldBasedCell: refactor constraint code
- Add constraints by activation
- Homogenize code.
2015-07-16 18:41:11 +02:00
Coxy c502a8a06d Remove dirty newline: Set minimumStepHeaderHeight instead for consistent layout with localized strings 2015-07-16 15:31:16 +01:00
Coxy 952b837a09 ORKTowerOFHanoiResult now includes move records, various refactorings, add documentation 2015-07-16 13:06:09 +01:00
Umer Khan 4aa8a67e99 Fixed delegate bug in ORKTaskViewController when initializing with restorationData. 2015-07-15 16:23:55 -07:00
Umer Khan 0f1a234076 Removed identifiers from logName and added recorderUUID. 2015-07-15 15:50:29 -07:00
Coxy 1b61c97a44 add conclusion step to ordered task for consistency 2015-07-15 20:10:48 +01:00
Coxy 43424a4727 make suggested changes 2015-07-15 20:00:16 +01:00
Ricardo Sánchez-Sáez 27a777a3e7 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints 2015-07-15 19:54:08 +02:00
Umer Khan c5809e2f71 Refactored order of step identifier and recorder identifier. 2015-07-15 10:41:25 -07:00
Coxy 632bbd399b invert highlighting of selected disk 2015-07-15 17:13:22 +01:00
Coxy1989 966f8e737d Merge pull request #2 from rsanchezsaez/coxy-toh
Add custom Tower of Hanoi task images
2015-07-15 17:04:30 +01:00
Ricardo Sánchez-Sáez d6297d2300 Add custom Tower of Hanoi task images 2015-07-15 17:27:39 +02:00
Coxy a85ce60704 revert committed redundant change 2015-07-15 09:31:59 +01:00
Coxy b17f01425c Print warning if the number of disks is not sensible + Refactorings suggested in PR. 2015-07-15 09:29:50 +01:00
Umer Khan 1573b011b6 Added step identifier to ORKRecorder logName. 2015-07-14 14:47:36 -07:00
Bruce Duncan 584394be4f Changed both accessibility properties to copy. Updated the example accessibilityInstructions in ORKTest. Updated the accessibilityInstructions documentation to include a better description and example usage. 2015-07-14 15:36:04 -04:00
Umer Khan 5f568e7516 Fixed character count bug for textAnswerFormat with maximum length. 2015-07-14 11:33:58 -07:00
Yuan Zhu 188a96bb4b Merge pull request #315 from umerkhan-apple/iss310
Implementation of issue # 310 - Custom title glitch for bar button items.
2015-07-14 10:41:40 -07:00
Umer Khan f066f4ff4b Added 'isEmailAddress' validation for isEqual in ORKTextAnswerFormat. 2015-07-13 16:19:50 -07:00
Umer Khan 285a04853f Added documentation for setupButtons method placement. 2015-07-13 14:42:27 -07:00
Coxy 255f810b6c Re-implement time formatting with NSDateComponentsFormatter 2015-07-12 19:06:03 +01:00
Umer Khan 84b8501b63 Fixed learnMoreButtonTitle not updating title text. 2015-07-10 15:15:43 -07:00
Yuan Zhu 3e51248aae Merge branch 'master' into ios9 2015-07-10 14:33:22 -07:00
Umer Khan 2054b39cc7 Fixed learnMoreButtonTitle not updating issue. 2015-07-10 11:27:54 -07:00
Coxy 979ba19958 Tower selection color scheme is now visually consistent with RK, Redundant Plist change is reverted, feature is now included in ORKTest 2015-07-10 09:39:46 +01:00
Umer Khan 00d469ca9b Fixed code format for if statement. 2015-07-09 17:36:07 -07:00
Umer Khan 268367bfbe Refactored text and email answer validation. 2015-07-09 17:30:41 -07:00
Umer Khan f7f6143f34 Added context alerts for text and email form items & updated Mini Form in test app. 2015-07-09 14:33:40 -07:00
Yuan Zhu df7428f8c0 Merge pull request #317 from danoli3/ios9-example-fix
Fix: Initializing from a metatype must reference 'init' explicitly
2015-07-09 11:27:35 -07:00
Umer Khan 019742bfc7 Moved validation code from ORKSurveyAnswerCell to ORKAnswerFormat. 2015-07-09 11:10:30 -07:00
Umer Khan 6d20008857 Updated invalid text alert message in localization file. 2015-07-09 10:37:29 -07:00
Umer Khan 86adf5093f Updated text answer validation for email address. 2015-07-09 10:36:13 -07:00
Ricardo Sánchez-Sáez fdedacaa51 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints 2015-07-09 15:46:58 +01:00
Coxy 7c9ebe1960 Add Tower of Hanoi Task 2015-07-09 13:10:54 +01:00
Daniel Rosser ef606e38ac Fix: Initializing from a metatype must reference 'init' explicitly 2015-07-09 15:54:38 +10:00
Bruce Duncan b6dce69805 Per feedback from @umerkhan-apple, renamed accessibilityHint on the ORKImageCaptureStep to be accessibilityInstructions, and then added a new accessibilityHint property that represents the accessibilityHint on the "Capture Image" button. 2015-07-08 23:14:43 -04:00
Umer Khan c005814613 Fixed navigation bar button glitch when switching views with custom title. 2015-07-08 15:24:14 -07:00
Allen Tu 1ecf1d7027 Merge remote-tracking branch 'ResearchKit/master' 2015-07-08 13:20:44 -07:00
Umer Khan 324048d709 Modified localized invalid email alert message. 2015-07-07 17:43:16 -07:00
Umer Khan 12ef17ec90 Updated unit tests for ORKEmailAnswerFormat. 2015-07-07 16:35:31 -07:00
Yuan Zhu c856b29933 Merge pull request #314 from ubik2/master
Fix issue #313 Special case handling for HKUnit percentUnit
2015-07-07 16:22:01 -07:00
Umer Khan 4e56c56985 Moved answerFormat from ORKAnswerFormat_Internal to ORKAnswerFormat. 2015-07-07 16:18:11 -07:00
Umer Khan f85964f2f9 Added alert for maximum length exceeded in a text answer. 2015-07-07 16:01:35 -07:00
Robin McCollum 548b38924b Fix issue #313 Special case handling for HKUnit percentUnit default form values 2015-07-07 15:47:21 -07:00
Umer Khan 5665d02cab Updated localizedInvalidValueStringWithAnswerString for email validation only. 2015-07-07 11:06:51 -07:00
Umer Khan 5ae1252bff Fixed ORKSurveyAnswerCellForText email validation. 2015-07-07 10:24:51 -07:00
Umer Khan 3cc9ddcb02 Updated localizedInvalidValueStringWithAnswerString for ORKTextAnswerFormat. 2015-07-06 17:51:45 -07:00
Umer Khan 8a01f9c741 Implemented PR changes. 2015-07-06 17:45:15 -07:00
Umer Khan 3ed95dec20 Updates from PR. 2015-07-06 17:03:47 -07:00
Umer Khan 3d33bb4061 Removed extra imports from ORKAnswerFormatTests. 2015-07-06 16:59:43 -07:00
Umer Khan 1838ebd9cd Added unit tests for email answer format regex validation. 2015-07-06 16:58:16 -07:00
Umer Khan e7058383cf Added ORKFormItemCell implementation for ORKEmailAnswerFormat with MiniForm Test. 2015-07-06 15:30:59 -07:00
Umer Khan cafbd3efb4 Removed ORKQuestionTypeEmail from implementation. 2015-07-06 15:10:53 -07:00
Umer Khan 02fade4c5c Revert correctValueIfNeeded in ORKSurveyAnswerCellForText back to original implementation. 2015-07-06 13:37:59 -07:00
Umer Khan ecdfacd8e4 Added questionResultClass to ORKEmailAnswerFormat. 2015-07-06 13:32:43 -07:00
Umer Khan 4a37a54f24 Updated the documentation for ORKEmailAnswerFormat 2015-07-06 13:27:35 -07:00
Umer Khan 82d1d32149 Added ORKEmailAnswerFormat test into Selection Survey. 2015-07-06 12:53:58 -07:00
Umer Khan ea189b85c5 Add class method implementation for ORKEmailAnswerFormat. 2015-07-06 10:39:08 -07:00
Yuan Zhu 75e5f6846f Merge pull request #307 from weijentu/master
ORKHTMLPDFWriter generates an extra empty page when useMetric is true
2015-07-06 10:19:55 -07:00
Umer Khan d25ee99dd6 Added ORKEmailAnswerFormat to support email answers. 2015-07-02 16:53:35 -07:00
Umer Khan ffef2ffef3 Updating comment for numer pad keyboard test. 2015-07-02 13:56:28 -07:00
Umer Khan eef7a42501 Updating ORKTest with a textAnswerFormat using a number pad keyboard. 2015-07-02 13:39:36 -07:00
Umer Khan 01231010cd Merge remote-tracking branch 'upstream/master' into iss261 2015-07-02 13:29:17 -07:00
Bruce Duncan 90448fe9b4 Per discussion with @umerkhan-apple, removed the recaptureAccessibilityHint and renamed the remaining property to simply be accessibilityHint. Added a new accessibilityLabel localized string for when the preview is showing a captured image. 2015-07-02 16:27:23 -04:00
Umer Khan 8808da5225 Exposed keyboard type property on text entry fields. 2015-07-02 13:22:14 -07:00
Allen Tu 679f8f7f6b ORKHTMLPDFWriter generate an extra empty page when useMetric is true
When useMetric is true, ORKHTMLPDFWriter is going to generate an extra
empty pages before the signature page. To gain little more pixels can
omit this extra empty page.
2015-07-02 09:58:51 -07:00
Yuan Zhu e258f01e0a Merge pull request #304 from weijentu/master
Reverse family/given name order for zh, ko and ja
2015-07-01 16:49:47 -07:00
Allen Tu da117c191f Address an issue that the method familyNameFirstLangs to be constructed multiple times
inline keyword would actually copy the code to the places where it get
referenced. It causes static dispatch_once_t onceToken and static
NSArray *familyNameFirstLangs to be duplicated.
2015-07-01 16:34:55 -07:00
Bruce Duncan 4072b6e285 Implementation of issue #228, with a separate hint for each of the two different modes of the preview view. 2015-07-01 19:11:04 -04:00
Allen Tu dfda44c635 Make the separator explicit 2015-07-01 15:55:55 -07:00
Allen Tu 130c172a6e Move currentLocalePresentsFamilyNameFirst to ORKHelpers
Move currentLocalePresentsFamilyNameFirst to ORKHelpers
2015-07-01 15:38:02 -07:00
Allen Tu 926d6f4a4b Reverse family name first in language configuration with a prefix @"zh", @"ko" or @"ja" when making a pdf consent
Reverse family name first in language configuration with a prefix
@"zh", @"ko" or @"ja" when making a pdf consent
2015-07-01 13:29:46 -07:00
Yuan Zhu 286c26359d Merge pull request #301 from umerkhan-apple/master
Localization for numbers throughout the ResearchKit
2015-07-01 13:05:08 -07:00
Umer Khan bf6c081869 Refactored macro and number formatter for tapping test. 2015-06-29 17:05:43 -07:00
Umer Khan 981103e54c Localized numbers for tapping count. 2015-06-29 16:13:42 -07:00
Umer Khan 16c1b736bc Updated the Localizable.strings files. 2015-06-29 15:36:36 -07:00
Umer Khan 6dabdf1ec1 Refactored localization code with macro. 2015-06-29 15:08:08 -07:00
Umer Khan d4e88e28cb Reverting minor change in Localizable.strings files. 2015-06-29 11:44:49 -07:00
Umer Khan 4fad188807 Minor fix in localized strings file for English (UK). 2015-06-29 11:40:05 -07:00
Umer Khan 399ea5b117 Localized numbers throughout the kit 2015-06-29 11:18:05 -07:00
Yuan Zhu 6fd991a0d7 Merge pull request #298 from YuanZhu-apple/master
Fix issue #292 Value picker in a non optional form allows going to next step
2015-06-26 10:07:46 -07:00
Yuan Zhu 88b1559ad9 Merge pull request #293 from shazino/ork_catalog-app-icon
Add AppIcon for ORKCatalog app
2015-06-23 16:09:38 -07:00
Yuan Zhu 197e0205c6 Remove debug code 2015-06-20 23:53:50 -07:00
Yuan Zhu bdc136b184 Fix issue #292 Value picker in a non optional form allows going to next step
Add a common method `ORKIsAnswerEmpty(id answer)` to judge if an answer is empty.
Also add a non optional form step in ORKTest.
2015-06-20 23:52:08 -07:00
Coxy f98574a483 correct dumb error 2015-06-18 11:16:24 +01:00
Coxy b4e463ed21 make PR suggested changes 2015-06-18 09:13:35 +01:00
Coxy 36a4d7e200 Pie chart title layout is now customisable, apply refactoring suggestions in PR, ORKAxisView now uses autolayout. A few other small changes for cosmetic reasons and consistency 2015-06-17 19:56:46 +01:00
Yuan Zhu 892404fd59 Merge pull request #204 from rsanchezsaez/rsanchezsaez-codingstyleguide
Add coding-sytle-guide.md document
2015-06-16 14:44:35 -07:00
Ricardo Sánchez-Sáez 73bb8b00a5 Coding Style Guide: personalize copyright line in example header 2015-06-16 15:13:13 +01:00
Coxy 54442f56cc pie chart now appears first in catalog, title / text labels now appear above pie chart, pie chart animation is now visible, cosmetic / style issues now resolved. 2015-06-15 19:18:05 +01:00
Ricardo Sánchez-Sáez bc3640c776 Coding Style Guide: add hard wrap guideline to appledoc section 2015-06-15 11:08:34 +01:00
Ricardo Sánchez-Sáez c659231e85 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-codingstyleguide 2015-06-14 23:00:28 +01:00
Ricardo Sánchez-Sáez 2b7efb3d9b Coding Style Guide: add appledoc section 2015-06-14 22:59:07 +01:00
Ricardo Sánchez-Sáez 6e1200ec0f Coding Style Guide: remove redundant wording 2015-06-14 22:33:45 +01:00
Ricardo Sánchez-Sáez 34f63d94e1 Coding Style Guide: add note about implicit nil initialization of object pointers 2015-06-14 22:33:45 +01:00
Ricardo Sánchez-Sáez 23c8f0c3a1 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-codingstyleguide 2015-06-14 22:33:45 +01:00
Ricardo Sánchez-Sáez b7b1cc74eb Add coding-style-guide.md document
Link it from CONTRIBUTING.md. Also: move dependency-management.md to the new docs-standalone folder.
2015-06-14 22:33:45 +01:00
Julien Therier a06c6488a4 Add AppIcon for ORKCatalog app 2015-06-14 16:42:22 +02:00
Yuan Zhu 80bed1dec2 Merge pull request #273 from brucehappy/stepheaderviewlayout
Allow caption and instruction labels to grow or shrink in step header view
2015-06-12 11:22:40 -07:00
Bruce Duncan e31b8f21f8 Moved existing layout debug code up into the initializer and changed the colors to match each separate component's background color. 2015-06-12 14:07:26 -04:00
Yuan Zhu 85cd25741a Merge pull request #265 from rsanchezsaez/rsanchezsaez-imagecapture
Fix Image Capture View constraints not being updated after a rotation
2015-06-12 10:19:53 -07:00
Bruce Duncan 3c01156ea9 Changed the layout debug colors to use alpha. Removed setting of default hugging priority in initializer for caption and instruction labels. 2015-06-12 11:27:39 -04:00
Coxy 45bd2f28e3 line charts now animate out of snapped positions, pie chart line width is configurable and capped when it results in filled pie. 2015-06-12 10:09:10 +01:00
Bruce Duncan 71de23ce43 Merge branch 'master' into stepheaderviewlayout 2015-06-11 20:55:11 -04:00
Ricardo Sánchez-Sáez e2c081dd98 ORKImageCaptureView: use ivars instead of internal properties
Also hard-wraps constraint code.
2015-06-11 00:15:52 +01:00
Ricardo Sánchez-Sáez 040cd69ecf Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-imagecapture
# Conflicts:
#	ResearchKit/Common/ORKImageCaptureView.m
2015-06-11 00:07:10 +01:00
Yuan Zhu 6f44f74028 Merge pull request #278 from coxy1989/coxy-issue193
prevent ORKFormStepViewController proceeding to the next step if the …
2015-06-10 14:26:05 -07:00
Coxy c4bfa99597 improve readability, add documenting comment 2015-06-10 08:54:19 +01:00
Yuan Zhu 57cb115ac4 Merge branch 'stable' 2015-06-09 18:37:44 -07:00
Yuan Zhu fa5214c4bc Update ResearchKit.podspec
To 1.1.2
2015-06-09 18:35:52 -07:00
Yuan Zhu 84ad0d4072 Fix two warnings in release build. 2015-06-09 18:31:52 -07:00
Yuan Zhu 8b9cfb3082 Merge branch 'stable' 2015-06-09 18:17:51 -07:00
Yuan Zhu 9ed835007f Update ResearchKit.podspec
To 1.1.1
2015-06-09 18:15:44 -07:00
Coxy df71dd575e fix 2015-06-09 13:16:15 +01:00
jwe-apple 23d42e1883 Merge pull request #288 from jwe-apple/ios9
Support for iOS 9, Xcode 7, and Swift 2.
2015-06-08 18:35:17 -07:00
John Earl 6ee6c36483 Support for iOS 9, Xcode 7, and Swift 2. 2015-06-08 18:11:07 -07:00
jwe-apple 1e67f88a7f Merge pull request #287 from jwe-apple/serialization-nullability
Add nullability annotation to ORKESerialization
2015-06-08 18:10:07 -07:00
John Earl d616b26fc0 Add nullability annotation to ORKESerialization 2015-06-08 18:05:40 -07:00
John Earl c291842226 Merge branch 'convergence' 2015-06-08 16:51:11 -07:00
jwe-apple 67bc2884bb Merge pull request #286 from jwe-apple/translations-1.1
Localization update for ResearchKit 1.1
2015-06-08 16:49:28 -07:00
John Earl 3b3280bdda Review fix 2015-06-08 16:46:02 -07:00
John Earl 4fcb4b8cb6 Project file update 2015-06-08 16:42:24 -07:00
John Earl 7d7a25f77c Localization update for ResearchKit 1.1
Updates ResearchKit translations for new features for 1.1.
Incorporates some bug fixes to existing translations too, and
ensures that ORKTest app can be used for testing all the localizations.
2015-06-08 14:35:17 -07:00
Yuan Zhu 544352a288 Merge pull request #274 from niakrise/issue_259
Minor animation glitch when showing keyboard on a form #259
2015-06-08 14:27:38 -07:00
John Earl 33e0f03c37 Merge branch 'convergence' 2015-06-08 14:21:56 -07:00
jwe-apple 64f51aaa3c Merge pull request #285 from jwe-apple/speech
Fix speech rate on iOS 8.3 and earlier
2015-06-08 14:21:09 -07:00
jwe-apple f9b7b57e3a Merge pull request #284 from jwe-apple/viet
Vietnamese is a family name first language
2015-06-08 14:20:09 -07:00
jwe-apple 333053deb8 Merge pull request #283 from ResearchKit/revert-282-viet
Revert "Vietnamese is a family name first language"
2015-06-08 14:17:59 -07:00
jwe-apple 5a18717615 Revert "Vietnamese is a family name first language" 2015-06-08 14:17:39 -07:00
jwe-apple 6719ad01f0 Merge pull request #282 from jwe-apple/viet
Vietnamese is a family name first language
2015-06-08 14:17:05 -07:00
John Earl 8155c96d61 Vietnamese is a family name first language
Add Vietnamese to the list of such languages for consent review.
2015-06-08 14:16:00 -07:00
John Earl af6a62483a Fix speech rate on iOS 8.3 and earlier
Patch earlier this week adjusted the speech rate to use the default speech
rate. This is too fast a rate on iOS 8.3 and earlier.
2015-06-08 14:14:26 -07:00
jwe-apple 9d35a3842b Merge pull request #280 from YuanZhu-apple/master
Fix test failure in ORKTest
2015-06-08 14:08:11 -07:00
Yuan Zhu 5f73e4d1c2 Fix test failure in ORKTest
Make contentURL work as a bookmark URL.
2015-06-08 14:05:36 -07:00
John Earl 0cca4e0852 Merge branch 'convergence' 2015-06-08 09:54:17 -07:00
Coxy a823528eef prevent ORKFormStepViewController proceeding to the next step if the participant has typed an invalid value (issue #193) 2015-06-08 13:57:56 +01:00
Zoya Pribytkova 3c413f3088 resolved conflicts with master branch. 2015-06-08 18:41:56 +07:00
Zoya Pribytkova d155da245a Merge branch 'master' into issue_259 2015-06-08 18:37:32 +07:00
Zoya Pribytkova 5908b3a07b fixed #259 second case. (Switching between placeholder and suffix in ORKUnitTextField) 2015-06-08 14:54:47 +07:00
jwe-apple e88ed5d551 Merge pull request #272 from brucehappy/convergence_issue_242
Image Capture Step optional support
2015-06-07 20:32:31 -07:00
Bruce Duncan cfeb443255 Move all manipulation of the continue and skip buttons to an update function called by the functions that affect them. 2015-06-07 18:46:03 -04:00
Zoya Pribytkova b09c054c32 fixed #259 2015-06-06 19:26:03 +07:00
Bruce Duncan 88c207d285 Allow the captionLabel and instructionLabel to either shrink or grow when one is empty and the other is not 2015-06-06 05:30:36 -04:00
Bruce Duncan 9813ddc17e Do not allow the continue button to be used when set during an error state. This can happen in the simulator where there is no camera. 2015-06-06 03:46:37 -04:00
Bruce Duncan fa37135471 Prevent the file from being rewritten on initialization from a valid result. Clean up handleError slightly. 2015-06-06 03:37:56 -04:00
Bruce Duncan 90f4cc472a Removed if statement in capturePressed as only the "then" can now occur 2015-06-06 02:58:57 -04:00
Bruce Duncan c3254ecc46 Update the continue button if its not currently set to the capture button 2015-06-05 21:18:20 -04:00
Bruce Duncan 68623b97c2 Added support for optional. Fixed layout problem (thanks to @YuanZhu-apple #269). Reworked saving of continue and skip buttons. Made the ORKCatalog image capture step non-optional. 2015-06-05 19:59:04 -04:00
John Earl 442e55e14b Merge branch 'convergence' 2015-06-05 16:48:15 -07:00
Bruce Duncan ad707bf2a3 Merge branch 'issue_242' into convergence_issue_242 2015-06-05 18:21:14 -04:00
jwe-apple f9e5a898a2 Merge pull request #271 from YuanZhu-apple/convergence
In FormItemCell, lower a heightConstraint's priority
2015-06-05 14:58:55 -07:00
Yuan Zhu eef997cc1b In FormItemCell, lower a heightConstraint's priority to avoid conflicts with system supplied UIView-Encapsulated-Layout-Height constraint. 2015-06-05 13:11:36 -07:00
jwe-apple 4fac6c1c08 Merge pull request #268 from YuanZhu-apple/convergence
"Learn More" modal views: replace "Cancel" with "Done"  (Fix for #266)
2015-06-05 10:24:05 -07:00
Coxy 3be88f7d38 address PR review comments, new dynamic pie chart layout implementation 2015-06-05 16:51:06 +01:00
Yuan Zhu 781d95ab88 Change the method name as well. 2015-06-04 22:00:23 -07:00
Yuan Zhu 69c5c63e7b "Learn More" modal views: replace "Cancel" with "Done" (Fix for #266) 2015-06-04 20:14:56 -07:00
jwe-apple 955f1bede9 Merge pull request #205 from brucehappy/issue_186
Exclusive Text Choices - Issue #186
2015-06-03 18:31:54 -07:00
jwe-apple ededc79153 Merge pull request #220 from jamiedaniel/master
Display document in ORKConsentLearnMoreViewController
2015-06-03 18:31:34 -07:00
jwe-apple f36a059306 Merge pull request #267 from rsanchezsaez/rsanchezsaez-imagecapturefix
Fix image capture view constraints updating after rotation
2015-06-03 18:24:12 -07:00
Ricardo Sánchez-Sáez 2593b7ae99 ORKImageCaptureView: fix constraints not being updated after a rotation 2015-06-03 22:34:05 +01:00
Ricardo Sánchez-Sáez 1f3c0bd922 Merge remote-tracking branch '_upstream/master' into rsanchezsaez-imagecapture 2015-06-03 11:27:35 +01:00
Ricardo Sánchez-Sáez 143c29ea10 ORKImageCaptureView: fix constraints not being updated after a rotation 2015-06-03 11:14:35 +01:00
jwe-apple 512bed7505 Merge pull request #264 from brucehappy/fix_pr_262
Fix for compile error in #262
2015-06-03 00:08:02 -07:00
Bruce Duncan 91e8a9a370 Fixed renamed identifier reference 2015-06-03 02:58:07 -04:00
Bruce Duncan fd330506f2 Fix for #242 Experiencing an error will now completely shut down the image capture step, including removing the continue and skip buttons, and resulting in only error text shown in the view. 2015-06-03 02:50:50 -04:00
Yuan Zhu 600c8f0898 Merge pull request #262 from jwe-apple/test2
Fix tests and rename Device Motion Reaction Time to Reaction Time
2015-06-02 23:28:39 -07:00
John Earl 17219a81a2 Review changes. 2015-06-02 23:10:49 -07:00
John Earl c7a0f893a4 Add missing files 2015-06-02 19:01:15 -07:00
John Earl fbe97c7c53 Fix tests and rename Device Motion Reaction Time to Reaction Time
Makes all tests pass in both ORKTest and ResearchKit.
Fixes test failures introduced in #252.

Also fixes #257, renaming to ORKReactionTime...
2015-06-02 18:57:46 -07:00
jwe-apple 1f9ea2351c Merge pull request #258 from rsanchezsaez/jwe-nsurlserialization
ORKURLForRelativePath(): use NSURL methods instead of CFURL's
2015-06-02 18:17:47 -07:00
Ricardo Sánchez-Sáez 99db33cbc4 ORKURLForRelativePath(): use NSURL methods instead of CFURL's
Also: minor variable renames and whitespace conforming.
2015-06-02 22:12:55 +01:00
John Earl 1c52f9421b Minor fix (thanks @rsanchezsaez) 2015-06-02 12:28:11 -07:00
jwe-apple 2ff60bfc91 Merge pull request #252 from jwe-apple/nsurl-serialization
Exception when saving and restoring image capture step.
2015-06-02 12:25:54 -07:00
jwe-apple 784b9c266c Merge pull request #255 from rsanchezsaez/rsanchezsaez-imagecapture
Update image capture task images in ORKCatalog
2015-06-02 12:24:59 -07:00
jwe-apple 87d9a720c8 Merge pull request #254 from jwe-apple/consented
Add explicit consent review indication
2015-06-02 12:24:16 -07:00
John Earl 07005babf4 Review fix 2015-06-02 12:24:09 -07:00
jwe-apple 6a877cf70a Merge pull request #253 from jwe-apple/formstep
Issue #245: enable multiple section headers
2015-06-02 12:22:41 -07:00
John Earl 4358bd903f Review fixes. 2015-06-02 12:22:04 -07:00
jwe-apple f711545f8f Merge pull request #251 from jwe-apple/reaction-timeout
Reaction time task does not time out in sim
2015-06-02 11:53:53 -07:00
John Earl 591ee60003 Add conditional to address review feedback 2015-06-02 11:53:39 -07:00
jwe-apple 34d2fec94e Merge pull request #250 from jwe-apple/keyboard-hide
Keyboard does not hide when tapping on margins on iPad
2015-06-02 11:51:27 -07:00
jwe-apple 41e239fa2e Merge pull request #249 from jwe-apple/speechrate
Speech rate should use default speech rate
2015-06-02 11:51:12 -07:00
jwe-apple c05f998007 Merge pull request #248 from jwe-apple/textlayout
Fix unexpected text truncation
2015-06-02 11:50:05 -07:00
John Earl 0559b095af Review fix: align with contract of return type 2015-06-02 11:49:24 -07:00
Ricardo Sánchez-Sáez 8d95cf9c19 ORKCatalog: update image capture task images
Also, fix small issue in ORKImageCaptureCameraPreviewView.
2015-06-02 10:55:18 +01:00
John Earl 94333e65da Add explicit consent review indication
Adds a `consented` property to ORKConsentSignatureResult. This property
is true if the consent has been explicitly agreed by the user, and false
otherwise.

Added ORKESerializer support and verified unit tests pass.
2015-06-02 00:27:05 -07:00
John Earl 6c9312ffd8 Issue #245: enable multiple section headers
If multiple section headers are requested, they will now all display.
As a side effect, this also fixes #245.
2015-06-02 00:17:19 -07:00
John Earl 9e498684b2 Exception when saving and restoring image capture step.
If the app is terminated while on an image capture step, and restarted
by build and run from Xcode, an exception would occur while restoring.

This is a symptom of serializing NSURL's directly, rather than serializing
either a relative path or bookmark data. This matters because the path can
change after a reinstall or restore from backup.

Here we make two changes. First, the output directory in task and step
view controller is serialized as bookmark data rather than directly as a URL.
Secondly, for results serialization, NSURL references are stored as paths
relative to the NSHomeDirectory (i.e. the root of the writable sandbox).
2015-06-01 23:55:03 -07:00
John Earl 43359003ca Reaction time task does not time out in sim
The reaction time task was untestable in the simulator. Here, we add
support for both timing out the task in the simulator, and for using the
shake gesture in the simulator.
2015-06-01 22:54:36 -07:00
jwe-apple 8c2b897a8e Merge pull request #246 from rsanchezsaez/rsanchezsaez-imagecapture
Improvements to image capture active step
2015-06-01 22:37:40 -07:00
John Earl 61a67a4e26 Keyboard does not hide when tapping on margins on iPad
Steps to reproduce:
- Build and deploy ORKTest to iPad sim
- Miniform -> Weight
- Tap on weight, Keyboard appears
- Tap on side of screen

Actual result:
- Keyboard does not hide

Expected result:
- Keyboard should hide.

Fix: allow parent view to specify a different tap off scope for the tap off
gesture recognizer by exposing a tapOffView property on ORKTableContainerView.

This has no API impact, since ORKTableContainerView is internal to the framework.
2015-06-01 22:31:09 -07:00
John Earl 0f22145f37 Speech rate should use default speech rate
Using a speech rate relative to the maximum speech rate is error
prone.
2015-06-01 22:12:18 -07:00
John Earl 1bd8764245 Fix unexpected text truncation
In certain scenarios, the interaction of auto layout and the selection of
the preferredMaxLayoutWidth could result in text being abnormally
truncated.

This fix lets the labels in the headerview be full width, by reducing the
content hugging priority.

This is slightly less efficient from a rendering perspective but makes
the autolayout calculation more stable.
2015-06-01 21:49:33 -07:00
jwe-apple a6aa2fbab7 Merge pull request #247 from jwe-apple/timepicker2
Fix picker layout centering in certain conditions.
2015-06-01 21:25:48 -07:00
John Earl 43bd4897cd Fix picker layout centering in certain conditions.
The constraints implementation change updates to correct behavior, but did
not affect the actual bug.
2015-06-01 21:24:07 -07:00
Ricardo Sánchez-Sáez ce52ed22cc ORKImageCaptureStepViewController: log additional error on image write failure 2015-06-02 00:54:07 +01:00
Ricardo Sánchez-Sáez cac4c8bbeb ORKImageCaptureCameraPreviewView: add fade in/out animation to template image 2015-06-02 00:49:39 +01:00
Ricardo Sánchez-Sáez 54c3374f93 ORKImageCaptureCameraPreviewView: make template image to insets from actual video frame instead of superview frame
Compare running on iPad vs iPhone 6 to see the difference.
Also: use plain UIImageView instead of ORKTintedImageView for captureImageView.
2015-06-01 23:49:06 +01:00
Ricardo Sánchez-Sáez 34d80c8842 ORKImageCaptureView: use ORKBackgroundColor instead of hardcoded white color 2015-06-01 23:39:13 +01:00
Ricardo Sánchez-Sáez 25dec24ebf ORKTest: replace image capture example image 2015-06-01 23:29:54 +01:00
Jamie Daniel 1250da259d Merge remote-tracking branch 'upstream/master' 2015-06-01 00:24:26 -04:00
jwe-apple 58b512172d Merge pull request #239 from jwe-apple/imagecapture2
Issue #234 - Fix rotation behavior on iPad.
2015-05-31 15:55:09 -07:00
jwe-apple 3c49a02b1c Merge pull request #238 from jwe-apple/issue-236
Only attempt to create outputDirectory if it is non-nil
2015-05-31 15:52:57 -07:00
jwe-apple df31766f16 Merge pull request #240 from rsanchezsaez/rsanchezsaez-reactiontime
Reaction time task: fix issues
2015-05-31 15:52:41 -07:00
Ricardo Sánchez-Sáez bbfd809e84 ResultTableViewProviders: fix crash because ORKDeviceMotionReactionTimeResult's timestamp was selectable
Also corrects the selectable attribute of some non-selectable rows and removes unneeded code.
2015-05-31 13:34:27 +01:00
Ricardo Sánchez-Sáez 2eee55747a Reaction time task: fix issue which caused the failure animation not to show if shaking device before blue dot appeared
Also: avoid launching the failure animation twice if shaking the device while timeout failure animation was shown.
2015-05-31 12:59:55 +01:00
John Earl 06d1a23032 Issue #224 - Fix rotation behavior on iPad.
Existing listened for device orientation notifications, rather than status bar orientation.
Status bar orientation is the right one to listen for.
2015-05-30 23:22:11 -07:00
John Earl e458ec5845 Only attempt to create outputDirectory if it is non-nil 2015-05-30 20:16:18 -07:00
jwe-apple 2bb1eed6f4 Merge pull request #232 from rsanchezsaez/rsanchezsaez-reactiontime
Device motion reaction time code improvements
2015-05-30 20:01:31 -07:00
jwe-apple f66aead4da Merge pull request #237 from rsanchezsaez/rsanchezsaez-toneaudiometry
Tone audiometry: stop playing sound on step suspend
2015-05-30 19:59:36 -07:00
Ricardo Sánchez-Sáez 614b1d7080 ORKToneAudiometryPracticeStepViewController: stop playing tone on suspend, and restart on resume 2015-05-30 11:23:41 +01:00
Ricardo Sánchez-Sáez 8649fa8223 ORKDeviceMotionReactionTimeStep: add minimumStimulusInterval and timeout validation
Adds corresponding unit tests.
2015-05-30 11:05:37 +01:00
Ricardo Sánchez-Sáez fb939304b9 ORKDeviceMotionReactionTime: various code improvements (fixes error in step copy method)
Also:
- Refactor and simplify constraint code.
- Conform to whitespace conventions.
- Replace true/false usage by YES/NO.
- Use SystemSoundID instead of UInt32.
2015-05-29 14:40:29 +01:00
Ricardo Sánchez-Sáez 38707d4f67 ORKContinueButton: refactor constraint code
- Make most constraints static and lighten updateConstraints.
- Add constraints by activation.
2015-05-29 00:30:58 +01:00
Ricardo Sánchez-Sáez b5b3c61be0 ORKConsentSignatureController: refactor constraint code
- Make most constraints static and lighten updateConstraints.
- Add constraints by activation.
2015-05-29 00:29:45 +01:00
Ricardo Sánchez-Sáez 64f702b826 ORKActiveStepQuantityView: rename local variable (additionalConstraints -> constraints) 2015-05-28 23:23:18 +01:00
Ricardo Sánchez-Sáez fdef4d29bd Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints
# Conflicts:
#	ResearchKit/Common/ORKVerticalContainerView.m
2015-05-28 23:13:44 +01:00
Coxy 2e549a3825 Header comments first draft, some header refactoring, fix line chart scrubbing bug introduced in ~2 2015-05-28 18:00:50 +01:00
Coxy 7aa352d1ca address PR comments: mostly cosmetic 2015-05-28 11:24:55 +01:00
Jamie Daniel 94f82683de Merge remote-tracking branch 'upstream/master' 2015-05-27 15:12:17 -04:00
jwe-apple 3e23cd4b8b Merge pull request #229 from rsanchezsaez/rsanchezsaez-headerdocs
Fix overviews' example code warnings by using fenced code blocks
2015-05-27 10:52:15 -07:00
Jamie Daniel 849b7cefa5 Merge remote-tracking branch 'upstream/master' 2015-05-27 12:06:27 -04:00
Jamie Daniel f891adfaa9 Corrected decode for url and corrected tests for serialization. 2015-05-27 11:48:11 -04:00
Jamie Daniel b29818cb96 Correct name of method to match parameters scheme 2015-05-26 20:40:49 -04:00
Ricardo Sánchez-Sáez f8632a371d Fix HeaderDoc markdown template warnings by using fenced code blocks
It needs appledoc v2.2.1 (build 1334), which can be found here: https://github.com/tomaz/appledoc/pull/535
2015-05-26 23:29:25 +01:00
jwe-apple 097ff8dd63 Merge pull request #227 from jwe-apple/accessibility
Accessibility updates.
2015-05-26 13:30:00 -07:00
John Earl 22696a6d38 Accessibility updates.
- Annotates the image capture view in an image capture step as an image.
- Adds the slider range description labels to the VoiceOver range description.
2015-05-26 13:28:55 -07:00
John Earl 81acc7bbd9 Issue #222 - Bump versions to 1.1 2015-05-26 13:17:55 -07:00
jwe-apple 98980500ec Merge pull request #225 from rsanchezsaez/rsanchezsaez-scaleconstraints
Fix autolayout warnings after rotation on form with vertical scales
2015-05-26 13:14:33 -07:00
Jamie Daniel 21fdd1364c Display document in ORKConsentLearnMoreViewController TESTING
Fixes #215
2015-05-26 03:04:01 -04:00
jwe-apple 2ca06c44b2 Merge pull request #226 from rsanchezsaez/rsanchezsaez-headerdocs
Fix some erroneous HeaderDocs @param comments
2015-05-25 23:17:27 -07:00
Ricardo Sánchez-Sáez 06326d7ffe HeaderDocs: fix some erroneous @param comments 2015-05-26 00:55:09 +01:00
Ricardo Sánchez-Sáez bc7ea01397 ORKScaleSliderView: fix autolayout warnings on form with vertical scales rotation (#202)
Also simplifies vertical scale autolayout code.
2015-05-26 00:18:03 +01:00
jwe-apple dbe906e7ec Merge pull request #223 from rsanchezsaez/rsanchezsaez-navigationrules
Step navigation rules: rename 'matchingStepIdentifiers' to 'destinationStepIdentifiers'
2015-05-25 14:05:28 -07:00
jwe-apple bde087d3b3 Merge pull request #217 from rsanchezsaez/rsanchezsaez-visualconsent
Add optional tinted image cache (only enabled for consent step view controller)
2015-05-25 13:55:22 -07:00
Ricardo Sánchez-Sáez c3b353783f Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules 2015-05-25 21:53:53 +01:00
Ricardo Sánchez-Sáez 53bcccdc87 ORKStepNavigationRule: rename 'matchingStepIdentifiers' by 'destinationStepIdentifiers' 2015-05-25 21:53:36 +01:00
jwe-apple 94b644ca6f Merge pull request #221 from ayushgoel/master
Make plist to strings script DRY
2015-05-25 13:47:36 -07:00
Ricardo Sánchez-Sáez d25bdbe953 ORKVisualConsentStepViewController: preload next consent section image only
(Instead of loading the whole view controller.)
2015-05-25 20:07:32 +01:00
Ricardo Sánchez-Sáez 3af24d1828 ORKConsentSection: move image loading from controller to internal property
Also moves ConsentSection+AssetLoading contents to main file.
2015-05-25 19:50:43 +01:00
Ayush Goel 117c84d06a Make plist to strings script DRY
Refactor repeated code to create a function
2015-05-25 10:20:10 +05:30
Jamie Daniel 966790eb47 Display document in ORKConsentLearnMoreViewController
Fixes #215
2015-05-24 00:34:16 -04:00
Jamie Daniel 6b3dd56772 Display document in ORKConsentLearnMoreViewController
Fixes #215
2015-05-22 13:24:27 -04:00
Ricardo Sánchez-Sáez 180294ce71 ORKTintedImageView: fix error with animated image tinting 2015-05-22 16:10:19 +01:00
Bruce Duncan 10f89bd445 Removed unused variables 2015-05-22 02:44:09 -04:00
Bruce Duncan 32f580eca9 Missed some uses of choiceWithText 2015-05-22 02:04:34 -04:00
Bruce Duncan b858656fde Removed extraneous choiceWithFormat factory methods and changed code that called them. 2015-05-22 01:48:12 -04:00
Bruce Duncan accc78709c Reworked existing single choice test to take in the format and choices, so that I could use it to test an answer in multiple mode, but that has a set of choices where all are exclusive. Added a two exclusive choice test which tests exclusives unselecting other exclusives. 2015-05-22 01:38:53 -04:00
Ricardo Sánchez-Sáez 6bc2d35a94 ORKVisualConsentStepViewController & ORKTintedImageView: add optional tinted image view caching (only enabled for consent step view controller) 2015-05-22 02:24:41 +01:00
jwe-apple 1fe84298a0 Merge pull request #216 from rsanchezsaez/rsanchezsaez-visualconsent
ORKEAGLMoviePlayerView: fix incorrect aspect ratio after rotation
2015-05-21 16:29:14 -07:00
Ricardo Sánchez-Sáez 5e6442d3a0 ORKEAGLMoviePlayerView: fix incorrect aspect ratio after rotation
Also:
- Add guards so GL functions aren't called if OpenGL is not setup.
- Delete program and buffers on dealloc.
2015-05-22 00:09:38 +01:00
jwe-apple 8fbcb42170 Merge pull request #212 from rsanchezsaez/rsanchezsaez-visualconsent
Fix visual content warnings and crash
2015-05-21 16:07:01 -07:00
Ricardo Sánchez-Sáez 63272ecbce ORKTintedImageView: return early and deindent method body 2015-05-22 00:00:50 +01:00
Bruce Duncan 6c4aafb174 Added copyright to ORKAnswerFormat. Removed convenience initializer for ORKTextChoice and changed the one instance of code using it, per @jwe-apple request. 2015-05-21 18:03:32 -04:00
Ricardo Sánchez-Sáez ea07a956b2 ORKImageByTintingImage: return early instead of indenting 2015-05-21 23:00:42 +01:00
Bruce Duncan 2ac8d2c5fd Broke getting the current text choice out onto a separate line for readability. 2015-05-21 17:56:57 -04:00
Ricardo Sánchez-Sáez be0df4d187 ORKTintedImageView: make sure animated images are tinted at proper scale 2015-05-21 22:04:08 +01:00
Ricardo Sánchez-Sáez 07f48c125b Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-visualconsent 2015-05-21 20:59:15 +01:00
jwe-apple b44cc8c072 Merge pull request #214 from jwe-apple/ui-review-2
UI review changeset
2015-05-21 10:11:29 -07:00
John Earl 5cd1562f6f UI review changeset
- Add comments to remind developers to be careful what images they use for image capture steps.
- Update wording for both active tasks
- Add an extra step before countdown for the audiometry active task and be more explicit about headphones
- Adjust color, size, and alignment of supplementary scale labels
- Turn off audio tone generation when inactive
2015-05-21 10:10:27 -07:00
jwe-apple 2240780a5b Merge pull request #209 from jwe-apple/ipad-fixes
Minor iPad layout fixes
2015-05-21 10:08:18 -07:00
jwe-apple 01a2de8934 Merge pull request #210 from jwe-apple/orktest-language
Minor changes to copy in ORKTest
2015-05-21 10:08:07 -07:00
Coxy fdd7a43d96 Dry up graph classes, address other PR comments 2015-05-21 17:13:51 +01:00
Ricardo Sánchez-Sáez fa966fa682 ORKVerticalContainerView: replace UIImageView by ORKTintedImageView
Tinting of consent images is now done by the ORKTintedView.
2015-05-21 14:49:07 +01:00
Ricardo Sánchez-Sáez 775e7f2520 ORKConsentSceneViewController: go back to using template rendering mode for consent images
It caused tinted consent images not to have the correct custom tint color and scale.
2015-05-21 14:36:58 +01:00
Ricardo Sánchez-Sáez ff50ceb63e ORKTintedImageView: avoid trying to tint a nil image 2015-05-21 14:11:46 +01:00
Ricardo Sánchez-Sáez b7b8b751f6 ORKVisualConsentStepViewController: fix crash when animator completion block was executed after deallocation 2015-05-21 14:09:21 +01:00
Ricardo Sánchez-Sáez fa5bbf3011 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-visualconsent 2015-05-21 13:57:05 +01:00
jwe-apple 952fc8c7ff Merge pull request #211 from jwe-apple/swift-changes
Swift review changes
2015-05-20 23:27:23 -07:00
John Earl e486bdef88 Swift review changes
The ORKCatalog changes for the image capture step have been reviewed for sample
code quality. A few minor changes ensue, mainly to simplify the syntax.
2015-05-20 23:24:49 -07:00
Ricardo Sánchez-Sáez 5047401252 ORKTest: add "Toggle Tint Color" button 2015-05-21 02:01:25 +01:00
John Earl 26dd857f0a Minor changes to copy in ORKTest
The ORKTest copy is not part of the framework, not particularly
user visible, but it's nice to keep it consistent.
2015-05-20 14:34:21 -07:00
John Earl 404e46f84b Minor iPad layout fixes
- Clip question step tableview to bounds to avoid visible artifact on
  consent sharing step.

- Make consent sharing step present its "learn more" content in a form sheet.
2015-05-20 14:26:53 -07:00
John Earl 17679ff56e Merge branch 'issue_1' of https://github.com/brucehappy/ResearchKit 2015-05-20 13:20:44 -07:00
jwe-apple b6b5f0accc Merge pull request #151 from rsanchezsaez/rsanchezsaez-navigationrules
Add navigable ordered task and step navigation rules
2015-05-20 13:06:57 -07:00
Ricardo Sánchez-Sáez e6a27ba94a Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints 2015-05-20 20:21:49 +01:00
Ricardo Sánchez-Sáez 6ce52bad33 Move ORKNullStepIdentifier to ORKStepNavigationRule and add HeaderDoc comment
Also: add explicit test in ORKNavigableOrderedTask; make ORKResultPredicateTaskIdentifierVariableName safer by prefixing string value by ORK.
2015-05-20 11:23:27 +01:00
Coxy c3cb9e042a Merge branch 'master' into coxy-graphs 2015-05-20 10:20:12 +01:00
Bruce Duncan 1194bafcad Neglected to mark exclusive a readonly property 2015-05-20 05:00:02 -04:00
Bruce Duncan 22124fc530 Implemented text choice exclusivity for the multiple-choice style. Exclusive choices can be used for things like "None of the above". 2015-05-20 04:45:19 -04:00
Ricardo Sánchez-Sáez 8bf354e741 ORKNavigableOrderedTask & ORKStep: add ORKNullStepIdentifier, to be used in step navigation rules when you want to end the ongoing task 2015-05-20 02:20:28 +01:00
Ricardo Sánchez-Sáez e725a6514a ORKTest: remove duplicate Reaction Time Task button 2015-05-20 02:04:54 +01:00
Ricardo Sánchez-Sáez bd4bf8ec38 Fix 'dizziness' typo 2015-05-20 01:06:55 +01:00
jwe-apple 0736e68401 Merge pull request #201 from jwe-apple/fix-identifiers
Fix identifier uniqueness issues
2015-05-19 14:50:26 -07:00
Ricardo Sánchez-Sáez f85ed88df3 ORKDirectStepNavigationRule: allow 'destinationStep' nullability
A direct step navigation rule with a nil destination step identifier can be used to finish the ongoing task early.
Also adds corresponding Unit Tests.
2015-05-19 21:43:05 +01:00
Bruce Duncan b6f4dbc345 Make sure that translatesAutoresizingMaskIntoConstraints is set to NO on init of the sub views, as well as self, both on init and if the constraints are updated. 2015-05-19 04:58:11 -04:00
Ricardo Sánchez-Sáez 853103ef1c Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
#	Testing/ORKTest/ORKTest/MainViewController.m
2015-05-19 09:28:18 +01:00
Ricardo Sánchez-Sáez 622af54829 ORKResultPredicate: use ORK_EXTERN for ORKResultPredicateTaskIdentifierVariableName
Also renames ORKTaskIdentifierResultPredicateVariableName to ORKResultPredicateTaskIdentifierVariableName.
2015-05-19 09:24:07 +01:00
John Earl 52f3d906a4 Fix ORKTest unit tests 2015-05-19 00:19:23 -07:00
John Earl 72217721cd Fix identifier uniqueness issues
1) Form items can have no identifier if they are just placeholders
for section headers in the table view. We should ignore the nil
identifiers for the purpose of the uniqueness check.

2) In ORKTest, the scale questions task had a non-unique step
identifier in it.
2015-05-19 00:02:03 -07:00
Bruce Duncan cde2e256f6 spacing 2015-05-19 01:39:14 -04:00
Bruce Duncan 05355b639c Changed the way ORKTintedImageView works, such that its shouldApplyTint will never override the renderingMode of the image provided to it. Updated the ORKCatalog and ORKTest image capture tasks to set the image renderingMode on the instruction steps to AlwaysTemplate to get them to tint. 2015-05-19 01:29:19 -04:00
Bruce Duncan 0842a0abb1 Renamed continuePressed to capturePressed for clarity. Added BOOLs to prevent processing capture or retake presses until the called delegate returns. 2015-05-19 00:31:49 -04:00
Bruce Duncan 6cdd9b81b6 Comment spacing and wrong word 2015-05-19 00:01:48 -04:00
Bruce Duncan f3c0bce4ff Fixed comment typo, and changed "the settings" to "Settings" 2015-05-18 23:02:48 -04:00
Bruce Duncan 54de137765 Inlined floatContinueView and fixed comment typo 2015-05-18 23:00:55 -04:00
Bruce Duncan b3bae6eebd Changed orientationChange to orientationDidChange 2015-05-18 22:57:38 -04:00
Bruce Duncan d2f6e1f0d0 Renamed hideTemplateImage to templateImageHidden, and getter to isTemplateImageHidden 2015-05-18 22:45:35 -04:00
Bruce Duncan ecce58e5a1 Reworked the check for overriding the continue button action 2015-05-18 22:33:12 -04:00
Bruce Duncan 40062a22a7 Reordered and relabeled the image capture step/task identifiers. 2015-05-18 20:49:54 -04:00
Bruce Duncan 9d47a69ccd Per @jwe-apple , handle the case of the continue button having its action change after it was first intercepted. 2015-05-18 20:46:06 -04:00
Ricardo Sánchez-Sáez 0ef6913118 ORKResultPredicate: make 'taskIdentifier' argument nullable
If you pass 'nil', the obtained result predicate will have a $TASK_IDENTIFIER substitution variable which will be replaced in ORKPredicateStepNavigationRule by the ongoing task identifier.

Also:
- Add convenience methods with no 'taskIdentifier' argument to ORKResultPredicate.
- Update ORKTest sample code to use convenience methods.
- Update Unit Tests to cover both convenience and regular nullable methods.
2015-05-19 00:21:30 +01:00
jwe-apple 66d978b37f Merge pull request #195 from rsanchezsaez/rsanchezsaez-activetaskimages
Add custom images for Tone Audiometry and Reaction Time tasks
2015-05-18 14:00:02 -07:00
jwe-apple 324192edef Merge pull request #190 from mattio/master
Update ORKFormStep API usage in the example snippet
2015-05-18 13:58:24 -07:00
John Earl 1df428f956 Add Apple copyright line (fixup from PR #200) 2015-05-18 13:57:53 -07:00
jwe-apple 6bcffa2368 Merge pull request #200 from alexbasson/fix-reverted-pr-198
Fix reverted pr 198
2015-05-18 13:55:55 -07:00
jwe-apple d9fe0c38bb Merge pull request #191 from rsanchezsaez/rsanchezsaez-doubleseparator
Avoid using magic number in ORKQuestionStepViewController
2015-05-18 13:43:18 -07:00
Coxy1989 39d3e3e0f2 Merge pull request #1 from rsanchezsaez/coxy-graphs
ORKCatalog: update the chart tab bar icon to a black template
2015-05-18 19:56:40 +01:00
Ricardo Sánchez-Sáez 9ff14d9f08 ORKCatalog: update the chart tab bar icon to a black template 2015-05-18 18:10:43 +01:00
Coxy 65a7fa342c fix pie chart overlapping dot / title layout issue 2015-05-18 17:24:02 +01:00
Ricardo Sánchez-Sáez ec8a764c06 Merge branch 'master' of github.com:rsanchezsaez/ResearchKit into rsanchezsaez-doubleseparator 2015-05-18 12:36:16 +01:00
Ricardo Sánchez-Sáez 291fa77606 Extract ORKScreenMetricMaxDimension (10000.0 magic number) to ORKSkin
Also goes back to using this constant for ORKQuestionStepViewController out of screen cell separator insets.
2015-05-18 12:33:49 +01:00
Ricardo Sánchez-Sáez 58b34e98a1 ORKResultPredicate: use NAN for ORKIgnoreDoubleValue and ORKIgnoreTimeIntervalValue (instead of DBL_MAX)
Also removes some unnecessary casts.
2015-05-18 11:59:55 +01:00
Alex Basson b7b7cd26a4 Add relevant copywrite headers 2015-05-18 06:35:29 -04:00
Ricardo Sánchez-Sáez a6cbe2a5d0 ORKStepNavigationRule appledoc: 'discretionarily' -> 'arbitrarily' 2015-05-18 11:33:16 +01:00
Alex Basson 0ffb0fd90b Revert "Revert "Tests for ORKConsentDocument""
This reverts commit 1529cd3a88.
2015-05-18 06:32:11 -04:00
jwe-apple db346ea955 Merge pull request #199 from ResearchKit/revert-198-tests-for-orkconsentdocument
Revert "Tests for ORKConsentDocument"
2015-05-18 01:13:22 -07:00
jwe-apple 1529cd3a88 Revert "Tests for ORKConsentDocument" 2015-05-18 01:12:59 -07:00
jwe-apple e8bd33b710 Merge pull request #198 from alexbasson/tests-for-orkconsentdocument
Tests for ORKConsentDocument
2015-05-18 01:10:02 -07:00
jwe-apple 339541a0c8 Merge pull request #197 from stownsend/master
_signaturePageContent not copied (fix for issue 196)
2015-05-18 01:02:00 -07:00
stownsend 20ba6f7bf0 Merge pull request #1 from stownsend/stownsend-patch-1
Update to ConsentDocument.m
2015-05-18 12:00:47 +10:00
stownsend dcdc1e6686 Update to ConsentDocument.m
Addressing issue 196, signaturePageContent is not copied on document copy.
2015-05-18 11:58:02 +10:00
Alex Basson e09ae87e63 Add tests for ORKConsentSignatureFormatter 2015-05-17 21:42:17 -04:00
Alex Basson 1958f073db Add tests for ORKConsentSectionFormatter
* reorganize consent-related tests into Consent group
2015-05-17 20:32:45 -04:00
Alex Basson 1cae0db303 Test ORKConsentDocument's makePDFWithCompletionHandler method
* Add ORKConsentSectionFormatter
* Add ORKConsentSignatureFormatter
2015-05-17 20:31:37 -04:00
Ricardo Sánchez-Sáez ad72ce7347 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-constraints 2015-05-17 21:51:24 +01:00
Ricardo Sánchez-Sáez 4cf953ec0f Add custom images for Tone Audiometry and Reaction Time tasks
Also, rename Reaction Time task in ORKCatalog and ORKTest (was Device Motion Reaction Time).
2015-05-17 20:51:51 +01:00
Bruce Duncan 46f5cf6fd8 Should not be importing the private header from ORKImageCaptureStepViewController.h, just import ORKDefines_Private.h in the .m. 2015-05-17 14:28:14 -04:00
Ricardo Sánchez-Sáez 977dab78dc ORKResultPredicate: re-work predicate to match both task identifier and question result identifier
You can now have question results with the same identifier as long as they are part of different task results. Supplying the desired task identifier with the predicate is now compulsory: use the current task identifier if you want to match the ongoing task; or use any of the task result identifiers if you add extra ones to ORKPredicateStepNavigationRule's 'additionalTaskResults' property.

This change:
- Adds the task identifier argument to all predicate-building methods.
- Allows better reuse of predicate building code.
- Modifies ORKPredicateStepNavigationRule and Unit Tests accordingly. Task results are no longer squashed into a question result array. The new result predicates match the ORKTaskResult tree in its original form.
2015-05-17 16:26:57 +01:00
Alex Basson 0855cabddf Refactor ORKConsentDocument to allow for dependency injection 2015-05-16 22:05:39 -04:00
Ricardo Sánchez-Sáez 38326f25f4 ORKResultPredicate: add ORKIgnoreDoubleValue and ORKIgnoreTimeIntervalValue constants.
You can pass them to 'double' or 'NSTimeInterval' maximumValue argument or minimumValue argument to ignore those. Also adds corresponding Unit Tests.
2015-05-16 20:44:32 +01:00
Ricardo Sánchez-Sáez d97c70dee6 ORKResultPredicate: replace float arguments by double; make time interval question of NSTimeInterval type
Also adds corresponding Unit Tests.
2015-05-16 20:32:06 +01:00
Ricardo Sánchez-Sáez 3545133d51 ORKDirectStepNavigationRule: add 'destinationStepIdentifier' property; ORKPredicateStepNavigationRule: add 'resultPredicates', 'matchingStepIdentifiers' and 'defaultStepIdentifier' properties
Also adds corresponding Unit Tests.
2015-05-16 17:40:51 +01:00
Ricardo Sánchez-Sáez f3f0d5540d ORKNavigableOrderedTask: make sure 'sourceIdentifier' can safely be nil in 'updateStepIdentifierStackWithSourceIdentifier:destinationIdentifier:'
The stack is cleared if 'sourceIdentifier' is nil.
Also: assert destinationIdentifier; fixed typo in sourceIdentifier argument name.
2015-05-16 17:27:07 +01:00
Ricardo Sánchez-Sáez 46d1e57d81 ORKNavigableOrderedTask: add 'navigationRuleForTriggerStepIdentifier:' method
Also fixes typo in 'updateStepIdentifierStackWithSourceIdentifier:' method.
2015-05-16 17:11:39 +01:00
Ricardo Sánchez-Sáez 49e9181001 Remove HeaderDoc comment marker on unavailable new and init methods 2015-05-16 17:00:21 +01:00
Ricardo Sánchez-Sáez e22e1144fb Navigation rules: improve HeaderDoc comments
Also: extract ORKResultPredicate implementation into its own file.
2015-05-16 16:55:43 +01:00
Ricardo Sánchez-Sáez ddb3d459f5 ORKOrderedTask, ORKNavigableOrderedTask, ORKStepNavigationRule, ORKResultPredicate: hard-wrap HeaderDoc comments at column 100 2015-05-16 13:22:52 +01:00
Ricardo Sánchez-Sáez 3c75a76ae2 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
#	ResearchKitTests/ORKTaskTests.m
#	Testing/ORKTest/ORKTest/MainViewController.m
2015-05-16 12:55:30 +01:00
Ricardo Sánchez-Sáez 14743d1868 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules
# Conflicts:
#	ResearchKit.xcodeproj/project.pbxproj
#	Testing/ORKTest/ORKTest/MainViewController.m
#	Testing/ORKTest/ORKTest/ORKESerialization.m
2015-05-16 11:35:48 +01:00
Ricardo Sánchez-Sáez 462cf41773 ORKQuestionStepViewController: avoid using magic number 2015-05-16 10:33:32 +01:00
Bruce Duncan 9d1918b361 Added image capture step to ORKCatalog sample. Renamed existing Image table cell to TextImage, and created new Image table cell that shows a UIImageView that respects aspect ratio. Use the new Image table cell when the ORKFileResult points at an image file. As ORKCatalog calls setContinueButtonItem multiple times, changed ORKImageCaptureView to handle it. 2015-05-16 02:30:50 -04:00
Bruce Duncan fac2badb47 Headerdoc added, and nullability marked. 2015-05-15 19:09:27 -04:00
Bruce Duncan 9c17ac09ac Removed shouldUsePercentageBasedTemplateImageInsets property and associated code. Template image insets are assumed to always be percentages. 2015-05-15 18:47:18 -04:00
Bruce Duncan bfaac8ad2f Rework the capture setup such that its clear we are either dealing with a device with no camera, or one that is not giving us permission to use the camera. Update the name of the localized strings to be clearer about the two error cases. 2015-05-15 18:41:18 -04:00
John Earl cb001e2f4e Merge fix for ORKTest 2015-05-15 14:54:05 -07:00
John Earl c7a91a19a9 Merge branch 'coxy1989-coxy-reactionTime' 2015-05-15 14:28:33 -07:00
John Earl 164a7a4415 Merge fix 2015-05-15 14:27:14 -07:00
John Earl df71c79fe5 Merge branch 'coxy-reactionTime' of https://github.com/coxy1989/ResearchKit into coxy1989-coxy-reactionTime 2015-05-15 14:24:48 -07:00
Mattio Valentino 88a2b86d3f Update ORKFormStep API usage in the example snippet 2015-05-15 16:54:29 -04:00
jwe-apple 93b5df5541 Merge pull request #185 from scelis/signature-multi-touch
Fix various multitouch issues in ORKSignatureView
2015-05-15 13:04:44 -07:00
jwe-apple 492ce201f1 Merge pull request #182 from rsanchezsaez/rsanchezsaez-visualconsent
Visual consent view controller cleanup and optimization
2015-05-15 13:04:04 -07:00
jwe-apple d8c2bc8b55 Merge pull request #179 from rsanchezsaez/garnett-identifiervalidation
Complete unique identifier validation for task steps and form step items
2015-05-15 13:01:00 -07:00
jwe-apple 8481b66de4 Merge pull request #189 from rsanchezsaez/rsanchezsaez-mergeconflicts
ORKTest: Fix remaining scale merge conflict
2015-05-15 12:38:32 -07:00
Ricardo Sánchez-Sáez 3462909cd7 ORKVisualConsentStepViewController: add debug log message if either semaphore wait times out 2015-05-15 20:22:46 +01:00
Ricardo Sánchez-Sáez 16477efe6a ORKTest: Fix remaining scale merge conflict 2015-05-15 20:15:19 +01:00
Ricardo Sánchez-Sáez 4fa8de266c ORKVisualConsentStepController: add comments explaining semaphore usage 2015-05-15 20:10:49 +01:00
Ricardo Sánchez-Sáez 38b6310d10 Extract ORKNavigableOrderedTask and ORKResultPredicate into their own files 2015-05-15 19:46:17 +01:00
jwe-apple 7d833c8262 Merge pull request #188 from rsanchezsaez/rsanchezsaez-doubleseparator
Fix double bottom separator in boolean and text choice questions
2015-05-15 10:59:02 -07:00
jwe-apple 14aa32074e Merge pull request #187 from rsanchezsaez/rsanchezsaez-mergeconflicts
Resolve tone audiometry merge conflicts
2015-05-15 10:58:11 -07:00
Ricardo Sánchez-Sáez 67fee928e0 ORKESerialization: remove debug log 2015-05-15 18:05:19 +01:00
Ricardo Sánchez-Sáez 94db7d392c ORKQuestionStepViewController: fix double bottom separator 2015-05-15 02:44:36 +01:00
Ricardo Sánchez-Sáez 38135994ab Resolve previous tone audiometry merge conflicts 2015-05-15 02:40:15 +01:00
Ricardo Sánchez-Sáez 23246cbcbb Resolve previous tone audiometry merge conflicts 2015-05-15 02:00:12 +01:00
Ricardo Sánchez-Sáez 267ff6e563 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-visualconsent 2015-05-15 01:59:07 +01:00
Ricardo Sánchez-Sáez d7fe76008a ORKConsentSceneView: load tinted image using 'ORKImageByTintingImage()' instead of 'imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate'
This greatly improves next step loading performance on ORKVisualConsentStepViewController.
2015-05-15 01:58:03 +01:00
John Earl 4a494bda70 Merge branch 'shazino-tone-audiometry' 2015-05-14 17:21:40 -07:00
John Earl c50120d64f Merge branch 'tone-audiometry' of https://github.com/shazino/ResearchKit into shazino-tone-audiometry 2015-05-14 17:21:11 -07:00
John Earl d2cf8eba0a Merge branch 'CareEvolution-ORKScaleSliderView' 2015-05-14 17:13:50 -07:00
John Earl e0ca725a42 Merge branch 'ORKScaleSliderView' of https://github.com/CareEvolution/ResearchKit into CareEvolution-ORKScaleSliderView 2015-05-14 17:13:38 -07:00
John Earl ce735a1835 Merge branch 'CareEvolution-NSNumberFormatterForScaleAnswerFormats' 2015-05-14 17:01:46 -07:00
John Earl fb316bb744 Merge branch 'NSNumberFormatterForScaleAnswerFormats' of https://github.com/CareEvolution/ResearchKit into CareEvolution-NSNumberFormatterForScaleAnswerFormats 2015-05-14 17:01:30 -07:00
Ricardo Sánchez-Sáez cc9f194a2d ORKVisualConsentStepViewController: restore semaphore with 5-second timeout (guard against the animator not finishing)
Also add completion block to 'showViewController:forward:animated:completion:'.
2015-05-15 00:03:56 +01:00
Ricardo Sánchez-Sáez c787d2a134 ORKVisualConsentTransitionAnimator: make sure current player stops on 'finish' 2015-05-15 00:01:29 +01:00
Ricardo Sánchez-Sáez 536d28f6d9 ORKEAGLMoviePlayerView: cleanup and avoid some redundant OpenGL calls
(Optimizations are very minor, as OpenGL is not the bottleneck.)
2015-05-14 22:13:04 +01:00
jwe-apple f20d81ee3f Merge pull request #184 from scelis/signature-dots
Allow users to add a dot to the signature view
2015-05-14 09:51:58 -07:00
Sebastian Celis 0518fd777d Ignore all extra touches in the signature view.
This commit fixes a couple of issues with extra touches in the signature
view:

* Adding a second touch while signing would cause the path to jump to
  the second touch, which is probably not what the user wanted.
* Once two touches were applied to the signature view, if both touches
  ended simultaneously, gestureTouchesEnded: would return before calling
  signatureViewDidEditImage: on the delegate. This could get the UI into
  an odd state where there is a signature in the view but no clear
  button below the view.

By ignoring the extra touches completely, we can also clean up the code
a little and remove the extra touches checks in the various touch event
handlers.
2015-05-14 10:08:33 -05:00
Sebastian Celis 9c1cf6c6bf Allow users to add a dot to the signature view.
Add a small circle to the current signature path in touchesBegan to
properly support dots in the signature view. This provides a nicer
experience to users, allowing them to dot their i's.
2015-05-14 09:59:37 -05:00
Coxy 51dc62a780 spelling errors, licence headers 2015-05-13 22:06:58 +01:00
Coxy fb5a7a3f48 UI improvements 2015-05-13 20:05:53 +01:00
Scott Guelich 3d91a933b9 Add percent support to continuous scales
Also adds a readonly numberFormat property to ORKScaleAnswerFormat and ORKContinuousScaleAnswerFormat that can be overridden by subclasses for currency, etc.
2015-05-13 09:23:35 -07:00
Ricardo Sánchez-Sáez f1e75f2ce7 ORKVisualConsentStepViewController: make sure target view controller image is not hidden when there is no animation 2015-05-13 16:57:15 +01:00
Ricardo Sánchez-Sáez 7dc37149f3 ORKVisualConsentStepViewController: much simpler video animator logic
Does away with the semaphore, providing instead a linear, block-based, logic for the page transition and video transition animation options.
Also fixes a bug in which back button wasn't appearing if showViewController:forward:animated:'s 'animated' was set to NO.
Finally, calls 'updatePageIndex' (which in turn shows/hides the back button) earlier. Back button it's now shown after page transition completes, instead of after video transition animation completes.
2015-05-13 16:46:22 +01:00
Ricardo Sánchez-Sáez c50e88b3c7 ORKVisualConsentAnimationContext: correct observing flag ivar names 2015-05-13 16:39:03 +01:00
Ricardo Sánchez-Sáez 90a1b8407c ORKVisualConsentTransitionAnimator: remove useless dealloc method
The animator is never deallocated unless you first send it 'finish' (the CADisplayLink retains it).
2015-05-13 16:24:16 +01:00
Ricardo Sánchez-Sáez 46990ba807 ORKVisualConsentStepViewController: code cleanup 2015-05-13 12:26:07 +01:00
Ricardo Sánchez-Sáez 6795808555 Merge branch 'master' of github.com:rsanchezsaez/ResearchKit into garnett-identifiervalidation 2015-05-13 10:33:38 +01:00
Ricardo Sánchez-Sáez 3b6262c4fe Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules
# Conflicts:
#	ResearchKit/Common/ORKHelpers.h
#	ResearchKit/Common/ORKVerticalContainerView.m
#	Testing/ORKTest/ORKTest/MainViewController.m
#	Testing/ORKTest/ORKTest/ORKESerialization.m
2015-05-13 10:33:09 +01:00
Bruce Duncan 9659fbb530 Moved requestedPermissions up into ORKStep from ORKActiveStep. Added a camera permission. Requested the permission from the image capture step. Added missing reference to the image capture step template image in the JSON serialization test. 2015-05-13 04:28:29 -04:00
Bruce Duncan 3b45807b87 Cleaned up imports and protocols (left over from early version) 2015-05-13 02:44:47 -04:00
jwe-apple 8ff919dc79 Merge pull request #181 from rsanchezsaez/rsanchezsaez-cleanup
HeaderDoc comment and whitespace cleanup
2015-05-12 17:39:30 -07:00
Ricardo Sánchez-Sáez df3883988b Another pass at whitespace homogenization
- Recorder subclasses were never checked
- Perform additional whitespace checks:
    - Remove spaces between statement and ';'
    - Remove spaces after pointer asterisk and variable name
    - Add space between class name and extension parenthesis '()'
2015-05-13 01:13:41 +01:00
Ricardo Sánchez-Sáez 63ce90d4d3 ORKTaskTests: remove ORKT prefix in static variables 2015-05-13 00:24:23 +01:00
Ricardo Sánchez-Sáez 74d403b52d ORKTaskTests: remove ORKT prefix in static variables 2015-05-13 00:18:19 +01:00
Ricardo Sánchez-Sáez 3541f2b253 HeaderDoc format standardization: remove inline '*' characters; separate @param section from @return by newline; remove empty newline before closing comment. 2015-05-13 00:10:58 +01:00
Ricardo Sánchez-Sáez a923c426ed ORKtaskTests: rename 'getTaskSteps:stepIdentifiers:' to 'generateTaskSteps:stepIdentifiers:' 2015-05-12 23:59:02 +01:00
Ricardo Sánchez-Sáez 2c2e5254bc ORKtaskTests: rename 'getTaskSteps:stepIdentifiers:' to 'generateTaskSteps:stepIdentifiers:' 2015-05-12 23:53:14 +01:00
Ricardo Sánchez-Sáez ce28538a36 ORKTask: improve 'validateParameters' HeaderDoc comment 2015-05-12 23:44:35 +01:00
Eric DeLabar 1de5fcc6c2 Fixed Scale Slider autolayout for right-to-left 2015-05-12 14:26:24 -04:00
Eric DeLabar ee90b17351 Fixed typo in localizable strings file 2015-05-12 14:22:50 -04:00
Eric DeLabar f8211adf83 Code style and documentation changes 2015-05-12 14:19:43 -04:00
Coxy f5b440fd1f Code Styling 2015-05-12 14:46:53 +01:00
Coxy 619e9434a9 make suggested changes from PR comments 2015-05-12 14:07:58 +01:00
Coxy 360ccab3df conform to RK Coding Style Guide 2015-05-12 11:27:04 +01:00
Bruce Duncan 2e01d033fb Merge branch 'master' into issue_1 2015-05-12 06:14:42 -04:00
Bruce Duncan dab4bcc047 First pass at a full implementation of Issue #1 2015-05-12 06:09:40 -04:00
Ricardo Sánchez-Sáez b68ad7b906 Add ORKTask and ORKFormStep unique identifier validation tests 2015-05-12 11:00:59 +01:00
Ricardo Sánchez-Sáez b7a70253d6 Merge branch 'master' of github.com:rsanchezsaez/ResearchKit into garnett-validation 2015-05-12 10:43:21 +01:00
Ricardo Sánchez-Sáez df04bf8235 ORKOrderedTask & ORKFormStep: unique identifier validation fixes 2015-05-12 10:22:55 +01:00
Coxy a05adeb264 remove remaining APC prefixes 2015-05-12 09:05:08 +01:00
Ricardo Sánchez-Sáez 6b0559b13b ORKAudioContentView: make constraints static 2015-05-12 02:10:27 +01:00
jwe-apple f56f6312e6 Merge pull request #170 from rsanchezsaez/rsanchezsaez-ipadmetrics
Fix margins in "Learn More" modal view
2015-05-11 18:03:33 -07:00
Ricardo Sánchez-Sáez 93bb589eb7 ORKActiveStepTimerView: refactor constraint code
- Make most constraints static and lighten updateConstraints
- Add constraints by activatiion
2015-05-12 02:00:22 +01:00
jwe-apple 912631f4d8 Merge pull request #168 from alexbasson/145-present-consent-in-form-sheet
Present consent "Learn More" content in form sheet
2015-05-11 17:56:16 -07:00
Ricardo Sánchez-Sáez f923bd7fe0 ORKActiveStepQuantityView: avoid a bit of duplicate constraint code; rename 'setupConstraints' to 'setUpConstraints' 2015-05-12 01:55:09 +01:00
jwe-apple 61e8746cbd Merge pull request #157 from rsanchezsaez/rsanchezsaez-scaledefaultvalue
Fix ORKQuestionStepViewController losing its default value when going back
2015-05-11 17:20:39 -07:00
Ricardo Sánchez-Sáez af1ed4425c ORKStepHeaderView & ORKVerticalContainerView: drop '_' prefix from constraint keys 2015-05-12 00:49:19 +01:00
jwe-apple 51d666f1e8 Merge pull request #175 from rsanchezsaez/rsanchezsaez-constraints
Extract ORKDefineStringKey() (was 'DEF_KEY()') to helpers
2015-05-11 16:15:47 -07:00
Ricardo Sánchez-Sáez 6e8006b094 Extract ORKDefineStringKey() (was 'DEF_KEY()') to helpers 2015-05-11 23:15:41 +01:00
Coxy 5aabe018f0 remove offending line 2015-05-11 19:53:10 +01:00
jwe-apple 62745570c5 Merge pull request #173 from rsanchezsaez/rsanchezsaez-activesteps
ActiveStep fixes
2015-05-11 10:40:57 -07:00
jwe-apple 9a49196cd6 Merge pull request #172 from rsanchezsaez/rsanchezsaez-constraints
Constraints: make sure [super updateConstraints] is always called last
2015-05-11 10:37:07 -07:00
jwe-apple 9603fb8461 Merge pull request #169 from rsanchezsaez/rsanchezsaez-memorygame
Fix memory game layout jitter on iPad
2015-05-11 10:19:35 -07:00
Coxy c14dbe8fd5 Basic charts/graphs API for ResearchKit with demos (issue #92) 2015-05-11 16:49:47 +01:00
Coxy 38cf7a4541 undo committed project configuration 2015-05-11 10:30:00 +01:00
Ricardo Sánchez-Sáez 78cafb6a52 Fix some erroneous init methods
(Local ivars were being set without checking if super init succeeded.)
2015-05-10 19:42:15 +01:00
Ricardo Sánchez-Sáez 4725b15bcd ORKAudioStep: replace 'duration' property by parent's 'stepDuration'
This mimics ORKCountdownStep, ORKFitnessStep and ORKWalkingTaskStep.
2015-05-10 19:41:29 +01:00
Ricardo Sánchez-Sáez d929de736e ORKFitnessStep, ORKTappingIntervalStep and ORKWalkingTaskStep: set shouldShowDefaultTimer to NO in init method
These three active step types don't support showing the default timer: setting this property to YES produces no effect.
2015-05-10 19:28:55 +01:00
Ricardo Sánchez-Sáez d4b73a8f42 ORKCountdownLabel: fix issue causing ORKActiveStepTimerView to always show 0 as the initial timer value 2015-05-10 18:38:50 +01:00
Ricardo Sánchez-Sáez f0a9e7d443 Constraints: make sure [super updateConstraints] is always called last (#99) 2015-05-10 17:25:59 +01:00
Ricardo Sánchez-Sáez 55198e7dad ORKConsentReviewController: enable bounce in webView 2015-05-10 02:30:18 +01:00
Ricardo Sánchez-Sáez be0c887b85 ORKConsentLearnMoreViewController: add margins to the contained webView
(Margins were removed from the HTML document.)
2015-05-10 02:27:32 +01:00
Ricardo Sánchez-Sáez 9c1bbbbaac ORKSpatialSpanMemoryStepViewController: adjust ORKScreenMetricMinimumStepHeaderHeightForMemoryGame metric to avoid iPad jitter 2015-05-10 00:20:51 +01:00
Ricardo Sánchez-Sáez d1126e228c ORKScaleSlider: fix comment typo 2015-05-10 00:20:22 +01:00
Alex Basson 623e33841f Present consent "Learn More" content in form sheet
Addresses issue #145
2015-05-08 20:14:00 -04:00
jwe-apple 3dedf8c373 Merge pull request #167 from rsanchezsaez/rsanchezsaez-skinfunctions
Standardize ORKSkin metric functions
2015-05-08 16:45:35 -07:00
jwe-apple c42f29fdad Merge pull request #166 from rsanchezsaez/rsanchezsaez-ipadmetrics
Consent review iPad metrics and margins homogenization
2015-05-08 16:43:51 -07:00
Ricardo Sánchez-Sáez 5d47c8e183 ORKSkin: standardize skin function names 2015-05-09 00:38:52 +01:00
Ricardo Sánchez-Sáez a56b351593 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-skinfunctions 2015-05-09 00:37:02 +01:00
Ricardo Sánchez-Sáez fd6e941159 ORKConsentReviewController: move margin from consent document HTML to view controller's webView
Also: handle webView scrollIndicatorInsets.
2015-05-09 00:23:53 +01:00
jwe-apple 115591c032 Merge pull request #164 from CareEvolution/Issue148
Fix for Issue #148 - [iPad] Two finger tapping task vertical spacing improvement
2015-05-08 15:59:25 -07:00
Ricardo Sánchez-Sáez 152557e5e4 ORKConsentReviewController: move constraint setup to 'setupConstraints' method 2015-05-08 23:30:16 +01:00
Ricardo Sánchez-Sáez f16bba3076 ORKConsentReviewController: add iPad horizontal margins 2015-05-08 23:27:26 +01:00
jwe-apple 21427d5795 Merge pull request #165 from rsanchezsaez/rsanchezsaez-constraints
ActiveStepQuantityView & SpatialSpanMemoryContentView constraint code whitespace
2015-05-08 14:43:46 -07:00
Ricardo Sánchez-Sáez 972879a85e ORKActiveStepQuantityView & ORKSpatialSpanMemoryContentView: homogenize constraint code whitespace and alignment 2015-05-08 22:23:38 +01:00
Eric DeLabar ae4af75736 Fix for Issue #148
- Added LAYOUT_DEBUG colors
- On iPad, added more space between title, progress bar, and tap count
2015-05-08 16:29:48 -04:00
Coxy b738688f00 fix NSCoding type warning 2015-05-08 20:59:26 +01:00
Eric DeLabar fc81624880 Added JSON serialization to ORKScaleAnswerFormats and added examples with min and max value labels to the ORKTest project 2015-05-08 14:21:18 -04:00
Eric DeLabar a622726b1b Fixed ORKTest build for changes in PR#162
- Fixed testORKSerialization to exclude the minimum and maximum value description on ORKScaleAnswerFormat.
2015-05-08 13:46:35 -04:00
Eric DeLabar caec12f51c Fixed per code review comments for PR#162 2015-05-08 13:42:22 -04:00
Coxy d090892754 device motion reaction time first attempt 2015-05-08 17:31:05 +01:00
Eric DeLabar e1f54278ca Set content mode to redraw on the ORKScaleSlider so the tick marks scale properly on device rotation 2015-05-08 10:12:12 -04:00
Eric DeLabar 7a26e368e7 Added minimum and maximum description labels to the ORKScaleSlider 2015-05-08 10:12:06 -04:00
Eric DeLabar ec63648083 Fixed autolayout warnings for ORKScaleSliderView 2015-05-08 09:35:30 -04:00
jwe-apple 806c7917d3 Merge pull request #161 from rsanchezsaez/rsanchezsaez-verticalscale
Make ORKSurveyAnswerCellForScale constraints static
2015-05-07 22:54:57 -07:00
jwe-apple 546b965c5b Merge pull request #160 from rsanchezsaez/rsanchezsaez-signaturescroll
Fix unable to draw signature when scrolling is enabled
2015-05-07 22:53:07 -07:00
jwe-apple efb78baf7d Merge pull request #159 from rsanchezsaez/rsanchezsaez-ipadmetrics
Fix signature view metrics
2015-05-07 22:48:43 -07:00
Ricardo Sánchez-Sáez 4cd9bd8122 ORKSurveyAnswerCellForScale: make constraints static (fixes #158) 2015-05-08 03:27:14 +01:00
Ricardo Sánchez-Sáez 37ca7a3704 ORKSignatureGestureRecognizer: prioritize over scrollView's pan gesture recognizer 2015-05-08 02:47:24 +01:00
Ricardo Sánchez-Sáez 236a4026ce ORKSignatureView: add device based width and height
(Avoids rotation issues, as the signature view width is determined by the portrait orientation of the device screen; the height is just a metric.) Also: increase iPad signature view size.
2015-05-08 02:20:14 +01:00
Ricardo Sánchez-Sáez 3e8bf44aea ORKScaleSlider: setNeedsLayout after thumb visibility changes 2015-05-08 00:35:22 +01:00
Ricardo Sánchez-Sáez 978a585cde ORKQuestionStepViewController: do not set stepResult.results if the answer is nil (fixes #135) 2015-05-07 23:16:43 +01:00
Ricardo Sánchez-Sáez aa5219cef6 ORKPredicateStepNavigationRule: rename getLeafResultsWithTaskResult to leafResultsFromTaskResult 2015-05-07 21:16:49 +01:00
Ricardo Sánchez-Sáez c20126a9ef iPad: allow upside down orientation in ORKCatalog and ORKTest 2015-05-07 21:00:39 +01:00
Ricardo Sánchez-Sáez 466dbb98c5 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-navigationrules-dev
# Conflicts:
#	ResearchKit/Common/ORKVerticalContainerView.m
2015-05-07 19:12:31 +01:00
Ricardo Sánchez-Sáez 9169f9730f ORKPredicateStepNavigationRule: add additionalTaskResults property for cross-task navigation logic
(Including suitable unit tests.)
2015-05-07 19:05:47 +01:00
Ricardo Sánchez-Sáez 94c902d721 ORKNavigableOrderedTask: make stepNavigationRules a copy property 2015-05-07 17:59:02 +01:00
Ricardo Sánchez-Sáez 29c2829df0 ORKResultPredicate: make date method arguments nullable
(With their corresponding unit tests.)
2015-05-07 15:39:52 +01:00
vtourraine 075dc1f7b6 Add specific tone audiometry instruction step 2015-05-07 16:38:54 +02:00
Ricardo Sánchez-Sáez 8b4294f0dd ORKResultPredicate: replace CGFloat values by float; add minimum only and maximum only numeric and scale methods
(With their corresponding unit tests.)
2015-05-07 15:26:21 +01:00
Ricardo Sánchez-Sáez 27397735f4 ORKResultPredicate: added regular expression matching methods
Also: added the corresponding unit tests.
2015-05-07 15:07:54 +01:00
vtourraine e3c596ddb1 Update tone audiometry task with output volume in result 2015-05-07 15:27:15 +02:00
Ricardo Sánchez-Sáez b948c08d8f ORKPredicateStepNavigationRule: rename private initializer 2015-05-07 10:25:47 +01:00
Ricardo Sánchez-Sáez 5dd23fbb54 ORKOrderedTask and ORKStepNavigationRule: fix documentation issues 2015-05-07 01:46:55 +01:00
Ricardo Sánchez-Sáez 9ff7710b14 ORKPredicateStepNavigationRule: fix JSON serialization test failure due to empty array argument check 2015-05-06 23:21:54 +01:00
Ricardo Sánchez-Sáez 40e50fb0e6 ORKNavigableOrderedTask & ORKStepNavigationRule: add header documentation
Also: slight API refactor; add exceptions when trying to pass nil values; add removeNavigationRuleForTriggerStepIdentifier: method (with its unit test).
2015-05-06 22:52:13 +01:00
jwe-apple 5ba33f832d Merge pull request #136 from coxy1989/coxy-issue87_alert
Alert the user when an audioRecorder generates an error
2015-05-06 14:11:37 -07:00
Coxy c34852d677 make suggested change to incorrect condition in ORKAudioContentView 2015-05-06 21:52:21 +01:00
jwe-apple 46bd241ca3 Merge pull request #139 from rsanchezsaez/rsanchezsaez-ipadmetrics
Add iPad custom metrics
2015-05-06 13:40:37 -07:00
Ricardo Sánchez-Sáez b45628d543 ORKTaskTests: split testNavigableOrderedTask into individual test cases 2015-05-06 03:25:15 +01:00
Ricardo Sánchez-Sáez 9ea4786e21 ORKTaskTests: use NS_OPTIONS for bitmask options 2015-05-06 03:24:36 +01:00
Ricardo Sánchez-Sáez 6b03670808 ORKTaskTests: decouple testOrderedTask and testNavigableOrderedTask 2015-05-06 03:11:14 +01:00
Ricardo Sánchez-Sáez d4d874e312 ORKTaskTests: add tests for ORKResultPredicate convenience methods 2015-05-06 02:49:04 +01:00
Ricardo Sánchez-Sáez 6abc57b566 ORKResultPredicate: fix some issues with convenience methods 2015-05-06 02:48:12 +01:00
Ricardo Sánchez-Sáez d5fd81fd50 ORKTaskTests: use blocks for code reuse and legibility
Also moved some code around.
2015-05-06 00:57:04 +01:00
jwe-apple bfdebd914c Merge pull request #140 from rsanchezsaez/rsanchezsaez-observer
Remove unneeded @class forward declaration in ORKObserver
2015-05-05 16:20:24 -07:00
Ricardo Sánchez-Sáez 19fce1ac39 ORKTaskTests: sight improve to naming conventions
Also: fix ORKStepNavigationRule alignment.
2015-05-05 23:56:18 +01:00
Ricardo Sánchez-Sáez 117545160e ORKObserver: remove unneeded @class forward declaration 2015-05-05 23:11:25 +01:00
Ricardo Sánchez-Sáez 703155eb72 Add ORKTaskTests: tests ORKOrderedTask and ORKNavigableOrderedTask (and implicitly ORKPredicateStepNavigationRule and ORKDirectStepNavigationRule) 2015-05-05 23:09:22 +01:00
Ricardo Sánchez-Sáez c86bc22f71 Extract ORKDefineStringKey() ( was DEF_KEY() ) to helpers 2015-05-05 23:08:09 +01:00
Ricardo Sánchez-Sáez 31b792a795 ORKNavigableOrderedTask: support pushing and out of order step 2015-05-05 23:06:26 +01:00
vtourraine 70c8ef2e30 Rename ivars with underscores in audio generator 2015-05-05 09:25:14 +02:00
Ricardo Sánchez-Sáez 833f81296a ORKVerticalContainerView: move back updateConstraintConstants method 2015-05-04 19:01:01 +01:00
Ricardo Sánchez-Sáez bdf032553d Skin: reduce iPad ORKScreenMetricTopToIllustration 2015-05-04 18:44:22 +01:00
Ricardo Sánchez-Sáez 03cb3606c5 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-ipadmetrics
# Conflicts:
#	ResearchKit/Common/ORKSkin.m
2015-05-04 18:38:11 +01:00
jwe-apple 4d5f3307e5 Merge pull request #137 from rsanchezsaez/rsanchezsaez-verticalscale
Vertical scale improvement
2015-05-04 10:23:48 -07:00
Ricardo Sánchez-Sáez 9498cda223 iPad skin: adjust ORKScreenMetricTopToCaptionBaseline and add ORKScreenMetricTopToIllustration (issue #76) 2015-05-04 15:29:59 +01:00
vtourraine b338926f56 Update tone audiometry active task
- Remove 125 Hz test
- Switch to exponential fade-in, to make it linear in perception
2015-05-04 14:53:24 +02:00
Denis Lebedev 75fdaf6b09 Refactor validation: add -validateParameters to ORKTask 2015-05-04 12:44:48 +03:00
Denis Lebedev 2959667c65 Validate ORKFormStep items and ORKOrderedTask for identifier uniquiness 2015-05-04 12:33:54 +03:00
Ricardo Sánchez-Sáez db1f2a9ba5 ORKTest: add example of task archival and restoration (only for the ORKNavigableOrderedTask class) 2015-05-04 01:59:52 +01:00
Ricardo Sánchez-Sáez 1d4d307344 ORKNavigableOrderedTask: print debug warning if a navigation rule leads you to a step with a lower or equal index than the current one 2015-05-04 01:22:53 +01:00
Ricardo Sánchez-Sáez ac399005ba Add ORKResultPredicate class with convenience methods for building result-matching predicates. 2015-05-03 21:33:44 +01:00
Ricardo Sánchez-Sáez 0d45511b15 ORKStepNavigationRule and ORKNavigableOrderedTask: implement NSSecureCoding and NSCopying protocols
TODO: Implement NSPredicate JSON serialization.
2015-05-03 18:24:22 +01:00
Ricardo Sánchez-Sáez 19b5b34cc4 ORKNavigableOrderedTask: allow restoring the task to a particular step 2015-05-03 16:07:04 +01:00
Ricardo Sánchez-Sáez 2e7c58f48a ORKESerialization: fix bug in propFromDict() function 2015-05-03 16:00:26 +01:00
Ricardo Sánchez-Sáez 2a99e7d54f ORKNavigableOrderedTask: use a step identifier stack to handle stepBeforeStep: 2015-05-02 16:15:02 +01:00
Ricardo Sánchez-Sáez 378f5140de Whitespace 2015-05-02 15:30:56 +01:00
Ricardo Sánchez-Sáez 3027038744 StepNavigationTask: cleanup example; hide Learn More button 2015-05-02 15:30:13 +01:00
Ricardo Sánchez-Sáez 09e8b1d494 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-verticalscale 2015-05-02 13:43:43 +01:00
Ricardo Sánchez-Sáez 4881a32004 ORKSkin: add ORKScreenMetricVerticalScaleHorizontalMargin metric
This metric is used to adjust the vertical slider height so the vertical scale question step doesn't scroll by default on a single-line question (iPhone 5 and iPhone 6 screens only; multi-line questions will scroll). Also, replace English localized string "Your question goes here." by "Your question here." so it defaults to a single-line question on an iPhone 5 screen.
2015-05-02 13:39:08 +01:00
jwe-apple 9832cbc91f Merge pull request #130 from rsanchezsaez/rsanchezsaez-launchscreen
LaunchScreen: fix nav bar height and table view content inset
2015-05-01 12:51:24 -07:00
John Earl 5bc04aca3f Clean up bad merge 2015-05-01 11:14:49 -07:00
Ricardo Sánchez-Sáez 6030efaa96 ORKScaleSlider: subtract 5 pixels to vertical height (so the vertical scale question step fits without scrolling on iPhone 6) 2015-05-01 18:26:23 +01:00
Ricardo Sánchez-Sáez 0604f586df ORKStepNavigationRule: initial implementation 2015-05-01 17:04:41 +01:00
Coxy e59576640a alert the user when an audioRecorder generates an error 2015-05-01 13:16:05 +01:00
jwe-apple 3d44ed80c6 Merge pull request #113 from coxy1989/coxy-issue87
Audio predefined task: audio step should not show too loud if outputdir is nil and developer ignored the error
2015-04-30 21:10:06 -07:00
Ricardo Sánchez-Sáez 3378ab16f2 ORKScaleSlider: replace hitTest: by pointInside: (more efficient) 2015-04-30 14:15:09 +01:00
Coxy 8a5b6cc28d merge master 2015-04-29 19:08:03 +01:00
Coxy cc959e266f return early if audioRecorderError is not nil 2015-04-29 18:54:19 +01:00
Coxy 5e222351dc prevent silly UI updates after an audioRecorder has failed 2015-04-29 18:16:51 +01:00
vtourraine cf3ea70f77 Update tone audiometry task
- Add serialization tests
- Refactor constraints setup
- Fix localization typos
2015-04-29 11:17:56 +02:00
Ricardo Sánchez-Sáez 71c97a72b6 LaunchScreen: fix nav bar height and table view content inset 2015-04-28 23:32:32 +01:00
jwe-apple 4639a41eea Merge pull request #129 from rsanchezsaez/rsanchezsaez-namingconventions
Naming conventions: 'ident' is not an acceptable abbreviation
2015-04-28 13:18:46 -07:00
John Earl 965b39fe4a Merge branch 'jwe-apple-jwe-apple-issue-118b' 2015-04-28 12:56:09 -07:00
John Earl 4a55ec228c Merge branch 'jwe-apple-issue-118b' of https://github.com/jwe-apple/ResearchKit into jwe-apple-jwe-apple-issue-118b 2015-04-28 12:55:55 -07:00
Ricardo Sánchez-Sáez 14dd7a7c73 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-namingconventions 2015-04-28 20:53:10 +01:00
jwe-apple 1b0d93e247 Merge pull request #127 from richardrauser/RemoveDuplicateImports
Removing duplicate imports.
2015-04-28 12:50:52 -07:00
jwe-apple 4047451e4d Merge pull request #108 from rsanchezsaez/rsanchezsaez-ipadmargins
Add horizontal iPad margins
2015-04-28 12:32:41 -07:00
jwe-apple f602e85b75 Merge pull request #123 from jwe-apple/jwe-apple-issue-122
Issue #122: `shouldPresentStep:` method should correctly handle nil step
2015-04-28 12:21:28 -07:00
John Earl 3ad592e27c Whitespace fixup 2015-04-28 12:19:39 -07:00
John Earl 7ab47f3a88 Whitespace fixup 2015-04-28 12:17:00 -07:00
Ricardo Sánchez-Sáez fe82617dc5 Naming conventions: 'ident' is not an acceptable abbreviation
(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/APIAbbreviations.html#//apple_ref/doc/uid/20001285-BCIHCGAE)
2015-04-28 19:43:30 +01:00
Ricardo Sánchez-Sáez ed740fe7d3 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-ipadmargins
# Conflicts:
#	ResearchKit/Common/ORKScaleSliderView.m

Also: do some whitespace conforming on the merged code.
2015-04-28 19:33:53 +01:00
jwe-apple 621652b26f Merge pull request #128 from getaaron/update-pdf-documentation
Indicate that consent document must be copied for signature to be applied correctly
2015-04-28 10:12:14 -07:00
Aaron Brager a0adc6c557 Indicate that consent document must be copied for signature to be applied correctly. 2015-04-28 08:58:32 -05:00
Ricardo Sánchez-Sáez 227e5af903 ORKUpdateScrollViewBottomInset(): Perform safe CGFloat comparison
Adds ORKCGFloatNearlyEqualToFloat() inline function to ORKHelpers.
2015-04-28 14:55:45 +01:00
Ricardo Sánchez-Sáez 01d2c72c2d ORKSkin: restore iPad ORKScreenMetricIllustrationHeight (for adapted @3x images)
(It was squished during the merge, sorry.)
2015-04-28 13:44:42 +01:00
Richard Rauser fcb9fb61b0 Removing duplicate imports. 2015-04-28 12:48:02 +01:00
jwe-apple 75c05d200b Merge pull request #126 from troligtvis/master
duplicate initialization of variable removed
2015-04-28 03:18:58 -07:00
strawberrypie 9e12bed600 duplicate initialization of variable removed 2015-04-28 12:14:38 +02:00
John Earl b3c64fc66b Merge branch 'brucehappy-issue_4' 2015-04-28 03:01:49 -07:00
John Earl edb78414ec Merge branch 'issue_4' of https://github.com/brucehappy/ResearchKit into brucehappy-issue_4 2015-04-28 03:01:20 -07:00
vtourraine 1d89b53c78 Update tone audiometry step controller dispatch, audio generator license 2015-04-28 11:52:16 +02:00
jwe-apple 706244f95d Merge pull request #124 from troligtvis/master
Small typo corrected
2015-04-28 02:43:46 -07:00
John Earl 643be7ee8b Issue #118: Adjust fitness quantity pair layout
This fixes a regression in quantity pair layout. The left view of
the quantity pair, the distance view, formerly always contained
content, which fixed the vertical height of the view. At some point
that content was no longer set, handling the no-pedometer-distance
case. The primary fix here is to ensure that a title and zero
quantity are present in the distance view, even if distance is
not available (as in the simulator).

Secondary fixes fix constraints to make them static, since they
do not need to be dynamically updated. We also introduce new baseline
constraints to better enforce alignment between the left and right
views.

Tested distance-only, heart-rate-only, both, and neither visible on
iPhone 6 on iOS 8.3. Tested with and without a value for heart rate,
with both visible.
2015-04-28 02:35:51 -07:00
vtourraine 0ba31ce525 Update tone audiometry task implementation
- Add English and French localization
- Update copyright notices
- Fix code style
- Fix comments typo
2015-04-28 11:00:43 +02:00
Coxy efc1394987 move audio outputdir nil exception to ORKAudioRecorder's start method 2015-04-28 09:46:09 +01:00
strawberrypie 0997555a34 small typo corrected 2015-04-28 09:44:17 +02:00
strawberrypie b48ac27ec8 small typo corrected 2015-04-28 09:43:10 +02:00
John Earl dc35088d39 Issue #122: shouldPresentStep: method should correctly handle nil step
Adjust internal `shouldPresentStep:` method not to call the delegate
on a nil step, and to return NO if the step is nil. When the task has
completed, a nil step indicates this, so handle that case explicitly
rather than depending on a semantically odd `YES` from `shouldPresentStep:`.
2015-04-27 23:47:21 -07:00
Ricardo Sánchez-Sáez 139a3f6d00 ORKUpdateScrollViewBottomInset: make sure bottomInset actually changes before updating
Also: remove needless log line in ORKTableContainerView.
2015-04-28 01:36:21 +01:00
Ricardo Sánchez-Sáez 4c25cc50ee Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-ipadmargins
# Conflicts:
#	ResearchKit/ActiveTasks/ORKAudioContentView.m
#	ResearchKit/Common/ORKChoiceViewCell.m
#	ResearchKit/Common/ORKHelpers.m
#	ResearchKit/Common/ORKScaleSliderView.m
#	ResearchKit/Common/ORKSkin.m
#	ResearchKit/Common/ORKSurveyAnswerCellForText.m
2015-04-28 01:16:51 +01:00
Ricardo Sánchez-Sáez a48796942c ORKTableContainerView: adjust scrollIndicatorInsets on iPad screen size
Their position is now next to the edge of the screen (instead of next to the edge of the table).
Also: reuse on-screen keyboard inset handling code.
2015-04-28 00:55:46 +01:00
Ricardo Sánchez-Sáez 136471090e ORKSkin: change iPhone 6 and down default margin from 16.0 to 15.0 2015-04-27 23:56:19 +01:00
Ricardo Sánchez-Sáez a27ecaa20a ORKFormStepViewController: fix table and footer not being layout properly 2015-04-27 23:54:38 +01:00
jwe-apple 31ea7908a2 Merge pull request #116 from rsanchezsaez/rsanchezsaez-whitespace
Complete whitespace homogenization
2015-04-27 13:59:11 -07:00
Ricardo Sánchez-Sáez 2930653a98 ORKTest AppDelegate: revert to multiline comments 2015-04-27 20:55:40 +01:00
Ricardo Sánchez-Sáez 9604154b17 Naming conventions renames 2015-04-27 19:56:06 +01:00
Ricardo Sánchez-Sáez 709dec2841 Make sure statement opening brace always has a prepending space 2015-04-27 19:54:31 +01:00
Ricardo Sánchez-Sáez e3cca38a69 Homogeneous else braces 2015-04-27 19:49:03 +01:00
Ricardo Sánchez-Sáez 66f5452a35 Conform to cocoa naming conventions 2015-04-27 19:41:39 +01:00
Ricardo Sánchez-Sáez 9b4f0a404d Homogenize whitespace (ORKTests)
Also: some naming conventions renames.
2015-04-27 19:16:48 +01:00
Ricardo Sánchez-Sáez dbdabb49c2 Homogenize whitespace (Accessibility and Unit Tests)
Also: naming conventions renames.
2015-04-27 19:00:10 +01:00
Coxy ac1cf8e16e Move nil outputdir exception from viewDidAppear: to prepareStep 2015-04-27 18:58:07 +01:00
Ricardo Sánchez-Sáez 226791c774 Homogenize whitespace (Consent)
Also: naming conventions renames.
2015-04-27 18:46:37 +01:00
Ricardo Sánchez-Sáez 08a378b6b8 Homogenize whitespace (ActiveTasks)
Also: naming conventions renames.
2015-04-27 18:14:59 +01:00
Ricardo Sánchez-Sáez 71008fcc05 Homogenize whitespace (Skin, Misc)
Also: some naming conventions renames.
2015-04-27 17:07:14 +01:00
Bruce Duncan d50d647ffd Added braces, and don't reference the sliderLayoutWidth from the delegate more than once. 2015-04-27 11:56:00 -04:00
Ricardo Sánchez-Sáez 1a8f9e81bd Homogenize whitespace (PDF, Definitions, UIKitCategories)
Also: some naming conventions renames.
2015-04-27 16:49:54 +01:00
Ricardo Sánchez-Sáez a200c992ae Homogenize whitespace (Result and Container Views)
Also: some naming conventions renames.
2015-04-27 16:13:59 +01:00
vtourraine 91821ca5ae Add new tone audiometry active task, include it in the ORKCatalog app 2015-04-27 17:02:38 +02:00
Coxy a739df5f69 Merge branch 'master' into coxy-issue87 2015-04-27 11:35:30 +01:00
jwe-apple 5cd75fc585 Merge pull request #112 from rsanchezsaez/rsanchezsaez-whitespace
Homogenize whitespace [wip]
2015-04-26 22:34:40 -07:00
Ricardo Sánchez-Sáez 28a54aac7c Homogenize whitespace (Answer format)
Also: some naming conventions renames; remove empty inherited init.
2015-04-27 01:54:38 +01:00
Ricardo Sánchez-Sáez 35841e2ba8 Homogenize whitespace (Task and Step)
Also: some naming conventions renames; remove unneeded empty return.
2015-04-27 01:19:07 +01:00
Ricardo Sánchez-Sáez 77bb256cfa Move some stray opening braces 2015-04-27 00:31:57 +01:00
Ricardo Sánchez-Sáez 74ab1b3726 Re-work iPad margins calculations
Previous approach had several problems: applied doble iPad margin on text choice questions; didn't handle correctly separator right inset in numeric and text questions.
2015-04-26 23:58:09 +01:00
Ricardo Sánchez-Sáez 49256010d5 ORKSkin: code reuse for ORKGetScreenTypeForWindow() and ORKGetScreenTypeForWindow() 2015-04-26 13:06:11 +01:00
Coxy e15f56ff6e Audio step should not show too loud if outputdir is nil and developer ignored the error (issue #87) 2015-04-25 14:28:36 +01:00
Ricardo Sánchez-Sáez 3ed725399c ORKSkin & client classes: add iPad margins 2015-04-25 01:44:29 +01:00
jwe-apple 3e48fc66a8 Merge pull request #107 from brucehappy/issue_78
Make visual assets bigger on iPad (issue #78)
2015-04-24 17:09:04 -07:00
Bruce Duncan ae6fdc65d2 Formatting change 2015-04-24 19:58:41 -04:00
Bruce Duncan 74a3f4b589 Changed ResearchKit to compile for iPhone and iPad. Changed all universal images for Active and Consent tasks into device specific. Copied @3x images to @2x~ipad. Added iPad screen size and changed the metrics for ORKScreenMetricIllustrationHeight to be 1.5x the iPhone 6 value. Forced the 3x videos to be used for iPad 2x and 2x videos to be used for iPad 1x. 2015-04-24 19:40:49 -04:00
Ricardo Sánchez-Sáez 2df6cc99e1 ORKSkin: Move some layout methods from ORKHelpers
Also:
- Add ORKScreenTypeiPhone6Plus and ORKScreenTypeiPad
- Use constants instead of magic numbers or defines
2015-04-25 00:09:05 +01:00
jwe-apple 713b27060f Merge pull request #106 from evanmiller/evanmiller-activetasks-table
Active Task docs: add thead/tbody tags to table
2015-04-24 16:01:27 -07:00
jwe-apple 8cb90d81c1 Merge pull request #105 from evanmiller/evanmiller-activetasks-typo
Fix typo in ActiveTasks template
2015-04-24 15:59:49 -07:00
Evan Miller 1f3ea67c73 Active Task docs: add thead/tbody tags to table 2015-04-24 17:53:07 -05:00
Evan Miller d18907ea56 Fix typo in ActiveTasks template
Remove extraneous "to"
2015-04-24 17:48:01 -05:00
jwe-apple ef2eec6926 Merge pull request #104 from rsanchezsaez/rsanchezsaez-unnecessarycasts
Remove unnecessary casts
2015-04-24 14:58:27 -07:00
Ricardo Sánchez-Sáez 553c675eab HKSample(ORKJSONDictionary): remove anonymous category 2015-04-24 22:52:36 +01:00
Ricardo Sánchez-Sáez b8e24f456d HKSample(ORKJSONDictionary): enforce type safety regarding mutableDictionaries (and avoid mutableCopying)
Also: naming conventions.
2015-04-24 22:40:38 +01:00
jwe-apple 4a518c8d9a Merge pull request #103 from evanmiller/evanmiller-overview-semicolon
Fix small grammatical issue
2015-04-24 14:23:51 -07:00
Ricardo Sánchez-Sáez eb30a43ac6 Remove unnecessary casts 2015-04-24 22:06:14 +01:00
Evan Miller 47babbc318 Fix small grammatical issue
Use a semicolon instead of a comma.

Also add a newline to the end of the file.
2015-04-24 16:03:08 -05:00
Bruce Duncan 711fed4ff5 Don't check delegate for nil, as sliderLayoutWidth will return 0 if it is anyway. 2015-04-24 15:11:51 -04:00
jwe-apple 0c2bdc488f Merge pull request #101 from evanmiller/evanmiller-creatingsurveys-codesample
Tweak code sample
2015-04-24 09:14:08 -07:00
DanKeen 4cbd40f0d7 Merge pull request #102 from evanmiller/evanmiller-creatingsurveys-typo
Fix typo in documentation
2015-04-24 08:13:04 -07:00
Evan Miller 0df2d9a98b Fix typo in documentation
Remove extraneous quotation mark
2015-04-24 09:31:30 -05:00
Evan Miller 6d1e80a583 Tweak code sample
* firstResult is a property of the ORKStepResult

* Remove extraneous space from the if statement
2015-04-24 09:21:13 -05:00
Bruce Duncan daa7f7cd52 Eliminated the unneeded updateConstraints and moved constraint setting to the initializer. Fixed spacing on if statement. 2015-04-24 01:42:33 -04:00
Bruce Duncan 4f792442b1 Fixed spacing of if expression 2015-04-24 01:13:34 -04:00
Bruce Duncan 1e8002279d Merge branch 'master' into issue_4 2015-04-24 00:30:32 -04:00
Bruce Duncan 9eb1d445bb Merge branch 'master' into issue_4.
Removed hardcoded cell height for vertical layout scales and used auto layout plus delegate for height.
2015-04-24 00:25:31 -04:00
jwe-apple 1b1954e9ca Merge pull request #100 from evanmiller/evanmiller-activetasks-typos
Fix spelling error
2015-04-23 20:30:58 -07:00
Evan Miller 46236a4a08 Fix spelling error
preformed => performed
2015-04-23 19:52:27 -05:00
jwe-apple ee2127397b Merge pull request #96 from rsanchezsaez/rsanchezsaez-visualconsentscroll-b
Fix visual consent scene scroll
2015-04-23 15:21:00 -07:00
jwe-apple ac1dd33c34 Merge pull request #98 from rsanchezsaez/rsanchezsaez-centerpickers
Center pickers on iPad
2015-04-23 15:19:58 -07:00
Ricardo Sánchez-Sáez 8586381fb6 ORKSurveyAnswerCellForPicker: make sure constraints don't accumulate; add _tempPicker constraint 2015-04-23 23:06:28 +01:00
Ricardo Sánchez-Sáez e79c7d25d4 ORKObserver: remove new and init NS_UNAVAILABLE annotations; add nullability and designated initializer ones 2015-04-23 20:36:11 +01:00
Ricardo Sánchez-Sáez 21dba1f124 ORKSurveyAnswerCellForPicker: center pickers on iPad 2015-04-23 12:41:21 +01:00
Ricardo Sánchez-Sáez 3251a5226c ORKObserver: reuse initializer code 2015-04-23 10:38:43 +01:00
Ricardo Sánchez-Sáez ccf6b461bc Move back ORKViewControllerToolbarObserver to ORKTaskViewController file
Also: rename some variables for naming convention conformance.
2015-04-23 09:25:16 +01:00
John Earl 45215ecb0e Additional nullability corrections 2015-04-22 22:15:02 -07:00
John Earl 439df0718b Quick fix: nullability warnings 2015-04-22 22:10:52 -07:00
Ricardo Sánchez-Sáez 3c3eb5cb02 ORKVisualConsentStepViewController: add safety check on scrollViewObserver delegate method 2015-04-23 01:28:22 +01:00
Ricardo Sánchez-Sáez 6a895b4b5c ORKObserver: fix naming conventions and copyright headers 2015-04-23 01:28:03 +01:00
jwe-apple 720aed5388 Merge pull request #95 from rsanchezsaez/rsanchezsaez-singletextchoice
Fix single text choice cell should not deselect when re-selecting the same answer
2015-04-22 17:01:05 -07:00
Ricardo Sánchez-Sáez e2950decc2 ORKVisualConsentStepViewController: use NSRunLoopCommonModes for CADisplayLink so animation doesn't freeze when scrolling
Also, simultaneously scrollToTop animationView with scrollView
2015-04-23 00:51:43 +01:00
Ricardo Sánchez-Sáez f9e119acad ORKTextChoiceCellGroup: single text choice cell should not deselect when re-selecting the same answer
Also: fixed tests accordingly.
2015-04-23 00:14:05 +01:00
Ricardo Sánchez-Sáez bbda212a04 ORKVisualConsentStepViewController: enable scene scrolling before video animation finish and track animation view position with scrollView contentOffset 2015-04-22 23:06:16 +01:00
Ricardo Sánchez-Sáez 891c096bc1 Generalize and extract ORKObserver and subclasses for reuse 2015-04-22 22:33:24 +01:00
Ricardo Sánchez-Sáez cec9c3acf6 Merge remote-tracking branch 'upstream/master' into rsanchezsaez-visualconsentscroll 2015-04-22 21:56:25 +01:00
Ricardo Sánchez-Sáez 2612aca236 ORKVisualConsentStepViewController: register consent scene scrollView with taskViewController (enables hairline) 2015-04-22 20:30:16 +01:00
Dan Keen 2272d2e6db Update sub-headings in code examples to italicize.
r=jwe
2015-04-22 11:34:31 -07:00
John Earl ed8960f8b5 Disable unit tests from ORKTest scheme in 'Run' mode 2015-04-22 11:08:40 -07:00
John Earl 0f8a07fd8f Merge branch 'rsanchezsaez-rsanchezsaez-firstrespondercell' 2015-04-22 10:43:57 -07:00
John Earl 93c9c8d85a Merge branch 'rsanchezsaez-firstrespondercell' of https://github.com/rsanchezsaez/ResearchKit into rsanchezsaez-rsanchezsaez-firstrespondercell
Conflicts:
	ResearchKit/Common/ORKFormStepViewController.m
2015-04-22 10:43:50 -07:00
John Earl 25c543c468 Merge branch 'garnett-moar-tests' 2015-04-22 10:40:16 -07:00
John Earl fb519862b8 Merge branch 'moar-tests' of https://github.com/garnett/ResearchKit into garnett-moar-tests
Conflicts:
	ResearchKit/ActiveTasks/ORKVoiceEngine.m
2015-04-22 10:39:59 -07:00
John Earl 681891b300 Merge branch 'codestergit-fixed-formatting-of-curly-braces' 2015-04-22 10:35:09 -07:00
John Earl 1c5b93cae6 Merge branch 'fixed-formatting-of-curly-braces' of https://github.com/codestergit/ResearchKit into codestergit-fixed-formatting-of-curly-braces
Conflicts:
	ResearchKit/ActiveTasks/ORKAccelerometerRecorder.m
	ResearchKit/ActiveTasks/ORKAudioRecorder.m
	ResearchKit/ActiveTasks/ORKDataLogger.m
	ResearchKit/ActiveTasks/ORKDeviceMotionRecorder.m
	ResearchKit/ActiveTasks/ORKHealthQuantityTypeRecorder.m
	ResearchKit/ActiveTasks/ORKLocationRecorder.m
	ResearchKit/ActiveTasks/ORKPedometerRecorder.m
	ResearchKit/ActiveTasks/ORKRecorder.m
	ResearchKit/ActiveTasks/ORKTouchRecorder.m
	ResearchKit/Common/ORKAnswerFormat.m
	ResearchKit/Common/ORKQuestionStepViewController.m
	ResearchKit/Common/ORKResult.m
	ResearchKit/Common/ORKScaleSlider.m
	ResearchKit/Common/ORKSurveyAnswerCellForText.m
	ResearchKit/Consent/ORKConsentSignature.m
	ResearchKit/Consent/ORKEAGLMoviePlayerView.m
2015-04-22 10:34:57 -07:00
Ricardo Sánchez-Sáez 8a7ea2d051 ORKFormStepViewController: clear 'currentFirstResponderCell' on formItemCellDidResignFirstResponder: 2015-04-22 18:34:19 +01:00
jwe-apple 12148d0973 Merge pull request #79 from rsanchezsaez/rsanchezsaez-visualconsentscroll
Add scroll to visual content screens
2015-04-22 10:01:30 -07:00
Ricardo Sánchez-Sáez acd1f4379c ORKTableContainerView & ORKFormItemCell: add nullable attribute to delegate property 2015-04-22 15:21:48 +01:00
Ricardo Sánchez-Sáez 2a7d12381f ORKTableContainerView: track current first responder cell via delegate (for keyboard scrolling)
Also: remove 'ork_currentFirstResponderView' hack method.
2015-04-22 15:03:26 +01:00
Ricardo Sánchez-Sáez 2541fa2835 ORKVisualConsentStepViewController: make sure scrollToTopAnimated: is finished before starting transition (re-enable scrolling otherwise)
Also: remove needless delegate conformance, add comment, add copyright.
2015-04-22 12:02:06 +01:00
jwe-apple ca43fbf341 Merge pull request #80 from garnett/enable-ipad
Make apps universal, remove healthkit requirement
2015-04-22 00:34:44 -07:00
Denis Lebedev 745fb12b9b Fix actionSheet presentation on iPad 2015-04-22 09:12:09 +03:00
Denis Lebedev edb33fa975 Make apps universal, remove healthkit requirement 2015-04-22 08:55:54 +03:00
Denis Lebedev 0984008494 Update copyrights with contributor's name 2015-04-22 08:47:15 +03:00
Ricardo Sánchez-Sáez ca0b2b2a5c Move visual content scroll test task from ORKCatalog to ORKTest 2015-04-22 02:53:59 +01:00
Ricardo Sánchez-Sáez a4fad3df74 ORKVisualConsentStepViewController & ORKConsentSceneViewController: replace 'setContentOffset:' by bounds animation with completion block 2015-04-22 02:44:46 +01:00
Ricardo Sánchez-Sáez 0c6b420744 ORKVisualConsentStepViewController & ORKConsentSceneViewController: allow vertical scrolling in visual consent screens 2015-04-22 00:40:25 +01:00
John Earl 9aa69cd1ef Fix build after merging rsanchezsaez-rsanchezsaez-verticalscale 2015-04-21 14:34:52 -07:00
John Earl 6bf1e4aec5 Merge branch 'rsanchezsaez-rsanchezsaez-verticalscale' 2015-04-21 12:44:53 -07:00
John Earl cfe35edfef Merge branch 'rsanchezsaez-verticalscale' of https://github.com/rsanchezsaez/ResearchKit into rsanchezsaez-rsanchezsaez-verticalscale
Conflicts:
	ResearchKit/Common/ORKScaleSlider.m
2015-04-21 12:44:32 -07:00
Ricardo Sánchez-Sáez cdff825c7b ORKQuestionStep: rename 'isFormatVertical' to 'isFormatVerticalScale' 2015-04-21 20:18:50 +01:00
Ricardo Sánchez-Sáez 881f01a2d5 ORKScaleSlider: widen vertical scale tap target 2015-04-21 19:34:13 +01:00
John Earl 793deeec7d Convert assertions to exceptions so they are applied in release builds too. 2015-04-21 11:33:24 -07:00
Ricardo Sánchez-Sáez 3d5abb0b7a ORKScaleSlider: add comment about thumb rotation issue 2015-04-21 19:32:49 +01:00
Ricardo Sánchez-Sáez ed88a71af0 ORKScaleSlider: revert to explicit use of '[self bounds]' method instead of 'self.bounds' 2015-04-21 19:27:32 +01:00
Ricardo Sánchez-Sáez aed6935765 ORKAnswerFormat: & ORKQuestionStep: replace 'ORKQuestionTypeVerticalScale' type by 'isVertical' method querying 2015-04-21 19:24:09 +01:00
Denis Lebedev 022fe854b0 Return nullability to ORKVoiceEngine_internal 2015-04-21 07:42:50 +03:00
Ricardo Sánchez-Sáez 4039555bbc ORKTest: add vertical scales to scale task 2015-04-21 01:31:28 +01:00
Ricardo Sánchez-Sáez 0453c28748 ORKScaleAnswerFormat & ORKContinuousScaleAnswerFormat: more 'verticalFlag' to 'vertical' renaming 2015-04-21 01:29:47 +01:00
Ricardo Sánchez-Sáez a8affe5e06 ORKScaleAnswerFormat & ORKContinuousScaleAnswerFormat: handle vertical property in NSCoding; add it to serialization tests and testTaskModel
Also fix MainViewController scale answer format calls.
2015-04-21 01:15:08 +01:00
jwe-apple e5e2f5810e Merge pull request #64 from pbodsk/master
replacing (id) with (instancetype) in initWithCoder: methods
2015-04-20 15:05:03 -07:00
Yuan Zhu c9983cae47 Merge pull request #57 from mharper/master
Adds Swift code snippets for Getting Started
2015-04-20 14:07:52 -07:00
Michael Harper dcca7bf200 Remove self. from method calls
Conforms to Swift style per @YuanZhu-Apple.
2015-04-20 14:04:02 -07:00
Ricardo Sánchez-Sáez a08f8ee42d ORKAnswerFormat: rename 'verticalFlag' argument to 'vertical' 2015-04-20 21:01:51 +01:00
jwe-apple 2f81b9d31d Merge pull request #58 from rsanchezsaez/rsanchezsaez-plaintextstrings
Convert all non-English Localizable.strings to human-readable format
2015-04-20 12:49:29 -07:00
pbodsk adfe0147ab replacing (id) with (instancetype) in initWithCoder: methods 2015-04-20 21:48:59 +02:00
jwe-apple f750ccff78 Merge pull request #48 from wczekalski/improvement/Dynamic-Cast-Macro
Fixed possible double evaluation in the ORKDynamicCast macro
2015-04-20 12:37:40 -07:00
jwe-apple 95634467f6 Merge pull request #44 from rsanchezsaez/rsanchezsaez-recorderidentifier
Add identifier to ORKRecorderConfiguration and ORKRecorder
2015-04-20 12:36:26 -07:00
Ricardo Sánchez-Sáez d9b0e5dfed ORKScaleSlider: reset _thumbImageNeedsTransformUpdate flag
Also: don't use '_' prefix for method names.
2015-04-20 19:55:02 +01:00
Ricardo Sánchez-Sáez 59ac68442f ORKScaleSlider: minor optimization to _thumbImageSubview method 2015-04-19 16:02:36 +01:00
Ricardo Sánchez-Sáez 483cf7cd11 plist-to-strings.py: improve comments and inner function name 2015-04-19 14:16:47 +01:00
Ricardo Sánchez-Sáez 3817139626 plist-to-strings.py: move argument checks and logging outside function 2015-04-19 13:53:45 +01:00
Ricardo Sánchez-Sáez 4ec792498e plist-to-strings.py: remove unneeded import 2015-04-19 13:46:23 +01:00
Ricardo Sánchez-Sáez ad87af34cf plist-to-strings.py: add Python version information 2015-04-19 02:51:58 +01:00
Ricardo Sánchez-Sáez 52550021a9 Localizable.strings: convert all localized .strings files to plaintext 2015-04-19 02:48:31 +01:00
Ricardo Sánchez-Sáez 686fb2458a Add plist-to-strings.py script
It can be used to convert binary .strings files to plaintext .strings files. It takes a master plaintext .strings file for the key sort order of the converted file.
2015-04-19 02:47:58 +01:00
Ricardo Sánchez-Sáez 62cff57325 Add copyright line to ORKScaleSlider & ORKScaleSliderView 2015-04-19 00:06:15 +01:00
Ricardo Sánchez-Sáez 9877ec749e ORKOrderedTask: reuse recorder identifiers between steps
Also added my copyright line.
2015-04-19 00:01:13 +01:00
Ricardo Sánchez-Sáez 22d0de778b ORKRecorderConfiguration & friends: move base class initializers to the private header 2015-04-18 23:14:08 +01:00
Michael Harper 598b275a1a Adds Swift code snippets for Getting Started 2015-04-18 14:31:39 -07:00
Ricardo Sánchez-Sáez f0675d2646 ORKRecorder subclasses: remove needless casts
Also improved some code alignment.
2015-04-18 22:29:01 +01:00
Ricardo Sánchez-Sáez 15be84da3b ORKRecorder.h: improve documentation whitespace alignment 2015-04-18 22:28:47 +01:00
Ricardo Sánchez-Sáez 553b27735b ORKScaleSlider: improve code formatting (braces, whitespace) 2015-04-18 21:16:28 +01:00
Ricardo Sánchez-Sáez c7d27e2e0a ORKScaleSlider: keep thumbImage view original orientation in vertical scale 2015-04-18 21:13:33 +01:00
Denis Lebedev 83eb2a5766 Remove newline 2015-04-18 13:11:36 +03:00
Denis Lebedev 5ecb0490a9 Split tests 2015-04-18 12:26:13 +03:00
Denis Lebedev ecac08f098 Modify accessors in ORKVoiceEngineTests 2015-04-18 12:26:01 +03:00
Denis Lebedev 3db44a194d Make speachSynthesizer readonly 2015-04-18 12:15:52 +03:00
Denis Lebedev fc0f58e664 Remove nullability annotations 2015-04-18 12:09:50 +03:00
Denis Lebedev f9b46de2be Rename test class 2015-04-18 12:08:04 +03:00
Bruce Duncan c6df59cfbb Removed the need for a fixed cell height (140) for both Form and Question Step table cells containing scales. Removed the need for fixing the baseline of the value label in relation to the slider to a magic number. Force the value label to always use the height of its font for its intrinsic size, even when its content is empty string, which can happen on scale's with no value set. 2015-04-18 04:00:18 -04:00
Wojtek Czekalski 5f3c5ccd7d #48: Fixed code formatting issues 2015-04-18 09:04:53 +02:00
Yuan Zhu f4c30882c7 Merge pull request #56 from mluedke2/master
Corrects typo in a comment
2015-04-17 22:24:24 -07:00
mluedke2 aa150c1fa7 comment typo 2015-04-17 22:20:45 -07:00
jwe-apple f4949f859d Merge pull request #54 from jhersh/podspec-version
[Podspec] Fixed tag naming
2015-04-17 16:43:45 -07:00
Yuan Zhu 4fe283f294 Merge pull request #52 from mattshedlick/modern_syntax
Updating to use modern Objective-C syntax.
2015-04-17 16:03:50 -07:00
Yuan Zhu f78bbece03 Merge pull request #53 from mattshedlick/using_instancetype
Updating init methods that return id to return instancetype instead.
 initWithCoder: still returns (id) so those were left alone.
2015-04-17 15:52:03 -07:00
Jonathan Hersh d77dc73201 [Podspec] Fixed tag naming 2015-04-17 15:48:33 -07:00
Matthew Shedlick 3d39c73a37 Updating init methods that return (id) to return (instancetype) instead. 2015-04-17 18:46:26 -04:00
Matthew Shedlick 7142e9e4eb Updating to use modern Objective-C syntax. 2015-04-17 18:37:20 -04:00
jwe-apple 94a47a4b3a Merge pull request #5 from dasmer/master
Adds dependency management documentation (and CocoaPods support)
2015-04-17 15:30:59 -07:00
Denis Lebedev 18988376aa Add ORKVoiceEngineTests 2015-04-18 01:12:40 +03:00
Denis Lebedev 37673a096b Add tests for UIView+ORKAccessibility 2015-04-18 00:38:38 +03:00
Ricardo Sánchez-Sáez 44f6355977 ORKRecorderTests: add test for identifier propagation from recorder configuration to recorder 2015-04-17 22:25:11 +01:00
Yuan Zhu c0d84dc4a9 Merge pull request #49 from philliptharris/veryMinorTypo
Very minor typo fix
2015-04-17 14:24:36 -07:00
Phillip Harris d9739e0843 Very minor typo fix 2015-04-17 17:07:17 -04:00
Ricardo Sánchez-Sáez 47261f181c ORKRecorder: add my copyright info 2015-04-17 20:51:37 +01:00
Wojtek Czekalski 447594d36c Fixed possible double evaluation in the ORKDynamicCast macro 2015-04-17 21:49:37 +02:00
Ricardo Sánchez-Sáez 8c39fcf935 ORKRecorder & friends: improve documentation 2015-04-17 20:37:36 +01:00
codestergit fbbfac9a23 fixed formatting of curly braces in all files 2015-04-18 01:02:57 +05:30
Ricardo Sánchez-Sáez 49e79ab9f4 ORKRecorder: use recorder identifier for data log filename instead of step identifier 2015-04-17 20:26:43 +01:00
Dasmer Singh fc558417ac Set Xcode's Public files and Private files as podspec's public_header_files
[dependency_management.md] Fix typo

[Podspec] Add Xcode Public and Private files to public_header_files
2015-04-17 14:23:55 -04:00
Ricardo Sánchez-Sáez d58785fcf7 ORKJSONSerializationTests: Fix indentation 2015-04-17 19:13:04 +01:00
Ricardo Sánchez-Sáez 4362e13ebc Relayout vertical ORKScaleSliderView (optimized for iPhone 6 and up) 2015-04-17 15:09:42 +01:00
Dasmer Singh 7d4853a197 Create dependency managment file to list CocoaPods and Carthage.
[README] Drop fourth-level headers

Add Dependency Management file

[README.md] Link to dependency_management.md

Move /usr/bin/env ruby to top of script
2015-04-17 09:35:45 -04:00
Ricardo Sánchez-Sáez e0e216eecc Allow different cell heights in ORKSurveyAnswerCellForScale and ORKSurveyAnswerCellForVerticalScale 2015-04-17 14:12:28 +01:00
Ricardo Sánchez-Sáez a2140aff06 Replace ORKVerticalScaleAnswerFormat and ORKContinuousVerticalScaleAnswerFormat classes by 'vertical' property in ORKScaleAnswerFormat and ORKContinuousScaleAnswerFormat
Also:
- Rename 'minValue' and 'maxValue' to 'minimumValue' and 'maximumValue' (Coding Guidelines for Cocoa)
- Reorder 'defaultValue' before 'steps' in ORKScaleAnswerFormat initializers (for coherence with ORKContinuousScaleAnswerFormat)
2015-04-17 13:56:35 +01:00
Ricardo Sánchez-Sáez 99bc310088 ORKScaleSlider: rename 'isVertical' property to 'vertical' with specified 'isVertical' getter
(Coding Guidelines for Cocoa)
2015-04-17 12:40:11 +01:00
Ricardo Sánchez-Sáez 5f52f13833 ORKRecorderTests: rename 'conf' to 'recorderConfiguration'
(As per Coding Guidelines for Cocoa)
2015-04-17 12:21:28 +01:00
Ricardo Sánchez-Sáez 7b1725a955 ORKRecorderTests: add recorder identifier tests 2015-04-17 12:18:41 +01:00
Ricardo Sánchez-Sáez f349bd9b7f Fix whitespace alignment on some method arguments 2015-04-17 12:05:09 +01:00
Dasmer Singh b66fa14873 Merge remote-tracking branch 'upstream/master' 2015-04-16 22:57:12 -04:00
Dasmer Singh 56bd6301b1 [Podspec] Update author 2015-04-16 22:56:53 -04:00
Dasmer Singh 073d712324 [find_headers] Add license and copyright 2015-04-16 22:56:41 -04:00
Bruce Duncan d3dba26b79 Merge branch 'master' into issue_4 2015-04-16 22:44:09 -04:00
Bruce Duncan 2fc27d7bda Added fixed step and continuous scale examples to the kitchen sink form step in ORKTest 2015-04-16 22:34:57 -04:00
Bruce Duncan a3d3fbb439 Revert "Added example of fixed scale and continuous scale form items."
This reverts commit 10ca52e63d.
2015-04-16 22:32:34 -04:00
jwe-apple f5e0594c75 Merge pull request #18 from ricardopereira/improvement/localization/pt
ERROR_DATALOGGER_COULD_NOT_MAORK changed 'pagado' to 'eliminado'
2015-04-16 15:20:19 -07:00
Yuan Zhu 96f83191dd Merge pull request #47 from mdznr/Capitalization-Consistency
Capitalization Consistency of sections in README
2015-04-16 14:13:45 -07:00
Matt Zanchelli fe40138b12 "Getting Started" capitalization in README 2015-04-16 14:12:15 -07:00
Yuan Zhu 4376582b4a Add .gitignore 2015-04-16 13:41:40 -07:00
Yuan Zhu d313e3f7a5 Merge pull request #32 from alexruperez/master
Fixed Form Sample Crash
2015-04-16 11:26:58 -07:00
Yuan Zhu 6d39c5e744 Fix license link 2015-04-16 11:14:17 -07:00
Yuan Zhu 96e22ba0c2 Fix best practice link 2015-04-16 11:12:45 -07:00
Yuan Zhu 5a9bb2f8fd Fix best practice link 2015-04-16 11:12:03 -07:00
alexruperez 5de3d1ec8b Fixes ResearchKit/ResearchKit#32 2015-04-16 20:10:59 +02:00
Yuan Zhu de7ec25b28 Merge pull request #15 from justinjdickow/master
Added CONTRIBUTING.md
2015-04-16 11:08:04 -07:00
Yuan Zhu 9849beded4 Merge pull request #34 from dplusm/master
Fixed coding-style inconsistencies
2015-04-16 11:05:01 -07:00
Ricardo Pereira 1503c05d6e Changed to 'apagado' 2015-04-16 18:56:53 +01:00
Yuan Zhu 6f517f89cf Merge pull request #23 from fyaqub/master
Objects that conform to NSCopying should use copy instead of strong
2015-04-16 10:53:11 -07:00
Yuan Zhu d56fc3e1bd Merge pull request #13 from steipete/master
Uses modern version detection API instead of floating point comparison.
2015-04-16 10:52:54 -07:00
Yuan Zhu e6b5a96c48 Merge pull request #43 from kindraywind/patch-1
Fix comma inconsistencies.
2015-04-16 10:50:31 -07:00
Yuan Zhu 228da9c789 Merge pull request #46 from sferrini/master
Avoid retain cycle
2015-04-16 10:45:27 -07:00
Dasmer Singh 75ece11fc1 Update syntax and add argument exception 2015-04-16 13:27:17 -04:00
dasmer / eliperkins 9044b794a3 Add documentation_url to podspec 2015-04-16 13:26:43 -04:00
dasmer / eliperkins a2ff2bd393 Add find header script for public and private headers and use in podspec 2015-04-16 13:26:33 -04:00
Simone Ferrini f2ada1a01c Avoid retain cycle 2015-04-16 19:10:44 +02:00
Bruce Duncan 10ca52e63d Added example of fixed scale and continuous scale form items. 2015-04-16 12:39:00 -04:00
Matt Zanchelli 627399a78c Capitalization Consistency of sections in README
"cases" should be capitalized correctly in the "Use cases" header in the README.
2015-04-16 09:06:03 -07:00
Woramet Muangsiri 58b544d5df Fix comma inconsistencies. 2015-04-16 21:35:55 +07:00
alexruperez 422d3afb41 Resolves ResearchKit/ResearchKit#32 2015-04-16 14:18:11 +02:00
Ricardo Sánchez-Sáez e5f5119bba Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-recorderidentifier 2015-04-16 12:51:19 +01:00
Ricardo Sánchez-Sáez 44036cb73e ORKRecorder & ORKRecorderConfiguration: add identifier property
Modeled after ORKStep's identifier (read-only property that is assigned in the initializers).
The identifier gets passed from ORKRecorderConfiguration to ORKRecorder and finally to the corresponding ORKFileResult.
ORKRecorderConfiguration serialization added: ORKTest tests modified to support the new property and passing.
2015-04-16 12:51:03 +01:00
Bruce Duncan ac4f40a902 Basic implementation of issue #4 2015-04-16 04:21:46 -04:00
Yuan Zhu 954a2a05a6 Merge pull request #39 from sikhapol/format-property-declarations
Format property declarations
2015-04-16 00:05:45 -07:00
Sikhapol Saijit 34b481f68c Format property declarations 2015-04-16 12:29:25 +07:00
Ricardo Sánchez-Sáez 00aa3212b4 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-verticalscale 2015-04-16 00:38:18 +01:00
Yuan Zhu b7824b1851 Merge pull request #38 from streeter/patch-1
Fix typo
2015-04-15 11:43:30 -07:00
Chris Streeter 9d97a29104 Fix typo 2015-04-15 11:16:47 -07:00
jwe-apple 4726d6fdd7 Merge pull request #30 from franklinsch/master
Replaced magic numbers in OKHTMLPDFWriter.m
2015-04-15 11:12:17 -07:00
fs2014 bd1d1ca3e6 Updated float to CGFloat. 2015-04-15 20:11:26 +02:00
fs2014 390c52e5e8 Used static consts instead of define for type safety, as suggested by jwe-apple. 2015-04-15 19:40:04 +02:00
Yuan Zhu 37b30537e9 Merge pull request #31 from codestergit/remove-spaces-from-method-params
Removed spaces between colon and parameters according to Apple's cocoa coding style.
2015-04-15 10:32:22 -07:00
jwe-apple 4aac2f9010 Merge pull request #8 from garnett/cleanup-tests
Cleanup tests
2015-04-15 10:31:12 -07:00
jwe-apple 2c29f029c4 Merge pull request #36 from troligtvis/master
variable name corrected
2015-04-15 10:29:49 -07:00
DanKeen 175679468e Merge pull request #37 from hcanzonetta/master
Fixed typo in AdjustToScale
2015-04-15 10:08:47 -07:00
Justin Dickow 5f288877d0 Referenced CONTRIBUTING.md in README 2015-04-15 10:08:21 -04:00
Justin Dickow 3faffe89ea Addressed PR Comments, updated inline links 2015-04-15 09:47:46 -04:00
Hernán Canzonetta 648b382fe9 Fixed typo in AdjustToScale 2015-04-15 10:23:14 -03:00
strawberrypie 077e1bb94b small typo corrected 2015-04-15 14:35:01 +02:00
strawberrypie 17ae36d939 wrong variable name fixed 2015-04-15 13:39:42 +02:00
Ricardo Sánchez-Sáez ddcb2ce4f0 Merge branch 'master' of github.com:ResearchKit/ResearchKit into rsanchezsaez-dev 2015-04-15 11:26:11 +01:00
Ricardo Sánchez-Sáez 5953891a7c TaskListRow: add DiscreteVerticalScaleQuestionStep and ContinuousVerticalScaleQuestionStep examples to scaleQuestionTask 2015-04-15 11:25:28 +01:00
Ricardo Sánchez-Sáez fd2ab4b4a3 ORKAnswerFormat: add ORKVerticalScaleAnswerFormat and ORKContinuousVerticalScaleAnswerFormat classes and factory methods
Also:
ORKAnswerFormat .h: make spacing coherent; add missing ORKContinuousScaleAnswerFormat initializer comment
2015-04-15 11:24:46 +01:00
alexruperez b923899ced Fixed Form Sample Crash 2015-04-15 12:21:02 +02:00
Ricardo Sánchez-Sáez 87fd1537d7 ORKScaleAnswerFormatProvider protocol: add isVertical method; ORKScaleSliderView: add vertical mode support 2015-04-15 11:09:06 +01:00
Daniel Martens 3cb3b72c2d Fixed coding-style inconsistencies 2015-04-15 11:59:43 +02:00
Ricardo Sánchez-Sáez e270c9812d ORKScaleSlider: add vertical scale mode 2015-04-15 10:51:13 +01:00
Ricardo Sánchez-Sáez 0b5f1d7082 ORKScaleSlider: fix issue when left dragging touch outside the segmented scale
(Scale was being set to the maximumValue when you dragged the touch outside the segmented scale through the view's left bound)
2015-04-15 10:49:32 +01:00
codestergit f7f7c73ccc Removed space between colon and parameters 2015-04-15 14:50:24 +05:30
Peter Steinberger d4bd7b07d7 Remove Macro redefinition of HKBiologicalSexOther 2015-04-15 10:32:31 +02:00
fs2014 bd89f14b7e Replaced magic numbers in OKHTMLPDFWriter.m 2015-04-15 10:06:01 +02:00
Peter Steinberger 9b5ee80420 Remove _IPHONE_8_2 checks since nullability requires Xcode 6.3. 2015-04-15 09:38:00 +02:00
Denis Lebedev a2ab9874ab Revert ORKHKSampleTests to user ivars 2015-04-15 10:22:07 +03:00
Faisal Yaqub c1593b312d Switch NSArray objects to copy 2015-04-15 00:12:41 -07:00
Faisal Yaqub aeddc8fea9 Change NSValue and NSData properties to strong 2015-04-15 00:07:37 -07:00
Faisal Yaqub 9a03d12817 Revert accidental change to strong 2015-04-14 23:59:15 -07:00
Faisal Yaqub 54e147c969 Switch NSCalendar property to strong 2015-04-14 23:54:24 -07:00
Faisal Yaqub 9f0bdfd2fd Removing unused NSError properties 2015-04-14 23:52:48 -07:00
DanKeen 4ddf07f106 Merge pull request #26 from kindraywind/patch-1
Remove spaces according to Apple's cocoa coding style.
2015-04-14 22:52:24 -07:00
Woramet Muangsiri eae5f56040 Remove spaces according to Apple's cocoa coding style. 2015-04-15 12:38:30 +07:00
Faisal Yaqub 120d063bdf Switching collections back to copy 2015-04-14 22:29:31 -07:00
DanKeen 1d8182db32 Merge pull request #22 from waynn/patch-1
make it clear myStep is a variable
2015-04-14 21:59:43 -07:00
Dasmer Singh 946753ea91 [Podspec] Remove spaces between filenames 2015-04-14 22:40:29 -04:00
Faisal Yaqub 4757edc130 Objects that conform to NSCopying should use copy instead of strong 2015-04-14 18:32:53 -07:00
Waynn Lue 19460998b6 make it clear myStep is a variable 2015-04-14 18:07:44 -07:00
Yuan Zhu 1f0307aa63 Merge pull request #21 from sferrini/master
Removed unnecessary semicolons
2015-04-14 16:01:53 -07:00
Yuan Zhu e477f4e38b Capitalizing "Predefined" 2015-04-14 15:38:53 -07:00
Dasmer Singh 06125bb24d Explicitly add all public header files. Limit source files to only be .h and .m files 2015-04-14 17:06:46 -04:00
Dasmer Singh 4ff80ee4c2 Add shader files to resources 2015-04-14 17:06:34 -04:00
Simone Ferrini f61f4e66db Removed unnecessary semicolons 2015-04-14 23:03:47 +02:00
jwe-apple c11ae6d95e Merge pull request #20 from Rudimental/patch-1
Add closing p tag to fix formatting in section 2
2015-04-14 13:50:48 -07:00
Yuan Zhu 064d4d0a03 Merge pull request #19 from fedetrim/patch-1
Adopting Apple coding convention
2015-04-14 13:35:19 -07:00
David Rabkin fd84004c37 Add closing p tag to fix formatting in section 2
-The code isn't formatting correctly in section 2. By adding a closing p tag, the documentation can be read more easily.
2015-04-14 13:26:38 -07:00
fedetrim 33880857a0 Adopting Apple coding convention 2015-04-14 16:58:37 -03:00
Ricardo Pereira 9b6decc643 ERROR_DATALOGGER_COULD_NOT_MAORK changed 'pagado' to 'eliminado' 2015-04-14 20:12:30 +01:00
Justin Dickow d81f303959 Added CONTRIBUTING.md 2015-04-14 15:10:37 -04:00
Peter Steinberger e4f8af52eb Uses modern version detection API instead of floating point comparison.
While the current way of checking for the version is not deprecated,
converting the string to float isn’t a good idea either.

The framework is for iOS 8 and above, so we can use the new Foundation API.
2015-04-14 21:08:34 +02:00
Dasmer Singh 208249a3b9 Add project resources to podspec 2015-04-14 14:11:55 -04:00
Denis Lebedev 71373cc46f Remove empty test setup overrides 2015-04-14 20:55:26 +03:00
Denis Lebedev aa8186e175 DRY test fixtures 2015-04-14 20:40:33 +03:00
Denis Lebedev cabe77ca67 Delete template code 2015-04-14 20:37:09 +03:00
Dasmer Singh cdcda16714 Update README for CocoaPods 2015-04-14 13:27:42 -04:00
Yuan Zhu 9c75263ac5 Merge pull request #6 from frewsxcv/patch-1
Fix spelling error in readme
2015-04-14 10:21:39 -07:00
Corey Farwell 3d08b355bd Fix spelling error in readme 2015-04-14 13:19:30 -04:00
Dasmer Singh c5b1640343 Adds a podspec for Cocoapods 2015-04-14 13:15:13 -04:00
John Earl f22c425b25 Update readme links 2015-04-14 09:24:12 -07:00
4268 changed files with 642212 additions and 65433 deletions
+1
View File
@@ -0,0 +1 @@
LFS-Files/** filter=lfs diff=lfs merge=lfs -text
-2
View File
@@ -18,6 +18,4 @@ DerivedData
*.xcuserstate
.DS_Store
StudyDemo/ResearchKit
*.pyc
+2
View File
@@ -0,0 +1,2 @@
[lfs]
fetchexclude = *
-28
View File
@@ -1,28 +0,0 @@
Copyright (c) 2015, 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.
+143 -194
View File
@@ -1,229 +1,178 @@
![ResearchKit](https://github.com/user-attachments/assets/0384c1a6-ec67-45d3-be68-136a2e4cacff)
ResearchKit Framework
===========
The ResearchKit™ framework is an open source software framework that makes it easy to
create apps for medical research or for other research projects.
![VCS](https://img.shields.io/badge/dvcs-Git%20%2B%20LFS-tomato.svg) ![Platform](https://img.shields.io/cocoapods/p/ResearchKit.svg) ![CocoaPods](https://img.shields.io/cocoapods/v/ResearchKit.svg) ![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-yellow.svg?style=flat) [![License](https://img.shields.io/badge/license-BSD-green.svg?style=flat)](https://github.com/ResearchKit/ResearchKit#license) ![](https://travis-ci.com/ResearchKit/ResearchKit.svg?branch=master)
* Getting Started: [Getting Started](#gettingstarted)
* Documentation: ([Programming Guide](http://researchkit.org/docs/docs/Overview/GuideOverview.html)) ([API](http://researchkit.org/docs/index.html))
* Best practices: [Best Practices](../../wiki/best_practices)
* Contributing to ResearchKit: [Contributing](../../wiki/contributing)
* Website and blog: ([researchkit.org](http://researchkit.org/index.html)) ([Blog](http://researchkit.org/blog.html))
* ResearchKit BSD License: [License](#license)
The *ResearchKit™ framework* is an open source software framework that makes it easy to create apps
for medical research or for other research projects.
Getting More Information
========================
# Table of Contents
* Join [researchkit-users](https://lists.apple.com/mailman/listinfo/researchkit-users) for discussing uses of the ResearchKit framework and related projects.
* Join [researchkit-dev](https://lists.apple.com/mailman/listinfo/researchkit-dev) for discussing ongoing work to improve and expand the framework.
* Or [contact us](https://developer.apple.com/contact/researchkit/)
* [Requirements](#requirements)
* [Documentation](#documentation)
* [Getting Started](#gettingstarted)
* [Installing](#installation)
* [ORKCatalog App](#orkcatalog-app)
* [Surveys](#surveys)
* [Consent](#consent)
* [Active Tasks](#active-tasks)
* [Getting Help](#getting-help)
* [License](#license)
Use cases
===========
# Requirements <a name="requirements"></a>
A task in the ResearchKit framework contains a set of steps to present to a
user. Everything, whether its a survey, the consent process, or active tasks,
is represented as a task that can be presented with a task view controller.
The *ResearchKit framework* codebase supports iOS and requires Xcode 12.0 or newer. The *ResearchKit framework* has a Base SDK version of 13.0.
Surveys
-------
# Documentation <a name="documentation"></a>
The ResearchKit framework provides a pre-built user interface for surveys, which can be
presented modally on an iPhone, iPod Touch, or iPad. [Surveys](http://researchkit.org/docs/docs/Survey/CreatingSurveys.html)
<img width="1000" alt="ebedded-framework" src="https://github.com/ResearchKit/ResearchKit/assets/29615893/19d6edd3-3d95-4416-9ac4-24ccb35e09c2">
View the *ResearchKit framework* documentation by setting ResearchKit as your target in Xcode and selecting 'Build Documentation' in the Product menu dropdown.
Consent
----------------
# Getting Started <a name="gettingstarted"></a>
The ResearchKit framework provides visual consent templates that you can customize to
explain the details of your research study and obtain a signature if needed. [Consent](http://researchkit.org/docs/docs/InformedConsent/InformedConsent.html)
* [Website](https://www.researchandcare.org)
* [WWDC: ResearchKit and CareKit Reimagined](https://developer.apple.com/videos/play/wwdc2019/217/)
Active Tasks
------------
### Install as an embedded framework <a name="installation"></a>
Some studies may need data beyond survey questions or the passive data collection
capabilities available through use of the HealthKit and CoreMotion APIs if you are
programming for iOS. ResearchKit's active tasks invite users to perform activities
under semi-controlled conditions, while iPhone sensors actively collect data. [Active Tasks](http://researchkit.org/docs/docs/ActiveTasks/ActiveTasks.html)
Download the project source code and drag in ResearchKit.xcodeproj. Then, embed *ResearchKit* framework in your app by adding it to the "Frameworks, Libraries, and Embedded Content" section for your target as shown in the figure below.
<img width="1000" alt="ebedded-framework" src="https://github.com/ResearchKit/ResearchKit/assets/29615893/7479f313-ecc7-4d94-8c64-c58ae7362a4d">
Getting started<a name="gettingstarted"></a>
===============
### ORKCatalog App <a name="orkcatalog-app"></a>
The included catalog app demonstrates the different modules that are available in *ResearchKit*. Find the
project in ResearchKit's [`samples`](samples) directory.
Requirements
------------
| | |
|---|---|
| ![catalog-home](https://github.com/ResearchKit/ResearchKit/assets/29615893/45357cf8-17bf-4f38-aebc-bdf1c3395eb5) | ![catalog-survey](https://github.com/ResearchKit/ResearchKit/assets/29615893/a850f20b-7a05-4d14-bc2d-2d6dab7af30d) |
The primary ResearchKit framework codebase supports iOS and requires Xcode 6.3
or newer. The ResearchKit framework has a Base SDK version of 8.0, meaning that apps
using the ResearchKit framework can run on devices with iOS 8.0 or newer.
# Surveys <a name="surveys"></a>
The *ResearchKit framework* provides a pre-built user interface for surveys, which can be presented
modally on an *iPhone* or *iPad*. The example below shows the process to present a height question for a participant to answer.
Installation
------------
```swift
import ResearchKit
import ResearchKitUI
let sectionHeaderFormItem = ORKFormItem(sectionTitle: "Your question here.")
The lastest stable version of ResearchKit framework can be cloned with
let heightQuestionFormItem = ORKFormItem(identifier: "heightQuestionFormItem1", text: nil, answerFormat: ORKAnswerFormat.heightAnswerFormat())
heightQuestionFormItem.placeholder = "Tap here"
```
git clone -b stable https://github.com/ResearchKit/ResearchKit.git
let formStep = ORKFormStep(identifier: "HeightQuestionIdentifier", title: "Height", text: "Local system")
formStep.formItems = [sectionHeaderFormItem, heightQuestionFormItem]
return formStep
```
Or, for the latest changes, use the `master` branch:
The height question is presented in the figure below.
| | |
|---|---|
| ![height-question](https://github.com/ResearchKit/ResearchKit/assets/29615893/4f425329-83b7-45c3-84f9-58cdbcaf2529) | ![height-question-2](https://github.com/ResearchKit/ResearchKit/assets/29615893/2cc0dc2c-5c2a-4b50-a4be-834363fb64b5) |
# Consent <a name="consent"></a>
The *ResearchKit framework* provides classes that you can customize to explain the
details of your research study and obtain a signature if needed. Use *ResearchKit's* provided classes to quickly welcome, and inform your participants of what the study entails.
```swift
import ResearchKit
import ResearchKitUI
// Welcome page.
let welcomeStep = ORKInstructionStep(identifier: String(describing: Identifier.consentWelcomeInstructionStep))
welcomeStep.iconImage = UIImage(systemName: "hand.wave")
welcomeStep.title = "Welcome!"
welcomeStep.detailText = "Thank you for joining our study. Tap Next to learn more before signing up."
// Before You Join page.
let beforeYouJoinStep = ORKInstructionStep(identifier: String(describing: Identifier.informedConsentInstructionStep))
beforeYouJoinStep.iconImage = UIImage(systemName: "doc.text.magnifyingglass")
beforeYouJoinStep.title = "Before You Join"
let sharingHealthDataBodyItem = ORKBodyItem(text: "The study will ask you to share some of your Health data.",
detailText: nil,
image: UIImage(systemName: "heart.fill"),
learnMoreItem: nil,
bodyItemStyle: .image)
let completingTasksBodyItem = ORKBodyItem(text: "You will be asked to complete various tasks over the duration of the study.",
detailText: nil,
image: UIImage(systemName: "checkmark.circle.fill"),
learnMoreItem: nil,
bodyItemStyle: .image)
let signatureBodyItem = ORKBodyItem(text: "Before joining, we will ask you to sign an informed consent document.",
detailText: nil,
image: UIImage(systemName: "signature"),
learnMoreItem: nil,
bodyItemStyle: .image)
let secureDataBodyItem = ORKBodyItem(text: "Your data is kept private and secure.",
detailText: nil,
image: UIImage(systemName: "lock.fill"),
learnMoreItem: nil,
bodyItemStyle: .image)
beforeYouJoinStep.bodyItems = [
sharingHealthDataBodyItem,
completingTasksBodyItem,
signatureBodyItem,
secureDataBodyItem
]
```
git clone https://github.com/ResearchKit/ResearchKit.git
The consent steps are presented in the figure below.
| | |
|---|---|
| ![consent-welcome-page](https://github.com/ResearchKit/ResearchKit/assets/29615893/e6cbbe07-47ed-4bb4-a84a-f3bf612e9122) | ![consent-before-you-join](https://github.com/ResearchKit/ResearchKit/assets/29615893/687fe345-14d9-4356-9c37-c6a2714875ae) |
Vist the `Obtaining Consent`article in ResearchKit's Documentation for
more examples that include signature collection and PDF file storage.
# Active Tasks <a name="active-tasks"></a>
Some studies may need data beyond survey questions or the passive data collection capabilities
available through use of the *HealthKit* and *CoreMotion* APIs if you are programming for *iOS*.
*ResearchKit*'s active tasks invite users to perform activities under semi-controlled conditions,
while *iPhone* sensors actively collect data.
ResearchKit active tasks are not diagnostic tools nor medical devices of any kind and output from those active tasks may not be used for diagnosis. Developers and researchers are responsible for complying with all applicable laws and regulations with respect to further development and use of the active tasks.
Use predefined tasks provided by *ResearchKit* to guide your participants through specific actions.
```swift
import ResearchKit
import ResearchKitUI
import ResearchKitActiveTask
let orderedTask = ORKOrderedTask.dBHLToneAudiometryTask(withIdentifier: "dBHLToneAudiometryTaskIdentifier",
intendedUseDescription: nil, options: [])
let taskViewController = ORKTaskViewController(task: orderedTask, taskRun: nil)
taskViewController.delegate = self
present(taskViewController, animated: true)
```
The dBHL Tone Audiometry task is presented in the figure below.
Building
--------
| | |
|---|---|
| ![noise-check](https://github.com/ResearchKit/ResearchKit/assets/29615893/d8fb669c-bb60-482d-9a2d-e5b6b6696aa5) | ![dbhl-tone-test](https://github.com/ResearchKit/ResearchKit/assets/29615893/04df862b-46bc-4749-8c3e-02d2e54dbcbf) |
Build the ResearchKit framework by opening `ResearchKit.xcodeproj` and running the
`ResearchKit` framework target. Optionally, run the unit tests too.
# Getting Help <a name="getting-help"></a>
GitHub is our primary forum for ResearchKit. Feel free to open up issues about questions, problems, or ideas.
Adding the ResearchKit framework to your App
------------------------------
# License <a name="license"></a>
This walk-through shows how to embed the ResearchKit framework in your app as a
dynamic framework, and present a simple task view controller.
###1. Add the ResearchKit framework to Your Project
To get started, drag `ResearchKit.xcodeproj` from your checkout into
your iOS app project in Xcode:
<center>
<figure>
<img src="../../wiki/AddingResearchKitXcode.png" alt="Adding the ResearchKit framework to your project" align="middle"/>
</figure>
</center>
Then, embed the ResearchKit framework as a dynamic framework in your app, by adding
it to the Embedded Binaries section of the General pane for your
target as shown in the figure below.
<center>
<figure>
<img src="../../wiki/AddedBinaries.png" width="100%" alt="Adding the ResearchKit framework to Embedded Binaries" align="middle"/>
<figcaption><center>Adding the ResearchKit framework to Embedded Binaries</center></figcaption>
</figure>
</center>
###2. Create a Step
In this walk-through, we will use the ResearchKit framework to modally present a
simple single-step task showing a single instruction.
Create a step for your task by adding some code, perhaps in
`viewDidAppear:` of an existing view controller. To keep things
simple, we'll use an instruction step (`ORKInstructionStep`) and name
the step `myStep`.
```objc
ORKInstructionStep *myStep =
[[ORKInstructionStep alloc] initWithIdentifier:@"intro"];
myStep.title = @"Welcome to ResearchKit";
```
###3. Create a Task
Use the ordered task class (`ORKOrderedTask`) to create a task that
contains myStep. An ordered task is just a task where the order and
selection of later steps does not depend on the results of earlier
ones. Name your task `task` and initialize it with `myStep`.
```objc
ORKOrderedTask *task =
[[ORKOrderedTask alloc] initWithIdentifier:@"task" steps:@[myStep]];
```
###4. Present the Task
Create a task view controller (`ORKTaskViewController`) and initialize
it with your `task`. A task view controller manages a task and collects the
results of each step. In this case, your task view
controller simply displays your instruction step.
```objc
ORKTaskViewController *taskViewController =
[[ORKTaskViewController alloc] initWithTask:task taskRunUUID:nil];
taskViewController.delegate = self;
[self presentViewController:taskViewController animated:YES completion:nil];
```
The above snippet assumes that your class implements the
`ORKTaskViewControllerDelegate` protocol. This has just one required method,
which you must implement in order to handle the completion of the task:
```objc
- (void)taskViewController:(ORKTaskViewController *)taskViewController
didFinishWithReason:(ORKTaskViewControllerFinishReason)reason
error:(NSError *)error {
ORKTaskResult *taskResult = [taskViewController result];
// You could do something with the result here.
// Then, dismiss the task view controller.
[self dismissViewControllerAnimated:YES completion:nil];
}
```
If you now run your app, you should see your first ResearchKit framework
instruction step:
<center>
<figure>
<img src="../../wiki/HelloWorld.png" width="50%" alt="HelloWorld example screenshot" align="middle"/>
</figure>
</center>
What else can the ResearchKit framework do?
-----------------------------
The ResearchKit [`ORKCatalog`](samples/ORKCatalog) sample app is a
good place to start. Find the project in ResearchKit's
[`samples`](samples) directory. This project includes a list of all
the types of steps supported by the ResearchKit framework in one tab, and displays a
browser for the results of the last completed task in the other tab.
License<a name="license"></a>
=======
The source in the ResearchKit repository is made available under the
following license unless another license is explicitly identified:
```
Copyright (c) 2015, 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.
```
This project is made available under the terms of a BSD license. See the [LICENSE](LICENSE) file.
File diff suppressed because it is too large Load Diff
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:ResearchKit.xcodeproj">
</FileRef>
</Workspace>
@@ -1,97 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0630"
version = "1.8">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B183A4731A8535D100C76870"
BuildableName = "ResearchKit.framework"
BlueprintName = "ResearchKit"
ReferencedContainer = "container:ResearchKit.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "86CC8E991AC09332001CCD89"
BuildableName = "ResearchKitTests.xctest"
BlueprintName = "ResearchKitTests"
ReferencedContainer = "container:ResearchKit.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B183A4731A8535D100C76870"
BuildableName = "ResearchKit.framework"
BlueprintName = "ResearchKit"
ReferencedContainer = "container:ResearchKit.xcodeproj">
</BuildableReference>
</MacroExpansion>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B183A4731A8535D100C76870"
BuildableName = "ResearchKit.framework"
BlueprintName = "ResearchKit"
ReferencedContainer = "container:ResearchKit.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B183A4731A8535D100C76870"
BuildableName = "ResearchKit.framework"
BlueprintName = "ResearchKit"
ReferencedContainer = "container:ResearchKit.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -1,78 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0630"
version = "1.8">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B18FF3A41A9FE25700C0C3B0"
BuildableName = "docs"
BlueprintName = "docs"
ReferencedContainer = "container:ResearchKit.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
</Testables>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B18FF3A41A9FE25700C0C3B0"
BuildableName = "docs"
BlueprintName = "docs"
ReferencedContainer = "container:ResearchKit.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B18FF3A41A9FE25700C0C3B0"
BuildableName = "docs"
BlueprintName = "docs"
ReferencedContainer = "container:ResearchKit.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -1,35 +0,0 @@
/*
Copyright (c) 2015, 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.
*/
// Shared header for accessibility functionality.
#import "UIView+ORKAccessibility.h"
#import "ORKAccessibilityFunctions.h"
@@ -1,52 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKDefines.h"
#import "ORKHelpers.h"
@class ORKScaleSlider;
// Used to properly format values from the ORKScaleSlider.
ORK_EXTERN NSString *ORKAccessibilityFormatScaleSliderValue(CGFloat value, ORKScaleSlider *slider);
ORK_EXTERN NSString *ORKAccessibilityFormatContinuousScaleSliderValue(CGFloat value, ORKScaleSlider *slider);
// Performs a block on the main thread after a delay. If Voice Over is not running, the block is performed immediately.
ORK_EXTERN void ORKAccessibilityPerformBlockAfterDelay(NSTimeInterval delay, void(^block)(void));
// Convenience for posting an accessibility notification after a delay.
ORK_INLINE void ORKAccessibilityPostNotificationAfterDelay(UIAccessibilityNotifications notification, id argument, NSTimeInterval delay) {
ORKAccessibilityPerformBlockAfterDelay(delay, ^{
UIAccessibilityPostNotification(notification, argument);
});
}
// Creates a string suitable for Voice Over by joining the variables with ", " and avoiding nil and empty strings.
#define ORKAccessibilityStringForVariables(...) _ORKAccessibilityStringForVariables(ORK_NARG(__VA_ARGS__), ##__VA_ARGS__)
ORK_EXTERN NSString *_ORKAccessibilityStringForVariables(NSInteger numParameters, NSString *baseString, ...);
@@ -1,88 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKAccessibilityFunctions.h"
#import "ORKAnswerFormat_Internal.h"
#import "ORKScaleSlider.h"
#import "ORKScaleSliderView.h"
#import "UIView+ORKAccessibility.h"
NSString *ORKAccessibilityFormatScaleSliderValue(CGFloat value, ORKScaleSlider *slider) {
ORKScaleSliderView *sliderView = (ORKScaleSliderView *)[slider ork_superviewOfType:[ORKScaleSliderView class]];
if (!slider || !sliderView) {
return nil;
}
NSNumber *normalizedValue = [sliderView.formatProvider normalizedValueForNumber:@(value)];
return [sliderView.formatProvider localizedStringForNumber:normalizedValue];
}
NSString *ORKAccessibilityFormatContinuousScaleSliderValue(CGFloat value, ORKScaleSlider *slider) {
ORKScaleSliderView *sliderView = (ORKScaleSliderView *)[slider ork_superviewOfType:[ORKScaleSliderView class]];
if (!slider || !sliderView) {
return nil;
}
return [sliderView.formatProvider localizedStringForNumber:@(value)];
}
void ORKAccessibilityPerformBlockAfterDelay(NSTimeInterval delay, void(^block)(void)) {
if (block == nil) {
return;
}
if (!UIAccessibilityIsVoiceOverRunning()) {
delay = 0;
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
block();
});
}
NSString *_ORKAccessibilityStringForVariables(NSInteger numParameters, NSString *baseString, ...) {
NSMutableArray *variables = [[NSMutableArray alloc] init];
NSInteger paramIndex = 0;
va_list args;
va_start(args, baseString);
for (__unsafe_unretained NSString *variable = baseString;
paramIndex < numParameters;
variable = va_arg(args, __unsafe_unretained NSString *), paramIndex++) {
if ([variable isKindOfClass:[NSString class]] && variable.length > 0) {
[variables addObject:variable];
}
}
va_end(args);
return [variables componentsJoinedByString:@", "];
}
@@ -1,42 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIView (ORKAccessibility)
- (nullable UIView *)ork_superviewOfType:(nullable Class)aClass;
@end
NS_ASSUME_NONNULL_END
@@ -1,51 +0,0 @@
/*
Copyright (c) 2015, 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 "UIView+ORKAccessibility.h"
@implementation UIView (ORKAccessibility)
- (UIView *)ork_superviewOfType:(Class)aClass {
if (aClass == nil) {
return nil;
}
id superview = [self superview];
if (superview == nil) {
return nil;
}
else if ([superview isKindOfClass:aClass]) {
return superview;
}
return [superview ork_superviewOfType:aClass];
}
@end
@@ -1,42 +0,0 @@
/*
Copyright (c) 2015, 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 <CoreLocation/CoreLocation.h>
#import <ResearchKit/ResearchKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface CLLocation (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionary;
@end
NS_ASSUME_NONNULL_END
@@ -1,75 +0,0 @@
/*
Copyright (c) 2015, 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 "CLLocation+ORKJSONDictionary.h"
#import "ORKHelpers.h"
@implementation CLLocation (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionary
{
CLLocationCoordinate2D coord = self.coordinate;
CLLocationDistance altitude = self.altitude;
CLLocationAccuracy horizAccuracy = self.horizontalAccuracy;
CLLocationAccuracy vertAccuracy = self.verticalAccuracy;
CLLocationDirection course = self.course;
CLLocationSpeed speed = self.speed;
NSDate *timestamp = self.timestamp;
CLFloor *floor = self.floor;
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObject:ORKStringFromDateISO8601(timestamp) forKey:@"timestamp"];
if (horizAccuracy >= 0)
{
dict[@"coordinate"] = @{ @"latitude" : [NSDecimalNumber numberWithDouble:coord.latitude], @"longitude" : [NSDecimalNumber numberWithDouble:coord.longitude]};
dict[@"horizontalAccuracy"] = [NSDecimalNumber numberWithDouble:horizAccuracy];
}
if (vertAccuracy >= 0)
{
dict[@"altitude"] = [NSDecimalNumber numberWithDouble:altitude];
dict[@"verticalAccuracy"] = [NSDecimalNumber numberWithDouble:vertAccuracy];
}
if (course >= 0)
{
dict[@"course"] = [NSDecimalNumber numberWithDouble:course];
}
if (speed >= 0)
{
dict[@"speed"] = [NSDecimalNumber numberWithDouble:speed];
}
if (floor)
{
dict[@"floor"] = @(floor.level);
}
return dict;
}
@end
@@ -1,42 +0,0 @@
/*
Copyright (c) 2015, 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 <CoreMotion/CoreMotion.h>
#import <ResearchKit/ResearchKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface CMAccelerometerData (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionary;
@end
NS_ASSUME_NONNULL_END
@@ -1,46 +0,0 @@
/*
Copyright (c) 2015, 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 "CMAccelerometerData+ORKJSONDictionary.h"
@implementation CMAccelerometerData (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionary
{
NSDictionary *dict = @{@"timestamp": [NSDecimalNumber numberWithDouble:self.timestamp],
@"x" : [NSDecimalNumber numberWithDouble:self.acceleration.x],
@"y" : [NSDecimalNumber numberWithDouble:self.acceleration.y],
@"z" : [NSDecimalNumber numberWithDouble:self.acceleration.z]
};
return dict;
}
@end
@@ -1,43 +0,0 @@
/*
Copyright (c) 2015, 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 <CoreMotion/CoreMotion.h>
#import <ResearchKit/ResearchKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface CMDeviceMotion (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionary;
@end
NS_ASSUME_NONNULL_END
@@ -1,76 +0,0 @@
/*
Copyright (c) 2015, 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 "CMDeviceMotion+ORKJSONDictionary.h"
@implementation CMDeviceMotion (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionary
{
CMQuaternion attitude = self.attitude.quaternion;
CMRotationRate rotationRate = self.rotationRate;
CMAcceleration gravity = self.gravity;
CMAcceleration userAccel = self.userAcceleration;
CMCalibratedMagneticField field = self.magneticField;
NSDictionary *dict = @{@"timestamp": [NSDecimalNumber numberWithDouble:self.timestamp],
@"attitude" : @{
@"x" : [NSDecimalNumber numberWithDouble:attitude.x],
@"y" : [NSDecimalNumber numberWithDouble:attitude.y],
@"z" : [NSDecimalNumber numberWithDouble:attitude.z],
@"w" : [NSDecimalNumber numberWithDouble:attitude.w]
},
@"rotationRate" : @{
@"x" : [NSDecimalNumber numberWithDouble:rotationRate.x],
@"y" : [NSDecimalNumber numberWithDouble:rotationRate.y],
@"z" : [NSDecimalNumber numberWithDouble:rotationRate.z]
},
@"gravity" : @{
@"x" : [NSDecimalNumber numberWithDouble:gravity.x],
@"y" : [NSDecimalNumber numberWithDouble:gravity.y],
@"z" : [NSDecimalNumber numberWithDouble:gravity.z]
},
@"userAcceleration" : @{
@"x" : [NSDecimalNumber numberWithDouble:userAccel.x],
@"y" : [NSDecimalNumber numberWithDouble:userAccel.y],
@"z" : [NSDecimalNumber numberWithDouble:userAccel.z]
},
@"magneticField" : @{
@"x" : [NSDecimalNumber numberWithDouble:field.field.x],
@"y" : [NSDecimalNumber numberWithDouble:field.field.y],
@"z" : [NSDecimalNumber numberWithDouble:field.field.z],
@"accuracy" : [NSDecimalNumber numberWithDouble:field.accuracy]
}
};
return dict;
}
@end
@@ -1,43 +0,0 @@
/*
Copyright (c) 2015, 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 <CoreMotion/CoreMotion.h>
#import <ResearchKit/ResearchKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface CMMotionActivity (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionary;
@end
NS_ASSUME_NONNULL_END
@@ -1,91 +0,0 @@
/*
Copyright (c) 2015, 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 "CMMotionActivity+ORKJSONDictionary.h"
#import "ORKHelpers.h"
static NSString * const kActivityUnknown = @"unknown";
static NSString * const kActivityStationary = @"stationary";
static NSString * const kActivityWalking = @"walking";
static NSString * const kActivityRunning = @"running";
static NSString * const kActivityAutomotive = @"automotive";
static NSString * const kStartDateKey = @"startDate";
static NSString * const kEndDateKey = @"endDate";
static NSString *stringFromActivityConfidence(CMMotionActivityConfidence confidence)
{
NSDictionary *confidences = @{@(CMMotionActivityConfidenceHigh) : @"high",
@(CMMotionActivityConfidenceMedium) : @"medium",
@(CMMotionActivityConfidenceLow) : @"low"};
return confidences[@(confidence)];
}
static NSArray *activityArray(CMMotionActivity *activity)
{
NSMutableArray *ret = [NSMutableArray array];
if (activity.unknown)
{
[ret addObject:kActivityUnknown];
}
if (activity.stationary)
{
[ret addObject:kActivityStationary];
}
if (activity.walking)
{
[ret addObject:kActivityWalking];
}
if (activity.running)
{
[ret addObject:kActivityRunning];
}
if (activity.automotive)
{
[ret addObject:kActivityAutomotive];
}
return ret;
}
static NSString * const kActivityKey = @"activity";
static NSString * const kConfidenceKey = @"confidence";
@implementation CMMotionActivity (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionary
{
return @{kConfidenceKey : stringFromActivityConfidence(self.confidence),
kActivityKey : activityArray(self),
kStartDateKey : ORKStringFromDateISO8601(self.startDate)};
}
@end
@@ -1,44 +0,0 @@
/*
Copyright (c) 2015, 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 <CoreMotion/CoreMotion.h>
#import <ResearchKit/ResearchKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface CMPedometerData (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionary;
@end
NS_ASSUME_NONNULL_END
@@ -1,50 +0,0 @@
/*
Copyright (c) 2015, 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 "CMPedometerData+ORKJSONDictionary.h"
#import "ORKHelpers.h"
#import <CoreMotion/CoreMotion.h>
@implementation CMPedometerData (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionary
{
NSMutableDictionary *dict = [@{@"startDate": ORKStringFromDateISO8601(self.startDate),
@"endDate": ORKStringFromDateISO8601(self.endDate)
} mutableCopy];
for (NSString *key in @[@"numberOfSteps", @"distance", @"floorsAscended", @"floorsDescended"])
{
[dict setValue:[self valueForKey:key] forKey:key];
}
return dict;
}
@end
@@ -1,64 +0,0 @@
/*
Copyright (c) 2015, 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 <HealthKit/HealthKit.h>
#import <ResearchKit/ResearchKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_OPTIONS(NSInteger, ORKSampleJSONOptions) {
ORKSampleIncludeMetadata = 0x1,
ORKSampleIncludeSource = 0x2,
ORKSampleIncludeUUID = 0x4
};
/**
* JSON serialization aid for HKSample.
*
*/
@interface HKSample (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionaryWithOptions:(ORKSampleJSONOptions)options unit:(nullable HKUnit *)unit;
@end
/**
* JSON serialization aid for HKCorrelation.
*
*/
@interface HKCorrelation (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionaryWithOptions:(ORKSampleJSONOptions)options sampleTypes:(NSArray *)sampleTypes units:(NSArray *)units;
@end
NS_ASSUME_NONNULL_END
@@ -1,180 +0,0 @@
/*
Copyright (c) 2015, 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 "HKSample+ORKJSONDictionary.h"
#import "ORKHelpers.h"
static NSString *const kHKSampleIdentifierKey = @"type"; // For compatibility with Health XML export
static NSString *const kHKUUIDKey = @"uuid";
static NSString *const kHKSampleStartDateKey = @"startDate";
static NSString *const kHKSampleEndDateKey = @"endDate";
static NSString *const kHKSampleValue = @"value";
static NSString *const kHKMetadataKey = @"metadata";
static NSString *const kHKSourceKey = @"source";
static NSString *const kHKUnitKey = @"unit";
static NSString *const kHKCorrelatedObjectsKey = @"objects";
// static NSString *const kHKSourceIdentifierKey = @"sourceBundleIdentifier";
@interface HKCategorySample (ORKJSONDictionary)
@end
@interface HKQuantitySample (ORKJSONDictionary)
@end
@implementation HKSample (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionaryWithOptions:(ORKSampleJSONOptions)options unit:(HKUnit *)unit
{
NSMutableDictionary *mdict = [NSMutableDictionary dictionaryWithCapacity:12];
// Type identification
HKSampleType *sampleType = [self sampleType];
mdict[kHKSampleIdentifierKey] = [sampleType identifier];
// consider adding @"class" : NSStringFromClass(sampleType) ?
// Start and end dates
NSDate *startDate = [self startDate];
if (startDate)
{
mdict[kHKSampleStartDateKey] = ORKStringFromDateISO8601(startDate);
}
NSDate *endDate = [self endDate];
if (endDate)
{
mdict[kHKSampleEndDateKey] = ORKStringFromDateISO8601(endDate);
}
if (unit)
{
mdict[kHKUnitKey] = [unit unitString];
}
if ((options & ORKSampleIncludeUUID))
{
NSUUID *uuid = [self UUID];
if (uuid)
{
mdict[kHKUUIDKey] = [uuid UUIDString];
}
}
if ( (options & ORKSampleIncludeMetadata) && [self.metadata count] > 0)
{
NSMutableDictionary *metadata = [self.metadata mutableCopy];
for (NSString *k in metadata)
{
id obj = metadata[k];
if ([obj isKindOfClass:[NSDate class]])
{
metadata[k] = ORKStringFromDateISO8601(obj);
}
}
mdict[kHKMetadataKey] = metadata;
}
if (options & ORKSampleIncludeSource)
{
HKSource *source = [self source];
if (source.name)
{
mdict[kHKSourceKey] = source.name;
}
}
return mdict;
}
@end
@implementation HKCategorySample (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionaryWithOptions:(ORKSampleJSONOptions)options unit:(HKUnit *)unit
{
NSMutableDictionary *dict = [[super ork_JSONDictionaryWithOptions:options unit:unit] mutableCopy];
NSInteger value = [self value];
dict[kHKSampleValue] = @(value);
return dict;
}
@end
@implementation HKQuantitySample (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionaryWithOptions:(ORKSampleJSONOptions)options unit:(HKUnit *)unit
{
NSMutableDictionary *dict = [[super ork_JSONDictionaryWithOptions:options unit:unit] mutableCopy];
HKQuantity *quantity = [self quantity];
double value = [quantity doubleValueForUnit:unit];
dict[kHKSampleValue] = @(value);
return dict;
}
@end
@implementation HKCorrelation (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionaryWithOptions:(ORKSampleJSONOptions)options sampleTypes:(NSArray *)sampleTypes units:(NSArray *)units
{
NSMutableDictionary *mdict = (NSMutableDictionary *)[self ork_JSONDictionaryWithOptions:options unit:nil];
// The correlated objects
NSMutableArray *correlatedObjects = [NSMutableArray arrayWithCapacity:[sampleTypes count]];
for (HKSample *sample in self.objects)
{
NSUInteger idx = [sampleTypes indexOfObject:sample.sampleType];
if (idx == NSNotFound)
{
continue;
}
[correlatedObjects addObject:[sample ork_JSONDictionaryWithOptions:options unit:units[idx]]];
}
mdict[kHKCorrelatedObjectsKey] = correlatedObjects;
return mdict;
}
@end
@@ -1,64 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKRecorder.h>
NS_ASSUME_NONNULL_BEGIN
/**
The `ORKAccelerometerRecorder` class represents a recorder that requests and collects raw accelerometer data from CoreMotion at a fixed frequency.
The accelerometer recorder continues to record when the application enters the
background by using the background task support provided by UIApplication.
*/
ORK_CLASS_AVAILABLE
@interface ORKAccelerometerRecorder : ORKRecorder
/**
The frequency of accelerometer data collected from CoreMotion, in hertz (Hz).
*/
@property (nonatomic, readonly) double frequency;
/**
Returns an initialized accelerometer recorder using the specified frequency.
@param frequency The frequency of accelerometer data collected from CoreMotion, in hertz (Hz).
@return An initialized accelerometer recorder.
*/
- (instancetype)initWithFrequency:(double)frequency
step:(ORKStep *)step
outputDirectory:(NSURL *)outputDirectory;
@end
NS_ASSUME_NONNULL_END
@@ -1,246 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKAccelerometerRecorder.h"
#import "ORKDataLogger.h"
#import "CMAccelerometerData+ORKJSONDictionary.h"
#import <CoreMotion/CoreMotion.h>
#import "ORKRecorder_Internal.h"
#import "ORKRecorder_Private.h"
#import "ORKHelpers.h"
@interface ORKAccelerometerRecorder()
{
ORKDataLogger *_logger;
NSError *_recordingError;
}
@property (nonatomic, strong) CMMotionManager *motionManager;
@property (nonatomic) NSTimeInterval uptime;
@end
@implementation ORKAccelerometerRecorder
- (instancetype)initWithFrequency:(double)frequency step:(ORKStep *)step outputDirectory:(NSURL *)outputDirectory
{
self = [super initWithStep:step outputDirectory:outputDirectory];
if (self)
{
self.frequency = frequency;
self.continuesInBackground = YES;
}
return self;
}
- (void)dealloc
{
[_logger finishCurrentLog];
}
- (NSString *)recorderType
{
return @"accel";
}
- (void)setFrequency:(double)frequency {
if (frequency <=0) {
_frequency = 1;
} else {
_frequency = frequency;
}
}
- (CMMotionManager *)createMotionManager {
return [[CMMotionManager alloc] init];
}
- (void)start {
[super start];
self.motionManager = [self createMotionManager];
if (! _logger) {
NSError *err = nil;
_logger = [self makeJSONDataLoggerWithError:&err];
if (! _logger) {
[self finishRecordingWithError:err];
return;
}
}
if (! self.motionManager || ! self.motionManager.accelerometerAvailable)
{
NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
code:NSFeatureUnsupportedError
userInfo:@{@"recorder" : self}];
[self finishRecordingWithError:error];
return;
}
self.motionManager.accelerometerUpdateInterval = 1.0/_frequency;
self.uptime = [NSProcessInfo processInfo].systemUptime;
[self.motionManager stopAccelerometerUpdates];
[self.motionManager
startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init]
withHandler:^(CMAccelerometerData *data, NSError *error)
{
BOOL success = NO;
if (data)
{
success = [_logger append:[data ork_JSONDictionary] error:&error];
}
if (!success)
{
dispatch_async(dispatch_get_main_queue(), ^{
_recordingError = error;
[self stop];
});
}
}];
}
- (NSDictionary *)userInfo {
return @{ @"frequency" : @(self.frequency) };;
}
- (void)stop {
[self doStopRecording];
[_logger finishCurrentLog];
NSError *error = _recordingError;
_recordingError = nil;
__block NSURL *fileUrl = nil;
[_logger enumerateLogs:^(NSURL *logFileUrl, BOOL *stop) {
fileUrl = logFileUrl;
} error:&error];
[self reportFileResultWithFile:fileUrl error:error];
[super stop];
}
- (void)doStopRecording
{
if (self.isRecording) {
[self.motionManager stopAccelerometerUpdates];
self.motionManager = nil;
}
}
- (void)finishRecordingWithError:(NSError *)error
{
[self doStopRecording];
[super finishRecordingWithError:nil];
}
- (void)reset
{
[super reset];
_logger = nil;
}
- (BOOL)isRecording {
return self.motionManager.accelerometerActive;
}
- (NSString *)mimeType {
return @"application/json";
}
@end
@interface ORKAccelerometerRecorderConfiguration()
@end
@implementation ORKAccelerometerRecorderConfiguration
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
- (instancetype)initWithFrequency:(double)freq {
self = [self ork_init];
if (self) {
_frequency = freq;
}
return self;
}
#pragma clang diagnostic pop
- (ORKRecorder *)recorderForStep:(ORKStep *)step outputDirectory:(NSURL *)outputDirectory
{
return [[ORKAccelerometerRecorder alloc] initWithFrequency:self.frequency step:step outputDirectory:outputDirectory];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
ORK_DECODE_DOUBLE(aDecoder, frequency);
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
ORK_ENCODE_DOUBLE(aCoder, frequency);
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (BOOL)isEqual:(id)object {
BOOL isParentSame = [super isEqual:object];
__typeof(self) castObject = object;
return (isParentSame &&
(self.frequency == castObject.frequency)) ;
}
- (ORKPermissionMask)requestedPermissionMask {
return ORKPermissionCoreMotionAccelerometer;
}
@end
-225
View File
@@ -1,225 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKDefines.h>
#import <ResearchKit/ORKStep.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
/**
The `ORKActiveStep` class is the base class for steps in active tasks, which
are steps that collect sensor data in a semi-controlled environment, as opposed
to the purely passive data collection enabled by HealthKit, or the more subjective data
collected when users fill in surveys.
In addition to the behaviors of `ORKStep`, active steps have the concept of
life cycle, which includes a defined start and finish.
The ResearchKit framework provides built-in behaviors that allow active steps to play voice prompts, speak a count down, and have a
defined duration.
To present an active step in your app, it's likely that you will subclass `ORKActiveStep` and
`ORKActiveStepViewController` to present custom UI and custom
prompts. For example subclasses, see `ORKSpatialSpanMemoryStep` or `ORKFitnessStep`.
Active steps may also need `ORKResult` subclasses to record their results
if these don't come purely from recorders.
If you develop a new active step subclass, consider contributing your
code to the ResearchKit project so that it's available for others to use in
their studies.
See also: `ORKActiveStepViewController`
*/
ORK_CLASS_AVAILABLE
@interface ORKActiveStep : ORKStep
/**
The duration of the step in seconds.
If the step duration is greater than zero, a built-in timer starts when the
step starts. If `shouldStartTimerAutomatically` is set, the timer
starts when the step's view appears. When the timer expires, a sound or
vibration may be played. If `shouldContinueOnFinish` is set, the step
automatically navigates forward when the timer expires.
The default value of this property is `0`, which disables the built-in timer.
See also: `ORKActiveStepViewController`
*/
@property (nonatomic) NSTimeInterval stepDuration;
/**
A Boolean value indicating whether to show a view with a default timer.
The default timer UI is not used in any of the current predefined tasks,
but it can be displayed in a simple active task that does not require custom
UI and needs only a count down timer on screen during data collection.
Note that this property is ignored if `stepDuration` is `0`.
The default value of this property is `YES`.
*/
@property (nonatomic) BOOL shouldShowDefaultTimer;
/**
A Boolean value indicating whether to speak the last few seconds in the count down of the
duration of a timed step.
When the value of this property is `YES`, `AVSpeechSynthesizer` is used to synthesize the countdown. Note that this property is ignored if VoiceOver is enabled.
The default value of this property is `NO`.
*/
@property (nonatomic) BOOL shouldSpeakCountDown;
/**
A Boolean value indicating whether to start the count down timer automatically when the step starts, or
require the user to take some explicit action to start the step, such as tapping a button.
Usually the explicit action needs to come from custom UI in an
`ORKActiveStepViewController` subclass.
The default value of this property is `NO`.
*/
@property (nonatomic) BOOL shouldStartTimerAutomatically;
/**
A Boolean value indicating whether to play a default sound when the step starts.
The default value of this property is `NO`.
*/
@property (nonatomic) BOOL shouldPlaySoundOnStart;
/**
A Boolean value indicating whether to play a default sound when the step finishes.
The default value of this property is `NO`.
*/
@property (nonatomic) BOOL shouldPlaySoundOnFinish;
/**
A Boolean value indicating whether to vibrate when the step starts.
The default value of this property is `NO`.
*/
@property (nonatomic) BOOL shouldVibrateOnStart;
/**
A Boolean value indicating whether to vibrate when the step finishes.
The default value of this property is `NO`.
*/
@property (nonatomic) BOOL shouldVibrateOnFinish;
/**
A Boolean value indicating whether the Next button should double as a skip action before
the step finishes.
When the value of this property is `YES`, the ResearchKit framework hides the skip button and makes the Next button function as a skip button when the step has not yet finished.
The default value of this property is `NO`.
*/
@property (nonatomic) BOOL shouldUseNextAsSkipButton;
/**
A Boolean value indicating whether to transition automatically when the step finishes.
When the value of this property is `YES`, the active step view controller automatically performs the
continue action when the `[ORKActiveStepViewController finish]` method
is called.
The default value of this property is `NO`.
*/
@property (nonatomic) BOOL shouldContinueOnFinish;
/**
Localized text that represents an instructional voice prompt.
Instructional speech begins when the step starts. If VoiceOver is active,
the instruction is spoken by VoiceOver.
*/
@property (nonatomic, copy, nullable) NSString *spokenInstruction;
/**
An image to be displayed below the instructions for the step.
The image can be stretched to fit the available space. When choosing a size
for this asset, be sure to take into account the variations in device form factors.
*/
@property (nonatomic, strong, nullable) UIImage *image;
/**
An array of recorder configurations that define the parameters for recorders to be
run during a step to collect sensor or other data.
If you want to collect data from sensors while the step is in progress,
add one or more recorder configurations to the array. The active step view
controller instantiates recorders and collates their results as children
of the step result.
The set of recorder configurations is scanned when populating the
`requestedHealthKitTypesForReading` and `requestedPermissions` properties.
See also: `ORKRecorderConfiguration` and `ORKRecorder`.
*/
@property (nonatomic, copy, nullable) NSArray *recorderConfigurations;
/**
The set of HealthKit types the step requests for reading. (read-only)
The task view controller uses this set of types when constructing a list of
all the HealthKit types required by all the steps in a task, so that it can
present the HealthKit access dialog just once during that task.
By default, the property scans the recorders and collates the HealthKit
types the recorders require. Subclasses may override this implementation.
*/
@property (nonatomic, readonly, nullable) NSSet *requestedHealthKitTypesForReading;
/**
The set of access permissions required for the step. (read-only)
The permission mask is used by the task view controller to determine the types of
access to request from users when they complete the initial instruction steps
in a task. If your step requires access to APIs that limit access, include
the permissions you require in this mask.
By default, the property scans the recorders and collates the permissions
required by the recorders. Subclasses may override this implementation.
*/
@property (nonatomic, readonly) ORKPermissionMask requestedPermissions;
@end
NS_ASSUME_NONNULL_END
-192
View File
@@ -1,192 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKActiveStep.h"
#import "ORKHelpers.h"
#import "ORKStep_Private.h"
#import "ORKActiveStep_Internal.h"
#import "ORKActiveStepViewController.h"
#import "ORKRecorder_Private.h"
@implementation ORKActiveStep
+ (Class)stepViewControllerClass
{
return [ORKActiveStepViewController class];
}
- (BOOL)startsFinished {
return (_stepDuration == 0);
}
- (BOOL)hasCountDown {
return (_stepDuration > 0) && _shouldShowDefaultTimer;
}
- (BOOL)hasTitle {
NSString *title = self.title;
return ( title != nil && title.length > 0);
}
- (BOOL)hasText {
NSString *text = self.text;
return ( text != nil && text.length > 0);
}
- (BOOL)hasVoice {
return ( _spokenInstruction != nil && _spokenInstruction.length > 0);
}
- (BOOL)isRestorable {
return NO;
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (instancetype)initWithIdentifier:(NSString *)identifier {
self = [super initWithIdentifier:identifier];
if (self) {
self.shouldShowDefaultTimer = YES;
}
return self;
}
- (instancetype)copyWithZone:(NSZone *)zone
{
ORKActiveStep *step = [super copyWithZone:zone];
step.stepDuration = self.stepDuration;
step.shouldStartTimerAutomatically = self.shouldStartTimerAutomatically;
step.shouldSpeakCountDown = self.shouldSpeakCountDown;
step.shouldShowDefaultTimer = self.shouldShowDefaultTimer;
step.shouldPlaySoundOnStart = self.shouldPlaySoundOnStart;
step.shouldPlaySoundOnFinish = self.shouldPlaySoundOnFinish;
step.shouldVibrateOnStart = self.shouldVibrateOnStart;
step.shouldVibrateOnFinish = self.shouldVibrateOnFinish;
step.shouldUseNextAsSkipButton = self.shouldUseNextAsSkipButton;
step.shouldContinueOnFinish = self.shouldContinueOnFinish;
step.spokenInstruction = self.spokenInstruction;
step.recorderConfigurations = [self.recorderConfigurations copy];
step.image = self.image;
return step;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
ORK_DECODE_DOUBLE(aDecoder, stepDuration);
ORK_DECODE_BOOL(aDecoder, shouldStartTimerAutomatically);
ORK_DECODE_BOOL(aDecoder, shouldSpeakCountDown);
ORK_DECODE_BOOL(aDecoder, shouldShowDefaultTimer);
ORK_DECODE_BOOL(aDecoder, shouldPlaySoundOnStart);
ORK_DECODE_BOOL(aDecoder, shouldPlaySoundOnFinish);
ORK_DECODE_BOOL(aDecoder, shouldVibrateOnStart);
ORK_DECODE_BOOL(aDecoder, shouldVibrateOnFinish);
ORK_DECODE_BOOL(aDecoder, shouldUseNextAsSkipButton);
ORK_DECODE_BOOL(aDecoder, shouldContinueOnFinish);
ORK_DECODE_OBJ_CLASS(aDecoder, spokenInstruction, NSString);
ORK_DECODE_IMAGE(aDecoder, image);
ORK_DECODE_OBJ_ARRAY(aDecoder, recorderConfigurations, ORKRecorderConfiguration);
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
ORK_ENCODE_DOUBLE(aCoder, stepDuration);
ORK_ENCODE_BOOL(aCoder, shouldStartTimerAutomatically);
ORK_ENCODE_BOOL(aCoder, shouldSpeakCountDown);
ORK_ENCODE_BOOL(aCoder, shouldShowDefaultTimer);
ORK_ENCODE_BOOL(aCoder, shouldPlaySoundOnStart);
ORK_ENCODE_BOOL(aCoder, shouldPlaySoundOnFinish);
ORK_ENCODE_BOOL(aCoder, shouldVibrateOnStart);
ORK_ENCODE_BOOL(aCoder, shouldVibrateOnFinish);
ORK_ENCODE_BOOL(aCoder, shouldUseNextAsSkipButton);
ORK_ENCODE_BOOL(aCoder, shouldContinueOnFinish);
ORK_ENCODE_IMAGE(aCoder, image);
ORK_ENCODE_OBJ(aCoder, spokenInstruction);
ORK_ENCODE_OBJ(aCoder, recorderConfigurations);
}
- (BOOL)isEqual:(id)object {
BOOL isParentSame = [super isEqual:object];
__typeof(self) castObject = object;
return (isParentSame &&
ORKEqualObjects(self.spokenInstruction, castObject.spokenInstruction) &&
ORKEqualObjects(self.recorderConfigurations, castObject.recorderConfigurations) &&
ORKEqualObjects(self.image, castObject.image) &&
(self.stepDuration == castObject.stepDuration) &&
(self.shouldShowDefaultTimer == castObject.shouldShowDefaultTimer) &&
(self.shouldStartTimerAutomatically == castObject.shouldStartTimerAutomatically) &&
(self.shouldSpeakCountDown == castObject.shouldSpeakCountDown) &&
(self.shouldPlaySoundOnStart == castObject.shouldPlaySoundOnStart) &&
(self.shouldPlaySoundOnFinish == castObject.shouldPlaySoundOnFinish) &&
(self.shouldVibrateOnStart == castObject.shouldVibrateOnStart) &&
(self.shouldVibrateOnFinish == castObject.shouldVibrateOnFinish) &&
(self.shouldContinueOnFinish == castObject.shouldContinueOnFinish) &&
(self.shouldUseNextAsSkipButton == castObject.shouldUseNextAsSkipButton)) ;
}
- (NSSet *)requestedHealthKitTypesForReading {
NSMutableSet *set = [NSMutableSet set];
for (ORKRecorderConfiguration *config in self.recorderConfigurations) {
NSSet *subset = [config requestedHealthKitTypesForReading];
if (subset) {
[set unionSet:subset];
}
}
return set;
}
- (ORKPermissionMask)requestedPermissions {
ORKPermissionMask mask = ORKPermissionNone;
for (ORKRecorderConfiguration *config in self.recorderConfigurations) {
mask |= [config requestedPermissionMask];
}
return mask;
}
@end
@@ -1,63 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit_Private.h>
#import "ORKLabel.h"
NS_ASSUME_NONNULL_BEGIN
@interface ORKQuantityLabel : ORKLabel
@end
@interface ORKActiveStepQuantityView : UIView
@property (nonatomic, strong, nullable) NSString *title;
@property (nonatomic, strong, nullable) NSString *value;
@property (nonatomic, strong, nullable) UIImage *image;
@property (nonatomic) BOOL enabled;
@property (nonatomic, readonly, strong, nullable) UILabel *titleLabel;
@property (nonatomic, readonly, strong, nullable) UILabel *valueLabel;
@end
@interface ORKQuantityPairView : UIView
@property (nonatomic, strong, nullable) ORKActiveStepQuantityView *leftView;
@property (nonatomic, strong, nullable) ORKActiveStepQuantityView *rightView;
@property (nonatomic, assign) BOOL keylineHidden;
@end
NS_ASSUME_NONNULL_END
@@ -1,279 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKActiveStepQuantityView.h"
#import "ORKHelpers.h"
#import "ORKSkin.h"
#import "ORKTintedImageView.h"
#import "ORKSubheadlineLabel.h"
@implementation ORKQuantityLabel
+ (UIFont *)defaultFont {
return ORKTimeFontForSize(35);
}
@end
@implementation ORKActiveStepQuantityView
{
ORKSubheadlineLabel *_titleLabel;
ORKQuantityLabel *_valueLabel;
ORKTintedImageView *_imageView;
UIView *_valueHolder;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
_titleLabel = [ORKSubheadlineLabel new];
_titleLabel.textAlignment = NSTextAlignmentCenter;
_valueLabel = [ORKQuantityLabel new];
_valueLabel.textAlignment = NSTextAlignmentCenter;
_imageView = [ORKTintedImageView new];
_imageView.shouldApplyTint = YES;
_valueHolder = [UIView new];
_titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
_valueLabel.translatesAutoresizingMaskIntoConstraints = NO;
_imageView.translatesAutoresizingMaskIntoConstraints = NO;
_valueHolder.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:_titleLabel];
[_valueHolder addSubview:_valueLabel];
[_valueHolder addSubview:_imageView];
[self addSubview:_valueHolder];
#if LAYOUT_DEBUG
self.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent:0.2];
_titleLabel.backgroundColor = [[UIColor greenColor] colorWithAlphaComponent:0.2];
_valueLabel.backgroundColor = [[UIColor greenColor] colorWithAlphaComponent:0.2];
#endif
for (UIView *view in @[_titleLabel, _valueLabel, _imageView]) {
view.isAccessibilityElement = NO;
}
[self setNeedsUpdateConstraints];
}
return self;
}
- (void)setEnabled:(BOOL)enabled {
_enabled = enabled;
self.hidden = ! enabled;
[self setNeedsUpdateConstraints];
}
- (void)setTitle:(NSString *)title {
_title = title;
_titleLabel.text = title;
}
- (void)setValue:(NSString *)value {
_value = value;
_valueLabel.text = value;
}
- (void)setImage:(UIImage *)image {
_image = nil;
_imageView.image = image;
}
- (void)updateConstraints {
[self removeConstraints:[self constraints]];
const CGFloat TitleBaselineToValueBaseline = 40;
const CGFloat ValueBaselineToBottom = 36;
if (! _enabled) {
NSLayoutConstraint *zeroWidthConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:0];
zeroWidthConstraint.priority = UILayoutPriorityRequired-1;
[self addConstraint:zeroWidthConstraint];
}
NSDictionary *views = NSDictionaryOfVariableBindings(_titleLabel, _valueLabel, _imageView);
NSMutableArray *additionalConstraints = [NSMutableArray array];
[additionalConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_titleLabel]" options:0 metrics:nil views:views]];
[additionalConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_titleLabel]|" options:0 metrics:nil views:views]];
[additionalConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_imageView]-10-[_valueLabel]|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]];
[additionalConstraints addObject:[NSLayoutConstraint constraintWithItem:_valueLabel
attribute:NSLayoutAttributeFirstBaseline
relatedBy:NSLayoutRelationEqual
toItem:_titleLabel
attribute:NSLayoutAttributeLastBaseline
multiplier:1 constant:TitleBaselineToValueBaseline]];
[additionalConstraints addObject:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:_valueLabel
attribute:NSLayoutAttributeLastBaseline
multiplier:1 constant:ValueBaselineToBottom]];
[additionalConstraints addObject:[NSLayoutConstraint constraintWithItem:_valueHolder
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterX
multiplier:1 constant:0]];
[additionalConstraints addObject:[NSLayoutConstraint constraintWithItem:_valueLabel
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationGreaterThanOrEqual
toItem:_valueHolder
attribute:NSLayoutAttributeTop
multiplier:1 constant:0]];
[additionalConstraints addObject:[NSLayoutConstraint constraintWithItem:_valueLabel
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationLessThanOrEqual
toItem:_valueHolder
attribute:NSLayoutAttributeBottom
multiplier:1 constant:0]];
[additionalConstraints addObject:[NSLayoutConstraint constraintWithItem:_valueHolder
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationGreaterThanOrEqual
toItem:self
attribute:NSLayoutAttributeLeft
multiplier:1 constant:0]];
[additionalConstraints addObject:[NSLayoutConstraint constraintWithItem:_valueHolder
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationLessThanOrEqual
toItem:self
attribute:NSLayoutAttributeRight
multiplier:1 constant:0]];
for (NSLayoutConstraint *constraint in additionalConstraints) {
constraint.priority = UILayoutPriorityDefaultHigh;
}
[self addConstraints:additionalConstraints];
[super updateConstraints];
}
#pragma mark Accessibility
- (BOOL)isAccessibilityElement {
return YES;
}
- (NSString *)accessibilityLabel {
return _titleLabel.accessibilityLabel;
}
- (NSString *)accessibilityValue {
return _valueLabel.accessibilityLabel;
}
- (UIAccessibilityTraits)accessibilityTraits {
return [super accessibilityTraits] | UIAccessibilityTraitUpdatesFrequently;
}
@end
@implementation ORKQuantityPairView
{
UIView *_metricKeyline;
NSArray *_constraints;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
_leftView = [ORKActiveStepQuantityView new];
_rightView = [ORKActiveStepQuantityView new];
_leftView.translatesAutoresizingMaskIntoConstraints = NO;
_rightView.translatesAutoresizingMaskIntoConstraints = NO;
_metricKeyline = [UIView new];
_metricKeyline.translatesAutoresizingMaskIntoConstraints = NO;
self.translatesAutoresizingMaskIntoConstraints = NO;
[self setKeylineHidden:NO];
_metricKeyline.backgroundColor = [UIColor ork_midGrayTintColor];
[self addSubview:_leftView];
[self addSubview:_rightView];
[self addSubview:_metricKeyline];
[self setNeedsUpdateConstraints];
}
return self;
}
- (void)updateConstraints {
if (_constraints) {
[self removeConstraints:_constraints];
_constraints = nil;
}
NSMutableArray *constraints = [NSMutableArray array];
NSDictionary *views = NSDictionaryOfVariableBindings(_leftView, _rightView, _metricKeyline);
// Leave space for the keyline between these views, and then constrain it to be 1px wide and go from top to bottom baseline of metric views.
CGFloat scale = [[UIScreen mainScreen] scale];
NSArray *vertConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_leftView]|" options:(NSLayoutFormatOptions)0 metrics:nil views:views];
[constraints addObjectsFromArray:vertConstraints];
NSArray *horizConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_leftView]-s-[_rightView]-|" options:NSLayoutFormatAlignAllTop|NSLayoutFormatAlignAllBottom|NSLayoutFormatDirectionLeftToRight metrics:@{@"s":@(1/scale)} views:views];
for (NSLayoutConstraint *constraint in horizConstraints) {
constraint.priority = UILayoutPriorityDefaultHigh+1;
}
[constraints addObjectsFromArray:horizConstraints];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[_leftView][_metricKeyline(==s)]" options:NSLayoutFormatAlignAllTop|NSLayoutFormatDirectionLeftToRight metrics:@{@"s":@(1/scale)} views:views]];
NSLayoutConstraint *keylineBottom = [NSLayoutConstraint constraintWithItem:_metricKeyline
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:_leftView.valueLabel
attribute:NSLayoutAttributeLastBaseline
multiplier:1 constant:0];
[constraints addObject:keylineBottom];
NSLayoutConstraint *maxWidthConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:10000];
maxWidthConstraint.priority = UILayoutPriorityRequired-2;
[constraints addObject:maxWidthConstraint];
// This constraint should be beaten out by the full-width-coverage and zero-width constraints if only one of the views is enabled.
NSLayoutConstraint *equalWidthConstraint = [NSLayoutConstraint constraintWithItem:_leftView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:_rightView attribute:NSLayoutAttributeWidth multiplier:1 constant:0];
equalWidthConstraint.priority = UILayoutPriorityDefaultLow;
[constraints addObject:equalWidthConstraint];
[self addConstraints:constraints];
_constraints = constraints;
[super updateConstraints];
}
- (void)setKeylineHidden:(BOOL)keylineHidden {
_keylineHidden = keylineHidden;
_metricKeyline.hidden = keylineHidden;
}
@end
@@ -1,70 +0,0 @@
/*
Copyright (c) 2015, 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 <Foundation/Foundation.h>
#import <ResearchKit/ResearchKit.h>
NS_ASSUME_NONNULL_BEGIN
@class ORKActiveStepTimer;
typedef void (^ORKActiveStepTimerHandler)(ORKActiveStepTimer *timer, BOOL finished);
@interface ORKActiveStepTimer : NSObject
- (instancetype)initWithDuration:(NSTimeInterval)duration interval:(NSTimeInterval)interval runtime:(NSTimeInterval)runtime handler:(ORKActiveStepTimerHandler)handler;
@property (nonatomic, assign) NSTimeInterval duration;
@property (nonatomic, readonly) NSTimeInterval interval;
@property (nonatomic, readonly) NSTimeInterval runtime;
/*
Handler callbacks are returned on interval boundaries. The timer automatically
pauses itself when finished=YES.
This handler is retained. Be careful not to create a retain cycle.
*/
@property (nonatomic, copy, readonly) ORKActiveStepTimerHandler handler;
// Pauses the timer.
- (void)pause;
// Resumes the timer where it left off.
- (void)resume;
// Sets runtime to 0. Stops the timer if it is running.
- (void)reset;
@end
NS_ASSUME_NONNULL_END
@@ -1,243 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKActiveStepTimer.h"
#include <mach/mach.h>
#include <mach/mach_time.h>
#import <UIKit/UIKit.h>
static NSTimeInterval timeIntervalFromMachTime(uint64_t delta) {
static mach_timebase_info_data_t sTimebaseInfo;
if ( sTimebaseInfo.denom == 0 ) {
(void) mach_timebase_info(&sTimebaseInfo);
}
uint64_t elapsedNano = delta * sTimebaseInfo.numer / sTimebaseInfo.denom;
return elapsedNano * 1.0 / NSEC_PER_SEC;
}
@implementation ORKActiveStepTimer
{
uint64_t _startTime;
NSTimeInterval _preExistingRuntime;
dispatch_queue_t _queue;
dispatch_source_t _timer;
UIBackgroundTaskIdentifier _backgroundTaskIdentifier;
uint32_t _isRunning;
}
- (instancetype)initWithDuration:(NSTimeInterval)duration interval:(NSTimeInterval)interval runtime:(NSTimeInterval)runtime handler:(ORKActiveStepTimerHandler)handler {
self = [super init];
if (self) {
if (! handler) {
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Handler is required" userInfo:nil];
}
_duration = duration;
_interval = interval;
_handler = [handler copy];
_preExistingRuntime = runtime;
_backgroundTaskIdentifier = UIBackgroundTaskInvalid;
_queue = dispatch_queue_create("active_step", DISPATCH_QUEUE_SERIAL);
}
return self;
}
- (void)dealloc {
[self queue_pauseAtFinish:NO];
}
- (NSTimeInterval)runtime {
__block NSTimeInterval runtime = 0;
dispatch_sync(_queue, ^{
runtime = [self queue_runtime];
});
return MIN(runtime,_duration);
}
- (void)pause {
dispatch_sync(_queue, ^{
[self queue_pauseAtFinish:NO];
});
}
- (void)resume {
dispatch_sync(_queue, ^{
[self queue_resume];
});
}
- (void)reset {
dispatch_sync(_queue, ^{
[self queue_reset];
});
}
- (NSTimeInterval)queue_runtime {
NSTimeInterval runtime = _preExistingRuntime;
if (_timer != NULL) {
uint64_t now = mach_absolute_time();
runtime += timeIntervalFromMachTime(now - _startTime);
}
return runtime;
}
- (void)setDuration:(NSTimeInterval)duration {
dispatch_sync(_queue, ^{
_duration = duration;
});
}
- (void)hiqueue_event {
dispatch_sync(_queue, ^{
[self queue_event];
});
}
- (void)queue_event {
[self queue_assertBackgroundTask];
NSTimeInterval runtime = [self queue_runtime];
BOOL finished = (runtime >= _duration);
if (finished) {
[self queue_pauseAtFinish:YES];
}
dispatch_async(dispatch_get_main_queue(), ^{
_handler(self, finished);
dispatch_sync(_queue, ^{
// If the timer is still NULL here, we can safely release the background task.
if (_timer == NULL) {
[self queue_releaseBackgroundTask];
}
});
});
}
- (void)queue_clearTimer {
if (_timer != NULL) {
dispatch_source_cancel(_timer);
_timer = NULL;
}
}
- (void)queue_releaseBackgroundTask {
if (_backgroundTaskIdentifier == UIBackgroundTaskInvalid) {
return;
}
UIBackgroundTaskIdentifier ident = _backgroundTaskIdentifier;
_backgroundTaskIdentifier = UIBackgroundTaskInvalid;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] endBackgroundTask:ident];
});
}
- (void)queue_assertBackgroundTask {
if (_backgroundTaskIdentifier != UIBackgroundTaskInvalid) {
return;
}
_backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
// This is guaranteed to be called synchronously on the main queue, switch to our queue to invalidate the identifier
dispatch_sync(_queue, ^{
_backgroundTaskIdentifier = UIBackgroundTaskInvalid;
});
}];
}
- (void)queue_resume {
if (_timer != NULL) {
// Already resumed
return;
}
if ([self queue_runtime] >= _duration) {
// Already finished. Fire one event to indicate.
[self queue_event];
return;
}
// We want to run in the background if we can, so voice can be played, etc.
assert(_backgroundTaskIdentifier == UIBackgroundTaskInvalid);
[self queue_assertBackgroundTask];
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,
0, 0, dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0));
if (_timer == NULL) {
assert(0);
return;
}
__weak typeof(self) weakSelf = self;
dispatch_source_set_event_handler(_timer, ^{
typeof(self) strongSelf = weakSelf;
[strongSelf hiqueue_event];
});
NSTimeInterval timeUntilNextFire = (floor(_preExistingRuntime / _interval) + 1)*_interval - _preExistingRuntime;
_startTime = mach_absolute_time();
dispatch_source_set_timer(_timer,
dispatch_time(DISPATCH_TIME_NOW, timeUntilNextFire * NSEC_PER_SEC),
_interval * NSEC_PER_SEC ,
0.05 * NSEC_PER_SEC);
dispatch_resume(_timer);
}
- (void)queue_pauseAtFinish:(BOOL)atFinish {
if (_timer == NULL) {
// Not running
return;
}
uint64_t now = mach_absolute_time();
[self queue_clearTimer];
_preExistingRuntime += timeIntervalFromMachTime(now - _startTime);
_startTime = 0;
if (! atFinish) {
// If we are atFinish, the task will be released after the handler completes
[self queue_releaseBackgroundTask];
}
}
- (void)queue_reset {
[self queue_clearTimer];
_preExistingRuntime = 0;
[self queue_releaseBackgroundTask];
}
@end
@@ -1,49 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit_Private.h>
#import "ORKCustomStepView_Internal.h"
#import "ORKCountdownLabel.h"
#import "ORKTextButton.h"
NS_ASSUME_NONNULL_BEGIN
@interface ORKActiveStepTimerView : ORKActiveStepCustomView
@property (nonatomic, strong, nullable) ORKCountdownLabel *countDownLabel;
@property (nonatomic, strong, nullable) ORKTextButton *startTimerButton;
@property (nonatomic, strong, nullable) ORKActiveStep *step;
@end
NS_ASSUME_NONNULL_END
@@ -1,200 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKActiveStepTimerView.h"
#import "ORKActiveStepTimer.h"
#import "ORKHelpers.h"
#import "ORKSkin.h"
#import "ORKActiveStepViewController_Internal.h"
#import "ORKVoiceEngine.h"
#import "ORKSurveyAnswerCellForText.h"
#import "ORKSurveyAnswerCellForNumber.h"
#import "ORKActiveStep_Internal.h"
#import "ORKActiveStepViewController_Internal.h"
#import "ORKStepViewController_Internal.h"
@implementation ORKActiveStepTimerView
{
BOOL _started;
BOOL _registeredForNotifications;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// Count Down
{
_countDownLabel = [ORKCountdownLabel new];
_countDownLabel.textAlignment = NSTextAlignmentCenter;
_countDownLabel.text = @" ";
[self addSubview:_countDownLabel];
}
// Count down start button
{
_startTimerButton = [ORKTextButton new];
[_startTimerButton setTitle:ORKLocalizedString(@"BUTTON_START_TIMER", nil) forState:UIControlStateNormal];
[_startTimerButton addTarget:self action:@selector(startTimerButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
_startTimerButton.exclusiveTouch = YES;
[self addSubview:_startTimerButton];
}
_countDownLabel.accessibilityTraits |= UIAccessibilityTraitUpdatesFrequently;
[self setTranslatesAutoresizingMaskIntoConstraints:NO];
}
return self;
}
- (void)applicationDidBecomeActive:(NSNotification *)notification {
ORKActiveStepViewController *vc = self.activeStepViewController;
if (vc) {
[self updateDisplay:vc];
}
}
- (void)setRegisteredForNotifications:(BOOL)registered {
if (registered == _registeredForNotifications) {
return;
}
registered = _registeredForNotifications;
NSNotificationCenter *nfc = [NSNotificationCenter defaultCenter];
if (registered) {
[nfc addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
} else {
[nfc removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
}
}
- (void)didMoveToWindow {
[self setRegisteredForNotifications:(self.window != nil)];
}
- (void)setStep:(ORKActiveStep *)step
{
_step = step;
_countDownLabel.hidden = !(_step.hasCountDown);
BOOL hasTimerButton = (_step.hasCountDown && _step.shouldStartTimerAutomatically == NO);
_startTimerButton.hidden = !hasTimerButton;
_startTimerButton.alpha = 1;
[_countDownLabel setCountDownValue:(NSInteger)[_step stepDuration]];
[self setNeedsUpdateConstraints];
}
- (void)startTimerButtonTapped:(id)sender
{
[self.activeStepViewController start];
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, _countDownLabel);
}
- (void)updateDisplay:(ORKActiveStepViewController *)viewController {
NSInteger countDownValue = (NSInteger)round(viewController.timeRemaining);
[_countDownLabel setCountDownValue:countDownValue];
}
- (void)resetStep:(ORKActiveStepViewController *)viewController {
self.step = (ORKActiveStep *)viewController.step;
}
- (void)startStep:(ORKActiveStepViewController *)viewController {
_startTimerButton.alpha = 0;
}
- (void)suspendStep:(ORKActiveStepViewController *)viewController {
}
- (void)resumeStep:(ORKActiveStepViewController *)viewController {
self.step = (ORKActiveStep *)viewController.step;
if ([viewController timerActive])
{
_startTimerButton.alpha = 0;
[self updateDisplay:viewController];
}
}
- (void)finishStep:(ORKActiveStepViewController *)viewController {
}
- (void)setNeedsUpdateConstraints
{
[NSLayoutConstraint deactivateConstraints:[self constraints]];
[super setNeedsUpdateConstraints];
}
- (void)updateConstraints
{
NSDictionary *dictionary = NSDictionaryOfVariableBindings(_countDownLabel, _startTimerButton);
NSDictionary *metrics = @{@"CS" : @(2)};
ORKEnableAutoLayoutForViews([dictionary allValues]);
for (UIView *v in [dictionary allValues])
{
[self addConstraint:[NSLayoutConstraint constraintWithItem:v attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1 constant:0]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:v attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationLessThanOrEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
}
if (! _countDownLabel.hidden)
{
NSMutableString *verticalLayout = [NSMutableString new];
[verticalLayout appendString:@"V:|[_countDownLabel]"];
if (! _startTimerButton.hidden)
{
[verticalLayout appendString:@"-CS-[_startTimerButton]"];
}
[verticalLayout appendString:@"|"];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:verticalLayout options:NSLayoutFormatAlignAllCenterX metrics:metrics views:dictionary]];
}
else
{
[self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:0]];
}
[super updateConstraints];
}
@end
@@ -1,263 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKStepViewController.h>
#import <ResearchKit/ORKRecorder.h>
NS_ASSUME_NONNULL_BEGIN
/**
The `ORKActiveStepViewController` class is the base class for displaying `ORKActiveStep`
subclasses. The predefined active tasks defined in `ORKOrderedTask` all make use
of subclasses of `ORKActiveStep`, paired with `ORKActiveStepViewController`
subclasses.
An active step view controller is typically instantiated by a task view controller
when it encounters an active step in a task. Active steps generally include some form of sensor-driven data collection, or involve some highly interactive content, such as a cognitive task or game.
Examples of active step view controller subclasses include `ORKWalkingTaskStepViewController`,
`ORKCountdownStepViewController`, `ORKSpatialSpanMemoryStepViewController`,
`ORKFitnessStepViewController`, and `ORKAudioStepViewController`.
The primary feature that active step view controllers enable is life cycle. After an active step is presented, it can be started to start a timer. When the timer expires, the
step is considered finished. Some steps may have the concept of suspend and resume, such as when
the app is put in the background, and during which data recording is temporarily paused.
These life cycle methods generally apply to any recorders being used to record
data from the device's sensors, but they should also be applied to any UI
being displayed to clearly indicate when data is being collected
for the task.
When you develop a new active step, you should subclass `ORKActiveStepViewController`
and define your specific UI. When subclassing, pay special attention to the life cycle
methods, `start`, `finish`, `suspend`, and `resume`. Also, be sure to test for
the expected behavior when the user suspends and resumes the app, during task
save and restore, and during UIKit's UI state restoration.
See also: `ORKActiveStep`.
*/
ORK_CLASS_AVAILABLE
@interface ORKActiveStepViewController : ORKStepViewController <ORKRecorderDelegate>
/// @name UI Customization
/**
The custom view for the active step.
Attach a custom view here, and implement `sizeThatFits:` or
use `intrinsicContentSize` or provide constraints that request the size needed for
the custom view within the active step's layout.
Custom views can be used for visual instructions with animation,
or for getting interactive input.
*/
@property (nonatomic, strong, nullable) UIView *customView;
/**
The image view for the active step. (read-only)
The image view is created on demand when this property is accessed, and is a
shortcut to display an image in the custom area of an active task (that is, instead of
using `customView`).
*/
@property (nonatomic, strong, readonly, nullable) UIImageView *imageView;
/// @name Data collection
/**
The array of recorders currently in use by the active step. (read-only)
Recorders are generated when the step starts, based on the recorder
configurations of the step. Each recorder is an instance of `ORKRecorder`, and
is created by the active step view controller using the array of recorder
configurations in the step.
See also: `ORKRecorderConfiguration` and `ORKActiveStep`.
*/
@property (nonatomic, strong, readonly, nullable) NSArray *recorders;
/// @name Active step life cycle
/**
A Boolean value that indicates whether the step has finished. (read-only)
If the step is considered finished, the Continue button is enabled and the Skip
button is hidden. When the step is not finished, the Continue button is disabled and the Skip
button is visible.
In addition, when a step is finished, all recorders are stopped.
*/
@property (nonatomic, assign, getter=isFinished, readonly) BOOL finished;
/**
A Boolean value that indicates whether the step has started. (read-only)
If the step has not yet started, recorders are not yet running, and time
is not counted against the `duration` of the step.
*/
@property (nonatomic, assign, readonly, getter=isStarted) BOOL started;
/**
Tells the view controller that the active step has finished.
This method is an override point for subclasses, called by the base class when
the step has just finished.
The default implementation does nothing except in the case of steps that have countdown
enabled. When countdown is enabled in a step, the view controller attempts to navigate automatically to the next step, if so configured.
*/
- (void)stepDidFinish;
/**
A Boolean value that indicates whether to suspend the step if the app is not
active or the screen is off.
Active steps that require the screen in order to work should suspend
recording when the app goes into the background. Other active steps require
the step to continue while the app is in the background. For example, the fitness check
active step continues to collect data while the screen is off, and continues
to give voice prompts.
*/
@property (nonatomic, assign) BOOL suspendIfInactive;
/**
Starts the active step.
Call this method to start the timer on the active step, if there is one, and
to start any data recording.
When you start the step, recorders are instantiated based on their configurations and then started. All
timers should start, and the UI should show users that the step is in progress.
This method does nothing if the step has already started.
Subclasses should super when overriding this method.
*/
- (void)start;
/**
Suspends the active step.
Call this method to suspend data recording and the step's timer.
This method may called automatically when the app is suspended.
The view controller can be configured not to suspend even if the app
goes into the background (for more information, see `suspendIfInactive`).
Subclasses should call super when overriding this method.
*/
- (void)suspend;
/**
Resumes the active step.
Call this method when the step should be resumed. Calls to this method should
be paired with previous calls to `suspend`.
This method may be called automatically when the app is resumed. The view
controller can be configured not to suspend even if the app
goes into the background (for more information, see `suspendIfInactive`).
When the step is resumed, the UI should resume at the point where the user left off,
or, if that does not make sense for the particular step, to the most recent
suitable point.
Subclasses should call super when overriding this method.
*/
- (void)resume;
/**
Finishes the active step.
Call this method to finish the active step. If the active step is configured with
a timer, this method is called automatically when the timer expires.
Finishing the active step stops all data recording and stops any timers. In steps that have the
`shouldContinueOnFinish` property set, forward navigation to the next step
may ensue.
This method does nothing if the step has already finished.
Subclasses should call super when overriding this method.
*/
- (void)finish;
/// @name Recorder life cycle
/**
Tells the view controller that the set of recorders changed.
This method is usually called by the active step view controller in response
to `start` or `resume`.
Subclasses may override this method.
*/
- (void)recordersDidChange;
/**
Tells the view controller that the recorders are about to start.
This method is called by the active step view controller after instantiating
the recorders, but before starting them.
Subclasses may override this method.
*/
- (void)recordersWillStart;
/**
Tells the view controller that the recorders are about to stop.
This method is called by the active step view controller before
stopping the recorders.
Subclasses may override this method.
*/
- (void)recordersWillStop;
/**
Tells the view controller that the step has been loaded and is about to start.
This method is called by the active step view controller just after the step
has been set. The base implementation instantiates the recorders and timer but
does not start them.
Subclasses may override this method, but must also call super.
*/
- (void)prepareStep;
@end
NS_ASSUME_NONNULL_END
@@ -1,516 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKActiveStepViewController.h"
#import "ORKVoiceEngine.h"
#import "ORKSkin.h"
#import "ORKHelpers.h"
#import "ORKActiveStep.h"
#import "ORKTask.h"
#import "ORKTaskViewController.h"
#import "ORKVerticalContainerView.h"
#import "ORKStepViewController_Internal.h"
#import "ORKActiveStepViewController_Internal.h"
#import "ORKActiveStep_Internal.h"
#import "ORKRecorder_Internal.h"
#import "ORKTaskViewController_Internal.h"
#import "ORKActiveStepTimerView.h"
#import "ORKActiveStepTimer.h"
#import "ORKAccessibility.h"
#import "ORKStepHeaderView_Internal.h"
#import "ORKActiveStepView.h"
@interface ORKActiveStepViewController (){
ORKActiveStepView *_activeStepView;
ORKActiveStepTimer *_activeStepTimer;
NSArray *_recorderResults;
SystemSoundID _alertSound;
NSURL *_alertSoundURL;
}
@property (nonatomic, strong) NSArray *recorders;
@end
@implementation ORKActiveStepViewController
- (instancetype)initWithStep:(ORKStep *)step {
self = [super initWithStep:step];
if (self) {
_recorderResults = [NSArray new];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
_timerUpdateInterval = 1;
}
return self;
}
- (void)applicationWillResignActive:(NSNotification *)notification {
if (self.suspendIfInactive) {
[self suspend];
}
}
- (void)applicationDidBecomeActive:(NSNotification *)notification {
if (self.suspendIfInactive) {
[self resume];
}
}
- (ORKActiveStep *)activeStep {
return (ORKActiveStep *)self.step;
}
- (ORKActiveStepView *)activeStepView {
return _activeStepView;
}
- (void)viewDidLoad
{
[super viewDidLoad];
_activeStepView = [[ORKActiveStepView alloc] initWithFrame:self.view.bounds];
[_activeStepView setTranslatesAutoresizingMaskIntoConstraints:NO];
[_activeStepView setCustomView:_customView];
[self updateContinueButtonItem];
_activeStepView.headerView.learnMoreButtonItem = self.learnMoreButtonItem;
_activeStepView.continueSkipContainer.skipButtonItem = self.skipButtonItem;
_activeStepView.continueSkipContainer.continueEnabled = _finished;
[self.view addSubview:_activeStepView];
NSMutableArray *constraints = [NSMutableArray arrayWithArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[s]|" options:0 metrics:nil views:@{@"s":_activeStepView}]];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tg][s]|" options:0 metrics:nil views:@{@"s":_activeStepView,@"tg":self.topLayoutGuide}]];
[self.view addConstraints:constraints];
[self prepareStep];
}
- (void)stepDidChange
{
[super stepDidChange];
_activeStepView.activeStep = [self activeStep];
[self updateContinueButtonItem];
[self prepareStep];
}
- (UIView *)customViewContainer
{
__unused UIView *v = [self view];
return _activeStepView.customViewContainer;
}
- (UIImageView *)imageView
{
__unused UIView *v = [self view];
return _activeStepView.imageView;
}
- (void)setCustomView:(UIView *)customView
{
_customView = customView;
[_activeStepView setStepView:_customView];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
ORK_Log_Debug(@"%@",self);
[self.taskViewController setRegisteredScrollView:_activeStepView];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
ORK_Log_Debug(@"%@",self);
// Wait for animation complete
dispatch_async(dispatch_get_main_queue(), ^{
if ([[self activeStep] shouldStartTimerAutomatically])
{
[self start];
}
});
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
ORK_Log_Debug(@"%@",self);
[self suspend];
}
- (void)updateContinueButtonItem {
_activeStepView.continueSkipContainer.continueButtonItem = self.continueButtonItem;
}
- (void)setContinueButtonItem:(UIBarButtonItem *)continueButtonItem {
[super setContinueButtonItem:continueButtonItem];
[self updateContinueButtonItem];
}
- (void)setLearnMoreButtonItem:(UIBarButtonItem *)learnMoreButtonItem
{
[super setLearnMoreButtonItem:learnMoreButtonItem];
_activeStepView.headerView.learnMoreButtonItem = self.learnMoreButtonItem;
}
- (void)setSkipButtonItem:(UIBarButtonItem *)skipButtonItem
{
[super setSkipButtonItem:skipButtonItem];
_activeStepView.continueSkipContainer.skipButtonItem = skipButtonItem;
}
- (void)setFinished:(BOOL)finished
{
_finished = finished;
_activeStepView.continueSkipContainer.continueEnabled = finished;
}
- (ORKStepResult *)result {
ORKStepResult *sResult = [super result];
sResult.results = _recorderResults;
return sResult;
}
#pragma mark - transition
- (void)recordersDidChange {
}
- (void)recordersWillStart {
}
- (void)recordersWillStop {
}
- (void)prepareRecorders
{
// Stop any existing recorders
[self recordersWillStop];
for (ORKRecorder *recorder in self.recorders)
{
recorder.delegate = nil;
[recorder stop];
}
NSMutableArray *recorders = [NSMutableArray array];
for (ORKRecorderConfiguration * provider in self.activeStep.recorderConfigurations) {
// If the outputDirectory is nil, recorders which require one will generate an error.
// We start them anyway, because we don't know which recorders will require an outputDirectory.
ORKRecorder *recorder = [provider recorderForStep:self.step
outputDirectory:self.outputDirectory];
recorder.configuration = provider;
recorder.delegate = self;
[recorders addObject:recorder];
}
self.recorders = recorders;
[self recordersDidChange];
}
- (void)setOutputDirectory:(NSURL *)outputDirectory {
[super setOutputDirectory:outputDirectory];
[self prepareStep];
}
- (void)prepareStep {
if (self.activeStep==nil) {
return;
}
self.finished = [[self activeStep] startsFinished];
ORK_Log_Debug(@"%@", self);
_activeStepView.activeStep = self.activeStep;
if ([self.activeStep hasCountDown])
{
ORKActiveStepTimerView *timerView = [ORKActiveStepTimerView new];
_activeStepView.activeCustomView = timerView;
}
else
{
_activeStepView.activeCustomView = nil;
}
_activeStepView.activeCustomView.activeStepViewController = self;
[_activeStepView.activeCustomView resetStep:self];
[self resetTimer];
[self prepareRecorders];
}
- (void)startRecorders {
[self recordersWillStart];
// Start recorders
for (ORKRecorder *recorder in self.recorders) {
[recorder viewController:self willStartStepWithView:self.customViewContainer];
[recorder start];
}
}
- (void)stopRecorders {
[self recordersWillStop];
for (ORKRecorder *recorder in self.recorders) {
[recorder stop];
}
}
- (void)playSound
{
if (_alertSoundURL == nil) {
_alertSoundURL = [NSURL URLWithString:@"/System/Library/Audio/UISounds/short_low_high.caf"];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(_alertSoundURL), &_alertSound);
}
AudioServicesPlaySystemSound(_alertSound);
}
- (void)start {
ORK_Log_Debug(@"%@",self);
self.started = YES;
[self startTimer];
[_activeStepView.activeCustomView startStep:self];
[self startRecorders];
if (self.activeStep.shouldVibrateOnStart) {
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
}
if (self.activeStep.shouldPlaySoundOnStart) {
[self playSound];
}
// Start speech
if (self.activeStep.hasVoice && self.activeStep.spokenInstruction) {
// Let VO speak "Step x of y" before the instruction.
// If VO is not running, the text is spoken immediately.
ORKAccessibilityPerformBlockAfterDelay(1.5, ^{
[[ORKVoiceEngine sharedVoiceEngine] speakText:(NSString *__nonnull)self.activeStep.spokenInstruction];
});
}
}
- (void)suspend {
ORK_Log_Debug(@"%@",self);
if (self.finished || ! self.started) {
return;
}
[_activeStepTimer pause];
[_activeStepView.activeCustomView suspendStep:self];
[self stopRecorders];
}
- (void)resume {
ORK_Log_Debug(@"%@",self);
if (self.finished || ! self.started) {
return;
}
[_activeStepTimer resume];
[self prepareRecorders];
[self startRecorders];
[_activeStepView.activeCustomView resumeStep:self];
}
- (void)finish {
ORK_Log_Debug(@"%@",self);
if (self.finished) {
return;
}
self.finished = YES;
[_activeStepTimer pause];
[_activeStepView.activeCustomView finishStep:self];
[self stopRecorders];
if (self.activeStep.shouldPlaySoundOnFinish) {
[self playSound];
}
if (self.activeStep.shouldVibrateOnFinish) {
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
}
if (! self.activeStep.startsFinished) {
if (self.activeStep.shouldContinueOnFinish) {
[self goForward];
}
}
[self stepDidFinish];
}
- (void)dealloc {
AudioServicesDisposeSystemSoundID(_alertSound);
NSNotificationCenter *nfc = [NSNotificationCenter defaultCenter];
[nfc removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];
[nfc removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
}
#pragma mark - timers
- (void)resetTimer {
[_activeStepTimer reset];
_activeStepTimer = nil;
}
- (void)startTimer
{
[self resetTimer];
NSTimeInterval stepDuration = self.activeStep.stepDuration;
if (stepDuration > 0) {
__weak typeof(self) weakSelf = self;
_activeStepTimer = [[ORKActiveStepTimer alloc] initWithDuration:stepDuration
interval:_timerUpdateInterval
runtime:0
handler:^(ORKActiveStepTimer *timer, BOOL finished) {
typeof(self) strongSelf = weakSelf;
[strongSelf countDownTimerFired:timer finished:finished];
}];
[_activeStepTimer resume];
}
}
- (void)countDownTimerFired:(ORKActiveStepTimer *)timer finished:(BOOL)finished {
if (finished) {
[self finish];
}
NSInteger countDownValue = (NSInteger)round(timer.duration - timer.runtime);
ORKActiveStepCustomView *customView = _activeStepView.activeCustomView;
[customView updateDisplay:self];
ORKVoiceEngine *voice = [ORKVoiceEngine sharedVoiceEngine];
if (!finished && self.activeStep.shouldSpeakCountDown) {
// Speak entire countdown if VO is running.
if (UIAccessibilityIsVoiceOverRunning()) {
[voice speakInt:countDownValue];
return;
}
if (0 < countDownValue && countDownValue <= 3) {
[voice speakInt:countDownValue];
}
}
}
- (BOOL)timerActive {
return (_activeStepTimer != nil);
}
- (NSTimeInterval)timeRemaining {
if (_activeStepTimer == nil) {
return self.activeStep.stepDuration;
}
return _activeStepTimer.duration - _activeStepTimer.runtime;
}
#pragma mark - action handlers
- (void)stepDidFinish
{
}
#pragma mark - ORKRecorderDelegate
- (void)recorder:(ORKRecorder *)recorder didCompleteWithResult:(ORKResult *)result {
_recorderResults = [_recorderResults arrayByAddingObject:result];
[self notifyDelegateOnResultChange];
}
- (void)recorder:(ORKRecorder *)recorder didFailWithError:(NSError *)error {
if (error) {
STRONGTYPE(self.delegate) strongDelegate = self.delegate;
if ([strongDelegate respondsToSelector:@selector(stepViewController:recorder:didFailWithError:)]) {
[strongDelegate stepViewController:self recorder:recorder didFailWithError:error];
}
// If the recorder returns an error indicating that file write failed, and the output directory was nil,
// we consider it a fatal error and fail the step. Otherwise, developers might be confused to get
// no output, just because they did not set an output directory.
if ([error.domain isEqualToString:NSCocoaErrorDomain] &&
error.code == NSFileWriteInvalidFileNameError &&
self.outputDirectory == nil) {
[strongDelegate stepViewControllerDidFail:self withError:error];
}
}
}
static NSString * const _ORKFinishedRestoreKey = @"finished";
static NSString * const _ORKRecorderResultsRestoreKey = @"recorderResults";
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
[super encodeRestorableStateWithCoder:coder];
[coder encodeBool:_finished forKey:_ORKFinishedRestoreKey];
[coder encodeObject:_recorderResults forKey:_ORKRecorderResultsRestoreKey];
}
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
[super decodeRestorableStateWithCoder:coder];
self.finished = [coder decodeBoolForKey:_ORKFinishedRestoreKey];
_recorderResults = [coder decodeObjectOfClass:[NSArray class] forKey:_ORKRecorderResultsRestoreKey];
}
@end
@@ -1,67 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKActiveStepViewController.h"
#import "ORKActiveStepTimer.h"
NS_ASSUME_NONNULL_BEGIN
@class ORKActiveStepView;
@interface ORKActiveStepViewController ()
/**
* The customViewContainer allows custom view to be its subview.
* @note When ORKTouchRecorder is present, its gesture recognizer attaches to customViewContainer.
*/
@property (nonatomic, strong, readonly, nullable) UIView *customViewContainer;
@property (nonatomic, strong, readonly, nullable) ORKActiveStepView *activeStepView;
@property (nonatomic, readonly) NSTimeInterval timeRemaining;
@property (nonatomic, readonly) BOOL timerActive;
@property (nonatomic, assign) NSTimeInterval timerUpdateInterval;
@property (nonatomic, assign, getter=isStarted) BOOL started;
- (void)countDownTimerFired:(ORKActiveStepTimer *)timer finished:(BOOL)finished; // Let subclass receive timer fires
- (void)applicationWillResignActive:(NSNotification *)notification;
- (void)applicationDidBecomeActive:(NSNotification *)notification;
@end
NS_ASSUME_NONNULL_END
@@ -1,45 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKActiveStep.h>
@interface ORKActiveStep ()
/**
* Convenience methods.
*/
- (BOOL)startsFinished;
- (BOOL)hasCountDown;
- (BOOL)hasTitle;
- (BOOL)hasText;
- (BOOL)hasVoice;
@end
@@ -1,54 +0,0 @@
/*
Copyright (c) 2015, 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 ORKAudioContentView : ORKActiveStepCustomView
@property (nonatomic, copy, nullable) UIColor *keyColor;
@property (nonatomic, copy, nullable) UIColor *alertColor;
@property (nonatomic, assign, getter=isFinished) BOOL finished;
@property (nonatomic, assign) NSTimeInterval timeLeft;
@property (nonatomic, assign) CGFloat alertThreshold;
@property (nonatomic, copy, nullable) NSArray *samples;
// Samples should be in the range of (0, 1).
- (void)addSample:(NSNumber *)sample;
- (void)removeAllSamples;
@end
NS_ASSUME_NONNULL_END
@@ -1,385 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKAudioContentView.h"
#import "ORKHelpers.h"
#import "ORKSkin.h"
#import "ORKLabel.h"
#import "ORKHeadlineLabel.h"
#import "ORKAccessibility.h"
// The central blue region.
static const CGFloat GraphViewBlueZoneHeight = 170;
// The two bands at top and bottom which are "loud" each have this height.
static const CGFloat GraphViewRedZoneHeight = 25;
@interface ORKAudioGraphView : UIView
@property (nonatomic, strong) UIColor *keyColor;
@property (nonatomic, strong) UIColor *alertColor;
@property (nonatomic, copy) NSArray *values;
@property (nonatomic) CGFloat alertThreshold;
@end
static const CGFloat kValueLineWidth = 4.5;
static const CGFloat kValueLineMargin = 1.5;
@implementation ORKAudioGraphView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
NSLayoutConstraint *c1 = [NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:CGFLOAT_MAX];
c1.priority = UILayoutPriorityFittingSizeLevel;
NSLayoutConstraint *c2 = [NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:CGFLOAT_MAX];
c2.priority = UILayoutPriorityFittingSizeLevel;
[NSLayoutConstraint activateConstraints:@[c1,c2]];
#if TARGET_IPHONE_SIMULATOR
_values = @[@(0.2),@(0.6),@(0.55), @(0.1), @(0.75), @(0.7)];
#endif
}
return self;
}
- (void)setValues:(NSArray *)values {
_values = [values copy];
[self setNeedsDisplay];
}
- (void)setKeyColor:(UIColor *)keyColor {
_keyColor = [keyColor copy];
[self setNeedsDisplay];
}
- (void)setAlertColor:(UIColor *)alertColor {
_alertColor = [alertColor copy];
[self setNeedsDisplay];
}
- (void)setAlertThreshold:(CGFloat)alertThreshold {
_alertThreshold = alertThreshold;
[self setNeedsDisplay];
}
- (void)drawRect:(CGRect)rect {
CGRect r = self.bounds;
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(ctx, [UIColor whiteColor].CGColor);
CGContextFillRect(ctx, r);
CGFloat scale = [self.window.screen scale];
CGFloat midY = CGRectGetMidY(r);
CGFloat maxX = CGRectGetMaxX(r);
CGFloat halfHeight = r.size.height/2;
CGContextSaveGState(ctx);
{
UIBezierPath *centerLine = [UIBezierPath new];
[centerLine moveToPoint:(CGPoint){.x=0,.y=midY}];
[centerLine addLineToPoint:(CGPoint){.x=maxX,.y=midY}];
CGContextSetLineWidth(ctx, 1/scale);
[_keyColor setStroke];
CGFloat lengths[2] = {3,3};
CGContextSetLineDash(ctx, 0, lengths, 2);
[centerLine stroke];
}
CGContextRestoreGState(ctx);
CGFloat lineStep = kValueLineMargin + kValueLineWidth;
CGContextSaveGState(ctx);
{
CGFloat x = maxX - lineStep/2;
CGContextSetLineWidth(ctx, kValueLineWidth);
CGContextSetLineCap(ctx, kCGLineCapRound);
UIBezierPath *path1 = [UIBezierPath new];
path1.lineCapStyle = kCGLineCapRound;
path1.lineWidth = kValueLineWidth;
UIBezierPath *path2 = [path1 copy];
for (NSNumber *value in [_values reverseObjectEnumerator]) {
CGFloat floatValue = [value doubleValue];
UIBezierPath *p = nil;
if (floatValue > _alertThreshold) {
p = path1;
[_alertColor setStroke];
} else {
p = path2;
[_keyColor setStroke];
}
[p moveToPoint:(CGPoint){.x=x,.y=midY-floatValue*halfHeight}];
[p addLineToPoint:(CGPoint){.x=x,.y=midY+floatValue*halfHeight}];
x -= lineStep;
if (x < 0) {
break;
}
}
[_alertColor setStroke];
[path1 stroke];
[_keyColor setStroke];
[path2 stroke];
}
CGContextRestoreGState(ctx);
}
@end
@interface ORKAudioTimerLabel : ORKLabel
@end
@implementation ORKAudioTimerLabel
+ (UIFont *)defaultFont {
UIFontDescriptor *descriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleSubheadline];
UIFontDescriptor *alternativeDescriptor = ORKFontDescriptorForLightStylisticAlternative(descriptor);
return [UIFont fontWithDescriptor:alternativeDescriptor size:[alternativeDescriptor pointSize]+4];
}
@end
@interface ORKAudioContentView()
@property (nonatomic, strong) ORKHeadlineLabel *alertLabel;
@property (nonatomic, strong) UILabel *timerLabel;
@property (nonatomic, strong) ORKAudioGraphView *graphView;
@end
@implementation ORKAudioContentView
{
NSArray *_constraints;
NSMutableArray *_samples;
UIColor *_keyColor;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
CGFloat margin = ORKStandardMarginForView(self);
self.layoutMargins = (UIEdgeInsets){.left=2*margin,.right=2*margin};
self.alertLabel = [ORKHeadlineLabel new];
_alertLabel.translatesAutoresizingMaskIntoConstraints = NO;
self.timerLabel = [ORKAudioTimerLabel new];
_timerLabel.translatesAutoresizingMaskIntoConstraints = NO;
_timerLabel.textAlignment = NSTextAlignmentRight;
self.graphView = [ORKAudioGraphView new];
_graphView.translatesAutoresizingMaskIntoConstraints = NO;
self.translatesAutoresizingMaskIntoConstraints = NO;
self.alertColor = [UIColor ork_redColor];
[self addSubview:_alertLabel];
[self addSubview:_timerLabel];
[self addSubview:_graphView];
_timerLabel.text = @"06:00";
_alertLabel.text = ORKLocalizedString(@"AUDIO_TOO_LOUD_LABEL", nil);
self.alertThreshold = GraphViewBlueZoneHeight/(GraphViewRedZoneHeight*2+GraphViewBlueZoneHeight);
[self updateGraphSamples];
[self applyKeyColor];
[self setNeedsUpdateConstraints];
}
return self;
}
- (void)tintColorDidChange {
[self applyKeyColor];
}
- (void)setFinished:(BOOL)finished {
_finished = finished;
[self updateAlertLabelHidden];
}
- (void)applyKeyColor {
UIColor *keyColor = [self keyColor];
_timerLabel.textColor = keyColor;
_graphView.keyColor = keyColor;
}
- (UIColor *)keyColor {
return _keyColor ? : [self tintColor];
}
- (void)setKeyColor:(UIColor *)keyColor {
_keyColor = keyColor;
[self applyKeyColor];
}
- (void)setAlertColor:(UIColor *)alertColor {
_alertColor = alertColor;
_alertLabel.textColor = alertColor;
_graphView.alertColor = alertColor;
}
- (void)updateConstraints {
if ([_constraints count]) {
[NSLayoutConstraint deactivateConstraints:_constraints];
_constraints = nil;
}
NSMutableArray *constraints = [NSMutableArray array];
NSDictionary *views = NSDictionaryOfVariableBindings(_timerLabel, _alertLabel, _graphView);
[constraints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_graphView]-[_alertLabel]|"
options:(NSLayoutFormatOptions)0
metrics:nil views:views]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_alertLabel
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterX
multiplier:1 constant:0]];
[constraints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_graphView]-2-[_timerLabel]-|"
options:NSLayoutFormatAlignAllCenterY
metrics:nil views:views]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_graphView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:(GraphViewBlueZoneHeight+GraphViewRedZoneHeight*2)]];
_constraints = constraints;
[NSLayoutConstraint activateConstraints:constraints];
[super updateConstraints];
}
- (void)setAlertThreshold:(CGFloat)alertThreshold {
_alertThreshold = alertThreshold;
_graphView.alertThreshold = alertThreshold;
[self updateGraphSamples];
}
- (void)setTimeLeft:(NSTimeInterval)timeLeft {
_timeLeft = timeLeft;
[self updateTimerLabel];
}
- (void)updateTimerLabel {
static NSDateComponentsFormatter *_formatter = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSDateComponentsFormatter *fmt = [NSDateComponentsFormatter new];
fmt.unitsStyle = NSDateComponentsFormatterUnitsStylePositional;
fmt.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
fmt.allowedUnits = NSCalendarUnitMinute | NSCalendarUnitSecond;
_formatter = fmt;
});
NSString *s = [_formatter stringFromTimeInterval:MAX(round(_timeLeft),0)];
_timerLabel.text = s;
_timerLabel.hidden = (s == nil);
}
- (void)updateGraphSamples {
_graphView.values = _samples;
[self updateAlertLabelHidden];
}
- (void)updateAlertLabelHidden {
NSNumber *sample = [_samples lastObject];
BOOL hide = _finished || !([sample doubleValue] > _alertThreshold);
_alertLabel.hidden = hide;
}
- (void)setSamples:(NSArray *)samples {
_samples = [samples mutableCopy];
[self updateGraphSamples];
}
- (void)addSample:(NSNumber *)sample {
NSAssert(sample != nil, @"Sample should be non-nil");
if (! _samples) {
_samples = [NSMutableArray array];
}
[_samples addObject:sample];
// Try to keep around 250 samples
if ([_samples count] > 500) {
_samples = [[_samples subarrayWithRange:(NSRange){250,_samples.count-250}] mutableCopy];
}
[self updateGraphSamples];
}
- (void)removeAllSamples {
_samples = nil;
[self updateGraphSamples];
}
#pragma mark Accessibility
- (BOOL)isAccessibilityElement {
return YES;
}
- (NSString *)accessibilityLabel {
if (_alertLabel.isHidden) {
return _timerLabel.accessibilityLabel;
}
return ORKAccessibilityStringForVariables(_timerLabel.accessibilityLabel, _alertLabel.accessibilityLabel);
}
- (UIAccessibilityTraits)accessibilityTraits {
return [super accessibilityTraits] | UIAccessibilityTraitUpdatesFrequently;
}
@end
@@ -1,85 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKRecorder.h>
#import <AVFoundation/AVFoundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
The ORKAudioRecorder class represents a recorder that uses the app's
`AVAudioSession` object to record audio.
To ensure audio recording continues when a task enters the background,
add the `audio` tag to `UIBackgroundModes` in your app's `Info.plist` file.
*/
ORK_CLASS_AVAILABLE
@interface ORKAudioRecorder : ORKRecorder
/**
The default audio format settings.
If no settings are specified, the audio configuration is
MPEG4 AAC, 2 channels, 16 bit, 44.1 kHz, AVAudioQualityMin.
*/
+ (NSDictionary *)defaultRecorderSettings;
/**
Audio format settings
Settings for the recording session.
Passed to AVAudioRecorder`'s `-initWithURL:settings:error:`
For information on the settings available for an audio recorder, see "AV Foundation Audio Settings Constants".
*/
@property (nonatomic, copy, readonly, nullable) NSDictionary *recorderSettings;
/**
Returns an initialized audio recorder using the specified settings, step, and output directory.
@param recorderSettings The settings for the recording session.
@param step The step that requested this recording.
@param outputDirectory The directory in which the audio output should be stored.
@return An initialized audio recorder.
*/
- (instancetype)initWithRecorderSettings:(NSDictionary *)recorderSettings
step:(ORKStep *)step
outputDirectory:(NSURL *)outputDirectory NS_DESIGNATED_INITIALIZER;
/**
Reference to the audio recorder being used.
The value of this property is used in the audio task in order to display recorded volume in real time during the task.
*/
@property (nonatomic, strong, readonly, nullable) AVAudioRecorder *audioRecorder;
@end
NS_ASSUME_NONNULL_END
-350
View File
@@ -1,350 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKAudioRecorder.h"
#import "ORKHelpers.h"
#import "ORKRecorder_Internal.h"
#import "ORKRecorder_Private.h"
#import "ORKDefines_Private.h"
@interface ORKAudioRecorder ()
@property (nonatomic, strong) AVAudioRecorder *audioRecorder;
@property (nonatomic, copy) NSDictionary *recorderSettings;
@end
@implementation ORKAudioRecorder
- (void)dealloc
{
ORK_Log_Debug(@"Remove audiorecorder %p", self);
[_audioRecorder stop];
_audioRecorder = nil;
}
+ (NSDictionary *)defaultRecorderSettings
{
return [NSDictionary
dictionaryWithObjectsAndKeys:
@(kAudioFormatMPEG4AAC), AVFormatIDKey,
@(AVAudioQualityMin), AVEncoderAudioQualityKey,
@(2), AVNumberOfChannelsKey,
@(44100.0), AVSampleRateKey,
nil];
}
- (instancetype)initWithRecorderSettings:(NSDictionary *)recorderSettings
step:(ORKStep *)step
outputDirectory:(NSURL *)outputDirectory
{
self = [super initWithStep:step outputDirectory:outputDirectory];
if (self) {
self.continuesInBackground = YES;
if (! recorderSettings)
{
recorderSettings = [[self class] defaultRecorderSettings];
}
if (! [recorderSettings isKindOfClass:[NSDictionary class]])
{
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"recorderSettings should be a dictionary" userInfo:recorderSettings];
}
self.recorderSettings = recorderSettings;
}
return self;
}
- (void)start {
// Only create the file when we should actually start recording.
if (! _audioRecorder) {
NSError *error = nil;
NSURL *soundFileURL = [self recordingFileURL];
if (! [self recreateFileWithError:&error]) {
[self finishRecordingWithError:error];
return;
}
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
if (! [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]) {
[self finishRecordingWithError:error];
return;
}
ORK_Log_Debug(@"Create audioRecorder %p", self);
_audioRecorder = [[AVAudioRecorder alloc]
initWithURL:soundFileURL
settings:self.recorderSettings
error:&error];
if (! _audioRecorder) {
[self finishRecordingWithError:error];
return;
}
#if ! TARGET_IPHONE_SIMULATOR
if (!_audioRecorder.recording)
{
[_audioRecorder prepareToRecord];
}
#endif
}
#if ! TARGET_IPHONE_SIMULATOR
if (!_audioRecorder.recording)
{
[_audioRecorder prepareToRecord];
[_audioRecorder record];
}
#endif
[super start];
}
- (void)stop {
if (! _audioRecorder) {
// Error has already been returned.
return;
}
[self doStopRecording];
NSURL *fileUrl = [self recordingFileURL];
if (! [[NSFileManager defaultManager] fileExistsAtPath:[[self recordingFileURL] path]]) {
fileUrl = nil;
}
[self reportFileResultWithFile:fileUrl error:nil];
[super stop];
}
- (BOOL)isRecording {
return _audioRecorder.recording;
}
- (NSString *)mimeType {
NSDictionary *recorderSettings = [self recorderSettings];
unsigned int recorderFormat = [recorderSettings[AVFormatIDKey] unsignedIntValue];
NSString *contentType = @"audio";
switch (recorderFormat)
{
case kAudioFormatLinearPCM:
{
int numBits = [recorderSettings[AVLinearPCMBitDepthKey] intValue] ? : 16;
contentType = [NSString stringWithFormat:@"audio/L%d", numBits];
break;
}
case kAudioFormatAC3:
contentType = @"audio/ac3";
break;
case kAudioFormatMPEG4AAC:
case kAudioFormatMPEG4CELP:
case kAudioFormatMPEG4HVXC:
case kAudioFormatMPEG4TwinVQ:
case kAudioFormatAppleLossless:
contentType = @"audio/m4a";
break;
case kAudioFormatULaw:
contentType = @"audio/basic";
break;
}
return contentType;
}
- (NSString *)recorderType
{
return @"audio";
}
- (void)doStopRecording
{
if (self.isRecording) {
#if ! TARGET_IPHONE_SIMULATOR
[_audioRecorder stop];
[self applyFileProtection:ORKFileProtectionComplete toFileAtURL:[self recordingFileURL]];
#endif
}
}
- (void)finishRecordingWithError:(NSError *)error
{
[self doStopRecording];
[super finishRecordingWithError:error];
}
- (NSString *)extension
{
NSDictionary *recorderSettings = [self recorderSettings];
unsigned int recorderFormat = [recorderSettings[AVFormatIDKey] unsignedIntValue];
NSString *extension = @"au";
switch (recorderFormat)
{
case kAudioFormatLinearPCM:
{
extension = @"pcm";
break;
}
case kAudioFormatAC3:
extension = @"ac3";
break;
case kAudioFormatMPEG4AAC:
case kAudioFormatMPEG4CELP:
case kAudioFormatMPEG4HVXC:
case kAudioFormatMPEG4TwinVQ:
case kAudioFormatAppleLossless:
extension = @"m4a";
break;
}
return extension;
}
- (NSURL *)recordingFileURL
{
return [[self recordingDirectoryURL] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", [self logName], [self extension]]];
}
- (BOOL)recreateFileWithError:(NSError * __autoreleasing *)error
{
NSURL *url = [self recordingFileURL];
if (! url) {
if (error) {
*error = [NSError errorWithDomain:NSCocoaErrorDomain code:NSFileWriteInvalidFileNameError userInfo:@{NSLocalizedDescriptionKey:ORKLocalizedString(@"ERROR_RECORDER_NO_OUTPUT_DIRECTORY", nil)}];
}
return NO;
}
NSFileManager *fm = [NSFileManager defaultManager];
if (! [fm createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:error]) {
return NO;
}
if ([fm fileExistsAtPath:[url path]]) {
if (! [fm removeItemAtPath:[url path] error:error]) {
return NO;
}
}
[fm createFileAtPath:[url path] contents:nil attributes:nil];
[fm setAttributes:@{NSFileProtectionKey : ORKFileProtectionFromMode(ORKFileProtectionCompleteUnlessOpen)} ofItemAtPath:[url path] error:error];
return YES;
}
- (void)reset {
[_audioRecorder stop];
_audioRecorder = nil;
[super reset];
}
@end
@interface ORKAudioRecorderConfiguration ()
@end
@implementation ORKAudioRecorderConfiguration
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
- (instancetype)initWithRecorderSettings:(NSDictionary *)recorderSettings
{
self = [self ork_init];
if (self)
{
if (recorderSettings && ! [recorderSettings isKindOfClass:[NSDictionary class]])
{
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"recorderSettings should be a dictionary" userInfo:recorderSettings];
}
_recorderSettings = recorderSettings;
}
return self;
}
#pragma clang diagnostic pop
- (ORKRecorder *)recorderForStep:(ORKStep *)step
outputDirectory:(NSURL *)outputDirectory
{
return [[ORKAudioRecorder alloc] initWithRecorderSettings:(NSDictionary *__nonnull)self.recorderSettings
step:step
outputDirectory:outputDirectory];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
ORK_DECODE_OBJ_CLASS(aDecoder, recorderSettings, NSDictionary);
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
ORK_ENCODE_OBJ(aCoder, recorderSettings);
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (BOOL)isEqual:(id)object {
BOOL isParentSame = [super isEqual:object];
__typeof(self) castObject = object;
return (isParentSame &&
ORKEqualObjects(self.recorderSettings, castObject.recorderSettings)) ;
}
- (ORKPermissionMask)requestedPermissionMask {
return ORKPermissionAudioRecording;
}
@end
-42
View File
@@ -1,42 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKActiveStep.h>
NS_ASSUME_NONNULL_BEGIN
ORK_CLASS_AVAILABLE
@interface ORKAudioStep : ORKActiveStep
@property (nonatomic, assign) NSTimeInterval duration;
@end
NS_ASSUME_NONNULL_END
-96
View File
@@ -1,96 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKAudioStep.h"
#import "ORKAudioStepViewController.h"
#import "ORKHelpers.h"
#import "ORKStep_Private.h"
@implementation ORKAudioStep
+ (Class)stepViewControllerClass {
return [ORKAudioStepViewController class];
}
- (void)validateParameters {
[super validateParameters];
NSTimeInterval const ORKAudioTaskMinimumDuration = 5.0;
if ( self.duration < ORKAudioTaskMinimumDuration)
{
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"duration can not be shorter than %@ seconds.", @(ORKAudioTaskMinimumDuration)] userInfo:nil];
}
}
- (instancetype)copyWithZone:(NSZone *)zone
{
ORKAudioStep *step = [super copyWithZone:zone];
step.duration = self.duration;
return step;
}
- (BOOL)startsFinished {
return NO;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
ORK_DECODE_DOUBLE(aDecoder, duration);
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
ORK_ENCODE_DOUBLE(aCoder, duration);
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (BOOL)isEqual:(id)object {
BOOL isParentSame = [super isEqual:object];
__typeof(self) castObject = object;
return (isParentSame &&
(self.duration == castObject.duration)) ;
}
@end
@@ -1,40 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit_Private.h>
NS_ASSUME_NONNULL_BEGIN
ORK_CLASS_AVAILABLE
@interface ORKAudioStepViewController : ORKActiveStepViewController
@end
NS_ASSUME_NONNULL_END
@@ -1,172 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKAudioStepViewController.h"
#import "ORKAudioContentView.h"
#import "ORKActiveStepViewController_Internal.h"
#import "ORKVerticalContainerView.h"
#import <AVFoundation/AVFoundation.h>
#import "ORKActiveStepTimer.h"
#import "ORKHelpers.h"
#import "ORKStep_Private.h"
#import "ORKAudioStep.h"
#import "ORKAudioRecorder.h"
#import "ORKActiveStepView.h"
#import "ORKCustomStepView_Internal.h"
@interface ORKAudioStepViewController ()
@property (nonatomic, strong) AVAudioRecorder *avAudioRecorder;
@end
@implementation ORKAudioStepViewController
{
ORKAudioContentView *_audioContentView;
ORKAudioRecorder *_audioRecorder;
ORKActiveStepTimer *_timer;
}
- (instancetype)initWithStep:(ORKStep *)step {
self = [super initWithStep:step];
if (self) {
// Continue audio recording in the background
self.suspendIfInactive = NO;
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_audioContentView = [ORKAudioContentView new];
_audioContentView.timeLeft = self.audioStep.duration;
self.activeStepView.activeCustomView = _audioContentView;
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self start];
}
- (void)audioRecorderDidChange {
_audioRecorder.audioRecorder.meteringEnabled = YES;
[self setAvAudioRecorder:_audioRecorder.audioRecorder];
}
- (void)recordersDidChange {
ORKAudioRecorder *audioRecorder = nil;
for (ORKRecorder *recorder in self.recorders) {
if ([recorder isKindOfClass:[ORKAudioRecorder class]]) {
audioRecorder = (ORKAudioRecorder *)recorder;
break;
}
}
_audioRecorder = audioRecorder;
[self audioRecorderDidChange];
}
- (ORKAudioStep *)audioStep {
return (ORKAudioStep *)self.step;
}
- (void)doSample {
[_avAudioRecorder updateMeters];
float value = [_avAudioRecorder averagePowerForChannel:0];
// Assume value is in range roughly -60dB to 0dB
float clampedValue = MAX(value/60.0, -1) + 1;
[_audioContentView addSample:@(clampedValue)];
_audioContentView.timeLeft = [_timer duration] - [_timer runtime];
}
- (void)startNewTimerIfNeeded {
if (! _timer) {
NSTimeInterval duration = self.audioStep.duration;
__weak typeof(self) weakSelf = self;
_timer = [[ORKActiveStepTimer alloc] initWithDuration:duration interval:duration/100 runtime:0 handler:^(ORKActiveStepTimer *timer, BOOL finished) {
typeof(self) strongSelf = weakSelf;
[strongSelf doSample];
if (finished) {
[self finish];
}
}];
[_timer resume];
}
_audioContentView.finished = NO;
}
- (void)start {
[super start];
[self audioRecorderDidChange];
[_timer reset];
_timer = nil;
[self startNewTimerIfNeeded];
}
- (void)suspend {
[super suspend];
[_timer pause];
if (_avAudioRecorder) {
[_audioContentView addSample:@(0)];
}
}
- (void)resume {
[super resume];
[self audioRecorderDidChange];
[self startNewTimerIfNeeded];
[_timer resume];
}
- (void)finish {
[super finish];
[_timer reset];
_timer = nil;
}
- (void)stepDidFinish {
_audioContentView.finished = YES;
}
- (void)setAvAudioRecorder:(AVAudioRecorder *)recorder {
_avAudioRecorder = nil;
_avAudioRecorder = recorder;
}
@end
@@ -1,46 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit.h>
#import <ResearchKit/ORKActiveStep.h>
/**
The `ORKCountdownStep` class represents a step that displays a label and a
countdown for a time equal to its duration.
To use the countdown step, set the `duration` property, incorporate it into a
task, and present the task with a task view controller.
The countdown step is used in most of ResearchKit's predefined active tasks.
*/
ORK_CLASS_AVAILABLE
@interface ORKCountdownStep : ORKActiveStep
@end
@@ -1,66 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKCountdownStep.h"
#import "ORKCountdownStepViewController.h"
@implementation ORKCountdownStep
+ (Class)stepViewControllerClass
{
return [ORKCountdownStepViewController class];
}
- (instancetype)initWithIdentifier:(NSString *)identifier
{
self = [super initWithIdentifier:identifier];
if (self) {
self.shouldStartTimerAutomatically = YES;
self.shouldShowDefaultTimer = NO;
self.shouldContinueOnFinish = YES;
self.stepDuration = 5.0;
}
return self;
}
- (void)validateParameters {
[super validateParameters];
NSTimeInterval const ORKCountdownStepMinimumDuration = 3.0;
if ( self.stepDuration < ORKCountdownStepMinimumDuration)
{
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"duration can not be shorter than %@ seconds.", @(ORKCountdownStepMinimumDuration)] userInfo:nil];
}
}
@end
@@ -1,43 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit_Private.h>
/**
The `ORKCountdownStepViewController` class represents the step view controller that corresponds to an `ORKCountdownStep`.
It is not usually necessary to instantiate this view controller directly.
Instead, add a countdown step to a task, and present the task in a task
view controller.
*/
ORK_CLASS_AVAILABLE
@interface ORKCountdownStepViewController : ORKActiveStepViewController
@end
@@ -1,256 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKCountdownStepViewController.h"
#import "ORKCustomStepView_Internal.h"
#import "ORKActiveStepViewController_internal.h"
#import "ORKVerticalContainerView.h"
#import "ORKStepViewController_Internal.h"
#import "ORKActiveStepTimer.h"
#import "ORKResult.h"
#import "ORKLabel.h"
#import "ORKSubheadlineLabel.h"
#import "ORKHelpers.h"
#import "ORKAccessibility.h"
#import "ORKActiveStepView.h"
@interface ORKCountDownViewLabel : ORKLabel
@end
@implementation ORKCountDownViewLabel
+ (UIFont *)defaultFont {
return ORKThinFontWithSize(56);
}
@end
@interface ORKCountdownView : ORKActiveStepCustomView
@property (nonatomic, strong) ORKSubheadlineLabel *textLabel;
@property (nonatomic, strong) ORKCountDownViewLabel *timeLabel;
@property (nonatomic, strong) UIView *progressView;
- (void)startAnimateWithDuration:(NSTimeInterval)duration;
@end
@implementation ORKCountdownView {
CAShapeLayer *_circleLayer;
}
- (instancetype)init
{
self = [super init];
if (self) {
_textLabel = [ORKSubheadlineLabel new];
_textLabel.textAlignment = NSTextAlignmentCenter;
_textLabel.translatesAutoresizingMaskIntoConstraints = NO;
_textLabel.text = ORKLocalizedString(@"COUNTDOWN_LABEL", nil);
[self addSubview:_textLabel];
_timeLabel = [ORKCountDownViewLabel new];
_timeLabel.translatesAutoresizingMaskIntoConstraints = NO;
_timeLabel.textAlignment = NSTextAlignmentCenter;
[self addSubview:_timeLabel];
_progressView = [UIView new];
_progressView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:_progressView];
self.translatesAutoresizingMaskIntoConstraints = NO;
static const CGFloat ProgressIndicatorDiameter = 104;
static const CGFloat ProgressIndicatorOuterMargin = 1;
NSDictionary *metrics = @{@"d":@(ProgressIndicatorDiameter+2*ProgressIndicatorOuterMargin)};
NSDictionary *views = NSDictionaryOfVariableBindings(_textLabel, _timeLabel, _progressView);
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_textLabel]-(>=0)-[_progressView(==d)]|" options:NSLayoutFormatDirectionLeadingToTrailing|NSLayoutFormatAlignAllCenterX metrics:metrics views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(>=0)-[_textLabel]-(>=0)-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:metrics views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(>=0)-[_progressView(==d)]-(>=0)-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:metrics views:views]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:_progressView
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterX
multiplier:1.0 constant:0]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:_timeLabel
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:_progressView
attribute:NSLayoutAttributeCenterX
multiplier:1.0 constant:0]];
// Constant required in order to give appearance of vertical centering (compensating for leading on font)
[self addConstraint:[NSLayoutConstraint constraintWithItem:_timeLabel
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:_progressView
attribute:NSLayoutAttributeCenterY
multiplier:1.0 constant:-3]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:_progressView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:_textLabel
attribute:NSLayoutAttributeLastBaseline
multiplier:1 constant:16-ProgressIndicatorOuterMargin]];
_circleLayer = [CAShapeLayer layer];
static const CGFloat ProgressIndicatorRadius = ProgressIndicatorDiameter/2;
_circleLayer.path = [[UIBezierPath bezierPathWithArcCenter:CGPointMake(ProgressIndicatorRadius+ProgressIndicatorOuterMargin, ProgressIndicatorRadius+ProgressIndicatorOuterMargin)
radius:ProgressIndicatorRadius
startAngle:M_PI + M_PI_2
endAngle:-M_PI_2
clockwise:NO] CGPath];
_circleLayer.fillColor = [UIColor clearColor].CGColor;
_circleLayer.strokeColor = self.tintColor.CGColor;
_circleLayer.lineWidth = 1;
[_progressView.layer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
[_progressView.layer addSublayer:_circleLayer];
_textLabel.isAccessibilityElement = NO;
_timeLabel.isAccessibilityElement = NO;
}
return self;
}
- (void)tintColorDidChange {
_circleLayer.strokeColor = self.tintColor.CGColor;
}
- (void)startAnimateWithDuration:(NSTimeInterval)duration {
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"strokeEnd"];
animation.duration = duration*2;
animation.removedOnCompletion = YES;
animation.values = @[@(1.0), @(0.0), @(0.0)];
animation.keyTimes = @[@(0.0), @(0.5), @(1.0)];
animation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
[_circleLayer addAnimation:animation forKey:@"drawCircleAnimation"];
}
#pragma mark Accessibility
- (BOOL)isAccessibilityElement {
return YES;
}
- (NSString *)accessibilityLabel {
return ORKAccessibilityStringForVariables(_textLabel.accessibilityLabel, _timeLabel.accessibilityLabel);
}
- (UIAccessibilityTraits)accessibilityTraits {
return [super accessibilityTraits] | UIAccessibilityTraitUpdatesFrequently;
}
@end
@interface ORKCountdownStepViewController ()
@property (nonatomic, strong) ORKCountdownView *countdownView;
@end
@implementation ORKCountdownStepViewController {
NSInteger _countDown;
}
- (instancetype)initWithStep:(ORKStep *)step {
self = [super initWithStep:step];
if (self) {
self.suspendIfInactive = NO;
}
return self;
}
- (void)setStep:(ORKStep *)step {
[super setStep:step];
_countDown = round([(ORKActiveStep *)step stepDuration]);
}
- (void)viewDidLoad {
[super viewDidLoad];
self.learnMoreButtonItem = nil;
_countdownView = [[ORKCountdownView alloc] init];
_countdownView.translatesAutoresizingMaskIntoConstraints = NO;
self.activeStepView.activeCustomView = _countdownView;
[self updateCountdownLabel];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, [@(_countDown) stringValue]);
[_countdownView startAnimateWithDuration:[(ORKActiveStep *)self.step stepDuration]];
}
- (void)updateCountdownLabel {
_countdownView.timeLabel.text = [NSString stringWithFormat:@"%lu", (unsigned long)_countDown];
}
- (void)countDownTimerFired:(ORKActiveStepTimer *)timer finished:(BOOL)finished {
_countDown = MAX((_countDown-1), 0);
[self updateCountdownLabel];
if (UIAccessibilityIsVoiceOverRunning()) {
if (finished) {
[[NSNotificationCenter defaultCenter] addObserverForName:UIAccessibilityAnnouncementDidFinishNotification
object:nil
queue:nil
usingBlock:^(NSNotification *note) {
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityAnnouncementDidFinishNotification object:nil];
[super countDownTimerFired:timer finished:finished];
}];
UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, ORKLocalizedString(@"AX_ANNOUNCE_BEGIN_TASK", nil));
}
else {
UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, [@(_countDown) stringValue]);
[super countDownTimerFired:timer finished:finished];
}
}
else
{
[super countDownTimerFired:timer finished:finished];
}
}
@end
-529
View File
@@ -1,529 +0,0 @@
/*
Copyright (c) 2015, 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 <Foundation/Foundation.h>
#import <ResearchKit/ORKDefines.h>
NS_ASSUME_NONNULL_BEGIN
@class ORKDataLogger;
@class HKUnit;
/**
The `ORKDataLoggerDelegate` protocol defines methods that the delegate of an `ORKDataLogger` object uses to handle data being logged to disk.
*/
@protocol ORKDataLoggerDelegate <NSObject>
/**
Tells the delegate when a log file rollover occurs.
@param dataLogger The data logger providing the notification.
@param fileUrl The URL of the newly renamed log file.
*/
- (void)dataLogger:(ORKDataLogger *)dataLogger finishedLogFile:(NSURL *)fileUrl;
@optional
/**
Tells the delegate if the number of bytes in completed logs changes.
When files are removed or added, or marked as uploaded or unmarked, this delegate method is called a short time later. Multiple directory changes
are rolled up into a single delegate callback.
@param dataLogger The data logger providing the notification.
*/
- (void)dataLoggerByteCountsDidChange:(ORKDataLogger *)dataLogger;
@end
@class ORKLogFormatter;
/**
The `ORKDataLogger` class is an internal component used by some `ORKRecorder`
subclasses for writing data to disk during tasks. An `ORKDataLogger` object manages one log as a set of files in a directory.
The current log file is at `directory/logName`.
Historic log files are at `directory/logName-(timestamp)-(count)`
where timestamp is of the form `YYYYMMddHHmmss` (Zulu) and indicates the time
the log finished (that is, was rolled over). If more than one rollover occurs within
one second, additional log files may be created with increasing `count`.
The user is responsible for managing the historic log files, but the `ORKDataLogger` class
provides tools for enumerating them (in sorted order).
The data logger contains a concept of whether a file has been uploaded, which
is tracked using file attributes. This feature can facilitate a workflow in which
log files are archived and queued for upload before actually sending them to
a server. When archived and ready for upload, the files could be marked uploaded
by the `ORKDataLogger`. When the upload is complete and the data has been handed
off downstream, the files can then be deleted. If the upload fails, the uploaded
files can have that flag cleared, to indicate that they should be included
in the next archiving attempt.
*/
ORK_CLASS_AVAILABLE
@interface ORKDataLogger : NSObject
/**
Returns a data logger with an `ORKJSONLogFormatter`.
@param url The URL of the directory in which to place log files.
@param logName The prefix on the log file name in an ASCII string. Note that
the string must not contain the hyphen character ("-"), because a hyphen is used as a separator in the log naming scheme.
@param delegate The initial delegate. May be `nil`.
*/
+ (ORKDataLogger *)JSONDataLoggerWithDirectory:(NSURL *)url logName:(NSString *)logName delegate:(nullable id<ORKDataLoggerDelegate>)delegate;
/**
Returns an initialized data logger using the specified URL, log name, formatter, and delegate.
@param url The URL of the directory in which to place log files
@param logName The prefix on the log file name in an ASCII string. Note that
the string must not contain the hyphen character ("-"), because a hyphen is used as a separator in the log naming scheme.
@param formatter The type of formatter to use for the log, such as `ORKJSONLogFormatter`.
@param delegate The initial delegate. May be `nil`.
@return An initialized data logger.
*/
- (instancetype)initWithDirectory:(NSURL *)url logName:(NSString *)logName formatter:(ORKLogFormatter *)formatter delegate:(nullable id<ORKDataLoggerDelegate>)delegate NS_DESIGNATED_INITIALIZER;
/// The delegate to be notified when file sizes change or the log rolls over.
@property (weak, nullable) id<ORKDataLoggerDelegate> delegate;
/// The log formatter being used.
@property (strong, readonly) ORKLogFormatter *logFormatter;
/**
The maximum current log file size.
When the current log reaches this size, it is automatically rolled over.
*/
@property size_t maximumCurrentLogFileSize;
/**
The maximum current log file lifetime.
When the current log file has been active this long, it is rolled over.
*/
@property NSTimeInterval maximumCurrentLogFileLifetime;
/// The number of bytes of log data that are not marked uploaded, excluding the current file. This value is lazily updated.
@property unsigned long long pendingBytes;
/// The number of bytes of log data that are marked uploaded. This value is lazily updated.
@property unsigned long long uploadedBytes;
/// The file protection mode to use for newly created files.
@property (assign) ORKFileProtectionMode fileProtectionMode;
/// The prefix on the log file names.
@property (copy, readonly) NSString *logName;
/// Forces a roll-over now.
- (void)finishCurrentLog;
/// The current log file's location.
- (NSURL *)currentLogFileURL;
/**
Enumerates the URLs of completed log files, sorted to put the oldest first.
Takes a snapshot of the current directory's relevant files, sorts them,
and enumerates them. Errors can occur if changes are being made to the filesystem other
than through this object.
@param block The block to call during enumeration.
@param error Any error detected during the enumeration
@return `YES` if the enumeration was successful; otherwise, `NO`.
*/
- (BOOL)enumerateLogs:(void (^)(NSURL *logFileUrl, BOOL *stop))block error:(NSError * __autoreleasing *)error;
/**
Enumerates the URLs of completed log files not yet marked uploaded,
sorted to put the oldest first.
This method takes a snapshot of the current directory's completed nonuploaded log files, sorts them,
and then enumerates them. Errors can occur if changes are being made to the filesystem other
than through this object.
@param block The block to call during enumeration.
@param error Any error detected during the enumeration
@return `YES` if the enumeration was successful; otherwise, `NO`.
*/
- (BOOL)enumerateLogsNeedingUpload:(void (^)(NSURL *logFileUrl, BOOL *stop))block error:(NSError * __autoreleasing *)error;
/**
Enumerates the URLs of completed log files not already marked uploaded,
sorted to put the oldest first.
Takes a snapshot of the current directory's completed uploaded log files, sorts them,
and then enumerates them. Errors can occur if changes are being made to the filesystem other
than through this object.
@param block The block to call during enumeration.
@param error Any error detected during the enumeration
@return `YES` if the enumeration was successful; otherwise, `NO`.
*/
- (BOOL)enumerateLogsAlreadyUploaded:(void (^)(NSURL *logFileUrl, BOOL *stop))block error:(NSError * __autoreleasing *)error;
/**
Appends an object to the log file, which is formatted with `logFormatter`.
The default log formatter expects NSData; call canAcceptLogObjectOfClass: on `logFormatter` to determine if it will accept this object.
Note that the current log file is created and opened lazily when a request to
log data is made. If an attempt is made to log data and there is no access due
to file protection, the log is immediately rolled over and a new file created.
@param object Should be an object of a class that is accepted by the logFormatter.
@param error Error output, if the append fails.
@return `YES` if appending succeeds; otherwise, `NO`.
*/
- (BOOL)append:(id)object error:(NSError * __autoreleasing *)error;
/**
Appends multiple objects to the log file.
This method formats and appends all the objects at once. Using this method may have efficiency
and atomicity gains for error handling, compared to making multiple calls to `append:error`.
@param objects An array of objects of a class that is accepted by the logFormatter.
@param error Error output, if the append fails.
@return `YES` if appending succeeds; otherwise, `NO`.
*/
- (BOOL)appendObjects:(NSArray *)objects error:(NSError * __nullable __autoreleasing *)error;
/**
Checks whether a file has been marked as uploaded.
@param url The URL to check.
@return `YES` if the uploaded attribute has been set on the file and the file exists; otherwise,
`NO`.
*/
- (BOOL)isFileUploadedAtURL:(NSURL *)url;
/**
Marks or unmarks a file as uploaded.
This method uses an extended attribute on the filesystem to mark a file as uploaded.
This is intended for book-keeping use only and to track which files have already
been attached to a pending upload. When the upload is sufficiently complete,
the file should be removed.
@param uploaded A Boolean value that indicates whether to mark the file uploaded or not uploaded.
@param url The URL to mark.
@param error The error that occurred, if the operation fails.
@return `YES` if adding or removing the attribute succeeded; otherwise, `NO`.
*/
- (BOOL)markFileUploaded:(BOOL)uploaded atURL:(NSURL *)url error:(NSError * __nullable __autoreleasing *)error;
/**
Removes files if they are marked uploaded.
If a file is in the list, but is no longer marked uploaded, this method does not remove the file. This workflow lets you unmark files selectively if they could not be added
to the archive, and later call `removeUploadedFiles:withError:` to remove only
the files that are still marked uploaded.
@param fileURLs The array of files that should be removed.
@param error The error that occurred, if the operation fails.
@return `YES` if removing the files succeeded; otherwise, `NO`.
*/
- (BOOL)removeUploadedFiles:(NSArray *)fileURLs withError:(NSError * __nullable __autoreleasing *)error;
/**
Removes all files managed by this logger (files that have the `logName` prefix).
@param error The error that occurred, if operation fails.
@return `YES` if removing the files succeeded.; otherwise, `NO`.
*/
- (BOOL)removeAllFilesWithError:(NSError *__nullable __autoreleasing *)error;
@end
/**
The `ORKLogFormatter` class represents the base (default) log formatter, which appends data
blindly to a log file.
A log formatter is used by a data logger to format objects
for output to the log, and to begin a new log file and end an existing log file.
`ORKLogFormatter` accepts NSData and has neither a header nor a footer.
A log formatter should ensure that the log is always in a valid state, so that
even if the app is killed, the log is still readable.
*/
@interface ORKLogFormatter : NSObject
/**
Returns a Boolean value that indicates whether the log formatter can serialize the specified type of object.
@param c The class of object to serialize.
@return `YES` if the log formatter can serialize this object class; otherwise, `NO`.
*/
- (BOOL)canAcceptLogObjectOfClass:(Class)c;
/**
Returns a Boolean value that indicates whether the log formatter can serialize the specified type of object.
@param object The object to serialize.
@return `YES` if the log formatter can serialize `object`; otherwise, `NO`
*/
- (BOOL)canAcceptLogObject:(id)object;
/**
Begins a new log file on the specified file handle.
For example, may write a header or opening stanza of a new log file.
@param fileHandle The file handle to which to write.
@param error The error output, on failure.
@return `YES` if the write succeeds; otherwise, `NO`.
*/
- (BOOL)beginLogWithFileHandle:(NSFileHandle *)fileHandle error:(NSError * __nullable __autoreleasing *)error;
/**
Appends the specified object to the log file.
@param object The object to write.
@param fileHandle The file handle to which to write.
@param error The error output, on failure.
@return `YES` if the write succeeds; otherwise, `NO`.
*/
- (BOOL)appendObject:(id)object fileHandle:(NSFileHandle *)fileHandle error:(NSError * __nullable __autoreleasing *)error;
/**
Appends the specified objects to the log file.
@param objects The objects to write.
@param fileHandle The file handle to which to write.
@param error The error output, on failure.
@return `YES` if the write succeeds; otherwise, `NO`.
*/
- (BOOL)appendObjects:(NSArray *)objects fileHandle:(NSFileHandle *)fileHandle error:(NSError * __nullable __autoreleasing *)error;
@end
/**
The `ORKJSONLogFormatter` class represents a log formatter for producing JSON output.
The JSON log formatter accepts `NSDictionary` objects for serialization.
The JSON output is a dictionary that contains one key, `items`,
which contains the array of logged items. The log itself does not contain
any timestamp information, so the items should include such fields,
if desired.
*/
ORK_CLASS_AVAILABLE
@interface ORKJSONLogFormatter : ORKLogFormatter
@end
@class ORKJSONDataLogger;
@class ORKDataLoggerManager;
/**
The `ORKDataLoggerManagerDelegate` protocol defines methods a delegate can implement to receive notifications
when the data loggers managed by a `ORKDataLoggerManager` reach a certain file size threshold.
*/
ORK_CLASS_AVAILABLE
@protocol ORKDataLoggerManagerDelegate <NSObject>
/**
Called by the data logger manager when the total size of files
that are not marked uploaded has reached a threshold.
@param dataLoggerManager The manager that produced the notification.
@param pendingUploadBytes The number of bytes managed by all the loggers, which
have not yet been marked uploaded.
*/
- (void)dataLoggerManager:(ORKDataLoggerManager *)dataLoggerManager pendingUploadBytesReachedThreshold:(unsigned long long)pendingUploadBytes;
/**
Called by the data logger manager when the total size of files
managed by any of the loggers has reached a threshold.
@param dataLoggerManager The manager that produced the notification.
@param totalBytes The total number of bytes of all files managed.
*/
- (void)dataLoggerManager:(ORKDataLoggerManager *)dataLoggerManager totalBytesReachedThreshold:(unsigned long long)totalBytes;
@end
/**
The `ORKDataLoggerManager` class represents a manager for multiple `ORKDataLogger` instances,
which tracks the total size of log files produced and can notify its delegate
when file sizes reach configurable thresholds.
The `ORKDataLoggerManager` class is an internal component used by some `ORKRecorder`
subclasses for writing data to disk during tasks.
This manager can be used to organize the `ORKDataLogger` logs in a directory,
and keep track of the total number of bytes stored on disk by each logger. The
delegate can be informed if either the number of bytes pending upload, or the total
number of bytes, exceeds configurable thresholds.
The configuration of the loggers and their thresholds is persisted in a
configuration file in the log directory.
If the number of bytes pending upload exceeds the threshold, the natural action is to
upload them. A block-based enumeration is provided for enumerating all the logs
pending upload. Use `enumerateLogsNeedingUpload:error:`, and when a log has been
processed for upload, use the logger to mark it uploaded.
When the upload succeeds (or at least is successfully queued), the uploaded files
can be removed across all the loggers by calling `removeUploadedFiles:error:`
If the total number of bytes exceeds the threshold, the natural action is to remove log
files that have been marked uploaded, and then remove old log files until the
threshold is no longer exceeded. You can do this by calling `removeOldAndUploadedLogsToThreshold:error:`
*/
ORK_CLASS_AVAILABLE
@interface ORKDataLoggerManager : NSObject <ORKDataLoggerDelegate>
/**
Returns an initialized data logger manager using the specified directory and delegate.
Designated initializer.
@param directory The file URL of the directory where the data loggers should coexist.
@param delegate The delegate to receive notifications.
@return An initialized data logger manager.
*/
- (instancetype)initWithDirectory:(NSURL *)directory delegate:(nullable id<ORKDataLoggerManagerDelegate>)delegate NS_DESIGNATED_INITIALIZER;
/// The delegate of the data logger manager.
@property (weak, nullable) id<ORKDataLoggerManagerDelegate> delegate;
/// The threshold for delegate callback for total bytes not marked uploaded.
@property unsigned long long pendingUploadBytesThreshold;
/// The threshold for delegate callback for total bytes of completed logs.
@property unsigned long long totalBytesThreshold;
/// The total number of bytes of files not marked as pending upload.
@property unsigned long long pendingUploadBytes;
/// The total number of bytes for all the loggers.
@property unsigned long long totalBytes;
/**
Adds a data logger with a JSON log format to the directory.
This method throws an exception if a logger already exists with the specified log name.
@param logName The log name prefix for the data logger.
@return The `ORKDataLogger` object that was added.
*/
- (ORKDataLogger *)addJSONDataLoggerForLogName:(NSString *)logName;
/**
Adds a data logger with a particular formatter to the directory.
@param logName The log name prefix for the data logger.
@param formatter The log formatter instance to use for this logger.
@return The `ORKDataLogger` object that was added, or the existing one if one already existed for
that log name.
*/
- (ORKDataLogger *)addDataLoggerForLogName:(NSString *)logName formatter:(ORKLogFormatter *)formatter;
/**
Retrieves the already existing data logger for a log name.
@param logName The log name prefix for the data logger.
@return The `ORKDataLogger` object that was retrieved, or `nil` if one already existed for that log name.
*/
- (nullable ORKDataLogger *)dataLoggerForLogName:(NSString *)logName;
/**
Removes a data logger.
@param logger The logger to remove.
*/
- (void)removeDataLogger:(ORKDataLogger *)logger;
/// Returns the set of log names of the data loggers managed by this object.
- (NSArray *)logNames;
/**
Enumerates all the logs that need upload across all data loggers, sorted from oldest to first.
Before sorting the logs, this method fetches all the data loggers' logs that need upload.
@param block The block to call during enumeration.
@param error The error, on failure.
@return `YES` if the enumeration succeeds; otherwise, `NO`.
*/
- (BOOL)enumerateLogsNeedingUpload:(void (^)(ORKDataLogger *dataLogger, NSURL *logFileUrl, BOOL *stop))block error:(NSError * __autoreleasing *)error;
/**
Unmarks the set of uploaded files.
Use this method to indicate that the specified files should no longer be marked uploaded (for example, because
the upload did not succeed).
@param fileURLs The array of file URLs that should no longer be marked uploaded.
@param error The error, on failure.
@return `YES` if the operation succeeds; otherwise, `NO`.
*/
- (BOOL)unmarkUploadedFiles:(NSArray *)fileURLs error:(NSError * __nullable __autoreleasing *)error;
/**
Removes a set of uploaded files.
This method is analogous to a similar method in `ORKDataLogger`, but it accepts an array of files
that may relate to any of the data loggers. It is an error to pass a URL which would not
belong to one of the loggers managed by this manager.
@param fileURLs The array of file URLs that should be removed.
@param error The error, on failure.
@return `YES` if the operation succeeds; otherwise, `NO`.
*/
- (BOOL)removeUploadedFiles:(NSArray *)fileURLs error:(NSError * __nullable __autoreleasing *)error;
/**
Removes old and uploaded logs to bring total bytes down to a threshold.
This method removes uploaded logs first, followed by the oldest log files across
all of the data loggers, until the total usage falls below a threshold.
@param bytes The threshold down to which to remove old log files. File
removal stops when the total bytes managed by all the data
loggers reaches this threshold.
@param error The error, on failure.
@return `YES` if the operation succeeds; otherwise, `NO`.
*/
- (BOOL)removeOldAndUploadedLogsToThreshold:(unsigned long long)bytes error:(NSError * __nullable __autoreleasing *)error;
@end
NS_ASSUME_NONNULL_END
File diff suppressed because it is too large Load Diff
@@ -1,55 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit.h>
NS_ASSUME_NONNULL_BEGIN
/*
Exposing a minimal set of extra facilities to permit unit testing.
*/
@interface ORKDataLogger()
- (nullable NSFileHandle *)fileHandle;
@end
@protocol ORKDataLoggerExtendedDelegate <ORKDataLoggerDelegate>
@optional
- (void)dataLoggerThresholdsDidChange:(ORKDataLogger *)dataLogger;
@end
@interface NSURL (ORKDataLogger)
- (BOOL)ork_isUploaded;
- (BOOL)ork_setUploaded:(BOOL)uploaded error:(NSError * __autoreleasing *)error;
@end
NS_ASSUME_NONNULL_END
@@ -1,57 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKRecorder.h>
/**
The `ORKDeviceMotionRecorder` class represents a recorder that requests and collects device motion data from CoreMotion at a fixed frequency.
To ensure that the motion recorder continues to record when the app enters the
background, use the background task support provided by `UIApplication`.
*/
ORK_CLASS_AVAILABLE
@interface ORKDeviceMotionRecorder : ORKRecorder
/**
* The frequency of motion data collection from CoreMotion in hertz (Hz).
*/
@property (nonatomic, readonly) double frequency;
/**
Returns an initialized device motion recorder using the specified frequency.
@param frequency The frequency of motion data collection from CoreMotion in hertz (Hz).
@return An initialized motion data recorder.
*/
- (instancetype)initWithFrequency:(double)frequency
step:(ORKStep *)step
outputDirectory:(NSURL *)outputDirectory NS_DESIGNATED_INITIALIZER;
@end
@@ -1,239 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKDeviceMotionRecorder.h"
#import "ORKHelpers.h"
#import "ORKRecorder_Internal.h"
#import "ORKRecorder_Private.h"
#import "ORKDataLogger.h"
#import <CoreMotion/CoreMotion.h>
#import "CMDeviceMotion+ORKJSONDictionary.h"
@interface ORKDeviceMotionRecorder()
{
ORKDataLogger *_logger;
}
@property (nonatomic, strong) CMMotionManager *motionManager;
@property (nonatomic) NSTimeInterval uptime;
@end
@implementation ORKDeviceMotionRecorder
- (instancetype)initWithFrequency:(double)frequency
step:(ORKStep *)step
outputDirectory:(NSURL *)outputDirectory
{
self = [super initWithStep:step
outputDirectory:(NSURL *)outputDirectory];
if (self)
{
self.frequency = frequency;
self.continuesInBackground = YES;
}
return self;
}
- (void)dealloc
{
[_logger finishCurrentLog];
}
- (void)setFrequency:(double)frequency
{
if (frequency <= 0)
{
_frequency = 1;
}
else
{
_frequency = frequency;
}
}
- (CMMotionManager *)createMotionManager {
return [[CMMotionManager alloc] init];
}
- (void)start {
[super start];
if (! _logger) {
NSError *err = nil;
_logger = [self makeJSONDataLoggerWithError:&err];
if (! _logger) {
[self finishRecordingWithError:err];
return;
}
}
self.motionManager = [self createMotionManager];
self.motionManager.deviceMotionUpdateInterval = 1.0/_frequency;
self.uptime = [NSProcessInfo processInfo].systemUptime;
[self.motionManager stopDeviceMotionUpdates];
[self.motionManager
startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:^(CMDeviceMotion *data, NSError *error)
{
BOOL success = NO;
if (data)
{
success = [_logger append:[data ork_JSONDictionary] error:&error];
}
if (!success)
{
dispatch_async(dispatch_get_main_queue(), ^{
[self finishRecordingWithError:error];
});
}
}];
}
- (NSString *)recorderType
{
return @"deviceMotion";
}
- (void)stop {
[self doStopRecording];
[_logger finishCurrentLog];
NSError *error = nil;
__block NSURL *fileUrl = nil;
[_logger enumerateLogs:^(NSURL *logFileUrl, BOOL *stop) {
fileUrl = logFileUrl;
} error:&error];
[self reportFileResultWithFile:fileUrl error:error];
[super stop];
}
- (void)doStopRecording
{
if (self.isRecording) {
[self.motionManager stopDeviceMotionUpdates];
self.motionManager = nil;
}
}
- (void)finishRecordingWithError:(NSError *)error
{
[self doStopRecording];
[super finishRecordingWithError:error];
}
- (BOOL)isRecording {
return self.motionManager.deviceMotionActive;
}
- (NSString *)mimeType {
return @"application/json";
}
- (void)reset
{
[super reset];
_logger = nil;
}
@end
@interface ORKDeviceMotionRecorderConfiguration()
@end
@implementation ORKDeviceMotionRecorderConfiguration
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
- (instancetype)initWithFrequency:(double)freq {
self = [super ork_init];
if (self) {
_frequency = freq;
}
return self;
}
#pragma clang diagnostic pop
- (ORKRecorder *)recorderForStep:(ORKStep *)step outputDirectory:(NSURL *)outputDirectory
{
return [[ORKDeviceMotionRecorder alloc] initWithFrequency:self.frequency
step:step
outputDirectory:(NSURL *)outputDirectory];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
ORK_DECODE_DOUBLE(aDecoder, frequency);
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
ORK_ENCODE_DOUBLE(aCoder, frequency);
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (BOOL)isEqual:(id)object {
BOOL isParentSame = [super isEqual:object];
__typeof(self) castObject = object;
return (isParentSame &&
(self.frequency == castObject.frequency)) ;
}
- (ORKPermissionMask)requestedPermissionMask {
return ORKPermissionCoreMotionAccelerometer;
}
@end
@@ -1,51 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKCustomStepView_Internal.h"
NS_ASSUME_NONNULL_BEGIN
@interface ORKFitnessContentView : ORKActiveStepCustomView
@property (nonatomic, assign, getter=isFinished) BOOL finished;
@property (nonatomic) BOOL hasHeartRate;
@property (nonatomic) BOOL hasDistance;
@property (nonatomic, copy, nullable) NSString *heartRate;
@property (nonatomic) double distanceInMeters;
@property (nonatomic, strong, nullable) UIImage *image;
@property (nonatomic, assign) NSTimeInterval timeLeft;
@end
NS_ASSUME_NONNULL_END
@@ -1,277 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKFitnessContentView.h"
#import "ORKHelpers.h"
#import <CoreMotion/CoreMotion.h>
#import "ORKSkin.h"
#import "ORKActiveStepQuantityView.h"
#import "ORKTintedImageView.h"
// #define LAYOUT_TEST 1
// #define LAYOUT_DEBUG 1
@interface ORKFitnessContentView()
{
ORKQuantityLabel *_timerLabel;
ORKQuantityPairView *_quantityPairView;
UIView *_imageSpacer1;
UIView *_imageSpacer2;
ORKTintedImageView *_imageView;
NSLengthFormatter *_lengthFormatter;
NSLayoutConstraint *_imageRatioConstraint;
ORKScreenType _screenType;
NSArray *_constraints;
NSLayoutConstraint *_topConstraint;
}
@end
@implementation ORKFitnessContentView
- (ORKActiveStepQuantityView *)distanceView {
return _quantityPairView.leftView;
}
- (ORKActiveStepQuantityView *)heartRateView {
return _quantityPairView.rightView;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
_screenType = ORKScreenTypeiPhone4;
_timerLabel = [ORKQuantityLabel new];
_quantityPairView = [ORKQuantityPairView new];
_imageSpacer1 = [UIView new];
[_imageSpacer1 setTranslatesAutoresizingMaskIntoConstraints:NO];
_imageSpacer2 = [UIView new];
[_imageSpacer2 setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addSubview:_imageSpacer1];
[self addSubview:_imageSpacer2];
[self heartRateView].image = [UIImage imageNamed:@"heart-fitness" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
[self updateLengthFormatter];
_imageView = [ORKTintedImageView new];
_imageView.contentMode = UIViewContentModeScaleAspectFit;
_imageView.shouldApplyTint = YES;
_timerLabel.translatesAutoresizingMaskIntoConstraints = NO;
_quantityPairView.translatesAutoresizingMaskIntoConstraints = NO;
_imageView.translatesAutoresizingMaskIntoConstraints = NO;
self.translatesAutoresizingMaskIntoConstraints = NO;
[self updateKeylineVisible];
_timerLabel.accessibilityTraits |= UIAccessibilityTraitUpdatesFrequently;
_imageView.isAccessibilityElement = NO;
self.hasHeartRate = _hasHeartRate;
self.hasDistance = _hasDistance;
#if LAYOUT_TEST
self.timeLeft = 60*5;
self.hasHeartRate = YES;
self.hasDistance = YES;
self.distanceInMeters = 100;
self.heartRate = @"22";
#endif
#if LAYOUT_DEBUG
self.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.2];
_quantityPairView.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.2];
#endif
[self addSubview:_quantityPairView];
[self addSubview:_imageView];
[self addSubview:_timerLabel];
[self setNeedsUpdateConstraints];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(localeDidChange:) name:NSCurrentLocaleDidChangeNotification object:nil];
[self tintColorDidChange];
}
return self;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)updateLengthFormatter {
_lengthFormatter = [NSLengthFormatter new];
_lengthFormatter.numberFormatter.maximumFractionDigits = 1;
_lengthFormatter.numberFormatter.maximumSignificantDigits = 3;
}
- (void)localeDidChange:(NSNotification *)notification {
[self updateLengthFormatter];
[self setDistanceInMeters:_distanceInMeters];
}
- (void)willMoveToWindow:(UIWindow *)newWindow {
[super willMoveToWindow:newWindow];
_screenType = ORKGetScreenTypeForWindow(newWindow);
[self updateConstraintConstants];
}
- (void)updateConstraintConstants {
ORKScreenType screenType = _screenType;
const CGFloat CaptionBaselineToTimerTop = ORKGetMetricForScreenType(ORKScreenMetricCaptionBaselineToFitnessTimerTop, screenType);
const CGFloat CaptionBaselineToStepViewTop = ORKGetMetricForScreenType(ORKScreenMetricLearnMoreBaselineToStepViewTop, screenType);
_topConstraint.constant = (CaptionBaselineToTimerTop - CaptionBaselineToStepViewTop);
}
- (void)updateConstraints {
if (_constraints) {
[self removeConstraints:_constraints];
_constraints = nil;
}
NSMutableArray *constraints = [NSMutableArray array];
NSDictionary *views = NSDictionaryOfVariableBindings(_timerLabel, _imageView, _quantityPairView, _imageSpacer1, _imageSpacer2);
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_timerLabel][_imageSpacer1(>=0)][_imageView]" options:NSLayoutFormatAlignAllCenterX metrics:nil views:views]];
_topConstraint = [NSLayoutConstraint constraintWithItem:_timerLabel attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1 constant:0];
[self updateConstraintConstants];
[constraints addObject:_topConstraint];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_timerLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_timerLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1 constant:0]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_imageView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1 constant:0]];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_imageView][_imageSpacer2(>=0)][_quantityPairView]|" options:0 metrics:nil views:views]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_imageSpacer1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:0]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_imageSpacer2 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:0]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_imageSpacer1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:_imageSpacer2 attribute:NSLayoutAttributeHeight multiplier:1 constant:0]];
NSLayoutConstraint *c1 = [NSLayoutConstraint constraintWithItem:_imageSpacer1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:1000];
c1.priority = UILayoutPriorityDefaultLow-1;
[constraints addObject:c1];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_quantityPairView]|" options:(NSLayoutFormatOptions)0 metrics:nil views:views]];
NSLayoutConstraint *maxWidthConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:10000];
maxWidthConstraint.priority = UILayoutPriorityRequired-1;
[constraints addObject:maxWidthConstraint];
[self addConstraints:constraints];
_constraints = constraints;
[super updateConstraints];
}
- (void)setImage:(UIImage *)image {
_image = image;
_imageView.image = image;
_imageRatioConstraint.active = NO;
CGSize sz = image.size;
if (sz.width > 0 && sz.height > 0) {
_imageRatioConstraint = [NSLayoutConstraint constraintWithItem:_imageView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:_imageView attribute:NSLayoutAttributeWidth multiplier:sz.height/sz.width constant:0];
_imageRatioConstraint.active = YES;
}
}
- (void)setHasDistance:(BOOL)hasDistance {
_hasDistance = hasDistance;
[self distanceView].enabled = _hasDistance;
[self updateKeylineVisible];
}
- (void)setHasHeartRate:(BOOL)hasHeartRate {
_hasHeartRate = hasHeartRate;
[self heartRateView].enabled = _hasHeartRate;
[self updateKeylineVisible];
}
- (void)setHeartRate:(NSString *)heartRate {
_heartRate = heartRate;
[self heartRateView].value = heartRate;
[self heartRateView].title = ORKLocalizedString(@"FITNESS_HEARTRATE_TITLE", nil);
}
- (void)updateKeylineVisible {
[_quantityPairView setKeylineHidden:! (_hasDistance && _hasHeartRate)];
}
- (void)setDistanceInMeters:(double)distanceInMeters {
_distanceInMeters = distanceInMeters;
double displayDistance = _distanceInMeters;
NSString *distanceString = nil;
NSLengthFormatterUnit unit;
NSString *unitString = [_lengthFormatter unitStringFromMeters:displayDistance usedUnit:&unit];
switch (unit) {
case NSLengthFormatterUnitCentimeter:
case NSLengthFormatterUnitMillimeter:
unit = NSLengthFormatterUnitMeter;
// Force showing 0 meters if the distance is sufficiently short to be displayed in cm or mm
unitString = [_lengthFormatter unitStringFromValue:0 unit:NSLengthFormatterUnitMeter];
displayDistance = 0;
break;
default:
break;
}
// Use HealthKit to convert the unit, so we can use the number formatter directly.
HKUnit *hkUnit = [HKUnit unitFromLengthFormatterUnit:unit];
double conversionFactor = 1.0;
if ([hkUnit isNull] && (unit == NSLengthFormatterUnitYard)) {
hkUnit = [HKUnit footUnit];
conversionFactor = 1/3.0;
}
HKQuantity *quantity = [HKQuantity quantityWithUnit:[HKUnit meterUnit] doubleValue:displayDistance];
distanceString = [_lengthFormatter.numberFormatter stringFromNumber:@([quantity doubleValueForUnit:hkUnit]*conversionFactor)];
[self distanceView].title = [NSString stringWithFormat:ORKLocalizedString(@"FITNESS_DISTANCE_TITLE_FORMAT", nil), unitString];
[self distanceView].value = distanceString;
}
- (void)setTimeLeft:(NSTimeInterval)timeLeft {
_timeLeft = timeLeft;
[self updateTimerLabel];
}
- (void)updateTimerLabel {
static NSDateComponentsFormatter *_formatter = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSDateComponentsFormatter *fmt = [NSDateComponentsFormatter new];
fmt.unitsStyle = NSDateComponentsFormatterUnitsStylePositional;
fmt.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
fmt.allowedUnits = NSCalendarUnitMinute | NSCalendarUnitSecond;
_formatter = fmt;
});
NSString *s = [_formatter stringFromTimeInterval:MAX(round(_timeLeft),0)];
_timerLabel.text = s;
_timerLabel.hidden = (s == nil);
}
@end
-45
View File
@@ -1,45 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit.h>
#import <ResearchKit/ORKActiveStep.h>
/**
Fitness step.
Displays usual header, a counting-up timer, read outs for distance and/or
heart rate if corresponding recorders are attached.
Also displays an image during the task.
*/
ORK_CLASS_AVAILABLE
@interface ORKFitnessStep : ORKActiveStep
@end
-65
View File
@@ -1,65 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKFitnessStep.h"
#import "ORKFitnessStepViewController.h"
@implementation ORKFitnessStep
+ (Class)stepViewControllerClass {
return [ORKFitnessStepViewController class];
}
- (void)validateParameters {
[super validateParameters];
NSTimeInterval const ORKFitnessStepMinimumDuration = 5.0;
if ( self.stepDuration < ORKFitnessStepMinimumDuration)
{
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"rest duration can not be shorter than %@ seconds.", @(ORKFitnessStepMinimumDuration)] userInfo:nil];
}
}
- (instancetype)copyWithZone:(NSZone *)zone
{
ORKFitnessStep *step = [super copyWithZone:zone];
return step;
}
- (BOOL)startsFinished {
return NO;
}
@end
@@ -1,42 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit_Private.h>
/**
Step view controller corresponding to `ORKFitnessStep`.
Observes countdown timer, heart rate, and distance, and relays these to the
screen during the task.
*/
ORK_CLASS_AVAILABLE
@interface ORKFitnessStepViewController : ORKActiveStepViewController
@end
@@ -1,149 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKFitnessStepViewController.h"
#import "ORKHelpers.h"
#import "ORKStep_Private.h"
#import "ORKStepViewController_Internal.h"
#import "ORKActiveStepViewController_Internal.h"
#import "ORKFitnessContentView.h"
#import "ORKVerticalContainerView.h"
#import "ORKFitnessStep.h"
#import "ORKHealthQuantityTypeRecorder.h"
#import "ORKPedometerRecorder.h"
#import "ORKActiveStepView.h"
@interface ORKFitnessStepViewController () <ORKHealthQuantityTypeRecorderDelegate,ORKPedometerRecorderDelegate>
{
NSInteger _intendedSteps;
ORKFitnessContentView *_contentView;
NSNumberFormatter *_hrFormatter;
}
@end
@implementation ORKFitnessStepViewController
- (instancetype)initWithStep:(ORKStep *)step {
self = [super initWithStep:step];
if (self) {
self.suspendIfInactive = NO;
}
return self;
}
- (ORKFitnessStep *)fitnessStep {
return (ORKFitnessStep *)self.step;
}
- (void)stepDidChange {
[super stepDidChange];
_hrFormatter = [[NSNumberFormatter alloc] init];
_hrFormatter.numberStyle = kCFNumberFormatterNoStyle;
_contentView.timeLeft = self.fitnessStep.stepDuration;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_contentView = [ORKFitnessContentView new];
_contentView.image = self.fitnessStep.image;
_contentView.timeLeft = self.fitnessStep.stepDuration;
self.activeStepView.activeCustomView = _contentView;
self.activeStepView.stepViewFillsAvailableSpace = YES;
}
- (void)updateHeartRateWithQuantity:(HKQuantitySample *)quantity unit:(HKUnit *)unit {
if (quantity != nil) {
_contentView.hasHeartRate = YES;
}
if (quantity) {
_contentView.heartRate = [_hrFormatter stringFromNumber:@([quantity.quantity doubleValueForUnit:unit])];
} else {
_contentView.heartRate = @"--";
}
}
- (void)updateDistance:(double)distanceInMeters {
_contentView.hasDistance = YES;
_contentView.distanceInMeters = distanceInMeters;
}
- (void)recordersDidChange {
[super recordersDidChange];
ORKPedometerRecorder *pedometerRecorder = nil;
ORKHealthQuantityTypeRecorder *heartRateRecorder = nil;
for (ORKRecorder *recorder in self.recorders) {
if ([recorder isKindOfClass:[ORKPedometerRecorder class]]) {
pedometerRecorder = (ORKPedometerRecorder *)recorder;
} else if ([recorder isKindOfClass:[ORKHealthQuantityTypeRecorder class]]) {
ORKHealthQuantityTypeRecorder *rec1 = (ORKHealthQuantityTypeRecorder *)recorder;
if ([[[rec1 quantityType] identifier] isEqualToString:HKQuantityTypeIdentifierHeartRate]) {
heartRateRecorder = (ORKHealthQuantityTypeRecorder *)recorder;
}
}
}
if (heartRateRecorder == nil) {
_contentView.hasHeartRate = NO;
}
_contentView.heartRate = @"--";
_contentView.hasDistance = (pedometerRecorder != nil);
_contentView.distanceInMeters = 0;
}
- (void)countDownTimerFired:(ORKActiveStepTimer *)timer finished:(BOOL)finished {
_contentView.timeLeft = finished ? 0 : (timer.duration - timer.runtime);
[super countDownTimerFired:timer finished:finished];
}
#pragma mark - ORKHealthQuantityTypeRecorderDelegate
- (void)healthQuantityTypeRecorderDidUpdate:(ORKHealthQuantityTypeRecorder *)healthQuantityTypeRecorder {
if ([[healthQuantityTypeRecorder.quantityType identifier] isEqualToString:HKQuantityTypeIdentifierHeartRate]) {
[self updateHeartRateWithQuantity:healthQuantityTypeRecorder.lastSample unit:healthQuantityTypeRecorder.unit];
}
}
#pragma mark - ORKPedometerRecorderDelegate
- (void)pedometerRecorderDidUpdate:(ORKPedometerRecorder *)pedometerRecorder {
double distanceInMeters = pedometerRecorder.totalDistance;
[self updateDistance:distanceInMeters];
}
@end
@@ -1,63 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKRecorder.h>
NS_ASSUME_NONNULL_BEGIN
@class ORKHealthQuantityTypeRecorder;
@protocol ORKHealthQuantityTypeRecorderDelegate <ORKRecorderDelegate>
@optional
- (void)healthQuantityTypeRecorderDidUpdate:(ORKHealthQuantityTypeRecorder *)healthQuantityTypeRecorder;
@end
/**
The `ORKHealthQuantityTypeRecorder` class represents a recorder for collecting real time sample data from HealthKit, such as heart rate, during
an active task.
*/
ORK_CLASS_AVAILABLE
@interface ORKHealthQuantityTypeRecorder : ORKRecorder
@property (nonatomic, readonly, copy) HKQuantityType *quantityType;
@property (nonatomic, readonly, copy) HKUnit *unit;
@property (nonatomic, readonly, copy, nullable) HKQuantitySample *lastSample;
- (instancetype)initWithHealthQuantityType:(HKQuantityType *)quantityType
unit:(HKUnit *)unit
step:(ORKStep *)step
outputDirectory:(NSURL *)outputDirectory NS_DESIGNATED_INITIALIZER;
@end
NS_ASSUME_NONNULL_END
@@ -1,362 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKHealthQuantityTypeRecorder.h"
#import "ORKHelpers.h"
#import "ORKDataLogger.h"
#import "ORKRecorder_Private.h"
#import "ORKRecorder_Internal.h"
#import "HKSample+ORKJSONDictionary.h"
@interface ORKHealthQuantityTypeRecorder()
{
ORKDataLogger *_logger;
BOOL _isRecording;
HKHealthStore *_healthStore;
NSPredicate *_samplePredicate;
HKObserverQuery *_observerQuery;
NSInteger _anchor;
HKQuantitySample *_lastSample;
}
@property (nonatomic, strong) NSError *recordingError;
@end
@implementation ORKHealthQuantityTypeRecorder
- (instancetype)initWithHealthQuantityType:(HKQuantityType *)quantityType
unit:(HKUnit *)unit
step:(ORKStep *)step
outputDirectory:(NSURL *)outputDirectory
{
self = [super initWithStep:step
outputDirectory:(NSURL *)outputDirectory];
if (self)
{
NSParameterAssert(quantityType != nil);
NSParameterAssert(unit != nil);
// Quantity type and unit are immutable, so should be equivalent to -copy
_quantityType = quantityType;
_unit = unit;
self.continuesInBackground = YES;
_anchor = HKAnchoredObjectQueryNoAnchor;
}
return self;
}
- (void)dealloc
{
[_logger finishCurrentLog];
}
- (void)updateMostRecentSample:(HKQuantitySample *)sample {
[self willChangeValueForKey:@"lastSample"];
_lastSample = sample;
[self didChangeValueForKey:@"lastSample"];
id<ORKHealthQuantityTypeRecorderDelegate> delegate = (id<ORKHealthQuantityTypeRecorderDelegate>)self.delegate;
if (delegate && [delegate respondsToSelector:@selector(healthQuantityTypeRecorderDidUpdate:)]) {
[delegate healthQuantityTypeRecorderDidUpdate:self];
}
}
static const NSInteger _HealthAnchoredQueryLimit = 100;
- (void)query_logResults:(NSArray *)results withAnchor:(NSUInteger)newAnchor {
NSUInteger resultCount = [results count];
if (resultCount == 0) {
return;
}
// Do conversion to dictionary on whatever queue we happen to be on.
NSMutableArray *dictionaries = [NSMutableArray arrayWithCapacity:resultCount];
[results enumerateObjectsUsingBlock:^(HKQuantitySample *sample, NSUInteger idx, BOOL *stop) {
[dictionaries addObject:[sample ork_JSONDictionaryWithOptions:ORKSampleIncludeSource|ORKSampleIncludeMetadata unit:_unit]];
}];
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMostRecentSample:[results lastObject]];
NSError *error = nil;
if (! [_logger appendObjects:dictionaries error:&error]) {
// Logger writes are unrecoverable
[self finishRecordingWithError:error];
return;
}
_anchor = newAnchor;
if (resultCount == _HealthAnchoredQueryLimit) {
// Do another fetch immediately rather than wait for an observation
[self doFetchNewData];
}
});
}
- (void)doFetchNewData {
if (! _healthStore || ! _isRecording) {
return;
}
NSAssert(_samplePredicate != nil, @"Sample predicate should be non-nil if recording");
__weak typeof(self) weakSelf = self;
HKAnchoredObjectQuery *anchoredQuery = [[HKAnchoredObjectQuery alloc]
initWithType:_quantityType
predicate:_samplePredicate
anchor:_anchor
limit:_HealthAnchoredQueryLimit
completionHandler:^(HKAnchoredObjectQuery *query, NSArray *results, NSUInteger newAnchor, NSError *error)
{
if (error) {
// An error in the query's not the end of the world: we'll probably get another chance. Just log it.
ORK_Log_Debug(@"Anchored query error: %@", error);
return;
}
__typeof(self) strongSelf = weakSelf;
[strongSelf query_logResults:results withAnchor:newAnchor];
}];
[_healthStore executeQuery:anchoredQuery];
}
- (void)start {
[super start];
if (! _logger) {
NSError *err = nil;
_logger = [self makeJSONDataLoggerWithError:&err];
if (! _logger) {
[self finishRecordingWithError:err];
return;
}
}
if (! [HKHealthStore isHealthDataAvailable])
{
[self finishRecordingWithError:[NSError errorWithDomain:NSCocoaErrorDomain
code:NSFeatureUnsupportedError
userInfo:@{@"recorder" : self}]];
return;
}
if (!_healthStore) {
// Get a new obsever query
_healthStore = [HKHealthStore new];
} else {
// Reset
if (_observerQuery) {
[_healthStore stopQuery:_observerQuery];
_observerQuery = nil;
}
}
[_healthStore enableBackgroundDeliveryForType:_quantityType
frequency:HKUpdateFrequencyImmediate
withCompletion:^(BOOL success, NSError *error) {
// Doesn't really matter if this succeeds, but nice if it does.
if (! success) {
ORK_Log_Debug(@"Failed to enable background delivery: %@", error);
}
}];
_lastSample = nil;
_samplePredicate = [HKQuery predicateForSamplesWithStartDate:[NSDate date] endDate:nil options:HKQueryOptionStrictStartDate];
NSAssert(!_observerQuery, @"observer query should not exist if not recording");
__weak __typeof(self) weakSelf = self;
_observerQuery = [[HKObserverQuery alloc]
initWithSampleType:_quantityType
predicate:_samplePredicate
updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error) {
__typeof(self) strongSelf = weakSelf;
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
[strongSelf finishRecordingWithError:error];
} else {
[strongSelf doFetchNewData];
}
});
// Immediately signal receipt. We've fired off to either finish or do a new fetch.
completionHandler();
}];
_isRecording = YES;
[_healthStore executeQuery:_observerQuery];
}
- (NSString *)recorderType
{
return _quantityType.identifier;
}
- (void)stop {
if (! _isRecording) {
return;
}
[self doStopRecording];
[_logger finishCurrentLog];
NSError *error = nil;
__block NSURL *fileUrl = nil;
[_logger enumerateLogs:^(NSURL *logFileUrl, BOOL *stop) {
fileUrl = logFileUrl;
} error:&error];
[self reportFileResultWithFile:fileUrl error:error];
[super stop];
}
- (void)doStopRecording
{
if (_isRecording) {
NSAssert(_observerQuery != nil, @"Observer query should be non-nil when recording");
[_healthStore stopQuery:_observerQuery];
_observerQuery = nil;
_samplePredicate = nil;
_isRecording = NO;
[self updateMostRecentSample:nil];
}
}
- (void)finishRecordingWithError:(NSError *)error
{
[self doStopRecording];
[super finishRecordingWithError:error];
}
- (BOOL)isRecording {
return _isRecording;
}
- (NSString *)mimeType {
return @"application/json";
}
- (void)reset
{
[super reset];
_logger = nil;
}
@end
@interface ORKHealthQuantityTypeRecorderConfiguration()
@end
@implementation ORKHealthQuantityTypeRecorderConfiguration
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
- (instancetype)initWithHealthQuantityType:(HKQuantityType *)quantityType unit:(HKUnit *)unit {
self = [super ork_init];
if (self) {
NSParameterAssert(quantityType != nil);
NSParameterAssert(unit != nil);
// Quantity type and unit are immutable, so should be equivalent to -copy
_quantityType = quantityType;
_unit = unit;
}
return self;
}
#pragma clang diagnostic pop
- (ORKRecorder *)recorderForStep:(ORKStep *)step outputDirectory:(NSURL *)outputDirectory
{
return [[ORKHealthQuantityTypeRecorder alloc] initWithHealthQuantityType:_quantityType
unit:_unit
step:step
outputDirectory:outputDirectory];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
ORK_DECODE_OBJ_CLASS(aDecoder, quantityType, HKQuantityType);
ORK_DECODE_OBJ_CLASS(aDecoder, unit, HKUnit);
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
ORK_ENCODE_OBJ(aCoder, quantityType);
ORK_ENCODE_OBJ(aCoder, unit);
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (BOOL)isEqual:(id)object {
BOOL isParentSame = [super isEqual:object];
__typeof(self) castObject = object;
return (isParentSame &&
ORKEqualObjects(self.quantityType, castObject.quantityType)&&
ORKEqualObjects(self.unit, castObject.unit)) ;
}
- (NSSet *)requestedHealthKitTypesForReading {
return [NSSet setWithObject:_quantityType];
}
@end
@@ -1,44 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKRecorder.h>
/**
The `ORKLocationRecorder` class represents a recorder for collecting location data from CoreLocation.
Because location data is sensitive information, you need to take special care in handling it, including removoing or otherwise preparing it for a
anonymous data set.
The accuracy of location data may be limited indoors.
*/
ORK_CLASS_AVAILABLE
@interface ORKLocationRecorder : ORKRecorder
@end
@@ -1,214 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKLocationRecorder.h"
#import <CoreLocation/CoreLocation.h>
#import "CLLocation+ORKJSONDictionary.h"
#import "ORKDataLogger.h"
#import "ORKRecorder_Internal.h"
#import "ORKRecorder_Private.h"
@interface ORKLocationRecorder() <CLLocationManagerDelegate>
{
ORKDataLogger *_logger;
NSError *_recordingError;
BOOL _started;
}
@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic) NSTimeInterval uptime;
@end
@implementation ORKLocationRecorder
- (instancetype)initWithStep:(ORKStep *)step outputDirectory:(NSURL *)outputDirectory
{
self = [super initWithStep:step outputDirectory:outputDirectory];
if (self)
{
self.continuesInBackground = YES;
}
return self;
}
- (void)dealloc
{
[_logger finishCurrentLog];
}
- (NSString *)recorderType {
return @"location";
}
- (CLLocationManager *)createLocationManager {
return [[CLLocationManager alloc] init];
}
- (void)start {
[super start];
if (! _logger) {
NSError *err = nil;
_logger = [self makeJSONDataLoggerWithError:&err];
if (! _logger) {
[self finishRecordingWithError:err];
return;
}
}
self.locationManager = [self createLocationManager];
if ([CLLocationManager authorizationStatus] <= kCLAuthorizationStatusDenied)
{
[self.locationManager requestWhenInUseAuthorization];
}
self.locationManager.pausesLocationUpdatesAutomatically = NO;
self.locationManager.delegate = self;
if (! self.locationManager) {
NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
code:NSFeatureUnsupportedError
userInfo:@{@"recorder" : self}];
[self finishRecordingWithError:error];
return;
}
self.uptime = [NSProcessInfo processInfo].systemUptime;
[self.locationManager startUpdatingLocation];
}
- (void)doStopRecording {
[self.locationManager stopUpdatingLocation];
self.locationManager.delegate = nil;
self.locationManager = nil;
}
- (void)stop {
[self doStopRecording];
[_logger finishCurrentLog];
NSError *error = _recordingError;
_recordingError = nil;
__block NSURL *fileUrl = nil;
[_logger enumerateLogs:^(NSURL *logFileUrl, BOOL *stop) {
fileUrl = logFileUrl;
} error:&error];
[self reportFileResultWithFile:fileUrl error:error];
[super stop];
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
{
BOOL success = YES;
NSParameterAssert([locations count] >= 0);
NSError *error = nil;
if (locations)
{
NSMutableArray *dictionaries = [NSMutableArray arrayWithCapacity:[locations count]];
[locations enumerateObjectsUsingBlock:^(CLLocation *obj, NSUInteger idx, BOOL *stop) {
NSDictionary *d = [obj ork_JSONDictionary];
[dictionaries addObject:d];
}];
success = [_logger appendObjects:dictionaries error:&error];
}
if (!success)
{
dispatch_async(dispatch_get_main_queue(), ^{
_recordingError = error;
[self stop];
});
}
}
- (void)finishRecordingWithError:(NSError *)error
{
[self doStopRecording];
[super finishRecordingWithError:nil];
}
- (BOOL)isRecording {
return [CLLocationManager locationServicesEnabled] && (self.locationManager != nil) && ([CLLocationManager authorizationStatus] > kCLAuthorizationStatusDenied);
}
- (void)reset
{
[super reset];
_logger = nil;
}
- (NSString *)mimeType {
return @"application/json";
}
@end
@interface ORKLocationRecorderConfiguration()
@end
@implementation ORKLocationRecorderConfiguration
- (ORKRecorder *)recorderForStep:(ORKStep *)step outputDirectory:(NSURL *)outputDirectory {
return [[ORKLocationRecorder alloc] initWithStep:step outputDirectory:outputDirectory];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
return self;
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (BOOL)isEqual:(id)object {
BOOL isParentSame = [super isEqual:object];
return isParentSame;
}
- (ORKPermissionMask)requestedPermissionMask {
return ORKPermissionCoreLocation;
}
@end
@@ -1,65 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKRecorder.h>
NS_ASSUME_NONNULL_BEGIN
@class ORKPedometerRecorder;
@protocol ORKPedometerRecorderDelegate <ORKRecorderDelegate>
@optional
- (void)pedometerRecorderDidUpdate:(ORKPedometerRecorder *)pedometerRecorder;
@end
/**
A recorder that requests and collects device motion data from CoreMotion at a fixed frequency.
The accelerometer recorder continues to record if the application enters the
background using UIApplication's background task support.
*/
ORK_CLASS_AVAILABLE
@interface ORKPedometerRecorder : ORKRecorder
@property (nonatomic, readonly, nullable) NSDate *lastUpdateDate;
@property (nonatomic, readonly) NSInteger totalNumberOfSteps;
// Negative if an invalid value.
@property (nonatomic, readonly) NSInteger totalDistance;
- (instancetype)initWithStep:(ORKStep *)step
outputDirectory:(NSURL *)outputDirectory NS_DESIGNATED_INITIALIZER;
@end
NS_ASSUME_NONNULL_END
@@ -1,242 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKPedometerRecorder.h"
#import "ORKDataLogger.h"
#import "CMPedometerData+ORKJSONDictionary.h"
#import "ORKRecorder_Internal.h"
#import "ORKRecorder_Private.h"
@interface ORKPedometerRecorder()
{
ORKDataLogger *_logger;
BOOL _isRecording;
}
@property (nonatomic, strong) CMPedometer *pedometer;
@property (nonatomic, strong) NSError *recordingError;
@end
@implementation ORKPedometerRecorder
- (instancetype)initWithStep:(ORKStep *)step
outputDirectory:(NSURL *)outputDirectory
{
self = [super initWithStep:step
outputDirectory:(NSURL *)outputDirectory];
if (self)
{
self.continuesInBackground = YES;
}
return self;
}
- (void)dealloc
{
[_logger finishCurrentLog];
}
- (void)updateStatisticsWithData:(CMPedometerData *)pedometerData {
_lastUpdateDate = pedometerData.endDate;
_totalNumberOfSteps = [pedometerData.numberOfSteps integerValue];
if (pedometerData.distance) {
_totalDistance = [pedometerData.distance doubleValue];
} else {
_totalDistance = -1;
}
id delegate = self.delegate;
if ([delegate respondsToSelector:@selector(pedometerRecorderDidUpdate:)]) {
[delegate pedometerRecorderDidUpdate:self];
}
}
- (CMPedometer *)createPedometer {
return [[CMPedometer alloc] init];
}
- (void)start {
[super start];
_lastUpdateDate = nil;
_totalNumberOfSteps = 0;
_totalDistance = -1;
if (! _logger) {
NSError *err = nil;
_logger = [self makeJSONDataLoggerWithError:&err];
if (! _logger) {
[self finishRecordingWithError:err];
return;
}
}
self.pedometer = [self createPedometer];
if (! [[self.pedometer class] isStepCountingAvailable])
{
[self finishRecordingWithError:[NSError errorWithDomain:NSCocoaErrorDomain
code:NSFeatureUnsupportedError
userInfo:@{@"recorder" : self}]];
return;
}
_isRecording = YES;
__weak __typeof(self) weakSelf = self;
[self.pedometer startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData *pedometerData, NSError *error) {
BOOL success = NO;
if (pedometerData)
{
success = [_logger append:[pedometerData ork_JSONDictionary] error:&error];
dispatch_async(dispatch_get_main_queue(), ^{
__typeof(self) strongSelf = weakSelf;
[strongSelf updateStatisticsWithData:pedometerData];
});
}
if (!success || error)
{
dispatch_async(dispatch_get_main_queue(), ^{
__typeof(self) strongSelf = weakSelf;
[strongSelf finishRecordingWithError:error];
});
}
}];
}
- (NSString *)recorderType
{
return @"pedometer";
}
- (void)stop {
[self doStopRecording];
[_logger finishCurrentLog];
NSError *error = nil;
__block NSURL *fileUrl = nil;
[_logger enumerateLogs:^(NSURL *logFileUrl, BOOL *stop) {
fileUrl = logFileUrl;
} error:&error];
[self reportFileResultWithFile:fileUrl error:error];
[super stop];
}
- (void)doStopRecording
{
if (_isRecording) {
[self.pedometer stopPedometerUpdates];
_isRecording = NO;
self.pedometer = nil;
}
}
- (void)finishRecordingWithError:(NSError *)error
{
[self doStopRecording];
[super finishRecordingWithError:error];
}
- (BOOL)isRecording {
return _isRecording;
}
- (NSString *)mimeType {
return @"application/json";
}
- (void)reset
{
[super reset];
_logger = nil;
}
@end
@interface ORKPedometerRecorderConfiguration()
@end
@implementation ORKPedometerRecorderConfiguration
- (instancetype)init {
self = [super ork_init];
return self;
}
- (ORKRecorder *)recorderForStep:(ORKStep *)step outputDirectory:(NSURL *)outputDirectory
{
return [[ORKPedometerRecorder alloc] initWithStep:step
outputDirectory:outputDirectory];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
return self;
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (BOOL)isEqual:(id)object {
BOOL isParentSame = [super isEqual:object];
return (isParentSame) ;
}
- (ORKPermissionMask)requestedPermissionMask {
return ORKPermissionCoreMotionActivity;
}
@end
-428
View File
@@ -1,428 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKDefines.h>
#import <ResearchKit/ORKStep.h>
#import <HealthKit/HealthKit.h>
#import <ResearchKit/ORKResult.h>
NS_ASSUME_NONNULL_BEGIN
@class ORKRecorder;
/**
The `ORKRecorderConfiguration` class is the abstract base class for recorder configurations
that can be attached to an active step (`ORKActiveStep`).
Recorder configurations provide an easy way to collect CoreMotion
or other sensor data into a serialized format during the duration of an active step.
If you want to filter or process the data in real time, it is better to
use the existing APIs directly.
To use a recorder, include its configuration in the `recorderConfigurations` property
of an `ORKActiveStep` object, include that step in a task, and present it with
a task view controller.
To add a new recorder, subclass both `ORKRecorderConfiguration` and `ORKRecorder`,
and add the new `ORKRecorderConfiguration` subclass to an `ORKActiveStep` object.
*/
ORK_CLASS_AVAILABLE
@interface ORKRecorderConfiguration : NSObject <NSSecureCoding>
/**
The `init` method is unavailable outside the framework on `ORKRecorderConfiguration`,
because it is an abstract class.
`ORKRecorderConfiguration` classes should be initialized with custom designated
initializers on each subclass.
*/
- (instancetype)init NS_UNAVAILABLE;
/**
Returns a recorder instance using this configuration.
@param step The step for which this recorder is being created.
@param outputDirectory The directory in which all output file data should be written
(if producing `ORKFileResult` instances).
@return A configured recorder instance.
*/
- (nullable ORKRecorder *)recorderForStep:(nullable ORKStep *)step outputDirectory:(nullable NSURL *)outputDirectory;
/**
Returns the HealthKit types for which this recorder requires read access in a set of `HKSampleType` objects.
Typically, the task view controller automatically collects
and collates the types of HealthKit data requested by each of the active steps in a task,
and requests access to them at the end of the initial instruction
steps in the task.
If your recorder requires or would benefit from read access to HealthKit at
runtime during the task, return the appropriate set of `HKSampleType` objects.
*/
- (nullable NSSet *)requestedHealthKitTypesForReading;
@end
/**
The `ORKAccelerometerRecorderConfiguration` subclass configures
the collection of accelerometer data during an active step.
Accelerometer data is serialized to JSON and returned as an `ORKFileResult` object.
For details on the format, see `CMAccelerometerData+ORKJSONDictionary`.
To use a recorder, include its configuration in the `recorderConfigurations` property
of an `ORKActiveStep` object, include that step in a task, and present it with
a task view controller.
*/
ORK_CLASS_AVAILABLE
@interface ORKAccelerometerRecorderConfiguration : ORKRecorderConfiguration
/**
The frequency of accelerometer data collection in samples per second (Hz).
*/
@property (nonatomic, readonly) double frequency;
/**
Returns an initialized accelerometer recorder configuration using the specified frequency.
This method is the designated initializer.
@param frequency The frequency of accelerometer data collection in samples per second (Hz).
@return An initialized accelerometer recorder configuration.
*/
- (instancetype)initWithFrequency:(double)frequency NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
@end
/**
The `ORKAudioRecorderConfiguration` class represents a configuration that records
audio data during an active step.
An `ORKAudioRecorderConfiguration` generates an `ORKAudioRecorder` object.
To use a recorder, include its configuration in the `recorderConfigurations` property
of an `ORKActiveStep` object, include that step in a task, and present it with
a task view controller.
*/
ORK_CLASS_AVAILABLE
@interface ORKAudioRecorderConfiguration : ORKRecorderConfiguration
/**
The audio format settings for the recorder.
Pass the settings for the recording session to the `AVAudioRecorder` method `initWithURL:settings:error:`.
For information on the settings available for an audio recorder, see "AV Foundation Audio Settings Constants" in
the AVFoundation documentation.
The results are returned as an `ORKFileResult` object, which points to an audio file.
*/
@property (nonatomic, readonly, nullable) NSDictionary *recorderSettings;
/**
Returns an initialized audio recorder configuration using the specified settings.
This method is the designated initializer.
For information on the settings available for an audio recorder, see "AV Foundation Audio Settings Constants".
@param recorderSettings The settings for the recording session.
*/
- (instancetype)initWithRecorderSettings:(NSDictionary *)recorderSettings NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
@end
/**
The `ORKDeviceMotionRecorderConfiguration` class represents a configuration
that records device motion data during an active step.
Device motion data is the processed motion data provided by CoreMotion and obtained
from a `CMMotionManager` object. The data can include measures of the overall device orientation
obtained from combining accelerometer, magnetometer, and gyroscope data.
Device motion data is serialized to JSON and returned as an `ORKFileResult` object.
For details on the format, see `CMDeviceMotion+ORKJSONDictionary`.
To use a recorder, include its configuration in the `recorderConfigurations` property
of an `ORKActiveStep` object, include that step in a task, and present it with
a task view controller.
*/
ORK_CLASS_AVAILABLE
@interface ORKDeviceMotionRecorderConfiguration : ORKRecorderConfiguration
/**
The frequency of motion data collection in samples per second (Hz).
*/
@property (nonatomic, readonly) double frequency;
/**
Returns an initialized device motion recorder configuration using the specified frequency.
This method is the designated initializer.
@param frequency Motion data collection frequency in samples per second (Hz).
@return An initialized device motion recorder configuration.
*/
- (instancetype)initWithFrequency:(double)frequency NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
@end
/**
The `ORKPedometerRecorderConfiguration` class represents a configuration
that records pedometer data during an active step.
Pedometer data consists of information about the processed steps provided by CoreMotion, obtained
from a `CMPedometer` object. The pedometer object essentially reports the total number of steps taken since the
start of recording, updating the value every time a significant number of steps have
been detected.
Pedometer data is serialized to JSON and returned as an `ORKFileResult` object.
For details on the format, see `CMPedometerData+ORKJSONDictionary`.
To use a recorder, include its configuration in the `recorderConfigurations` property
of an `ORKActiveStep` object, include that step in a task, and present it with
a task view controller.
*/
ORK_CLASS_AVAILABLE
@interface ORKPedometerRecorderConfiguration : ORKRecorderConfiguration
/**
Returns an initialized pedometer recorder configuration.
This method is the designated initializer.
Note that the recorder instantiates a `CMPedometer` object, so no parameters are required.
*/
- (instancetype)init NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
@end
/**
The `ORKLocationRecorderConfiguration` class represents a configuration
that records location data during an active step.
The location data reported is the location provided by CoreLocation.
If this configuration is included in an active step in a task, the task
view controller requests access to location data at the end of the
initial instruction steps in the task.
Location data is serialized to JSON and returned as an `ORKFileResult` object.
For details on the format, see `CLLocation+ORKJSONDictionary`.
To use a recorder, include its configuration in the `recorderConfigurations` property
of an `ORKActiveStep` object, include that step in a task, and present it with
a task view controller.
*/
ORK_CLASS_AVAILABLE
@interface ORKLocationRecorderConfiguration : ORKRecorderConfiguration
/**
Returns an initialized location recorder configuration.
This method is the designated initializer.
No parameters are required.
*/
- (instancetype)init NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
@end
/**
The `ORKHealthQuantityTypeRecorderConfiguration` class represents a configuration
that records data from a HealthKit quantity type during an active step.
Before you can use this configuration, you must use Xcode to enable the appropriate HealthKit entitlement
for your app.
HealthKit quantity type data is serialized to JSON and returned as an `ORKFileResult` object.
For details on the format, see `HKSample+ORKJSONDictionary`.
To use a recorder, include its configuration in the `recorderConfigurations` property
of an `ORKActiveStep` object, include that step in a task, and present it with
a task view controller.
*/
ORK_CLASS_AVAILABLE
@interface ORKHealthQuantityTypeRecorderConfiguration : ORKRecorderConfiguration
/**
Returns an initialized health quantity type recorder configuration using the specified quantity type and unit designation.
This method is the designated initializer.
@param quantityType The quantity type that should be collected during the active task.
@param unit The unit for the data that should be collected and serialized.
@return An initialized health quantity type recorder configuration.
*/
- (instancetype)initWithHealthQuantityType:(HKQuantityType *)quantityType unit:(HKUnit *)unit NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
/**
The quantity type to be collected from HealthKit. (read-only)
*/
@property (nonatomic, readonly, copy) HKQuantityType *quantityType;
/**
The unit in which to serialize the data from HealthKit. (read-only)
*/
@property (nonatomic, readonly, copy) HKUnit *unit;
@end
/**
The `ORKRecorderDelegate` protocol defines methods that the delegate of an `ORKRecorder` object should use to handle errors and log the
completed results.
This protocol is implemented by `ORKActiveStepViewController`; your app should not
need to implement it.
*/
@protocol ORKRecorderDelegate <NSObject>
/**
Tells the delegate that the recorder has completed with the specified result.
Typically, this method is called once when recording is stopped.
@param recorder The generating recorder object.
@param result The generated result.
*/
- (void)recorder:(ORKRecorder *)recorder didCompleteWithResult:(nullable ORKResult *)result;
/**
Tells the delegate that recording failed.
Typically, this method is called once when the error occurred.
@param recorder The generating recorder object.
@param error The error that occurred.
*/
- (void)recorder:(ORKRecorder *)recorder didFailWithError:(NSError *)error;
@end
/**
A recorder is the runtime companion to an `ORKRecorderConfiguration` object, and is
usually generated by one.
During active tasks, it is often useful to collect one or more pieces of data
from sensors on the device. In research tasks, it's not always
necessary to display that data, but it's important to record it in a controlled manner.
An active step (`ORKActiveStep`) has an array of recorder configurations
(`ORKRecorderConfiguration`) that identify the types of data it needs to record
for the duration of the step. When a step starts, the active step view controller
instantiates a recorder for each of the step's recorder configurations.
The step view controller starts the recorder when the active step is started, and stops the
recorder when the active step is finished.
The results of recording are typically written to a file specified by the value of the `outputDirectory` property.
Usually, the `ORKActiveStepViewController` object is the recorder's delegate, and it
receives callbacks when errors occur or when recording is complete.
*/
ORK_CLASS_AVAILABLE
@interface ORKRecorder : NSObject
- (instancetype)init NS_UNAVAILABLE;
/// @name Configuration
@property (nonatomic, weak, nullable) id<ORKRecorderDelegate> delegate;
/**
The step that produced this recorder, configured during initialization.
*/
@property (nonatomic, strong, readonly, nullable) ORKStep *step;
/**
The configuration that produced this recorder.
*/
@property (nonatomic, strong, readonly, nullable) ORKRecorderConfiguration *configuration;
/**
The file URL of the output directory configured during initialization.
Typically, you set the `outputDirectory` property for the `ORKTaskViewController` object
before presenting the task.
*/
@property (nonatomic, copy, readonly, nullable) NSURL *outputDirectory;
/**
Returns the log prefix for the log file.
*/
- (nullable NSString *)logName;
/// @name Runtime Life Cycle
/**
Starts data recording.
If an error occurs when recording starts, it is returned through the delegate.
*/
- (void)start NS_REQUIRES_SUPER;
/**
Stops data recording, which generally triggers the return of results.
If an error occurs when stopping the recorder, it is returned through the delegate.
Subclasses should call `finishRecordingWithError:` rather than calling super.
*/
- (void)stop NS_REQUIRES_SUPER;
/**
A Boolean value indicating whether the recorder is currently recording.
@return `YES` if the recorder is recording; otherwise, `NO`.
*/
@property (nonatomic, readonly, getter=isRecording) BOOL recording;
@end
NS_ASSUME_NONNULL_END
-273
View File
@@ -1,273 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKRecorder.h"
#import "ORKRecorder_Internal.h"
#import "ORKRecorder_Private.h"
#import "ORKHelpers.h"
#import "ORKDataLogger.h"
#import "ORKDefines_Private.h"
@implementation ORKRecorderConfiguration
- (instancetype)ork_init
{
return [super init];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
return [super init];
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
}
- (BOOL)isEqual:(id)object {
if ([self class] != [object class]) {
return NO;
}
return YES;
}
- (NSUInteger)hash {
return 0;
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (ORKRecorder *)recorderForStep:(ORKStep *)step outputDirectory:(NSURL *)outputDirectory
{
return nil;
}
- (NSSet *)requestedHealthKitTypesForReading {
return nil;
}
- (ORKPermissionMask)requestedPermissionMask {
return ORKPermissionNone;
}
@end
@implementation ORKRecorder
{
UIBackgroundTaskIdentifier _backgroundTask;
NSUUID *_recorderUUID;
}
- (instancetype)init
{
@throw [NSException exceptionWithName:NSGenericException reason:@"Use designated initializer" userInfo:nil];
}
- (instancetype)ork_init
{
return [super init];
}
- (instancetype)initWithStep:(ORKStep *)step outputDirectory:(NSURL *)outputDirectory;
{
self = [super init];
if (self)
{
_outputDirectory = outputDirectory;
self.step = step;
_backgroundTask = NSNotFound;
_recorderUUID = [NSUUID UUID];
}
return self;
}
- (void)viewController:(UIViewController *)viewController willStartStepWithView:(UIView *)view {
}
- (void)start
{
if (self.continuesInBackground)
{
UIApplication *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier oldTask = _backgroundTask;
_backgroundTask = [app beginBackgroundTaskWithName:[NSString stringWithFormat:@"%@.%p",NSStringFromClass([self class]),self] expirationHandler:^{
[self stop];
}];
if (oldTask != NSNotFound)
{
[app endBackgroundTask:oldTask];
}
}
self.startDate = [NSDate date];
}
- (void)stop
{
[self finishRecordingWithError:nil];
[self reset];
}
- (void)finishRecordingWithError:(NSError *)error
{
// NOTE. This method may be called multiple times (once when someone tries
// to finish, and another time with -stop is actually called.
if (error)
{
// ALWAYS report errors to the delegate, even if we think we're finished already
id<ORKRecorderDelegate> localDelegate = self.delegate;
if (localDelegate && [localDelegate respondsToSelector:@selector(recorder:didFailWithError:)])
{
[localDelegate recorder:self didFailWithError:error];
}
[self reset];
}
if (_backgroundTask != NSNotFound)
{
// End the background task asynchronously, so whatever we're doing cleaning up the recorder has a chance to complete.
UIBackgroundTaskIdentifier ident = _backgroundTask;
_backgroundTask = NSNotFound;
// Hold the background task for a little extra to give time for the next step to kick in,
// if it is an automatic transition.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] endBackgroundTask:ident];
});
}
}
- (NSURL *)recordingDirectoryURL
{
if (! _outputDirectory) {
return nil;
}
return [NSURL fileURLWithPath:[_outputDirectory.path stringByAppendingPathComponent:[NSString stringWithFormat:@"recorder-%@",[_recorderUUID UUIDString]]]];
}
- (NSString *)recorderType
{
return @"recorder";
}
- (NSString *)logName
{
return [NSString stringWithFormat:@"%@_%@", [self recorderType],self.step.identifier];
}
- (ORKDataLogger *)makeJSONDataLoggerWithError:(NSError * __autoreleasing *)error
{
NSURL *workingDir = [self recordingDirectoryURL];
if (! workingDir) {
if (error) {
*error = [NSError errorWithDomain:NSCocoaErrorDomain code:NSFileWriteInvalidFileNameError userInfo:@{NSLocalizedDescriptionKey:ORKLocalizedString(@"ERROR_RECORDER_NO_OUTPUT_DIRECTORY", nil)}];
}
return nil;
}
if (![[NSFileManager defaultManager] createDirectoryAtURL:workingDir withIntermediateDirectories:YES attributes:nil error:error]) {
return nil;
}
NSString *ident = [self logName];
NSString *logName = [ident stringByReplacingOccurrencesOfString:@"-" withString:@"_"];
// Class B data protection for temporary file during active task logging.
ORKDataLogger *logger = [[ORKDataLogger alloc] initWithDirectory:workingDir logName:logName formatter:[ORKJSONLogFormatter new] delegate:nil];
logger.fileProtectionMode = ORKFileProtectionCompleteUnlessOpen;
return logger;
}
- (void)reset
{
_recorderUUID = [NSUUID UUID];
}
- (NSString *)mimeType {
return nil;
}
- (NSDictionary *)userInfo {
return nil;
}
- (void)applyFileProtection:(ORKFileProtectionMode)fileProtection toFileAtURL:(NSURL *)url {
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error = nil;
if (! [fm setAttributes:@{NSFileProtectionKey : ORKFileProtectionFromMode(fileProtection)} ofItemAtPath:[url path] error:&error]) {
ORK_Log_Debug(@"Error setting %@ on %@: %@", ORKFileProtectionFromMode(fileProtection), url, error);
}
}
- (void)reportFileResultWithFile:(NSURL *)fileUrl error:(NSError *)error {
id<ORKRecorderDelegate> localDelegate = self.delegate;
if (fileUrl && !error) {
if (localDelegate && [localDelegate respondsToSelector:@selector(recorder:didCompleteWithResult:)]) {
ORKFileResult *result = [[ORKFileResult alloc] initWithIdentifier:(NSString *__nonnull)self.step.identifier];
result.contentType = [self mimeType];
result.fileURL = fileUrl;
result.userInfo = [self userInfo];
result.startDate = self.startDate;
[localDelegate recorder:self didCompleteWithResult:result];
// Point future recording at a new directory
[self reset];
}
} else {
if (! error)
{
error = [NSError errorWithDomain:NSCocoaErrorDomain
code:NSFileReadNoSuchFileError
userInfo:@{NSLocalizedDescriptionKey:ORKLocalizedString(@"ERROR_RECORDER_NO_DATA", nil)}];
}
[self finishRecordingWithError:error];
}
}
@end
@@ -1,70 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKRecorder.h>
NS_ASSUME_NONNULL_BEGIN
@class ORKDataLogger;
@interface ORKRecorderConfiguration()
- (instancetype)ork_init;
@end
@interface ORKRecorder ()
- (instancetype)ork_init;
@property (nonatomic, strong, nullable) ORKStep *step;
@property (nonatomic, strong, nullable) ORKRecorderConfiguration *configuration;
@property (nonatomic) BOOL continuesInBackground;
@property (nonatomic, copy, nullable) NSDate *startDate;
- (NSString *)recorderType;
- (nullable ORKDataLogger *)makeJSONDataLoggerWithError:(NSError * __autoreleasing *)error NS_REQUIRES_SUPER;
- (void)reset NS_REQUIRES_SUPER;
- (void)reportFileResultWithFile:(NSURL *)fileUrl error:(nullable NSError *)error;
- (nullable NSURL *)recordingDirectoryURL;
@end
NS_ASSUME_NONNULL_END
@@ -1,102 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKRecorder.h>
NS_ASSUME_NONNULL_BEGIN
@class ORKStep;
/**
The `ORKTouchRecorderConfiguration` is a recorder configuration class for
generating an `ORKTouchRecorder`.
It is currently considered private, and is not used in any of the active tasks.
*/
ORK_CLASS_AVAILABLE
@interface ORKTouchRecorderConfiguration: ORKRecorderConfiguration
- (instancetype)init;
@end
@interface ORKRecorder()
- (instancetype)initWithStep:(nullable ORKStep *)step
outputDirectory:(nullable NSURL *)outputDirectory;
/**
A preparation step to provide viewController and view before record starting.
The step view controller should call this method before starting the recorder,
so that recorders that need a view or gesture recognizer in order to function
can attach themselves.
@param viewController The view controller that is about to 'start'
@param view Primary active view for the step.
*/
- (void)viewController:(UIViewController *)viewController willStartStepWithView:(nullable UIView *)view;
/**
Indicates that recording has failed; stop recording and report the error to the
delegate
@param error Error that occurred.
*/
- (void)finishRecordingWithError:(nullable NSError *)error;
/**
Helper for subclasses to request that file protection be applied to a file on disk.
This method is exposed to facilitate unit testing.
@param fileProtection Level of file protection desired
@param url URL of file to protect.
*/
- (void)applyFileProtection:(ORKFileProtectionMode)fileProtection toFileAtURL:(NSURL *)url;
@end
@interface ORKRecorderConfiguration()
/**
Returns the permission mask indicating the permissions required for this configuration.
This method is typically overridden in new recorder configuration subclasses.
*/
- (ORKPermissionMask)requestedPermissionMask;
@end
NS_ASSUME_NONNULL_END
@@ -1,81 +0,0 @@
/*
Copyright (c) 2015, 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 <Foundation/Foundation.h>
/**
The `ORKSpatialSpanGame` class represents a model object that represents one game-like experience in a spatial span memory task.
A game consists of a subset of a permutation of the integers [0 .. gameSize-1],
which represent the sequence of targets that should be tapped.
*/
@interface ORKSpatialSpanGame : NSObject
/**
Returns an initialized spatial span game using the specified game size, sequence length, and seed.
This method is the designated initializer.
@param gameSize The number of tiles in the game.
@param sequenceLength The number of elements in the sequence that the user has to remember.
@param seed The generator that should be used for generating the sequence. A value of 0 means that a random seed is used.
*/
- (instancetype)initWithGameSize:(NSInteger)gameSize
sequenceLength:(NSInteger)sequenceLength
seed:(uint32_t)seed NS_DESIGNATED_INITIALIZER;
/// The number of tiles in the game.
@property (nonatomic, readonly) NSInteger gameSize;
/// The length of the sequence. A sequence is a sub-array of a random permutation of integers (0..gameSize-1) that has a length of `sequenceLength`.
@property (nonatomic, readonly) NSInteger sequenceLength;
/// The seed to use to generate the sequence. Note that if you pass `seed` to another game, you get the same game.
@property (nonatomic, readonly) uint32_t seed;
/**
Enumerates the sequence, calling the block once for each element.
@param handler The block to be called for each element in the sequence. The `handler` block takes the following parameters:
`step` The step in the sequence. The step starts at 0 and increments by one on each call.
`tileIndex` The index in [ 0 .. gameSize ] that corresponds to the step's element of the sequence.
`isLastStep` A Boolean value that indicates if this is the last step in the sequence.
`stop` A Boolean value that indicates if the enumeration should be terminated (pass `NO` to terminate the enumeration).
*/
- (void)enumerateSequenceWithHandler:(void(^)(NSInteger step, NSInteger tileIndex, BOOL isLastStep, BOOL *stop))handler;
/// Returns the value of the specified step in the sequence.
- (NSInteger)tileIndexForStep:(NSInteger)step;
@end
@@ -1,104 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKSpatialSpanGame.h"
@implementation ORKSpatialSpanGame
{
NSInteger *_sequence;
}
- (void)generateSequence {
_sequence = calloc(_gameSize, sizeof(NSInteger));
if (_sequence == NULL) {
return;
}
for (NSInteger i = 0; i < _gameSize; i++) {
_sequence[i] = i;
}
// Knuth algorithm: swap each with a random element elsewhere in the array.
// Note: we will only use the first _sequenceLength elements of this array
srandom(_seed);
for (NSInteger i = 0; i < _gameSize; i++) {
NSInteger rand_i = random() % _gameSize;
NSInteger tmp = _sequence[i];
_sequence[i] = _sequence[rand_i];
_sequence[rand_i] = tmp;
}
}
- (void)dealloc {
if (_sequence != NULL) {
free(_sequence);
_sequence = NULL;
}
}
- (instancetype)initWithGameSize:(NSInteger)gameSize
sequenceLength:(NSInteger)sequenceLength
seed:(uint32_t)seed {
self = [super init];
if (self) {
_gameSize = gameSize;
_sequenceLength = sequenceLength;
NSParameterAssert(_gameSize > 0);
NSParameterAssert(_sequenceLength > 0);
NSParameterAssert(_sequenceLength < _gameSize);
_seed = seed;
if (_seed == 0) {
_seed = arc4random();
}
[self generateSequence];
if (_sequence == NULL) {
self = nil;
}
}
return self;
}
/// Step parameter is the step in the sequence; tileIndex is the value of that step of the sequence.
- (void)enumerateSequenceWithHandler:(void(^)(NSInteger step, NSInteger tileIndex, BOOL isLastStep, BOOL *stop))handler {
BOOL stop = NO;
for (NSInteger i = 0; i < _sequenceLength; i++) {
handler(i, _sequence[i], (i == _sequenceLength), &stop);
if (stop) break;
}
}
- (NSInteger)tileIndexForStep:(NSInteger)step {
return _sequence[step];
}
@end
@@ -1,68 +0,0 @@
/*
Copyright (c) 2015, 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 <Foundation/Foundation.h>
#import "ORKSpatialSpanTargetView.h"
NS_ASSUME_NONNULL_BEGIN
@class ORKSpatialSpanGame;
typedef NS_ENUM(NSInteger, ORKSpatialSpanResult) {
ORKSpatialSpanResultIgnore,
ORKSpatialSpanResultCorrect,
ORKSpatialSpanResultIncorrect
};
@interface ORKSpatialSpanGameState : NSObject
- (instancetype)initWithGame:(ORKSpatialSpanGame *)game NS_DESIGNATED_INITIALIZER;
@property (nonatomic, strong, readonly, nullable) ORKSpatialSpanGame *game;
@property (nonatomic, readonly, getter=isComplete) BOOL complete;
/// Enumerates all tiles, indicating the state of each tile at the specified state of the game.
- (void)enumerateTilesWithHandler:(void (^)(NSInteger tileIndex, ORKSpatialSpanTargetState state, BOOL *stop))handler;
/// Returns a result indicating whether the user's tap was correct, incorrect, or ignorable.
- (ORKSpatialSpanResult)playTileIndex:(NSInteger)tileIndex;
- (void)reset;
// Returns `NSNotFound` if there have been no plays
- (NSInteger)lastSuccessfulTileIndex;
// Number of tiles that have been successfully tapped
- (NSInteger)currentStepIndex;
@end
NS_ASSUME_NONNULL_END
@@ -1,113 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKSpatialSpanGameState.h"
#import "ORKSpatialSpanGame.h"
@implementation ORKSpatialSpanGameState {
NSMutableArray *_plays;
ORKSpatialSpanTargetState *_states;
}
- (instancetype)initWithGame:(ORKSpatialSpanGame *)game {
self = [super init];
if (self) {
_game = game;
_plays = [NSMutableArray array];
_states = calloc([_game gameSize], sizeof(ORKSpatialSpanTargetState));
if (_states == NULL) {
self = nil;
}
}
return self;
}
- (void)dealloc {
if (_states != NULL) {
free(_states);
_states = NULL;
}
}
- (void)reset {
const NSInteger gameSize = [_game gameSize];
for (NSInteger tileIndex = 0; tileIndex < gameSize; tileIndex++) {
_states[tileIndex] = ORKSpatialSpanTargetStateQuiescent;
}
[_plays removeAllObjects];
_complete = NO;
}
/// Enumerate all tiles, indicating the state of each tile at this point in the game.
- (void)enumerateTilesWithHandler:(void (^)(NSInteger tileIndex, ORKSpatialSpanTargetState state, BOOL *stop))handler {
const NSInteger gameSize = [_game gameSize];
BOOL stop = NO;
for (NSInteger tileIndex = 0; tileIndex < gameSize; tileIndex++) {
handler(tileIndex, _states[tileIndex], &stop);
if (stop) break;
}
}
/// User tapped a tile. Returns YES if it was the correct next tile.
- (ORKSpatialSpanResult)playTileIndex:(NSInteger)tileIndex {
if (_states[tileIndex] != ORKSpatialSpanTargetStateQuiescent) {
return ORKSpatialSpanResultIgnore;
}
NSInteger sequencePosition = [_plays count];
BOOL correct = ([_game tileIndexForStep:sequencePosition] == tileIndex);
_states[tileIndex] = correct ? ORKSpatialSpanTargetStateCorrect : ORKSpatialSpanTargetStateIncorrect;
if (correct) {
[_plays addObject:@(tileIndex)];
}
if ([_plays count] >= [_game sequenceLength]) {
_complete = YES;
}
return correct ? ORKSpatialSpanResultCorrect : ORKSpatialSpanResultIncorrect;
}
- (NSInteger)currentStepIndex {
return [_plays count];
}
- (NSInteger)lastSuccessfulTileIndex {
if (! [_plays count]) {
return NSNotFound;
}
return [[_plays lastObject] integerValue];
}
@end
@@ -1,84 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKCustomStepView_Internal.h"
#import "ORKSpatialSpanTargetView.h"
NS_ASSUME_NONNULL_BEGIN
typedef struct {
NSInteger width;
NSInteger height;
} ORKGridSize;
@class ORKSpatialSpanMemoryGameView;
@protocol ORKSpatialSpanMemoryGameViewDelegate<NSObject>
- (void)gameView:(ORKSpatialSpanMemoryGameView *)gameView didTapTileWithIndex:(NSInteger)tileIndex recognizer:(UITapGestureRecognizer *)recognizer;
@end
@interface ORKSpatialSpanMemoryGameView : UIView <ORKSpatialSpanTargetViewDelegate>
@property (nonatomic, weak, nullable) id<ORKSpatialSpanMemoryGameViewDelegate> delegate;
@property (nonatomic, assign) ORKGridSize gridSize;
@property (nonatomic, readonly) NSInteger numberOfTiles;
@property (nonatomic, readonly, nullable) NSArray *tileViews;
@property (nonatomic, strong, nullable) UIImage *customTargetImage;
- (void)resetTilesAnimated:(BOOL)animated;
- (void)setState:(ORKSpatialSpanTargetState)state forTileIndex:(NSInteger)tileIndex animated:(BOOL)animated;
- (ORKSpatialSpanTargetState)stateForTileIndex:(NSInteger)tileIndex;
@end
@interface ORKSpatialSpanMemoryContentView : ORKActiveStepCustomView
@property (nonatomic, readonly, strong) ORKSpatialSpanMemoryGameView *gameView;
@property (nonatomic, assign, getter=isFooterHidden) BOOL footerHidden;
@property (nonatomic, strong, nullable) NSString *capitalizedPluralItemDescription;
// Things that can be shown in the footer.
@property (nonatomic, assign) NSInteger numberOfItems;
@property (nonatomic, assign) NSInteger score;
@property (nonatomic, strong, nullable) UIBarButtonItem *buttonItem;
@end
NS_ASSUME_NONNULL_END
@@ -1,305 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKSpatialSpanMemoryContentView.h"
#import "ORKSpatialSpanTargetView.h"
#import "ORKActiveStepQuantityView.h"
#import "ORKVerticalContainerView.h"
#import "ORKSkin.h"
#import "ORKHelpers.h"
// #define LAYOUT_DEBUG 1
@implementation ORKSpatialSpanMemoryGameView
#pragma mark Primary interface
- (void)setGridSize:(ORKGridSize)gridSize {
_gridSize = gridSize;
#if LAYOUT_DEBUG
self.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.2];
#endif
[self resetTilesAnimated:NO];
}
- (NSInteger)numberOfTiles {
return _gridSize.width * _gridSize.height;
}
- (ORKSpatialSpanTargetView *)makeTargetView {
ORKSpatialSpanTargetView *targetView = [[ORKSpatialSpanTargetView alloc] init];
targetView.customTargetImage = _customTargetImage;
return targetView;
}
- (void)resetTilesAnimated:(BOOL)animated {
NSArray *currentViews = _tileViews;
NSInteger numberOfTilesOld = [_tileViews count];
NSInteger numberOfTilesNew = _gridSize.width*_gridSize.height;
NSMutableArray *newViews = [NSMutableArray arrayWithCapacity:numberOfTilesNew];
NSArray *viewsToRemove = nil;
if (numberOfTilesOld <= numberOfTilesNew) {
[newViews addObjectsFromArray:currentViews];
NSInteger tilesToAdd = numberOfTilesNew - numberOfTilesOld;
for (NSInteger idx = 0; idx < tilesToAdd; idx++) {
[newViews addObject:[self makeTargetView]];
}
} else {
[newViews addObjectsFromArray:[currentViews subarrayWithRange:(NSRange){0,numberOfTilesNew}]];
viewsToRemove = [currentViews subarrayWithRange:(NSRange){numberOfTilesNew, numberOfTilesOld-numberOfTilesNew}];
}
void(^resetBlock)(void) = ^(void) {
for (ORKSpatialSpanTargetView *view in viewsToRemove) {
view.delegate = nil;
[view removeFromSuperview];
}
if (numberOfTilesNew > numberOfTilesOld) {
NSArray *addedViews = [newViews subarrayWithRange:(NSRange){numberOfTilesOld,numberOfTilesNew-numberOfTilesOld}];
for (ORKSpatialSpanTargetView *view in addedViews) {
view.delegate = self;
[self addSubview:view];
}
}
_tileViews = newViews;
for (ORKSpatialSpanTargetView *view in _tileViews) {
[view setState:ORKSpatialSpanTargetStateQuiescent];
}
[self layoutSubviews];
};
if (animated) {
[UIView transitionWithView:self duration:0.3 options:UIViewAnimationOptionCurveEaseInOut animations:resetBlock completion:NULL];
} else {
resetBlock();
}
}
- (void)setCustomTargetImage:(UIImage *)customTargetImage {
_customTargetImage = customTargetImage;
for (ORKSpatialSpanTargetView *view in _tileViews) {
view.customTargetImage = _customTargetImage;
}
}
- (void)targetView:(ORKSpatialSpanTargetView *)targetView recognizer:(UITapGestureRecognizer *)recognizer {
[_delegate gameView:self
didTapTileWithIndex:[_tileViews indexOfObject:targetView]
recognizer:recognizer];
}
- (void)layoutSubviews {
[super layoutSubviews];
CGRect bds = [self bounds];
CGFloat gridItemEdgeLength = ORKFloorToViewScale(MIN(bds.size.width / _gridSize.width, bds.size.height / _gridSize.height), self);
gridItemEdgeLength = MIN(gridItemEdgeLength, 114);
CGSize gridItemSize = (CGSize){gridItemEdgeLength, gridItemEdgeLength};
CGPoint centeringOffset = CGPointZero;
centeringOffset.x = 0.5*(bds.size.width - (gridItemSize.width * _gridSize.width));
centeringOffset.y = 0.5*(bds.size.height - (gridItemSize.height * _gridSize.height));
NSInteger tileIndex = 0;
for (NSInteger x = 0; x < _gridSize.width; x++) {
for (NSInteger y = 0; y < _gridSize.height; y++) {
ORKSpatialSpanTargetView *targetView = [_tileViews objectAtIndex:tileIndex];
CGPoint origin = (CGPoint){.x = ORKFloorToViewScale(centeringOffset.x + x * gridItemSize.width, self),
.y = ORKFloorToViewScale(centeringOffset.y + y * gridItemSize.height, self)};
targetView.frame = (CGRect){.origin=origin, .size=gridItemSize};
tileIndex ++;
}
}
}
- (void)setState:(ORKSpatialSpanTargetState)state forTileIndex:(NSInteger)tileIndex animated:(BOOL)animated {
ORKSpatialSpanTargetView *view = [_tileViews objectAtIndex:tileIndex];
[view setState:state animated:animated];
}
- (ORKSpatialSpanTargetState)stateForTileIndex:(NSInteger)tileIndex {
return [(ORKSpatialSpanTargetView *)[_tileViews objectAtIndex:tileIndex] state];
}
#pragma mark Accessibility
- (BOOL)isAccessibilityElement {
return NO;
}
@end
@implementation ORKSpatialSpanMemoryContentView {
ORKQuantityPairView *_quantityPairView;
ORKNavigationContainerView *_continueView;
NSArray *_constraints;
NSLayoutConstraint *_topConstraint;
}
- (ORKActiveStepQuantityView *)countView {
return [_quantityPairView leftView];
}
- (ORKActiveStepQuantityView *)scoreView {
return [_quantityPairView rightView];
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
_gameView = [ORKSpatialSpanMemoryGameView new];
_gameView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:_gameView];
_quantityPairView = [ORKQuantityPairView new];
_quantityPairView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:_quantityPairView];
_continueView = [ORKNavigationContainerView new];
_continueView.translatesAutoresizingMaskIntoConstraints = NO;
_continueView.continueEnabled = YES;
_continueView.bottomMargin = 20;
[self addSubview:_continueView];
ORKActiveStepQuantityView *countView = [self countView];
ORKActiveStepQuantityView *scoreView = [self scoreView];
_capitalizedPluralItemDescription = [ORKLocalizedString(@"SPATIAL_SPAN_MEMORY_TARGET_STANDALONE", nil) capitalizedStringWithLocale:[NSLocale currentLocale]];
countView.title = [NSString stringWithFormat:ORKLocalizedString(@"MEMORY_GAME_ITEM_COUNT_TITLE_%@", nil), _capitalizedPluralItemDescription];
scoreView.title = ORKLocalizedString(@"MEMORY_GAME_SCORE_TITLE", nil);
countView.enabled = YES;
scoreView.enabled = YES;
self.numberOfItems = 0;
self.score = 0;
[self updateMargins];
#if LAYOUT_DEBUG
self.backgroundColor = [[UIColor greenColor] colorWithAlphaComponent:0.2];
_gameView.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent:0.2];
_continueView.backgroundColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2];
_quantityPairView.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.2];
[self scoreView].backgroundColor = [[UIColor purpleColor] colorWithAlphaComponent:0.2];
[self countView].backgroundColor = [[UIColor purpleColor] colorWithAlphaComponent:0.2];
#endif
[self setNeedsUpdateConstraints];
}
return self;
}
- (void)setCapitalizedPluralItemDescription:(NSString *)capitalizedPluralItemDescription {
_capitalizedPluralItemDescription = capitalizedPluralItemDescription;
[self countView].title = [NSString stringWithFormat:ORKLocalizedString(@"MEMORY_GAME_ITEM_COUNT_TITLE_%@", nil), _capitalizedPluralItemDescription];
}
- (void)setNumberOfItems:(NSInteger)numberOfItems {
ORKActiveStepQuantityView *countView = [self countView];
countView.value = [NSString stringWithFormat:@"%ld", (long)numberOfItems];
}
- (void)setScore:(NSInteger)score {
ORKActiveStepQuantityView *scoreView = [self scoreView];
scoreView.value = [NSString stringWithFormat:@"%ld", (long)score];
}
- (void)updateFooterHidden {
_quantityPairView.hidden = (_footerHidden || (_buttonItem != nil));
}
- (void)setFooterHidden:(BOOL)footerHidden {
_footerHidden = footerHidden;
[self updateFooterHidden];
}
- (void)setButtonItem:(UIBarButtonItem *)buttonItem {
_buttonItem = buttonItem;
_continueView.continueButtonItem = buttonItem;
_continueView.hidden = (buttonItem == nil);
[self updateFooterHidden];
}
- (void)updateMargins {
self.layoutMargins = (UIEdgeInsets){.left=ORKStandardMarginForView(self),.right=ORKStandardMarginForView(self)};
_quantityPairView.layoutMargins = self.layoutMargins;
}
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[self updateMargins];
}
- (void)updateConstraints {
if (_constraints) {
[NSLayoutConstraint deactivateConstraints:_constraints];
_constraints = nil;
}
NSMutableArray *constraints = [NSMutableArray array];
NSDictionary *views = NSDictionaryOfVariableBindings(_gameView, _quantityPairView, _continueView);
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=0)-[_gameView][_quantityPairView]|" options:NSLayoutFormatAlignAllCenterX metrics:nil views:views]];
NSLayoutConstraint *c1 = [NSLayoutConstraint constraintWithItem:_gameView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:1000];
c1.priority = UILayoutPriorityDefaultLow-1;
[constraints addObject:c1];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_gameView]-|" options:(NSLayoutFormatOptions)0 metrics:nil views:views]];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_quantityPairView]|" options:(NSLayoutFormatOptions)0 metrics:nil views:views]];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_continueView]|" options:(NSLayoutFormatOptions)0 metrics:nil views:views]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_continueView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:_quantityPairView attribute:NSLayoutAttributeBottom multiplier:1 constant:0]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_continueView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:_quantityPairView attribute:NSLayoutAttributeTop multiplier:1 constant:0]];
NSLayoutConstraint *maxWidthConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:10000];
maxWidthConstraint.priority = UILayoutPriorityRequired-1;
[constraints addObject:maxWidthConstraint];
[NSLayoutConstraint activateConstraints:constraints];
_constraints = constraints;
[super updateConstraints];
}
@end
@@ -1,50 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit_Private.h>
NS_ASSUME_NONNULL_BEGIN
ORK_CLASS_AVAILABLE
@interface ORKSpatialSpanMemoryStep : ORKActiveStep
@property (nonatomic, assign) NSInteger initialSpan;
@property (nonatomic, assign) NSInteger minimumSpan;
@property (nonatomic, assign) NSInteger maximumSpan;
@property (nonatomic, assign) NSTimeInterval playSpeed;
@property (nonatomic, assign) NSInteger maxTests;
@property (nonatomic, assign) NSInteger maxConsecutiveFailures;
@property (nonatomic, assign) BOOL requireReversal;
@property (nonatomic, strong, nullable) UIImage *customTargetImage;
@property (nonatomic, copy, nullable) NSString *customTargetPluralName;
@end
NS_ASSUME_NONNULL_END
@@ -1,192 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKSpatialSpanMemoryStep.h"
#import "ORKSpatialSpanMemoryStepViewController.h"
#import "ORKHelpers.h"
#import "ORKStep_Private.h"
@implementation ORKSpatialSpanMemoryStep
+ (Class)stepViewControllerClass {
return [ORKSpatialSpanMemoryStepViewController class];
}
- (instancetype)initWithIdentifier:(NSString *)identifier {
self = [super initWithIdentifier:identifier];
self.shouldStartTimerAutomatically = YES;
self.shouldContinueOnFinish = YES;
return self;
}
- (instancetype)copyWithZone:(NSZone *)zone
{
ORKSpatialSpanMemoryStep *step = [super copyWithZone:zone];
step.initialSpan = self.initialSpan;
step.minimumSpan = self.minimumSpan;
step.maximumSpan = self.maximumSpan;
step.playSpeed = self.playSpeed;
step.maxTests = self.maxTests;
step.maxConsecutiveFailures = self.maxConsecutiveFailures;
step.requireReversal = self.requireReversal;
step.customTargetImage = self.customTargetImage;
step.customTargetPluralName = self.customTargetPluralName;
return step;
}
- (void)validateParameters {
[super validateParameters];
NSInteger const ORKSpatialSpanMemoryTaskMinimumInitialSpan = 2;
NSInteger const ORKSpatialSpanMemoryTaskMaximumSpan = 20;
NSTimeInterval const ORKSpatialSpanMemoryTaskMinimumPlaySpeed = 0.5;
NSTimeInterval const ORKSpatialSpanMemoryTaskMaximumPlaySpeed = 20;
NSInteger const ORKSpatialSpanMemoryTaskMinimumMaxTests = 1;
NSInteger const ORKSpatialSpanMemoryTaskMinimumMaxConsecutiveFailures = 1;
if ( self.initialSpan < ORKSpatialSpanMemoryTaskMinimumInitialSpan)
{
@throw [NSException exceptionWithName:NSInvalidArgumentException
reason:[NSString stringWithFormat:@"initialSpan can not be less than %@.", @(ORKSpatialSpanMemoryTaskMinimumInitialSpan)]
userInfo:nil];
}
if ( self.minimumSpan > self.initialSpan)
{
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"initialSpan can not be less than minimumSpan." userInfo:nil];
}
if ( self.initialSpan > self.maximumSpan)
{
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"maximumSpan can not be less than initialSpan." userInfo:nil];
}
if ( self.maximumSpan > ORKSpatialSpanMemoryTaskMaximumSpan)
{
@throw [NSException exceptionWithName:NSInvalidArgumentException
reason:[NSString stringWithFormat:@"maximumSpan can not be more than %@.", @(ORKSpatialSpanMemoryTaskMaximumSpan)]
userInfo:nil];
}
if (self.playSpeed < ORKSpatialSpanMemoryTaskMinimumPlaySpeed)
{
@throw [NSException exceptionWithName:NSInvalidArgumentException
reason:[NSString stringWithFormat:@"playSpeed can not be shorter than %@ seconds.", @(ORKSpatialSpanMemoryTaskMinimumPlaySpeed)]
userInfo:nil];
}
if (self.playSpeed > ORKSpatialSpanMemoryTaskMaximumPlaySpeed)
{
@throw [NSException exceptionWithName:NSInvalidArgumentException
reason:[NSString stringWithFormat:@"playSpeed can not be longer than %@ seconds.", @(ORKSpatialSpanMemoryTaskMaximumPlaySpeed)]
userInfo:nil];
}
if (self.maxTests < ORKSpatialSpanMemoryTaskMinimumMaxTests)
{
@throw [NSException exceptionWithName:NSInvalidArgumentException
reason:[NSString stringWithFormat:@"maxTests can not be less than %@.", @(ORKSpatialSpanMemoryTaskMinimumMaxTests)]
userInfo:nil];
}
if (self.maxConsecutiveFailures < ORKSpatialSpanMemoryTaskMinimumMaxConsecutiveFailures)
{
@throw [NSException exceptionWithName:NSInvalidArgumentException
reason:[NSString stringWithFormat:@"maxConsecutiveFailures can not be less than %@.", @(ORKSpatialSpanMemoryTaskMinimumMaxConsecutiveFailures)]
userInfo:nil];
}
}
- (BOOL)startsFinished {
return NO;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
ORK_DECODE_INTEGER(aDecoder, initialSpan);
ORK_DECODE_INTEGER(aDecoder, minimumSpan);
ORK_DECODE_INTEGER(aDecoder, maximumSpan);
ORK_DECODE_INTEGER(aDecoder, playSpeed);
ORK_DECODE_INTEGER(aDecoder, maxTests);
ORK_DECODE_INTEGER(aDecoder, maxConsecutiveFailures);
ORK_DECODE_BOOL(aDecoder, requireReversal);
ORK_DECODE_IMAGE(aDecoder, customTargetImage);
ORK_DECODE_OBJ_CLASS(aDecoder, customTargetPluralName, NSString);
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
ORK_ENCODE_INTEGER(aCoder, initialSpan);
ORK_ENCODE_INTEGER(aCoder, minimumSpan);
ORK_ENCODE_INTEGER(aCoder, maximumSpan);
ORK_ENCODE_INTEGER(aCoder, playSpeed);
ORK_ENCODE_INTEGER(aCoder, maxTests);
ORK_ENCODE_INTEGER(aCoder, maxConsecutiveFailures);
ORK_ENCODE_BOOL(aCoder, requireReversal);
ORK_ENCODE_IMAGE(aCoder, customTargetImage);
ORK_ENCODE_OBJ(aCoder, customTargetPluralName);
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (BOOL)isEqual:(id)object {
BOOL isParentSame = [super isEqual:object];
__typeof(self) castObject = object;
return (isParentSame &&
(self.initialSpan == castObject.initialSpan) &&
(self.minimumSpan == castObject.minimumSpan) &&
(self.maximumSpan == castObject.maximumSpan) &&
(self.playSpeed == castObject.playSpeed) &&
(self.maxTests == castObject.maxTests) &&
(self.maxConsecutiveFailures == castObject.maxConsecutiveFailures) &&
(ORKEqualObjects(self.customTargetPluralName, castObject.customTargetPluralName)) &&
(self.requireReversal == castObject.requireReversal)) ;
}
- (BOOL)allowsBackNavigation {
return NO;
}
@end
@@ -1,39 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit_Private.h>
/**
View controller corresponding to `ORKSpatialSpanMemoryStep`.
*/
ORK_CLASS_AVAILABLE
@interface ORKSpatialSpanMemoryStepViewController : ORKActiveStepViewController
@end
@@ -1,776 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKSpatialSpanMemoryStepViewController.h"
#import "ORKHelpers.h"
#import "ORKActiveStep_Internal.h"
#import "ORKStep_Private.h"
#import "ORKActiveStepViewController_Internal.h"
#import "ORKSpatialSpanMemoryContentView.h"
#import "ORKVerticalContainerView.h"
#import "ORKStepViewController_Internal.h"
#import "ORKSpatialSpanGame.h"
#import "ORKSpatialSpanGameState.h"
#import "ORKVerticalContainerView_Internal.h"
#import "ORKSkin.h"
#import "ORKResult.h"
#import <QuartzCore/CABase.h>
#import "ORKSpatialSpanMemoryStep.h"
#import "ORKActiveStepView.h"
static const NSTimeInterval kMemoryGameActivityTimeout = 20;
typedef NS_ENUM(NSInteger, ORKSpatialSpanStepState) {
ORKSpatialSpanStepStateInitial,
ORKSpatialSpanStepStatePlayback,
ORKSpatialSpanStepStateGameplay,
ORKSpatialSpanStepStateTimeout,
ORKSpatialSpanStepStateFailed,
ORKSpatialSpanStepStateSuccess,
ORKSpatialSpanStepStateRestart,
ORKSpatialSpanStepStateComplete,
ORKSpatialSpanStepStateStopped,
ORKSpatialSpanStepStatePaused
};
@class ORKState;
typedef void (^_ORKStateHandler)(ORKState *fromState, ORKState *_toState, id context);
// Poor man's state machine:
// Define entry and exit handlers for each state.
// Transitions are a free for all!
@interface ORKState : NSObject
+ (ORKState *)stateWithState:(NSInteger)state entryHandler:(_ORKStateHandler)entryHandler exitHandler:(_ORKStateHandler)exitHandler context:(id)context;
@property (nonatomic, assign) NSInteger state;
@property (nonatomic, weak) id context;
@property (nonatomic, copy) _ORKStateHandler entryHandler;
- (void)setEntryHandler:(_ORKStateHandler)entryHandler;
@property (nonatomic, copy) _ORKStateHandler exitHandler;
- (void)setExitHandler:(_ORKStateHandler)exitHandler;
@end
@implementation ORKState;
+ (ORKState *)stateWithState:(NSInteger)state entryHandler:(_ORKStateHandler)entryHandler exitHandler:(_ORKStateHandler)exitHandler context:(id)context {
ORKState *s = [ORKState new];
s.state = state;
s.entryHandler = entryHandler;
s.exitHandler = exitHandler;
s.context = context;
return s;
}
@end
@interface ORKSpatialSpanMemoryStepViewController() <ORKSpatialSpanMemoryGameViewDelegate>
@end
@implementation ORKSpatialSpanMemoryStepViewController
{
ORKSpatialSpanMemoryContentView *_contentView;
ORKState *_state;
NSDictionary *_states;
ORKGridSize _gridSize;
ORKSpatialSpanGameState *_currentGameState;
// ORKSpatialSpanMemoryGameRecord
NSMutableArray *_gameRecords;
NSTimeInterval _gameStartTime;
NSInteger _lastRoundScore;
NSInteger _playbackIndex;
NSInteger _score;
NSInteger _numberOfItems;
NSInteger _gamesCounter;
NSInteger _consecutiveGamesFailed;
NSInteger _nextGameSequenceLength;
NSTimer *_playbackTimer;
NSTimer *_activityTimer;
}
- (ORKSpatialSpanMemoryStep *)spatialSpanStep {
return (ORKSpatialSpanMemoryStep *)self.step;
}
- (instancetype)initWithStep:(ORKStep *)step {
self = [super initWithStep:step];
if (self) {
self.suspendIfInactive = YES;
}
return self;
}
#pragma mark Overrides
- (void)viewDidLoad {
[super viewDidLoad];
_contentView = [ORKSpatialSpanMemoryContentView new];
_contentView.translatesAutoresizingMaskIntoConstraints = NO;
_contentView.footerHidden = YES;
_contentView.gameView.delegate = self;
self.activeStepView.activeCustomView = _contentView;
self.activeStepView.stepViewFillsAvailableSpace = NO;
self.activeStepView.minimumStepHeaderHeight = ORKGetMetricForScreenType(ORKScreenMetricMinimumStepHeaderHeightForMemoryGame, ORKGetScreenTypeForWindow(self.view.window));
[self resetUI];
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleUserTap:)];
[self.activeStepView addGestureRecognizer:tapGestureRecognizer];
}
- (void)stepDidChange {
[super stepDidChange];
[self initializeStates];
}
- (void)start {
[super start];
if (! _state) {
[self transitionToState:ORKSpatialSpanStepStateInitial];
}
[self transitionToState:ORKSpatialSpanStepStatePlayback];
}
- (void)suspend {
[super suspend];
switch (_state.state) {
case ORKSpatialSpanStepStatePlayback:
case ORKSpatialSpanStepStateGameplay:
[self transitionToState:ORKSpatialSpanStepStatePaused];
break;
default:
break;
}
}
- (void)resume {
[super resume];
}
- (void)finish {
[super finish];
[self transitionToState:ORKSpatialSpanStepStateStopped];
}
- (ORKStepResult *)result {
ORKStepResult *sResult = [super result];
// "Now" is the end time of the result, which is either actually now,
// or the last time we were in the responder chain.
NSDate *now = sResult.endDate;
NSMutableArray *results = [NSMutableArray arrayWithArray:sResult.results];
ORKSpatialSpanMemoryResult *memoryResult = [[ORKSpatialSpanMemoryResult alloc] initWithIdentifier:(NSString *__nonnull)self.step.identifier];
memoryResult.startDate = sResult.startDate;
memoryResult.endDate = now;
NSMutableArray *records = [NSMutableArray new];
__block NSInteger numberOfFailures = 0;
__block NSInteger score = 0;
// Only include valid records
[_gameRecords enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
ORKSpatialSpanMemoryGameRecord *record = (ORKSpatialSpanMemoryGameRecord *)obj;
if (record.gameStatus != ORKSpatialSpanMemoryGameStatusUnknown) {
[records addObject:record];
score += record.score;
if (record.gameStatus != ORKSpatialSpanMemoryGameStatusSuccess)
{
numberOfFailures++;
}
}
}];
memoryResult.score = score;
memoryResult.numberOfFailures = numberOfFailures;
memoryResult.numberOfGames = records.count;
memoryResult.gameRecords = [records copy];
[results addObject:memoryResult];
sResult.results = [results copy];
return sResult;
}
#pragma mark UpdateGameRecord
- (ORKSpatialSpanMemoryGameRecord *)currentGameRecord {
return _gameRecords? [_gameRecords lastObject] : nil;
}
- (void)createGameRecord {
if (_gameRecords == nil) {
_gameRecords = [NSMutableArray new];
}
ORKSpatialSpanMemoryGameRecord *gameRecord = [ORKSpatialSpanMemoryGameRecord new];
gameRecord.seed = _currentGameState.game.seed;
gameRecord.gameSize = _currentGameState.game.gameSize;
NSMutableArray *targetSequence = [NSMutableArray new];
[_currentGameState.game enumerateSequenceWithHandler:^(NSInteger step, NSInteger tileIndex, BOOL isLastStep, BOOL *stop) {
[targetSequence addObject:@(tileIndex)];
}];
gameRecord.sequence = [targetSequence copy];
[_gameRecords addObject:gameRecord];
_lastRoundScore = _score;
}
- (void)updateGameRecordTargetRects
{
ORKSpatialSpanMemoryGameRecord *record = [self currentGameRecord];
NSArray *tileViews = _contentView.gameView.tileViews;
NSMutableArray *targetRects = [NSMutableArray new];
for (UIView *tileView in tileViews) {
CGRect rect = [self.view convertRect:tileView.frame fromView:tileView.superview];
[targetRects addObject:[NSValue valueWithCGRect:rect]];
}
record.targetRects = [targetRects copy];
NSAssert(tileViews.count == 0 || tileViews.count == record.gameSize, nil);
}
- (void)updateGameRecordOnStartingGamePlay
{
_gameStartTime = CACurrentMediaTime();
}
- (void)handleUserTap:(UITapGestureRecognizer *)tapRecognizer
{
if (_state.state != ORKSpatialSpanStepStateGameplay) {
return;
}
[self updateGameRecordOnTouch:-1 location:[tapRecognizer locationInView: self.view]];
}
- (void)updateGameRecordOnTouch:(NSInteger)targetIndex location:(CGPoint)location
{
ORKSpatialSpanMemoryGameTouchSample *sample = [ORKSpatialSpanMemoryGameTouchSample new];
sample.timestamp = CACurrentMediaTime() - _gameStartTime;
sample.location = location;
sample.targetIndex = targetIndex;
ORKSpatialSpanMemoryGameRecord *record = [self currentGameRecord];
NSAssert(record, nil);
NSInteger currentStep = 0;
for (ORKSpatialSpanMemoryGameTouchSample *aSample in record.touchSamples) {
if (aSample.isCorrect) {
currentStep++;
}
}
sample.correct = (targetIndex == [_currentGameState.game tileIndexForStep:currentStep]);
NSMutableArray *sampleArray = [NSMutableArray arrayWithArray:record.touchSamples];
[sampleArray addObject:sample];
record.touchSamples = [sampleArray copy];
}
- (void)updateGameRecordOnSuccess
{
[self currentGameRecord].gameStatus = ORKSpatialSpanMemoryGameStatusSuccess;
}
- (void)updateGameRecordOnFailure
{
[self currentGameRecord].gameStatus = ORKSpatialSpanMemoryGameStatusFailure;
}
- (void)updateGameRecordOnTimeout
{
[self currentGameRecord].gameStatus = ORKSpatialSpanMemoryGameStatusTimeout;
}
- (void)updateGameRecordScore
{
[self currentGameRecord].score = _score - _lastRoundScore;
}
- (void)updateGameRecordOnPause
{
[self currentGameRecord].gameStatus = ORKSpatialSpanMemoryGameStatusUnknown;
}
#pragma mark ORKSpatialSpanStepStateInitial
- (ORKGridSize)gridSizeForSpan:(NSInteger)span {
NSInteger numberOfGridEntriesDesired = span*2;
NSInteger value = (NSInteger)ceil(sqrt(numberOfGridEntriesDesired));
value = MAX(value, 2);
value = MIN(value, 6);
return (ORKGridSize){value,value};
}
- (void)resetGameAndUI {
_score = 0;
_numberOfItems = 0;
_gamesCounter = 0;
_consecutiveGamesFailed = 0;
ORKSpatialSpanMemoryStep *step = [self spatialSpanStep];
_nextGameSequenceLength = step.initialSpan;
[self resetForNewGame];
}
- (void)resetUI {
_contentView.numberOfItems = _score;
_contentView.score = _numberOfItems;
_contentView.footerHidden = YES;
_contentView.buttonItem = nil;
_contentView.gameView.gridSize = _gridSize;
_contentView.gameView.customTargetImage = [[self spatialSpanStep] customTargetImage];
}
- (void)resetForNewGame {
[self.activeStepView updateTitle:self.step.title text:self.step.text];
_numberOfItems = 0;
NSInteger sequenceLength = _nextGameSequenceLength;
_gridSize = [self gridSizeForSpan:sequenceLength];
ORKSpatialSpanGame *game = [[ORKSpatialSpanGame alloc] initWithGameSize:_gridSize.width*_gridSize.height sequenceLength:sequenceLength seed:0];
ORKSpatialSpanGameState *gameState = [[ORKSpatialSpanGameState alloc] initWithGame:game];
_currentGameState = gameState;
[self createGameRecord];
[self resetUI];
}
#pragma mark ORKSpatialSpanStepStatePlayback
- (void)applyTargetState:(ORKSpatialSpanTargetState)targetState toSequenceIndex:(NSInteger)index duration:(NSTimeInterval)duration {
ORKSpatialSpanGame *game = _currentGameState.game;
if (index == NSNotFound || index < 0 || index >= game.sequenceLength ) {
return;
}
NSInteger tileIndex = [game tileIndexForStep:index];
ORKSpatialSpanMemoryGameView *gameView = _contentView.gameView;
[gameView setState:targetState forTileIndex:tileIndex animated:YES];
if (duration > 0 && targetState != ORKSpatialSpanTargetStateQuiescent) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self applyTargetState:ORKSpatialSpanTargetStateQuiescent toSequenceIndex:index duration:0];
});
}
}
- (void)playbackNextItem {
const NSInteger sequenceLength = _currentGameState.game.sequenceLength;
if (_playbackIndex >= sequenceLength) {
[self transitionToState:ORKSpatialSpanStepStateGameplay];
} else {
ORKSpatialSpanMemoryStep *step = [self spatialSpanStep];
NSInteger index = _playbackIndex;
NSInteger previousIndex = index-1;
if (step.requireReversal) {
// Play the indexes in reverse order when we require reversal. The participant
// is then required to tap the sequence in the forward direction, which
// appears as a reversal to them.
index = sequenceLength - 1 - index;
previousIndex = sequenceLength - 1 - previousIndex;
}
// Make sure the previous step *is *cleared
[self applyTargetState:ORKSpatialSpanTargetStateQuiescent toSequenceIndex:previousIndex duration:0];
// The active display should be visible for half the timer interval
[self applyTargetState:ORKSpatialSpanTargetStateActive toSequenceIndex:index duration:step.playSpeed/2];
}
_playbackIndex++;
}
- (void)startPlayback {
_playbackIndex = 0;
_contentView.footerHidden = YES;
_contentView.buttonItem = nil;
ORKSpatialSpanMemoryStep *step = [self spatialSpanStep];
NSString *title = [NSString stringWithFormat:ORKLocalizedString(@"MEMORY_GAME_PLAYBACK_TITLE_%@", nil), step.customTargetPluralName ? : ORKLocalizedString(@"SPATIAL_SPAN_MEMORY_TARGET_PLURAL", nil)];
[self.activeStepView updateTitle:title text:nil];
[_contentView.gameView resetTilesAnimated:NO];
_playbackTimer = [NSTimer scheduledTimerWithTimeInterval:step.playSpeed target:self selector:@selector(playbackNextItem) userInfo:nil repeats:YES];
}
- (void)finishPlayback {
[_playbackTimer invalidate];
_playbackTimer = nil;
}
#pragma mark ORKSpatialSpanStepStateGameplay
- (void)setNumberOfItems:(NSInteger)numberOfItems {
_numberOfItems = numberOfItems;
[_contentView setNumberOfItems:_numberOfItems];
}
- (void)setScore:(NSInteger)score {
_score = score;
[_contentView setScore:_score];
[self updateGameRecordScore];
}
- (void)activityTimeout {
[self transitionToState:ORKSpatialSpanStepStateTimeout];
}
- (void)resetActivityTimer {
[_activityTimer invalidate];
_activityTimer = nil;
_activityTimer = [NSTimer scheduledTimerWithTimeInterval:kMemoryGameActivityTimeout target:self selector:@selector(activityTimeout) userInfo:nil repeats:NO];
}
- (void)startGameplay {
[self setNumberOfItems:0];
// Update the target rects here, since layout will be complete by this point.
[self updateGameRecordTargetRects];
_contentView.footerHidden = NO;
_contentView.buttonItem = nil;
ORKSpatialSpanMemoryStep *step = [self spatialSpanStep];
NSString *pluralItemName = step.customTargetPluralName ? : ORKLocalizedString(@"SPATIAL_SPAN_MEMORY_TARGET_PLURAL", nil);
NSString *standaloneItemName = step.customTargetPluralName ? : ORKLocalizedString(@"SPATIAL_SPAN_MEMORY_TARGET_STANDALONE", nil);
_contentView.capitalizedPluralItemDescription = [standaloneItemName capitalizedStringWithLocale:[NSLocale currentLocale]];
NSString *titleFormat = step.requireReversal ? ORKLocalizedString(@"MEMORY_GAME_GAMEPLAY_REVERSE_TITLE_%@", nil) : ORKLocalizedString(@"MEMORY_GAME_GAMEPLAY_TITLE_%@", nil);
NSString *title = [NSString stringWithFormat:titleFormat, pluralItemName];
[self.activeStepView updateTitle:title text:nil];
[self resetActivityTimer];
// Ensure tiles are all reset at this point
[_currentGameState reset];
[_contentView.gameView resetTilesAnimated:NO];
[_contentView setScore:_score];
[_contentView setNumberOfItems:_numberOfItems];
[self updateGameRecordOnStartingGamePlay];
}
- (void)finishGameplay {
[_activityTimer invalidate];
_activityTimer = nil;
}
- (void)gameView:(ORKSpatialSpanMemoryGameView *)gameView didTapTileWithIndex:(NSInteger)tileIndex recognizer:(UITapGestureRecognizer *)recognizer {
if (_state.state != ORKSpatialSpanStepStateGameplay) {
return;
}
[self updateGameRecordOnTouch:tileIndex location:[recognizer locationInView:self.view]];
ORKSpatialSpanResult result = [_currentGameState playTileIndex:tileIndex];
switch (result) {
case ORKSpatialSpanResultIgnore:
break;
case ORKSpatialSpanResultCorrect:
[gameView setState:ORKSpatialSpanTargetStateCorrect forTileIndex:tileIndex animated:YES];
NSInteger stepIndex = [_currentGameState currentStepIndex];
[self setNumberOfItems:_numberOfItems+1];
[self setScore:_score + (round(log2(stepIndex))+1)*5];
[self resetActivityTimer];
if ([_currentGameState isComplete]) {
[self transitionToState:ORKSpatialSpanStepStateSuccess];
}
break;
case ORKSpatialSpanResultIncorrect:
[gameView setState:ORKSpatialSpanTargetStateIncorrect forTileIndex:tileIndex animated:YES];
[self transitionToState:ORKSpatialSpanStepStateFailed];
break;
}
}
#pragma mark ORKSpatialSpanStepStateSuccess
- (void)updateGameCountersForSuccess:(BOOL)success {
ORKSpatialSpanMemoryStep *step = [self spatialSpanStep];
if (success) {
NSInteger sequenceLength = [_currentGameState.game sequenceLength];
[self setScore:_score + (round(log2(sequenceLength))+1)*5];
_gamesCounter++;
_consecutiveGamesFailed = 0;
_nextGameSequenceLength = MIN(_nextGameSequenceLength + 1, step.maximumSpan);
} else {
_gamesCounter++;
_consecutiveGamesFailed++;
_nextGameSequenceLength = MAX(_nextGameSequenceLength - 1, step.minimumSpan);
}
}
- (void)continueAction {
ORKSpatialSpanMemoryStep *step = [self spatialSpanStep];
if (_gamesCounter < step.maxTests && _consecutiveGamesFailed < step.maxConsecutiveFailures) {
// Generate a new game
[self transitionToState:ORKSpatialSpanStepStateRestart];
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);
} else {
[self finish];
}
}
- (void)showSuccess {
[self updateGameRecordOnSuccess];
[self updateGameCountersForSuccess:YES];
if ([self finishIfCompletedGames]) {
return;
}
[self.activeStepView updateTitle:ORKLocalizedString(@"MEMORY_GAME_COMPLETE_TITLE", nil) text:ORKLocalizedString(@"MEMORY_GAME_COMPLETE_MESSAGE", nil)];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.75 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
_contentView.buttonItem = [[UIBarButtonItem alloc] initWithTitle:ORKLocalizedString(@"BUTTON_NEXT", nil) style:UIBarButtonItemStylePlain target:self action:@selector(continueAction)];
});
}
#pragma mark ORKSpatialSpanStepStateFailed
- (void)tryAgainAction {
// Restart with a new, shorter game
[self transitionToState:ORKSpatialSpanStepStateRestart];
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);
}
- (BOOL)finishIfCompletedGames {
ORKSpatialSpanMemoryStep *step = [self spatialSpanStep];
if (_consecutiveGamesFailed >= step.maxConsecutiveFailures || _gamesCounter >= step.maxTests) {
[self transitionToState:ORKSpatialSpanStepStateComplete];
return YES;
}
return NO;
}
- (void)showFailed {
[self updateGameRecordOnFailure];
[self updateGameCountersForSuccess:NO];
if ([self finishIfCompletedGames]) {
return;
}
[self.activeStepView updateTitle:ORKLocalizedString(@"MEMORY_GAME_FAILED_TITLE", nil) text:ORKLocalizedString(@"MEMORY_GAME_FAILED_MESSAGE", nil)];
_contentView.buttonItem = [[UIBarButtonItem alloc] initWithTitle:ORKLocalizedString(@"BUTTON_NEXT", nil) style:UIBarButtonItemStylePlain target:self action:@selector(tryAgainAction)];
}
#pragma mark ORKSpatialSpanStepStateTimeout
- (void)showTimeout {
[self updateGameRecordOnTimeout];
[self updateGameCountersForSuccess:NO];
if ([self finishIfCompletedGames]) {
return;
}
[self.activeStepView updateTitle:ORKLocalizedString(@"MEMORY_GAME_TIMEOUT_TITLE", nil) text:ORKLocalizedString(@"MEMORY_GAME_TIMEOUT_MESSAGE", nil)];
_contentView.buttonItem = [[UIBarButtonItem alloc] initWithTitle:ORKLocalizedString(@"BUTTON_NEXT", nil) style:UIBarButtonItemStylePlain target:self action:@selector(tryAgainAction)];
}
#pragma mark ORKSpatialSpanStepStateComplete
- (void)showComplete {
[self.activeStepView updateTitle:ORKLocalizedString(@"MEMORY_GAME_COMPLETE_TITLE", nil) text:nil];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.75 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
_contentView.buttonItem = [[UIBarButtonItem alloc] initWithTitle:ORKLocalizedString(@"BUTTON_NEXT", nil) style:UIBarButtonItemStylePlain target:self action:@selector(continueAction)];
});
}
#pragma mark ORKSpatialSpanStepStateRestart
- (void)doRestart {
[self resetForNewGame];
dispatch_async(dispatch_get_main_queue(), ^{
// Dispatch, so we don't do this in the middle of a state transition
if (_state.state == ORKSpatialSpanStepStateRestart) {
[self transitionToState:ORKSpatialSpanStepStatePlayback];
}
});
}
- (void)showPausedFromState:(ORKState *)fromState {
[self updateGameRecordOnPause];
// Do not update game counters - doesn't count as a game.
[_activityTimer invalidate]; _activityTimer = nil;
[_playbackTimer invalidate]; _playbackTimer = nil;
[self resetForNewGame];
[self.activeStepView updateTitle:ORKLocalizedString(@"MEMORY_GAME_PAUSED_TITLE", nil) text:ORKLocalizedString(@"MEMORY_GAME_PAUSED_MESSAGE", nil)];
_contentView.buttonItem = [[UIBarButtonItem alloc] initWithTitle:ORKLocalizedString(@"BUTTON_NEXT", nil) style:UIBarButtonItemStylePlain target:self action:@selector(continueAction)];
}
#pragma mark State machine
- (void)initializeStates {
NSMutableDictionary *states = [NSMutableDictionary dictionary];
states[@(ORKSpatialSpanStepStateInitial)] = [ORKState stateWithState:ORKSpatialSpanStepStateInitial
entryHandler:^(ORKState *from, ORKState *to, ORKSpatialSpanMemoryStepViewController *this) {
[this resetGameAndUI];
}
exitHandler:nil context:self];
states[@(ORKSpatialSpanStepStatePlayback)] = [ORKState stateWithState:ORKSpatialSpanStepStatePlayback
entryHandler:^(ORKState *from, ORKState *to, ORKSpatialSpanMemoryStepViewController *this) {
[this startPlayback];
}
exitHandler:^(ORKState *from, ORKState *to, ORKSpatialSpanMemoryStepViewController *this) {
[this finishPlayback];
} context:self];
states[@(ORKSpatialSpanStepStateGameplay)] = [ORKState stateWithState:ORKSpatialSpanStepStateGameplay
entryHandler:^(ORKState *from, ORKState *to, ORKSpatialSpanMemoryStepViewController *this) {
[this startGameplay];
}
exitHandler:^(ORKState *from, ORKState *to, ORKSpatialSpanMemoryStepViewController *this) {
[this finishGameplay];
} context:self];
states[@(ORKSpatialSpanStepStateSuccess)] = [ORKState stateWithState:ORKSpatialSpanStepStateSuccess
entryHandler:^(ORKState *from, ORKState *to, ORKSpatialSpanMemoryStepViewController *this) {
[this showSuccess];
}
exitHandler:nil context:self];
states[@(ORKSpatialSpanStepStateFailed)] = [ORKState stateWithState:ORKSpatialSpanStepStateFailed
entryHandler:^(ORKState *from, ORKState *to, ORKSpatialSpanMemoryStepViewController *this) {
[this showFailed];
}
exitHandler:nil context:self];
states[@(ORKSpatialSpanStepStateTimeout)] = [ORKState stateWithState:ORKSpatialSpanStepStateTimeout
entryHandler:^(ORKState *from, ORKState *to, ORKSpatialSpanMemoryStepViewController *this) {
[this showTimeout];
}
exitHandler:nil context:self];
states[@(ORKSpatialSpanStepStateRestart)] = [ORKState stateWithState:ORKSpatialSpanStepStateRestart
entryHandler:^(ORKState *from, ORKState *to, ORKSpatialSpanMemoryStepViewController *this) {
[this doRestart];
}
exitHandler:nil context:self];
states[@(ORKSpatialSpanStepStateComplete)] = [ORKState stateWithState:ORKSpatialSpanStepStateComplete
entryHandler:^(ORKState *from, ORKState *to, ORKSpatialSpanMemoryStepViewController *this) {
[this showComplete];
} exitHandler:nil context:self];
states[@(ORKSpatialSpanStepStateStopped)] = [ORKState stateWithState:ORKSpatialSpanStepStateStopped
entryHandler:nil
exitHandler:nil
context:self];
states[@(ORKSpatialSpanStepStatePaused)] = [ORKState stateWithState:ORKSpatialSpanStepStatePaused
entryHandler:^(ORKState *from, ORKState *to, ORKSpatialSpanMemoryStepViewController *this) {
[this showPausedFromState:from];
} exitHandler:nil context:self];
_states = states;
[self transitionToState:ORKSpatialSpanStepStateInitial];
}
- (void)transitionToState:(ORKSpatialSpanStepState)state {
ORKState *stateObject = _states[@(state)];
ORKState *oldState = _state;
if (oldState.exitHandler != nil) {
oldState.exitHandler(oldState, stateObject, oldState.context);
}
_state = stateObject;
if (stateObject.entryHandler) {
stateObject.entryHandler(oldState, stateObject, stateObject.context);
}
}
@end
@@ -1,64 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger, ORKSpatialSpanTargetState) {
ORKSpatialSpanTargetStateQuiescent,
ORKSpatialSpanTargetStateActive,
ORKSpatialSpanTargetStateCorrect,
ORKSpatialSpanTargetStateIncorrect
};
@class ORKSpatialSpanTargetView;
@protocol ORKSpatialSpanTargetViewDelegate<NSObject>
- (void)targetView:(ORKSpatialSpanTargetView *)targetView recognizer:(UITapGestureRecognizer *)recognizer;
@end
@interface ORKSpatialSpanTargetView : UIView
@property (nonatomic, weak, nullable) id<ORKSpatialSpanTargetViewDelegate> delegate;
@property (nonatomic, assign) ORKSpatialSpanTargetState state;
- (void)setState:(ORKSpatialSpanTargetState)state animated:(BOOL)animated;
@property (nonatomic, strong, nullable) UIColor *color;
@property (nonatomic, strong, nullable) UIImage *customTargetImage;
@end
NS_ASSUME_NONNULL_END
@@ -1,379 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKSpatialSpanTargetView.h"
#import "ORKHelpers.h"
#import "ORKSkin.h"
#import "ORKTintedImageView.h"
#import "ORKAccessibility.h"
#import "ORKDefines_Private.h"
static const UIEdgeInsets _ORKFlowerMargins = (UIEdgeInsets){12,12,12,12};
static const CGSize ORKFlowerBezierPathSize = (CGSize){90,90};
static UIBezierPath *ORKFlowerBezierPath() {
UIBezierPath *bezierPath = UIBezierPath.bezierPath;
[bezierPath moveToPoint: CGPointMake(58.8, 45)];
[bezierPath addCurveToPoint: CGPointMake(51.9, 33.2) controlPoint1: CGPointMake(107.8, 41.8) controlPoint2: CGPointMake(79.3, -7.2)];
[bezierPath addCurveToPoint: CGPointMake(38.1, 33.2) controlPoint1: CGPointMake(73.6, -10.4) controlPoint2: CGPointMake(16.5, -10.4)];
[bezierPath addCurveToPoint: CGPointMake(31.2, 45) controlPoint1: CGPointMake(10.8, -7.2) controlPoint2: CGPointMake(-17.8, 41.8)];
[bezierPath addCurveToPoint: CGPointMake(38.1, 56.8) controlPoint1: CGPointMake(-17.8, 48.2) controlPoint2: CGPointMake(10.7, 97.2)];
[bezierPath addCurveToPoint: CGPointMake(51.9, 56.8) controlPoint1: CGPointMake(16.4, 100.4) controlPoint2: CGPointMake(73.5, 100.4)];
[bezierPath addCurveToPoint: CGPointMake(58.8, 45) controlPoint1: CGPointMake(79.2, 97.2) controlPoint2: CGPointMake(107.8, 48.2)];
[bezierPath closePath];
[bezierPath moveToPoint: CGPointMake(45, 53.1)];
[bezierPath addCurveToPoint: CGPointMake(36.7, 45) controlPoint1: CGPointMake(40.4, 53.1) controlPoint2: CGPointMake(36.7, 49.5)];
[bezierPath addCurveToPoint: CGPointMake(45, 36.9) controlPoint1: CGPointMake(36.7, 40.5) controlPoint2: CGPointMake(40.4, 36.9)];
[bezierPath addCurveToPoint: CGPointMake(53.3, 45) controlPoint1: CGPointMake(49.6, 36.9) controlPoint2: CGPointMake(53.3, 40.5)];
[bezierPath addCurveToPoint: CGPointMake(45, 53.1) controlPoint1: CGPointMake(53.3, 49.5) controlPoint2: CGPointMake(49.6, 53.1)];
[bezierPath closePath];
bezierPath.miterLimit = 4;
return bezierPath;
}
static const CGSize ORKCheckBezierPathSize = (CGSize){28,28};
static UIBezierPath *ORKCheckBezierPath() {
UIBezierPath *bezierPath = UIBezierPath.bezierPath;
[bezierPath moveToPoint: CGPointMake(11.6, 19)];
[bezierPath addCurveToPoint: CGPointMake(11.1, 18.8) controlPoint1: CGPointMake(11.4, 19) controlPoint2: CGPointMake(11.2, 18.9)];
[bezierPath addLineToPoint: CGPointMake(7.5, 15.5)];
[bezierPath addCurveToPoint: CGPointMake(7.5, 14.4) controlPoint1: CGPointMake(7.2, 15.2) controlPoint2: CGPointMake(7.2, 14.7)];
[bezierPath addCurveToPoint: CGPointMake(8.6, 14.4) controlPoint1: CGPointMake(7.8, 14.1) controlPoint2: CGPointMake(8.3, 14.1)];
[bezierPath addLineToPoint: CGPointMake(11.6, 17.2)];
[bezierPath addLineToPoint: CGPointMake(19.6, 9.2)];
[bezierPath addCurveToPoint: CGPointMake(20.7, 9.2) controlPoint1: CGPointMake(19.9, 8.9) controlPoint2: CGPointMake(20.4, 8.9)];
[bezierPath addCurveToPoint: CGPointMake(20.7, 10.3) controlPoint1: CGPointMake(21, 9.5) controlPoint2: CGPointMake(21, 10)];
[bezierPath addLineToPoint: CGPointMake(12.2, 18.8)];
[bezierPath addCurveToPoint: CGPointMake(11.6, 19) controlPoint1: CGPointMake(12, 18.9) controlPoint2: CGPointMake(11.8, 19)];
[bezierPath closePath];
bezierPath.miterLimit = 4;
return bezierPath;
}
static const CGSize ORKErrorBezierPathSize = (CGSize){28,28};
static UIBezierPath *ORKErrorBezierPath() {
UIBezierPath *bezier3Path = UIBezierPath.bezierPath;
[bezier3Path moveToPoint: CGPointMake(15.1, 14)];
[bezier3Path addLineToPoint: CGPointMake(18.8, 10.3)];
[bezier3Path addCurveToPoint: CGPointMake(18.8, 9.2) controlPoint1: CGPointMake(19.1, 10) controlPoint2: CGPointMake(19.1, 9.5)];
[bezier3Path addCurveToPoint: CGPointMake(17.7, 9.2) controlPoint1: CGPointMake(18.5, 8.9) controlPoint2: CGPointMake(18, 8.9)];
[bezier3Path addLineToPoint: CGPointMake(14, 12.9)];
[bezier3Path addLineToPoint: CGPointMake(10.3, 9.2)];
[bezier3Path addCurveToPoint: CGPointMake(9.2, 9.2) controlPoint1: CGPointMake(10, 8.9) controlPoint2: CGPointMake(9.5, 8.9)];
[bezier3Path addCurveToPoint: CGPointMake(9.2, 10.3) controlPoint1: CGPointMake(8.9, 9.5) controlPoint2: CGPointMake(8.9, 10)];
[bezier3Path addLineToPoint: CGPointMake(12.9, 14)];
[bezier3Path addLineToPoint: CGPointMake(9.2, 17.7)];
[bezier3Path addCurveToPoint: CGPointMake(9.2, 18.8) controlPoint1: CGPointMake(8.9, 18) controlPoint2: CGPointMake(8.9, 18.5)];
[bezier3Path addCurveToPoint: CGPointMake(9.7, 19) controlPoint1: CGPointMake(9.3, 18.9) controlPoint2: CGPointMake(9.5, 19)];
[bezier3Path addCurveToPoint: CGPointMake(10.2, 18.8) controlPoint1: CGPointMake(9.9, 19) controlPoint2: CGPointMake(10.1, 18.9)];
[bezier3Path addLineToPoint: CGPointMake(13.9, 15.1)];
[bezier3Path addLineToPoint: CGPointMake(17.6, 18.8)];
[bezier3Path addCurveToPoint: CGPointMake(18.1, 19) controlPoint1: CGPointMake(17.7, 18.9) controlPoint2: CGPointMake(17.9, 19)];
[bezier3Path addCurveToPoint: CGPointMake(18.6, 18.8) controlPoint1: CGPointMake(18.3, 19) controlPoint2: CGPointMake(18.5, 18.9)];
[bezier3Path addCurveToPoint: CGPointMake(18.6, 17.7) controlPoint1: CGPointMake(18.9, 18.5) controlPoint2: CGPointMake(18.9, 18)];
[bezier3Path addLineToPoint: CGPointMake(15.1, 14)];
[bezier3Path closePath];
bezier3Path.miterLimit = 4;
return bezier3Path;
}
@interface ORKPathView : UIView
- (instancetype)initWithBezierPath:(UIBezierPath *)path canvasSize:(CGSize)canvasSize canvasMargins:(UIEdgeInsets)margins color:(UIColor *)color;
@property (nonatomic, readonly) UIEdgeInsets canvasMargins;
@property (nonatomic, readonly) CGSize canvasSize;
@property (nonatomic, readonly, strong) UIBezierPath *path;
@property (nonatomic, readonly, strong) UIColor *color;
@end
@implementation ORKPathView
- (instancetype)initWithBezierPath:(UIBezierPath *)path canvasSize:(CGSize)canvasSize canvasMargins:(UIEdgeInsets)margins color:(UIColor *)color
{
CGRect r = (CGRect){CGPointZero, canvasSize};
CGRect outsetRect = UIEdgeInsetsInsetRect(r, (UIEdgeInsets){.top=-margins.top,.left=-margins.left,.right=-margins.right,.bottom=-margins.bottom});
self = [super initWithFrame:outsetRect];
if (self) {
_canvasMargins = margins;
_canvasSize = canvasSize;
_path = path;
_color = color;
self.tintColor = color;
self.opaque = NO;
[self setNeedsDisplay];
}
return self;
}
- (void)setColor:(UIColor *)color {
_color = color;
self.tintColor = color;
[self setNeedsDisplay];
}
- (void)drawRect:(CGRect)rect {
CGRect bds = [self bounds];
CGContextRef ctx = UIGraphicsGetCurrentContext();
[[UIColor clearColor] setFill];
CGContextFillRect(ctx, bds);
CGFloat baseWidth = _canvasSize.width + _canvasMargins.left + _canvasMargins.right;
CGFloat baseHeight = _canvasSize.height + _canvasMargins.top + _canvasMargins.bottom;
CGFloat aspectRatio = MIN( bds.size.width / baseWidth, bds.size.height / baseHeight);
CGContextSaveGState(ctx);
CGContextScaleCTM(ctx, aspectRatio, aspectRatio);
CGContextTranslateCTM(ctx, _canvasMargins.left, _canvasMargins.top);
[self.tintColor setFill];
[_path fill];
CGContextRestoreGState(ctx);
}
- (void)tintColorDidChange {
[self setNeedsDisplay];
}
@end
@implementation ORKSpatialSpanTargetView {
UITapGestureRecognizer *_tapRecognizer;
CGFloat _flowerScaleFactor;
UIView *_flowerView;
UIView *_checkView;
UIView *_errorView;
}
- (UIView *)newFlowerViewWithImage:(UIImage *)image {
if (image == nil) {
return [[ORKPathView alloc] initWithBezierPath:ORKFlowerBezierPath() canvasSize:ORKFlowerBezierPathSize canvasMargins:_ORKFlowerMargins color:[UIColor blackColor]];
} else {
ORKTintedImageView *imageView = [[ORKTintedImageView alloc] initWithImage:image];
imageView.shouldApplyTint = YES;
imageView.contentMode = UIViewContentModeScaleAspectFit;
return imageView;
}
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
_tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self addGestureRecognizer:_tapRecognizer];
_flowerScaleFactor = 1;
_flowerView = [self newFlowerViewWithImage:nil];
[self addSubview:_flowerView];
_checkView = [[ORKPathView alloc] initWithBezierPath:ORKCheckBezierPath() canvasSize:ORKCheckBezierPathSize canvasMargins:UIEdgeInsetsZero color:[self tintColor]];
_checkView.backgroundColor = [UIColor whiteColor];
_checkView.layer.masksToBounds = YES;
_checkView.hidden = YES;
[self addSubview:_checkView];
_errorView = [[ORKPathView alloc] initWithBezierPath:ORKErrorBezierPath() canvasSize:ORKErrorBezierPathSize canvasMargins:UIEdgeInsetsZero color:[UIColor ork_redColor]];
_errorView.backgroundColor = [UIColor whiteColor];
_errorView.layer.masksToBounds = YES;
_errorView.hidden = YES;
[self addSubview:_errorView];
for (UIView *view in @[_flowerView, _checkView, _errorView]) {
view.isAccessibilityElement = NO;
}
}
return self;
}
- (void)setCustomTargetImage:(UIImage *)customTargetImage {
UIImage *oldTargetImage = _customTargetImage;
_customTargetImage = customTargetImage;
if ((customTargetImage == nil) != (oldTargetImage == nil)) {
[_flowerView removeFromSuperview];
_flowerView = [self newFlowerViewWithImage:customTargetImage];
_flowerScaleFactor = (customTargetImage ? 0.8 : 1);
_flowerView.transform = CGAffineTransformMakeScale(_flowerScaleFactor, _flowerScaleFactor);
[self insertSubview:_flowerView atIndex:0];
} else if (customTargetImage) {
[(UIImageView *)_flowerView setImage:customTargetImage];
}
[self setNeedsLayout];
}
- (void)handleTap:(UITapGestureRecognizer *)recognizer {
[_delegate targetView:self recognizer:recognizer];
}
- (void)setState:(ORKSpatialSpanTargetState)state {
[self setState:state animated:NO];
}
- (void)tintColorDidChange {
if ([_checkView isKindOfClass:[ORKPathView class]]) {
[(ORKPathView *)_checkView setColor:[self tintColor]];
}
[self setState:_state];
}
- (void)setState:(ORKSpatialSpanTargetState)state animated:(BOOL)animated {
_state = state;
CGFloat newAlpha;
BOOL checkHidden = YES;
BOOL errorHidden = YES;
CGAffineTransform newTransform = CGAffineTransformMakeScale(_flowerScaleFactor, _flowerScaleFactor);
CGFloat oldCircleAlpha = [_errorView.layer.presentationLayer opacity];
CGFloat newCircleAlpha;
CGAffineTransform oldCircleTransform = CGAffineTransformIdentity;
CGAffineTransform newCircleTransform = CGAffineTransformIdentity;
BOOL useSpring = NO;
NSTimeInterval duration = 0.3;
switch (state) {
case ORKSpatialSpanTargetStateQuiescent:
_flowerView.tintColor = [self tintColor];
newAlpha = 0.2;
newCircleAlpha = 0.0;
newCircleTransform = CGAffineTransformMakeScale(0.2, 0.2);
break;
case ORKSpatialSpanTargetStateActive:
_flowerView.tintColor = [self tintColor];
newAlpha = 1.0;
newCircleTransform = CGAffineTransformMakeScale(0.2, 0.2);
newCircleAlpha = 0.0;
break;
case ORKSpatialSpanTargetStateIncorrect:
_flowerView.tintColor = [UIColor ork_redColor];
newTransform = CGAffineTransformMakeScale(0.9*_flowerScaleFactor, 0.9*_flowerScaleFactor);
oldCircleAlpha = 0;
newCircleAlpha = 1;
oldCircleTransform = CGAffineTransformMakeScale(0.2, 0.2);
newCircleTransform = CGAffineTransformMakeScale(1.0, 1.0);
newAlpha = 1.0;
errorHidden = NO;
useSpring = NO;
break;
case ORKSpatialSpanTargetStateCorrect:
_flowerView.tintColor = [self tintColor];
newTransform = CGAffineTransformMakeScale(1.1*_flowerScaleFactor, 1.1*_flowerScaleFactor);
oldCircleAlpha = 0;
newCircleAlpha = 1;
oldCircleTransform = CGAffineTransformMakeScale(0.2, 0.2);
newCircleTransform = CGAffineTransformMakeScale(1.0, 1.0);
newAlpha = 1.0;
checkHidden = NO;
useSpring = YES;
duration = 0.5;
break;
}
_checkView.alpha = oldCircleAlpha;
_errorView.alpha = newCircleAlpha;
_checkView.transform = oldCircleTransform;
_errorView.transform = oldCircleTransform;
_errorView.hidden = errorHidden;
_checkView.hidden = checkHidden;
_flowerView.transform = CGAffineTransformMakeScale(_flowerScaleFactor, _flowerScaleFactor);
[UIView animateWithDuration:(animated?duration:0) delay:0 usingSpringWithDamping:useSpring?0.5:1 initialSpringVelocity:0 options:(UIViewAnimationOptions)UIViewAnimationOptionBeginFromCurrentState animations:^{
_errorView.alpha = newCircleAlpha;
_checkView.alpha = newCircleAlpha;
_errorView.transform = newCircleTransform;
_checkView.transform = newCircleTransform;
self.alpha = newAlpha;
_flowerView.transform = newTransform;
} completion:NULL];
}
- (void)layoutSubviews {
[super layoutSubviews];
CGRect bds = self.bounds;
_flowerView.center = (CGPoint){CGRectGetMidX(bds), CGRectGetMidY(bds)};
_flowerView.bounds = bds;
_flowerView.transform = CGAffineTransformMakeScale(_flowerScaleFactor, _flowerScaleFactor);
CGFloat designWidth = ORKFlowerBezierPathSize.width + _ORKFlowerMargins.left + _ORKFlowerMargins.right;
CGFloat scaleFactor = bds.size.width / designWidth;
CGAffineTransform tfm = CGAffineTransformMakeScale(scaleFactor, scaleFactor);
CGRect checkRect = CGRectApplyAffineTransform((CGRect){CGPointZero,ORKCheckBezierPathSize}, tfm);
[_checkView setBounds:checkRect];
_checkView.layer.cornerRadius = checkRect.size.width/2;
CGRect errorRect = CGRectApplyAffineTransform((CGRect){CGPointZero,ORKErrorBezierPathSize}, tfm);
[_errorView setBounds:errorRect];
_errorView.layer.cornerRadius = errorRect.size.width/2;
_errorView.center = _flowerView.center;
_checkView.center = _flowerView.center;
}
#pragma mark Accessibility
- (BOOL)isAccessibilityElement {
return YES;
}
- (NSString *)accessibilityLabel {
NSString *state;
switch (self.state) {
case ORKSpatialSpanTargetStateActive:
state = ORKLocalizedString(@"AX.MEMORY.TILE.ACTIVE", nil);
break;
case ORKSpatialSpanTargetStateCorrect:
state = ORKLocalizedString(@"AX.MEMORY.TILE.CORRECT", nil);
break;
case ORKSpatialSpanTargetStateIncorrect:
state = ORKLocalizedString(@"AX.MEMORY.TILE.INCORRECT", nil);
break;
case ORKSpatialSpanTargetStateQuiescent:
state = ORKLocalizedString(@"AX.MEMORY.TILE.QUIESCENT", nil);
break;
}
return ORKAccessibilityStringForVariables(ORKLocalizedString(@"AX.MEMORY.TILE.LABEL", nil), state);
}
@end
@@ -1,47 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKCustomStepView_Internal.h"
#import "ORKRoundTappingButton.h"
NS_ASSUME_NONNULL_BEGIN
@interface ORKTappingContentView : ORKActiveStepCustomView
- (void)setTapCount:(NSUInteger)tapCount;
- (void)setProgress:(CGFloat)progress animated:(BOOL)animated;
@property (nonatomic, strong, readonly) ORKRoundTappingButton *tapButton1;
@property (nonatomic, strong, readonly) ORKRoundTappingButton *tapButton2;
@end
NS_ASSUME_NONNULL_END
@@ -1,243 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKTappingContentView.h"
#import "ORKActiveStepTimer.h"
#import "ORKResult.h"
#import "ORKSkin.h"
#import "ORKSubheadlineLabel.h"
#import "ORKTapCountLabel.h"
#import "ORKHelpers.h"
@interface ORKTappingContentView ()
@property (nonatomic, strong) ORKSubheadlineLabel *tapCaptionLabel;
@property (nonatomic, strong) ORKTapCountLabel *tapCountLabel;
@property (nonatomic, strong) UIProgressView *progressView;
@end
@implementation ORKTappingContentView {
NSArray *_constraints;
ORKScreenType _screenType;
UIView *_buttonContainer;
}
- (instancetype)init {
self = [super init];
if (self) {
_screenType = ORKScreenTypeiPhone4;
_tapCaptionLabel = [ORKSubheadlineLabel new];
_tapCaptionLabel.textAlignment = NSTextAlignmentCenter;
_tapCaptionLabel.translatesAutoresizingMaskIntoConstraints = NO;
_tapCountLabel = [ORKTapCountLabel new];
_tapCountLabel.textAlignment = NSTextAlignmentCenter;
_tapCountLabel.translatesAutoresizingMaskIntoConstraints = NO;
_buttonContainer = [UIView new];
_buttonContainer.translatesAutoresizingMaskIntoConstraints = NO;
_progressView = [UIProgressView new];
_progressView.translatesAutoresizingMaskIntoConstraints = NO;
_progressView.progressTintColor = [self tintColor];
[_progressView setAlpha:0];
_tapButton1 = [[ORKRoundTappingButton alloc] init];
_tapButton1.translatesAutoresizingMaskIntoConstraints = NO;
[_tapButton1 setTitle:ORKLocalizedString(@"TAP_BUTTON_TITLE", nil) forState:UIControlStateNormal];
_tapButton2 = [[ORKRoundTappingButton alloc] init];
_tapButton2.translatesAutoresizingMaskIntoConstraints = NO;
[_tapButton2 setTitle:ORKLocalizedString(@"TAP_BUTTON_TITLE", nil) forState:UIControlStateNormal];
[self addSubview:_tapCaptionLabel];
[self addSubview:_tapCountLabel];
[self addSubview:_progressView];
[self addSubview:_buttonContainer];
[_buttonContainer addSubview:_tapButton1];
[_buttonContainer addSubview:_tapButton2];
self.translatesAutoresizingMaskIntoConstraints = NO;
_tapCaptionLabel.text = ORKLocalizedString(@"TOTAL_TAPS_LABEL", nil);
[self setTapCount:0];
[self setNeedsUpdateConstraints];
_tapCountLabel.accessibilityTraits |= UIAccessibilityTraitUpdatesFrequently;
}
return self;
}
- (void)tintColorDidChange {
[super tintColorDidChange];
_progressView.progressTintColor = [self tintColor];
}
- (void)setTapCount:(NSUInteger)tapCount {
_tapCountLabel.text = [NSString stringWithFormat:@"%02lu", (unsigned long)tapCount];
}
- (void)setProgress:(CGFloat)progress animated:(BOOL)animated {
[_progressView setProgress:progress animated:animated];
[UIView animateWithDuration:animated ? 0.2 : 0 animations:^{
[_progressView setAlpha:(progress == 0) ? 0 : 1];
}];
}
- (void)resetStep:(ORKActiveStepViewController *)viewController {
[super resetStep:viewController];
[self setTapCount:0];
_tapButton1.enabled = YES;
_tapButton2.enabled = YES;
}
- (void)finishStep:(ORKActiveStepViewController *)viewController {
[super finishStep:viewController];
_tapButton1.enabled = NO;
_tapButton2.enabled = NO;
}
- (void)willMoveToWindow:(UIWindow *)newWindow {
[super willMoveToWindow:newWindow];
_screenType = ORKGetScreenTypeForWindow(newWindow);
[self setNeedsUpdateConstraints];
}
- (void)updateConstraints {
if ([_constraints count]) {
[NSLayoutConstraint deactivateConstraints:_constraints];
_constraints = nil;
}
ORKScreenType screenType = _screenType;
const CGFloat HeaderBaselineToCaptionTop = ORKGetMetricForScreenType(ORKScreenMetricCaptionBaselineToTappingLabelTop, screenType);
const CGFloat AssumedHeaderBaselineToStepViewTop = ORKGetMetricForScreenType(ORKScreenMetricLearnMoreBaselineToStepViewTop, screenType);
CGFloat margin = ORKStandardMarginForView(self);
self.layoutMargins = (UIEdgeInsets) { .left=margin*2, .right=margin*2 };
static const CGFloat CaptionBaselineToTapCountBaseline = 56;
static const CGFloat TapButtonBottomToBottom = 36;
NSMutableArray *constraints = [NSMutableArray array];
NSDictionary *views = NSDictionaryOfVariableBindings(_buttonContainer, _tapCaptionLabel, _tapCountLabel, _progressView, _tapButton1, _tapButton2);
[constraints addObject:[NSLayoutConstraint constraintWithItem:_progressView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeTop
multiplier:1 constant:(HeaderBaselineToCaptionTop/3) - AssumedHeaderBaselineToStepViewTop]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_tapCaptionLabel
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeTop
multiplier:1 constant:(HeaderBaselineToCaptionTop - AssumedHeaderBaselineToStepViewTop)]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_tapCountLabel
attribute:NSLayoutAttributeFirstBaseline
relatedBy:NSLayoutRelationEqual
toItem:_tapCaptionLabel
attribute:NSLayoutAttributeFirstBaseline
multiplier:1 constant:CaptionBaselineToTapCountBaseline]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:_buttonContainer
attribute:NSLayoutAttributeBottom
multiplier:1 constant:TapButtonBottomToBottom]];
[constraints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_tapCountLabel]-(>=10)-[_buttonContainer]"
options:NSLayoutFormatAlignAllCenterX
metrics:nil views:views]];
[constraints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_progressView]-|"
options:(NSLayoutFormatOptions)0
metrics:nil views:views]];
NSLayoutConstraint *wideProgress = [NSLayoutConstraint constraintWithItem:_progressView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:2000];
wideProgress.priority = UILayoutPriorityRequired-1;
[constraints addObject:wideProgress];
[constraints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_tapCaptionLabel]-|"
options:(NSLayoutFormatOptions)0
metrics:nil views:views]];
[constraints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_tapCountLabel]-|"
options:(NSLayoutFormatOptions)0
metrics:nil views:views]];
[constraints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_tapButton1]|"
options:(NSLayoutFormatOptions)0
metrics:nil views:views]];
[constraints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_tapButton2]|"
options:(NSLayoutFormatOptions)0
metrics:nil views:views]];
[constraints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_tapButton1]-(>=24)-[_tapButton2(==_tapButton1)]|"
options:(NSLayoutFormatOptions)0
metrics:nil views:views]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:_tapButton1
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:_tapButton2
attribute:NSLayoutAttributeCenterY
multiplier:1 constant:0]];
_constraints = constraints;
[self addConstraints:_constraints];
[NSLayoutConstraint activateConstraints:constraints];
[super updateConstraints];
}
@end
@@ -1,40 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit_Private.h>
NS_ASSUME_NONNULL_BEGIN
ORK_CLASS_AVAILABLE
@interface ORKTappingIntervalStep : ORKActiveStep
@end
NS_ASSUME_NONNULL_END
@@ -1,54 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKTappingIntervalStep.h"
#import "ORKTappingIntervalStepViewController.h"
@implementation ORKTappingIntervalStep
+ (Class)stepViewControllerClass {
return [ORKTappingIntervalStepViewController class];
}
- (void)validateParameters {
[super validateParameters];
NSTimeInterval const ORKTwoFingerTappingMinimumDuration = 5.0;
if ( self.stepDuration < ORKTwoFingerTappingMinimumDuration) {
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"duration can not be shorter than %@ seconds.", @(ORKTwoFingerTappingMinimumDuration)] userInfo:nil];
}
}
@end
@@ -1,40 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit_Private.h>
NS_ASSUME_NONNULL_BEGIN
ORK_CLASS_AVAILABLE
@interface ORKTappingIntervalStepViewController : ORKActiveStepViewController
@end
NS_ASSUME_NONNULL_END
@@ -1,222 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKTappingIntervalStepViewController.h"
#import "ORKTappingContentView.h"
#import "ORKActiveStepViewController_internal.h"
#import "ORKVerticalContainerView.h"
#import "ORKStepViewController_Internal.h"
#import "ORKActiveStepTimer.h"
#import "ORKResult.h"
#import "ORKHelpers.h"
#import "ORKActiveStepView.h"
@interface ORKTappingIntervalStepViewController () <UIGestureRecognizerDelegate>
@property (nonatomic, strong) NSMutableArray *samples;
@end
@implementation ORKTappingIntervalStepViewController {
ORKTappingContentView *_tappingContentView;
NSTimeInterval _tappingStart;
BOOL _expired;
CGRect _buttonRect1;
CGRect _buttonRect2;
CGSize _viewSize;
NSUInteger _hitButtonCount;
UIGestureRecognizer *_touchDownRecognizer;
}
- (instancetype)initWithStep:(ORKStep *)step {
self = [super initWithStep:step];
if (self) {
self.suspendIfInactive = YES;
}
return self;
}
- (void)initializeInternalButtonItems
{
[super initializeInternalButtonItems];
// Don't show next button
self.internalContinueButtonItem = nil;
self.internalDoneButtonItem = nil;
}
- (void)viewDidLoad {
[super viewDidLoad];
_tappingStart = 0;
_touchDownRecognizer = [UIGestureRecognizer new];
_touchDownRecognizer.delegate = self;
[self.view addGestureRecognizer:_touchDownRecognizer];
self.activeStepView.stepViewFillsAvailableSpace = YES;
self.timerUpdateInterval = 0.1;
_expired = NO;
_tappingContentView = [[ORKTappingContentView alloc] init];
self.activeStepView.activeCustomView = _tappingContentView;
[_tappingContentView.tapButton1 addTarget:self action:@selector(buttonPressed:forEvent:) forControlEvents:UIControlEventTouchDown];
[_tappingContentView.tapButton2 addTarget:self action:@selector(buttonPressed:forEvent:) forControlEvents:UIControlEventTouchDown];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
_buttonRect1 = [self.view convertRect:_tappingContentView.tapButton1.bounds fromView:_tappingContentView.tapButton1];
_buttonRect2 = [self.view convertRect:_tappingContentView.tapButton2.bounds fromView:_tappingContentView.tapButton2];
_viewSize = self.view.frame.size;
}
- (ORKStepResult *)result {
ORKStepResult *sResult = [super result];
// "Now" is the end time of the result, which is either actually now,
// or the last time we were in the responder chain.
NSDate *now = sResult.endDate;
NSMutableArray *results = [NSMutableArray arrayWithArray:sResult.results];
ORKTappingIntervalResult *tappingResult = [[ORKTappingIntervalResult alloc] initWithIdentifier:(NSString *__nonnull)self.step.identifier];
tappingResult.startDate = sResult.startDate;
tappingResult.endDate = now;
tappingResult.buttonRect1 = _buttonRect1;
tappingResult.buttonRect2 = _buttonRect2;
tappingResult.stepViewSize = _viewSize;
tappingResult.samples = _samples;
[results addObject:tappingResult];
sResult.results = [results copy];
return sResult;
}
- (void)receiveTouch:(UITouch *)touch onButton:(ORKTappingButtonIdentifier)buttonIdentifier {
if (_expired || self.samples == nil) {
return;
}
NSTimeInterval ti = CACurrentMediaTime();
if (_tappingStart == 0) {
_tappingStart = ti;
}
CGPoint location = [touch locationInView:self.view];
// Add new sample
ti = ti-_tappingStart;
ORKTappingSample *sample = [[ORKTappingSample alloc] init];
sample.buttonIdentifier = buttonIdentifier;
sample.location = location;
sample.timestamp = ti;
[self.samples addObject:sample];
if (buttonIdentifier == ORKTappingButtonIdentifierLeft || buttonIdentifier == ORKTappingButtonIdentifierRight) {
_hitButtonCount++;
}
// Update label
[_tappingContentView setTapCount:_hitButtonCount];
}
- (void)stepDidFinish {
[super stepDidFinish];
_expired = YES;
[_tappingContentView finishStep:self];
[self goForward];
}
- (void)countDownTimerFired:(ORKActiveStepTimer *)timer finished:(BOOL)finished {
CGFloat progress = finished ? 1 : (timer.runtime / timer.duration);
[_tappingContentView setProgress:progress animated:YES];
[super countDownTimerFired:timer finished:finished];
}
- (void)start {
[super start];
[_tappingContentView setProgress:0.001 animated:NO];
}
#pragma mark buttonAction
- (IBAction)buttonPressed:(id)button forEvent:(UIEvent *)event {
if (self.samples == nil) {
// Start timer on first touch event on button
_samples = [NSMutableArray array];
_hitButtonCount = 0;
[self start];
}
NSInteger index = (button == _tappingContentView.tapButton1) ? ORKTappingButtonIdentifierLeft : ORKTappingButtonIdentifierRight;
[self receiveTouch:[[event touchesForView:button] anyObject] onButton:index] ;
}
#pragma mark UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
CGPoint location = [touch locationInView:self.view];
BOOL shouldReceive = !(CGRectContainsPoint(_buttonRect1, location) || CGRectContainsPoint(_buttonRect2, location));
if (shouldReceive && touch.phase == UITouchPhaseBegan) {
[self receiveTouch:touch onButton:ORKTappingButtonIdentifierNone];
}
return NO;
}
@end
@@ -1,54 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKRecorder.h>
NS_ASSUME_NONNULL_BEGIN
/**
The `ORKTouchRecorder` class defines the attributes and behavior of touch events recorder.
This class is considered private because its interface is not yet considered
stable. It is not currently used by any of the pre-defined active tasks.
*/
ORK_CLASS_AVAILABLE
@interface ORKTouchRecorder : ORKRecorder
/**
The `ORKTouchRecorder` attaches a gesture recognizer to `touchView` to receive touch events.
Use `-viewController:willStartStepWithView:` to set the `touchView` property before
the touch recorder starts.
*/
@property (nonatomic, strong, readonly, nullable) UIView *touchView;
@end
NS_ASSUME_NONNULL_END
-265
View File
@@ -1,265 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKTouchRecorder.h"
#import "ORKDataLogger.h"
#import "ORKRecorder_Internal.h"
#import "ORKRecorder_Private.h"
#import "UITouch+ORKJSONDictionary.h"
@protocol ORKTouchRecordingDelegate <NSObject>
- (void)view:(UIView *)view didDetectTouch:(UITouch *)touch;
@end
@interface ORKTouchGestureRecognizer : UIGestureRecognizer
@property (nonatomic, weak) id<ORKTouchRecordingDelegate> eventDelegate;
@end
@implementation ORKTouchGestureRecognizer
- (instancetype)init
{
self = [super init];
if (self) {
}
return self;
}
- (void)reportTouches:(NSSet *)touches {
for (UITouch *touch in touches) {
[self.eventDelegate view:self.view didDetectTouch:touch];
}
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self reportTouches:touches];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[self reportTouches:touches];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self reportTouches:touches];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[self reportTouches:touches];
}
@end
@interface ORKTouchRecordingView : UIView
@property (nonatomic, weak) id<ORKTouchRecordingDelegate> deleagte;
@end
@interface ORKTouchRecorder () <ORKTouchRecordingDelegate>
{
ORKDataLogger *_logger;
}
@property (nonatomic, strong) ORKTouchGestureRecognizer *gestureRecognizer;
@property (nonatomic, strong) NSMutableArray *touchArray;
@property (nonatomic) NSTimeInterval uptime;
@property (nonatomic, strong) NSError *recordingError;
@end
@implementation ORKTouchRecorder
- (instancetype)initWithStep:(ORKStep *)step outputDirectory:(NSURL *)outputDirectory
{
self = [super initWithStep:step
outputDirectory:(NSURL *)outputDirectory];
return self;
}
- (void)dealloc
{
[_logger finishCurrentLog];
}
- (void)viewController:(UIViewController *)viewController willStartStepWithView:(UIView *)view {
if (self.isRecording == NO) {
_touchView = view;
}
}
- (void)start {
if (! _logger) {
NSError *err = nil;
_logger = [self makeJSONDataLoggerWithError:&err];
if (! _logger) {
[self finishRecordingWithError:err];
return;
}
}
if (self.touchView) {
[self.touchView addGestureRecognizer:self.gestureRecognizer];
[super start];
self.touchArray = [NSMutableArray array];
_uptime = [NSProcessInfo processInfo].systemUptime;
}
else
{
@throw [NSException exceptionWithName:NSGenericException
reason:@"No touch capture view provided"
userInfo:@{@"recorder": self}];
}
}
- (ORKTouchGestureRecognizer *)gestureRecognizer {
if (_gestureRecognizer == nil) {
_gestureRecognizer = [ORKTouchGestureRecognizer new];
_gestureRecognizer.eventDelegate = self;
}
return _gestureRecognizer;
}
- (void)stop {
[self doStopRecording];
[_logger finishCurrentLog];
NSError *error = nil;
__block NSURL *fileUrl = nil;
[_logger enumerateLogs:^(NSURL *logFileUrl, BOOL *stop) {
fileUrl = logFileUrl;
} error:&error];
[self reportFileResultWithFile:fileUrl error:error];
[super stop];
}
- (void)doStopRecording
{
if (_touchView)
{
[self.touchView removeGestureRecognizer:self.gestureRecognizer];
_touchView = nil;
}
}
- (void)finishRecordingWithError:(NSError *)error
{
[self doStopRecording];
[super finishRecordingWithError:error];
}
- (NSString *)recorderType
{
return @"touch";
}
- (NSString *)mimeType {
return @"application/json";
}
- (void)reset
{
[super reset];
_logger = nil;
}
#pragma mark - ORKTouchRecordingDelegate
- (void)view:(UIView *)view didDetectTouch:(UITouch *)touch {
if ([self.touchArray containsObject:touch] == NO) {
[self.touchArray addObject:touch];
}
NSError *err = nil;
if (![_logger append:[touch ork_JSONDictionaryInView:view allTouches:self.touchArray] error:&err])
{
assert(err != nil);
[self finishRecordingWithError:err];
}
}
@end
@interface ORKTouchRecorderConfiguration()
@end
@implementation ORKTouchRecorderConfiguration
- (instancetype)init
{
return [self ork_init];
}
- (ORKRecorder *)recorderForStep:(ORKStep *)step
outputDirectory:(NSURL *)outputDirectory {
ORKTouchRecorder *recorder = [[ORKTouchRecorder alloc] initWithStep:step
outputDirectory:outputDirectory];
return recorder;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
}
return self;
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
@end
-53
View File
@@ -1,53 +0,0 @@
/*
Copyright (c) 2015, 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 <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import <ResearchKit/ResearchKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface ORKVoiceEngine : NSObject <AVSpeechSynthesizerDelegate>
+ (ORKVoiceEngine *)sharedVoiceEngine;
- (void)speakText:(NSString *)text;
- (void)speakInt:(NSInteger)number;
- (void)stopTalking;
- (BOOL)isSpeaking;
@end
NS_ASSUME_NONNULL_END
-108
View File
@@ -1,108 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKVoiceEngine.h"
#import "ORKHelpers.h"
@interface ORKVoiceEngine ()
@property (nonatomic, strong) AVSpeechSynthesizer *speechSynthesizer;
@end
@implementation ORKVoiceEngine
+(ORKVoiceEngine *)sharedVoiceEngine
{
static ORKVoiceEngine *shared;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [ORKVoiceEngine new];
});
return shared;
}
- (instancetype)init
{
self = [super init];
if (self) {
self.speechSynthesizer = [[AVSpeechSynthesizer alloc] init];
self.speechSynthesizer.delegate = self;
}
return self;
}
- (void)dealloc
{
[self.speechSynthesizer stopSpeakingAtBoundary:AVSpeechBoundaryImmediate];
self.speechSynthesizer.delegate = nil;
self.speechSynthesizer = nil;
}
- (void)speakText:(NSString *)text {
if (self.speechSynthesizer.isSpeaking) {
[self stopTalking];
}
if (UIAccessibilityIsVoiceOverRunning()) {
UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, text);
return;
}
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:text];
utterance.rate = AVSpeechUtteranceMaximumSpeechRate / 7;
[self.speechSynthesizer speakUtterance:utterance];
}
- (void)speakInt:(NSInteger)number {
[self speakText:[NSString stringWithFormat:@"%ld",(long)number]];
}
- (void)stopTalking {
[self.speechSynthesizer stopSpeakingAtBoundary:AVSpeechBoundaryWord];
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance {
}
- (BOOL)isSpeaking
{
return self.speechSynthesizer.isSpeaking;
}
@end
@@ -1,53 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ORKActiveStep.h>
/**
The `ORKWalkingTaskStep` class implements a step that's used in the predefined
walking task.
You don't usually need to instantiate a walking step directly;
instead, it is instantiated as part of a predefined task. See the
predefined active tasks defined in `ORKOrderedTask`.
*/
ORK_CLASS_AVAILABLE
@interface ORKWalkingTaskStep : ORKActiveStep
/**
The number of steps the user should be asked to take in each leg of the
walking task step.
The step finishes when the number of steps have been completed,
or after `1.5 * numberOfStepsPerLeg` seconds, whichever comes first.
*/
@property (nonatomic, assign) NSInteger numberOfStepsPerLeg;
@end
@@ -1,100 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKWalkingTaskStep.h"
#import "ORKHelpers.h"
#import "ORKWalkingTaskStepViewController.h"
#import "ORKStep_Private.h"
@implementation ORKWalkingTaskStep
+ (Class)stepViewControllerClass {
return [ORKWalkingTaskStepViewController class];
}
- (void)validateParameters {
[super validateParameters];
NSInteger const ORKShortWalkTaskMinimumNumberOfStepsPerLeg = 1;
if ( self.numberOfStepsPerLeg < ORKShortWalkTaskMinimumNumberOfStepsPerLeg)
{
@throw [NSException exceptionWithName:NSInvalidArgumentException
reason:[NSString stringWithFormat:@"numberOfStepsPerLeg can not be less than %@.", @(ORKShortWalkTaskMinimumNumberOfStepsPerLeg)]
userInfo:nil];
}
}
- (instancetype)copyWithZone:(NSZone *)zone
{
ORKWalkingTaskStep *step = [super copyWithZone:zone];
step.numberOfStepsPerLeg = self.numberOfStepsPerLeg;
return step;
}
- (BOOL)startsFinished {
return NO;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
ORK_DECODE_INTEGER(aDecoder, numberOfStepsPerLeg);
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
ORK_ENCODE_INTEGER(aCoder, numberOfStepsPerLeg);
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (BOOL)isEqual:(id)object {
BOOL isParentSame = [super isEqual:object];
__typeof(self) castObject = object;
return (isParentSame &&
(self.numberOfStepsPerLeg == castObject.numberOfStepsPerLeg)) ;
}
@end
@@ -1,42 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit_Private.h>
/**
View controller corresponding to the `ORKWalkingTaskStep`.
Observes the results of the pedometer, in order to finish early
when the threshold number of steps have been observed.
*/
ORK_CLASS_AVAILABLE
@interface ORKWalkingTaskStepViewController : ORKActiveStepViewController
@end
@@ -1,290 +0,0 @@
/*
Copyright (c) 2015, 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 "ORKWalkingTaskStepViewController.h"
#import "ORKHelpers.h"
#import "ORKStep_Private.h"
#import "ORKStepViewController_Internal.h"
#import "ORKActiveStepViewController_Internal.h"
#import "ORKCustomStepView_Internal.h"
#import "ORKActiveStepViewController_Internal.h"
#import "ORKVerticalContainerView_Internal.h"
#import "ORKSkin.h"
#import "ORKWalkingTaskStep.h"
#import "ORKPedometerRecorder.h"
#import "ORKActiveStepView.h"
static const CGFloat kProgressCircleDiameter = 10;
static const CGFloat kProgressCircleSpacing = 4;
@interface ORKWalkingProgressCircleView : UIView
@property (nonatomic, assign) BOOL completed;
@end
@implementation ORKWalkingProgressCircleView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setCompleted:NO];
self.backgroundColor = [self tintColor];
self.layer.cornerRadius = kProgressCircleDiameter/2;
}
return self;
}
- (void)tintColorDidChange {
[super tintColorDidChange];
self.backgroundColor = [self tintColor];
}
- (CGSize)intrinsicContentSize {
return (CGSize){kProgressCircleDiameter,kProgressCircleDiameter};
}
- (CGSize)sizeThatFits:(CGSize)size {
return (CGSize){kProgressCircleDiameter,kProgressCircleDiameter};
}
- (void)setCompleted:(BOOL)completed {
_completed = completed;
self.alpha = (completed ? 1.0 : 0.6);
}
@end
@interface ORKWalkingProgressView : UIView
@property (nonatomic, assign) NSInteger count;
@end
@implementation ORKWalkingProgressView
{
NSArray *_circles;
NSInteger _index;
NSTimer *_timer;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.count = 3;
}
return self;
}
- (void)dealloc {
[_timer invalidate];
_timer = nil;
}
- (void)setCount:(NSInteger)count {
_count = count;
if (count != [_circles count]) {
for (UIView *v in _circles) {
[v removeFromSuperview];
}
NSMutableArray *newCircles = [NSMutableArray array];
for (NSInteger idx = 0; idx < count; idx ++) {
ORKWalkingProgressCircleView *circle = [ORKWalkingProgressCircleView new];
[newCircles addObject:circle];
[self addSubview:circle];
}
_circles = newCircles;
[self invalidateIntrinsicContentSize];
[self setNeedsLayout];
self.index = _index;
}
}
- (void)setIndex:(NSInteger)index {
_index = index;
[_circles enumerateObjectsUsingBlock:^(ORKWalkingProgressCircleView *circle, NSUInteger idx, BOOL *stop) {
circle.completed = (idx < _index);
}];
}
- (void)didMoveToWindow {
if (self.window) {
[self startAnimating];
} else {
[self stopAnimating];
}
}
- (void)stopAnimating {
[_timer invalidate];
_timer = nil;
}
- (void)incrementIndex {
self.index = (_index + 1) % (_count + 1);
}
- (void)startAnimating {
[self stopAnimating];
self.index = 0;
_timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(incrementIndex) userInfo:nil repeats:YES];
}
- (CGSize)sizeThatFits:(CGSize)size {
size.height = kProgressCircleDiameter;
size.width = (_count * kProgressCircleDiameter) + MAX(_count-1,0) * kProgressCircleSpacing;
return size;
}
- (CGSize)intrinsicContentSize {
return [self sizeThatFits:CGSizeZero];
}
- (void)layoutSubviews {
CGSize sz = (CGSize){kProgressCircleDiameter,kProgressCircleDiameter};
CGFloat xStep = kProgressCircleDiameter + kProgressCircleSpacing;
CGFloat x0 = 0;
for (UIView *v in _circles) {
v.frame = (CGRect){{x0,0},sz};
x0 += xStep;
}
}
@end
@interface ORKWalkingContentView : ORKActiveStepCustomView
{
ORKScreenType _screenType;
NSLayoutConstraint *_topConstraint;
}
@property (nonatomic, strong, readonly) ORKWalkingProgressView *progressView;
@end
@implementation ORKWalkingContentView
- (void)willMoveToWindow:(UIWindow *)newWindow {
[super willMoveToWindow:newWindow];
_screenType = ORKGetScreenTypeForWindow(newWindow);
[self updateConstraintConstants];
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
_progressView = [ORKWalkingProgressView new];
_progressView.translatesAutoresizingMaskIntoConstraints = NO;
_screenType = ORKScreenTypeiPhone4;
#if LAYOUT_DEBUG
self.backgroundColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2];
_progressView.backgroundColor = [[UIColor yellowColor] colorWithAlphaComponent:0.2];
#endif
[self addSubview:_progressView];
[self setNeedsUpdateConstraints];
}
return self;
}
- (void)updateConstraintConstants {
ORKScreenType screenType = _screenType;
const CGFloat CaptionBaselineToProgressTop = 100;
const CGFloat CaptionBaselineToStepViewTop = ORKGetMetricForScreenType(ORKScreenMetricLearnMoreBaselineToStepViewTop, screenType);
[_topConstraint setConstant:(CaptionBaselineToProgressTop - CaptionBaselineToStepViewTop)];
}
- (void)updateConstraints {
[self removeConstraints:[self constraints]];
NSDictionary *views = NSDictionaryOfVariableBindings(_progressView);
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_progressView]-(>=0)-|" options:NSLayoutFormatAlignAllCenterX metrics:nil views:views]];
_topConstraint = [NSLayoutConstraint constraintWithItem:_progressView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1 constant:0];
[self updateConstraintConstants];
[self addConstraint:_topConstraint];
[self addConstraint:[NSLayoutConstraint constraintWithItem:_progressView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
[super updateConstraints];
}
@end
@interface ORKWalkingTaskStepViewController () <ORKPedometerRecorderDelegate>
{
NSInteger _intendedSteps;
ORKWalkingContentView *_contentView;
}
@end
@implementation ORKWalkingTaskStepViewController
- (instancetype)initWithStep:(ORKStep *)step {
self = [super initWithStep:step];
if (self) {
self.suspendIfInactive = NO;
}
return self;
}
- (ORKWalkingTaskStep *)walkingTaskStep {
return (ORKWalkingTaskStep *)self.step;
}
- (void)viewDidLoad {
[super viewDidLoad];
_contentView = [ORKWalkingContentView new];
_contentView.translatesAutoresizingMaskIntoConstraints = NO;
self.activeStepView.activeCustomView = _contentView;
}
- (void)stepDidChange {
[super stepDidChange];
_intendedSteps = [[self walkingTaskStep] numberOfStepsPerLeg];
}
- (void)pedometerRecorderDidUpdate:(ORKPedometerRecorder *)pedometerRecorder {
NSInteger numberOfSteps = [pedometerRecorder totalNumberOfSteps];
ORK_Log_Debug(@"Steps: %lld", (long long)numberOfSteps);
if (_intendedSteps > 0 && numberOfSteps >= _intendedSteps) {
[self finish];
}
}
@end
@@ -1,43 +0,0 @@
/*
Copyright (c) 2015, 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 <ResearchKit/ResearchKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UITouch (ORKJSONDictionary)
- (NSDictionary *)ork_JSONDictionaryInView:(UIView *)view allTouches:(NSArray *)allTouches;
@end
NS_ASSUME_NONNULL_END

Some files were not shown because too many files have changed in this diff Show More