From fc0b862d13f807662b81cac3a4ba2765c465240b Mon Sep 17 00:00:00 2001 From: Lennart Goedhart <LGoedhart@ea.com> Date: Thu, 5 May 2016 20:44:41 +1000 Subject: [PATCH] Current live and working version of CNL uploader as of 2016-05-05. Removed all options to use Dexcom or Medtronic CGM (sorry arbox0). --- .gitignore | 1 + .idea/encodings.xml | 6 + .idea/gradle.xml | 8 +- .idea/inspectionProfiles/Project_Default.xml | 6 + .../inspectionProfiles/profiles_settings.xml | 7 + .idea/workspace.xml | 1374 +++++++++-------- app/app.iml | 35 +- .../android/dexcom/DexcomG4Activity.java | 291 ++-- .../com/nightscout/android/eula/Eula.java | 15 +- .../android/medtronic/MedtronicCNLReader.java | 274 +++- .../medtronic/MedtronicCNLSession.java | 21 +- .../medtronic/message/BeginEHSMMessage.java | 17 + .../message/ChannelNegotiateMessage.java | 12 +- .../message/ContourNextLinkBinaryMessage.java | 82 +- .../ContourNextLinkCommandMessage.java | 16 + .../message/ContourNextLinkMessage.java | 22 + .../ContourNextLinkMessageHandler.java | 11 + .../message/EncryptionException.java | 10 + .../medtronic/message/EndEHSMMessage.java | 17 + .../medtronic/message/MedtronicMessage.java | 85 +- .../message/MedtronicReceiveMessage.java | 64 + .../message/MedtronicSendMessage.java | 83 + .../medtronic/message/MessageHandler.java | 9 - .../medtronic/message/MessageUtils.java | 47 +- .../message/PumpStatusRequestMessage.java | 12 + .../message/PumpStatusResponseMessage.java | 21 + .../message/PumpTimeRequestMessage.java | 12 + .../message/PumpTimeResponseMessage.java | 24 + .../message/UnexpectedMessageException.java | 10 + .../service/MedtronicCNLService.java | 144 +- .../android/settings/SettingsFragment.java | 70 - .../upload/Medtronic640gPumpRecord.java | 112 ++ .../android/upload/UploadHelper.java | 112 +- app/src/main/res/layout/adb.xml | 15 +- app/src/main/res/values/strings.xml | 4 +- app/src/main/res/xml/preferences.xml | 135 +- build.gradle | 2 +- build/intermediates/dex-cache/cache.xml | 47 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 39 files changed, 1973 insertions(+), 1264 deletions(-) create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/BeginEHSMMessage.java create mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkCommandMessage.java create mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessageHandler.java create mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/EncryptionException.java create mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/EndEHSMMessage.java create mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/MedtronicReceiveMessage.java create mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/MedtronicSendMessage.java delete mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/MessageHandler.java create mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusRequestMessage.java create mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusResponseMessage.java create mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeRequestMessage.java create mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeResponseMessage.java create mode 100644 app/src/main/java/com/nightscout/android/medtronic/message/UnexpectedMessageException.java create mode 100644 app/src/main/java/com/nightscout/android/upload/Medtronic640gPumpRecord.java diff --git a/.gitignore b/.gitignore index 6394e04..eecad1a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .gradle app/build +build/generated diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="Encoding"> + <file url="PROJECT" charset="UTF-8" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 39139a6..2ab1e27 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -5,7 +5,7 @@ <GradleProjectSettings> <option name="distributionType" value="LOCAL" /> <option name="externalProjectPath" value="$PROJECT_DIR$" /> - <option name="gradleHome" value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8" /> + <option name="gradleHome" value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10" /> <option name="gradleJvm" value="1.8" /> <option name="modules"> <set> @@ -13,6 +13,12 @@ <option value="$PROJECT_DIR$/app" /> </set> </option> + <option name="myModules"> + <set> + <option value="$PROJECT_DIR$" /> + <option value="$PROJECT_DIR$/app" /> + </set> + </option> </GradleProjectSettings> </option> </component> diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..f7b3a44 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ +<component name="InspectionProjectProfileManager"> + <profile version="1.0"> + <option name="myName" value="Project Default" /> + <inspection_tool class="AndroidLintRtlHardcoded" enabled="false" level="WARNING" enabled_by_default="false" /> + </profile> +</component> \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..3b31283 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ +<component name="InspectionProjectProfileManager"> + <settings> + <option name="PROJECT_PROFILE" value="Project Default" /> + <option name="USE_PROJECT_PROFILE" value="true" /> + <version value="1.0" /> + </settings> +</component> \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 5928168..47a223c 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> + <component name="AnalysisUIOptions"> + <option name="SCOPE_TYPE" value="3" /> + </component> <component name="AndroidConfiguredLogFilters"> <filters> <filter> @@ -21,7 +24,48 @@ <option name="TOOL_WINDOW_CONFIGURED_FILTER" value="Show only selected application" /> </component> <component name="ChangeListManager"> - <list default="true" id="73c0df16-fbb3-4a39-b542-4a9ed61c734a" name="Default" comment="" /> + <list default="true" id="73c0df16-fbb3-4a39-b542-4a9ed61c734a" name="Default" comment="Commit working version of Uploader before refactoring messages to be "classier"."> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/BeginEHSMMessage.java" /> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkCommandMessage.java" /> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessageHandler.java" /> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/EncryptionException.java" /> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/EndEHSMMessage.java" /> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicReceiveMessage.java" /> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicSendMessage.java" /> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusRequestMessage.java" /> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusResponseMessage.java" /> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeRequestMessage.java" /> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeResponseMessage.java" /> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/UnexpectedMessageException.java" /> + <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/Medtronic640gPumpRecord.java" /> + <change type="DELETED" beforePath="$PROJECT_DIR$/.idea/libraries/logback_android_1_1_1_3.xml" afterPath="" /> + <change type="DELETED" beforePath="$PROJECT_DIR$/.idea/libraries/mongo_java_driver_3_0_2.xml" afterPath="" /> + <change type="DELETED" beforePath="$PROJECT_DIR$/.idea/libraries/physicaloidlibrary.xml" afterPath="" /> + <change type="DELETED" beforePath="$PROJECT_DIR$/.idea/libraries/slf4j_api_1_7_2.xml" afterPath="" /> + <change type="DELETED" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MessageHandler.java" afterPath="" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.gitignore" afterPath="$PROJECT_DIR$/.gitignore" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/gradle.xml" afterPath="$PROJECT_DIR$/.idea/gradle.xml" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/app.iml" afterPath="$PROJECT_DIR$/app/app.iml" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Activity.java" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Activity.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/eula/Eula.java" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/eula/Eula.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLReader.java" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLReader.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLSession.java" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLSession.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessage.java" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessage.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicMessage.java" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicMessage.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MessageUtils.java" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MessageUtils.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/settings/SettingsFragment.java" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/settings/SettingsFragment.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/UploadHelper.java" afterPath="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/UploadHelper.java" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/res/layout/adb.xml" afterPath="$PROJECT_DIR$/app/src/main/res/layout/adb.xml" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/res/values/strings.xml" afterPath="$PROJECT_DIR$/app/src/main/res/values/strings.xml" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/res/xml/preferences.xml" afterPath="$PROJECT_DIR$/app/src/main/res/xml/preferences.xml" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/build.gradle" afterPath="$PROJECT_DIR$/build.gradle" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/build/intermediates/dex-cache/cache.xml" afterPath="$PROJECT_DIR$/build/intermediates/dex-cache/cache.xml" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/gradle/wrapper/gradle-wrapper.properties" afterPath="$PROJECT_DIR$/gradle/wrapper/gradle-wrapper.properties" /> + </list> <ignored path="MedtronicUploader.iws" /> <ignored path=".idea/workspace.xml" /> <ignored path="$PROJECT_DIR$/build/classes/" /> @@ -48,12 +92,12 @@ <favorites_list name="MedtronicUploader" /> </component> <component name="FileEditorManager"> - <leaf> + <leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> <file leaf-file-name="DexcomG4Activity.java" pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Activity.java"> <provider selected="true" editor-type-id="text-editor"> <state vertical-scroll-proportion="0.0"> - <caret line="963" column="0" selection-start-line="963" selection-start-column="0" selection-end-line="963" selection-end-column="0" /> + <caret line="524" column="0" selection-start-line="524" selection-start-column="0" selection-end-line="524" selection-end-column="0" /> <folding> <element signature="imports" expanded="true" /> </folding> @@ -61,74 +105,42 @@ </provider> </entry> </file> - <file leaf-file-name="MedtronicCNLService.java" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java"> + <file leaf-file-name="UploadHelper.java" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/UploadHelper.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0"> - <caret line="115" column="33" selection-start-line="115" selection-start-column="33" selection-end-line="115" selection-end-column="33" /> + <state vertical-scroll-proportion="-1.1111112"> + <caret line="2" column="7" selection-start-line="2" selection-start-column="7" selection-end-line="2" selection-end-column="7" /> <folding /> </state> </provider> </entry> </file> - <file leaf-file-name="MedtronicCNLReader.java" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLReader.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0"> - <caret line="117" column="8" selection-start-line="117" selection-start-column="8" selection-end-line="117" selection-end-column="8" /> - <folding> - <element signature="imports" expanded="true" /> - <element signature="e#1312#1313#0" expanded="true" /> - <element signature="e#1344#1345#0" expanded="true" /> - </folding> - </state> - </provider> - </entry> - </file> - <file leaf-file-name="ContourNextLinkMessage.java" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessage.java"> + <file leaf-file-name="MedtronicCNLService.java" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java"> <provider selected="true" editor-type-id="text-editor"> <state vertical-scroll-proportion="0.0"> - <caret line="8" column="32" selection-start-line="8" selection-start-column="32" selection-end-line="8" selection-end-column="32" /> + <caret line="105" column="0" selection-start-line="105" selection-start-column="0" selection-end-line="105" selection-end-column="0" /> <folding /> </state> </provider> </entry> </file> - <file leaf-file-name="ContourNextLinkBinaryMessage.java" pinned="false" current-in-tab="true"> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.28169015"> - <caret line="12" column="38" selection-start-line="12" selection-start-column="38" selection-end-line="12" selection-end-column="38" /> - <folding> - <element signature="imports" expanded="true" /> - </folding> - </state> - </provider> - </entry> - </file> - <file leaf-file-name="MedtronicMessage.java" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicMessage.java"> + <file leaf-file-name="MedtronicCNLSession.java" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLSession.java"> <provider selected="true" editor-type-id="text-editor"> <state vertical-scroll-proportion="0.0"> - <caret line="52" column="31" selection-start-line="52" selection-start-column="31" selection-end-line="52" selection-end-column="31" /> - <folding> - <element signature="imports" expanded="true" /> - <element signature="e#632#633#0" expanded="true" /> - <element signature="e#684#685#0" expanded="true" /> - </folding> + <caret line="4" column="0" selection-start-line="4" selection-start-column="0" selection-end-line="4" selection-end-column="0" /> + <folding /> </state> </provider> </entry> </file> - <file leaf-file-name="ChannelNegotiateMessage.java" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java"> + <file leaf-file-name="MedtronicCNLReader.java" pinned="false" current-in-tab="true"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLReader.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0"> - <caret line="21" column="34" selection-start-line="21" selection-start-column="34" selection-end-line="21" selection-end-column="34" /> - <folding> - <element signature="imports" expanded="true" /> - </folding> + <state vertical-scroll-proportion="0.33802816"> + <caret line="189" column="91" selection-start-line="189" selection-start-column="91" selection-end-line="189" selection-end-column="91" /> + <folding /> </state> </provider> </entry> @@ -143,6 +155,9 @@ </list> </option> </component> + <component name="Git.Settings"> + <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> + </component> <component name="GradleLocalSettings"> <option name="availableProjects"> <map> @@ -173,6 +188,11 @@ <entry key="$PROJECT_DIR$"> <value> <list> + <ExternalTaskPojo> + <option name="description" value="Displays all buildscript dependencies declared in root project 'MedtronicUploader'." /> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="buildEnvironment" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="description" value="Displays the components produced by root project 'MedtronicUploader'. [incubating]" /> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> @@ -313,6 +333,10 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="compileDebugAndroidTestRenderscript" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="compileDebugAndroidTestShaders" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="compileDebugAndroidTestSources" /> @@ -329,6 +353,10 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="compileDebugRenderscript" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="compileDebugShaders" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="compileDebugSources" /> @@ -361,6 +389,10 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="compileReleaseRenderscript" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="compileReleaseShaders" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="compileReleaseSources" /> @@ -458,6 +490,26 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="generateReleaseSources" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="incrementalDebugAndroidTestJavaCompilationSafeguard" /> + </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="incrementalDebugJavaCompilationSafeguard" /> + </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="incrementalDebugUnitTestJavaCompilationSafeguard" /> + </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="incrementalReleaseJavaCompilationSafeguard" /> + </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="incrementalReleaseUnitTestJavaCompilationSafeguard" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="description" value="Installs the Debug build." /> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> @@ -508,6 +560,10 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="mergeDebugAndroidTestResources" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="mergeDebugAndroidTestShaders" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="mergeDebugAssets" /> @@ -520,6 +576,10 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="mergeDebugResources" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="mergeDebugShaders" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="mergeReleaseAssets" /> @@ -532,6 +592,10 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="mergeReleaseResources" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="mergeReleaseShaders" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="description" value="Creates a version of android.jar that's suitable for unit tests." /> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> @@ -565,6 +629,18 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="preDebugUnitTestBuild" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="prePackageMarkerForDebug" /> + </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="prePackageMarkerForDebugAndroidTest" /> + </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> + <option name="name" value="prePackageMarkerForRelease" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" /> <option name="name" value="preReleaseBuild" /> @@ -787,6 +863,11 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="buildDependents" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="description" value="Displays all buildscript dependencies declared in project ':app'." /> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="buildEnvironment" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="description" value="Assembles and tests this project and all projects it depends on." /> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> @@ -830,6 +911,10 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="compileDebugAndroidTestRenderscript" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="compileDebugAndroidTestShaders" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="compileDebugAndroidTestSources" /> @@ -846,6 +931,10 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="compileDebugRenderscript" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="compileDebugShaders" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="compileDebugSources" /> @@ -878,6 +967,10 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="compileReleaseRenderscript" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="compileReleaseShaders" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="compileReleaseSources" /> @@ -995,6 +1088,26 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="help" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="incrementalDebugAndroidTestJavaCompilationSafeguard" /> + </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="incrementalDebugJavaCompilationSafeguard" /> + </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="incrementalDebugUnitTestJavaCompilationSafeguard" /> + </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="incrementalReleaseJavaCompilationSafeguard" /> + </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="incrementalReleaseUnitTestJavaCompilationSafeguard" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="description" value="Installs the Debug build." /> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> @@ -1045,6 +1158,10 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="mergeDebugAndroidTestResources" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="mergeDebugAndroidTestShaders" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="mergeDebugAssets" /> @@ -1057,6 +1174,10 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="mergeDebugResources" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="mergeDebugShaders" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="mergeReleaseAssets" /> @@ -1069,6 +1190,10 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="mergeReleaseResources" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="mergeReleaseShaders" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="description" value="Creates a version of android.jar that's suitable for unit tests." /> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> @@ -1107,6 +1232,18 @@ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="preDebugUnitTestBuild" /> </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="prePackageMarkerForDebug" /> + </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="prePackageMarkerForDebugAndroidTest" /> + </ExternalTaskPojo> + <ExternalTaskPojo> + <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> + <option name="name" value="prePackageMarkerForRelease" /> + </ExternalTaskPojo> <ExternalTaskPojo> <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/app" /> <option name="name" value="preReleaseBuild" /> @@ -1298,7 +1435,7 @@ </option> <option name="modificationStamps"> <map> - <entry key="$PROJECT_DIR$" value="4376083200000" /> + <entry key="$PROJECT_DIR$" value="4379299520000" /> </map> </option> <option name="projectBuildClasspath"> @@ -1313,93 +1450,76 @@ <ExternalModuleBuildClasspathPojo> <option name="entries"> <list> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle/1.5.0/gradle-1.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle/1.5.0/gradle-1.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-core/1.5.0/gradle-core-1.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-core/1.5.0/gradle-core-1.5.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle/2.1.0/gradle-2.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-core/2.1.0/gradle-core-2.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/transform-api/1.5.0/transform-api-1.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/transform-api/1.5.0/transform-api-1.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/compilerCommon/1.0-rc5/compilerCommon-1.0-rc5.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3-sources.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-api/2.1.0/gradle-api-2.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint/25.1.0/lint-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/compilerCommon/2.1.0/compilerCommon-2.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3-sources.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint/24.5.0/lint-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint/24.5.0/lint-24.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder/1.5.0/builder-1.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder/1.5.0/builder-1.5.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-gradle-api.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder/2.1.0/builder-2.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3-sources.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/annotations/24.5.0/annotations-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/annotations/24.5.0/annotations-24.5.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/annotations/25.1.0/annotations-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-checks/25.1.0/lint-checks-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2-sources.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4/4.5/antlr4-4.5.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/baseLibrary/1.0-rc5/baseLibrary-1.0-rc5-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/baseLibrary/1.0-rc5/baseLibrary-1.0-rc5.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/baseLibrary/2.1.0/baseLibrary-2.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-checks/24.5.0/lint-checks-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-checks/24.5.0/lint-checks-24.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdk-common/24.5.0/sdk-common-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdk-common/24.5.0/sdk-common-24.5.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-model/2.1.0/builder-model-2.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/common/25.1.0/common-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/ddms/ddmlib/25.1.0/ddmlib-25.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-model/1.5.0/builder-model-1.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-model/1.5.0/builder-model-1.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/common/24.5.0/common-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/common/24.5.0/common-24.5.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdklib/25.1.0/sdklib-25.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdklib/24.5.0/sdklib-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdklib/24.5.0/sdklib-24.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-test-api/1.5.0/builder-test-api-1.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-test-api/1.5.0/builder-test-api-1.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jack/jack-api/0.9.0/jack-api-0.9.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jack/jack-api/0.9.0/jack-api-0.9.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/ddms/ddmlib/24.5.0/ddmlib-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/ddms/ddmlib/24.5.0/ddmlib-24.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/manifest-merger/24.5.0/manifest-merger-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/manifest-merger/24.5.0/manifest-merger-24.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jill/jill-api/0.9.0/jill-api-0.9.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jill/jill-api/0.9.0/jill-api-0.9.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-test-api/2.1.0/builder-test-api-2.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdk-common/25.1.0/sdk-common-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/manifest-merger/25.1.0/manifest-merger-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jack/jack-api/0.10.0/jack-api-0.10.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jill/jill-api/0.10.0/jill-api-0.10.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3-sources.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-api/25.1.0/lint-api-25.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-runtime/4.5/antlr4-runtime-4.5.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-annotations/4.5/antlr4-annotations-4.5.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/ST4/4.0.8/ST4-4.0.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-api/24.5.0/lint-api-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-api/24.5.0/lint-api-24.5.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/repository/25.1.0/repository-25.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/layoutlib/layoutlib-api/24.5.0/layoutlib-api-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/layoutlib/layoutlib-api/24.5.0/layoutlib-api-24.5.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/dvlib/24.5.0/dvlib-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/dvlib/24.5.0/dvlib-24.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/abego/treelayout/org.abego.treelayout.core/1.0.1/org.abego.treelayout.core-1.0.1.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/dvlib/25.1.0/dvlib-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/layoutlib/layoutlib-api/25.1.0/layoutlib-api-25.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/abego/treelayout/org.abego.treelayout.core/1.0.1/org.abego.treelayout.core-1.0.1.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1-sources.jar" /> @@ -1419,93 +1539,76 @@ <ExternalModuleBuildClasspathPojo> <option name="entries"> <list> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle/1.5.0/gradle-1.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle/1.5.0/gradle-1.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-core/1.5.0/gradle-core-1.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-core/1.5.0/gradle-core-1.5.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle/2.1.0/gradle-2.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-core/2.1.0/gradle-core-2.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/transform-api/1.5.0/transform-api-1.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/transform-api/1.5.0/transform-api-1.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/compilerCommon/1.0-rc5/compilerCommon-1.0-rc5.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3-sources.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-api/2.1.0/gradle-api-2.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint/25.1.0/lint-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/compilerCommon/2.1.0/compilerCommon-2.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3-sources.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint/24.5.0/lint-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint/24.5.0/lint-24.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder/1.5.0/builder-1.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder/1.5.0/builder-1.5.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-gradle-api.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder/2.1.0/builder-2.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3-sources.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/annotations/24.5.0/annotations-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/annotations/24.5.0/annotations-24.5.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/annotations/25.1.0/annotations-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-checks/25.1.0/lint-checks-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2-sources.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4/4.5/antlr4-4.5.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/baseLibrary/1.0-rc5/baseLibrary-1.0-rc5-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/baseLibrary/1.0-rc5/baseLibrary-1.0-rc5.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/baseLibrary/2.1.0/baseLibrary-2.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-checks/24.5.0/lint-checks-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-checks/24.5.0/lint-checks-24.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdk-common/24.5.0/sdk-common-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdk-common/24.5.0/sdk-common-24.5.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-model/2.1.0/builder-model-2.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/common/25.1.0/common-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/ddms/ddmlib/25.1.0/ddmlib-25.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-model/1.5.0/builder-model-1.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-model/1.5.0/builder-model-1.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/common/24.5.0/common-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/common/24.5.0/common-24.5.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdklib/25.1.0/sdklib-25.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdklib/24.5.0/sdklib-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdklib/24.5.0/sdklib-24.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-test-api/1.5.0/builder-test-api-1.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-test-api/1.5.0/builder-test-api-1.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jack/jack-api/0.9.0/jack-api-0.9.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jack/jack-api/0.9.0/jack-api-0.9.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/ddms/ddmlib/24.5.0/ddmlib-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/ddms/ddmlib/24.5.0/ddmlib-24.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/manifest-merger/24.5.0/manifest-merger-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/manifest-merger/24.5.0/manifest-merger-24.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jill/jill-api/0.9.0/jill-api-0.9.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jill/jill-api/0.9.0/jill-api-0.9.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-test-api/2.1.0/builder-test-api-2.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdk-common/25.1.0/sdk-common-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/manifest-merger/25.1.0/manifest-merger-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jack/jack-api/0.10.0/jack-api-0.10.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jill/jill-api/0.10.0/jill-api-0.10.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3-sources.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-api/25.1.0/lint-api-25.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-runtime/4.5/antlr4-runtime-4.5.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-annotations/4.5/antlr4-annotations-4.5.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/ST4/4.0.8/ST4-4.0.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-api/24.5.0/lint-api-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-api/24.5.0/lint-api-24.5.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/repository/25.1.0/repository-25.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/layoutlib/layoutlib-api/24.5.0/layoutlib-api-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/layoutlib/layoutlib-api/24.5.0/layoutlib-api-24.5.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/dvlib/24.5.0/dvlib-24.5.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/dvlib/24.5.0/dvlib-24.5.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/abego/treelayout/org.abego.treelayout.core/1.0.1/org.abego.treelayout.core-1.0.1.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/dvlib/25.1.0/dvlib-25.1.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/layoutlib/layoutlib-api/25.1.0/layoutlib-api-25.1.0.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/abego/treelayout/org.abego.treelayout.core/1.0.1/org.abego.treelayout.core-1.0.1.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1-sources.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1.jar" /> <option value="$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1-sources.jar" /> @@ -1529,119 +1632,64 @@ <option name="name" value="app" /> <option name="projectBuildClasspath"> <list> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/announce" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/antlr" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/base-services" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/base-services-groovy" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/build-comparison" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/build-init" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/cli" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/code-quality" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/core" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/dependency-management" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/diagnostics" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/ear" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/ide" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/ide-native" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/internal-integ-testing" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/internal-testing" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/ivy" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/jacoco" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/javascript" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/jetty" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/language-groovy" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/language-java" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/language-jvm" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/language-native" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/language-scala" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/launcher" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/maven" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/messaging" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/model-core" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/model-groovy" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/native" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/open-api" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/osgi" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/platform-base" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/platform-jvm" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/platform-native" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/platform-play" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/plugin-development" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/plugin-use" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/plugins" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/publish" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/reporting" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/resources" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/resources-http" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/resources-s3" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/resources-sftp" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/scala" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/signing" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/sonar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/test-kit" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/testing-native" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/tooling-api" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/tooling-api-builders" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/ui" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/src/wrapper" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/ant-1.9.3.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/ant-launcher-1.9.3.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-base-services-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-base-services-groovy-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-cli-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-core-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-docs-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-launcher-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-messaging-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-model-core-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-model-groovy-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-native-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-open-api-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-resources-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-tooling-api-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-ui-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/gradle-wrapper-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/groovy-all-2.4.4.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-announce-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-antlr-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-build-comparison-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-build-init-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-code-quality-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-dependency-management-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-diagnostics-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-ear-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-ide-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-ide-native-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-ivy-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-jacoco-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-javascript-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-jetty-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-language-groovy-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-language-java-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-language-jvm-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-language-native-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-language-scala-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-maven-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-osgi-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-platform-base-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-platform-jvm-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-platform-native-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-platform-play-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-plugin-development-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-plugin-use-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-plugins-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-publish-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-reporting-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-resources-http-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-resources-s3-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-resources-sftp-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-scala-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-signing-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-sonar-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-test-kit-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-testing-native-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/gradle-tooling-api-builders-2.8.jar" /> - <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8/lib/plugins/ivy-2.2.0.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/ant-1.9.3.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/ant-launcher-1.9.3.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-base-services-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-base-services-groovy-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-cli-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-core-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-docs-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-launcher-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-messaging-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-model-core-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-model-groovy-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-native-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-open-api-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-resources-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-tooling-api-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-ui-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/gradle-wrapper-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/groovy-all-2.4.4.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-announce-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-antlr-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-build-comparison-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-build-init-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-code-quality-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-dependency-management-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-diagnostics-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-ear-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-ide-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-ide-native-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-ivy-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-jacoco-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-javascript-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-jetty-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-language-groovy-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-language-java-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-language-jvm-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-language-native-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-language-scala-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-maven-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-osgi-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-platform-base-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-platform-jvm-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-platform-native-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-platform-play-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-plugin-development-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-plugin-use-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-plugins-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-publish-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-reporting-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-resources-http-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-resources-s3-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-resources-sftp-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-scala-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-signing-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-sonar-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-test-kit-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-testing-native-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/gradle-tooling-api-builders-2.10.jar" /> + <option value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10/lib/plugins/ivy-2.2.0.jar" /> <option value="$PROJECT_DIR$/buildSrc/src/main/java" /> <option value="$PROJECT_DIR$/buildSrc/src/main/groovy" /> </list> @@ -1658,10 +1706,7 @@ <component name="IdeDocumentHistory"> <option name="CHANGED_PATHS"> <list> - <option value="$PROJECT_DIR$/app/src/main/res/xml/device_filter.xml" /> - <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/widget/CGMWidgetUpdater.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/widget/CGMWidget.java" /> - <option value="$PROJECT_DIR$/app/src/main/res/values/strings.xml" /> <option value="$PROJECT_DIR$/app/src/main/assets/logback.xml" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCGMService.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLService.java" /> @@ -1674,23 +1719,44 @@ <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/USB/USBPower.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/USB/UsbHidDriver.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/service/TestService.java" /> - <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Activity.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/service/AbstractService.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/service/ServiceManager.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/USB/UsbDriver.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/Message.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ChecksumException.java" /> - <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/BayerBinaryMessage.java" /> - <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLSession.java" /> - <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java" /> - <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MessageUtils.java" /> - <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicMessage.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/BayerBinaryMessageHandler.java" /> - <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLReader.java" /> - <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MessageHandler.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/BaseMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MessageHandler.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessageHandler.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkCommandMessage.java" /> <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/EncryptionException.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/BeginEHSMMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeRequestMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeResponseMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MessageUtils.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/EGVRecord.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusRequestMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusResponseMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicSendMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/EndEHSMMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicReceiveMessage.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/UnexpectedMessageException.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/Medtronic640gPumpRecord.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/UploadHelper.java" /> + <option value="$PROJECT_DIR$/app/src/main/res/layout/adb.xml" /> + <option value="$PROJECT_DIR$/app/src/main/res/values/strings.xml" /> + <option value="$PROJECT_DIR$/app/src/main/res/xml/preferences.xml" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/settings/SettingsFragment.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Activity.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/eula/Eula.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLSession.java" /> + <option value="$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLReader.java" /> </list> </option> </component> @@ -1701,15 +1767,31 @@ </MavenGeneralSettings> </option> </component> - <component name="NamedScopeManager"> - <order /> - </component> <component name="ProjectFrameBounds"> <option name="y" value="23" /> <option name="width" value="1400" /> <option name="height" value="783" /> </component> - <component name="ProjectLevelVcsManager" settingsEditedManually="false"> + <component name="ProjectInspectionProfilesVisibleTreeState"> + <entry key="Project Default"> + <profile-state> + <expanded-state> + <State> + <id /> + </State> + <State> + <id>Android > Lint > Correctness</id> + </State> + </expanded-state> + <selected-state> + <State> + <id>AndroidLintSimpleDateFormat</id> + </State> + </selected-state> + </profile-state> + </entry> + </component> + <component name="ProjectLevelVcsManager" settingsEditedManually="true"> <OptionsSetting value="true" id="Add" /> <OptionsSetting value="true" id="Remove" /> <OptionsSetting value="true" id="Checkout" /> @@ -1730,8 +1812,12 @@ <autoscrollToSource /> <autoscrollFromSource /> <sortByType /> + <manualOrder /> + <foldersAlwaysOnTop value="true" /> </navigator> <panes> + <pane id="Scratches" /> + <pane id="ProjectPane" /> <pane id="AndroidView"> <subPane> <PATH> @@ -1744,20 +1830,6 @@ <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidBuildScriptsGroupNode" /> </PATH_ELEMENT> </PATH> - <PATH> - <PATH_ELEMENT> - <option name="myItemId" value="MedtronicUploader" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidViewProjectNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="app" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidModuleNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="assets" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode" /> - </PATH_ELEMENT> - </PATH> <PATH> <PATH_ELEMENT> <option name="myItemId" value="MedtronicUploader" /> @@ -1836,16 +1908,12 @@ <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidModuleNode" /> </PATH_ELEMENT> <PATH_ELEMENT> - <option name="myItemId" value="java" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="android" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode" /> + <option name="myItemId" value="res" /> + <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidResFolderNode" /> </PATH_ELEMENT> <PATH_ELEMENT> - <option name="myItemId" value="widget" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> + <option name="myItemId" value="drawable" /> + <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidResFolderTypeNode" /> </PATH_ELEMENT> </PATH> <PATH> @@ -1857,18 +1925,6 @@ <option name="myItemId" value="app" /> <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidModuleNode" /> </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="java" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="android" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="utils" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> </PATH> <PATH> <PATH_ELEMENT> @@ -1887,10 +1943,6 @@ <option name="myItemId" value="android" /> <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode" /> </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="USB" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> </PATH> <PATH> <PATH_ELEMENT> @@ -2032,28 +2084,6 @@ <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> </PATH_ELEMENT> </PATH> - <PATH> - <PATH_ELEMENT> - <option name="myItemId" value="MedtronicUploader" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidViewProjectNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="app" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidModuleNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="java" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="android" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="eula" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - </PATH> <PATH> <PATH_ELEMENT> <option name="myItemId" value="MedtronicUploader" /> @@ -2076,67 +2106,26 @@ <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> </PATH_ELEMENT> </PATH> - <PATH> - <PATH_ELEMENT> - <option name="myItemId" value="MedtronicUploader" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidViewProjectNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="app" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidModuleNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="java" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="android" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="dexcom" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="USB" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - </PATH> - <PATH> - <PATH_ELEMENT> - <option name="myItemId" value="MedtronicUploader" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidViewProjectNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="app" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidModuleNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="manifests" /> - <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidManifestsGroupNode" /> - </PATH_ELEMENT> - </PATH> </subPane> </pane> <pane id="Scope" /> - <pane id="ProjectPane" /> <pane id="PackagesPane" /> - <pane id="Scratches" /> </panes> </component> <component name="PropertiesComponent"> <property name="settings.editor.selected.configurable" value="preferences.pluginManager" /> <property name="settings.editor.splitter.proportion" value="0.2" /> <property name="recentsLimit" value="5" /> - <property name="android.project.structure.last.selected" value="SDK Location" /> + <property name="android.project.structure.last.selected" value="Project" /> <property name="android.project.structure.proportion" value="0.15" /> - <property name="FullScreen" value="false" /> - <property name="ANDROID_EXTENDED_DEVICE_CHOOSER_SERIALS" value="192.168.0.115:5555" /> + <property name="ANDROID_EXTENDED_DEVICE_CHOOSER_SERIALS" value="d1cd921" /> <property name="ANDROID_EXTENDED_DEVICE_CHOOSER_AVD" value="Nexus_5_API_23_x86" /> <property name="restartRequiresConfirmation" value="true" /> <property name="OverrideImplement.combined" value="true" /> <property name="OverrideImplement.overriding.sorted" value="false" /> - <property name="SearchEverywhereHistoryKey" value="	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLSession.java" /> + <property name="SearchEverywhereHistoryKey" value="adb	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/res/layout/adb.xml string	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/res/values/strings.xml 640g	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/java/com/nightscout/android/upload/Medtronic640gPumpRecord.java e	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/java/com/nightscout/android/dexcom/EGVRecord.java egv	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/java/com/nightscout/android/dexcom/EGVRecord.java medtronicme	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicMessage.java chann	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java binary	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java nego	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java commandme	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkCommandMessage.java contourne	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessage.java con	FILE	file:///Users/lgoedhart/StudioProjects/MedtronicUploader/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessage.java" /> + <property name="last_opened_file_path" value="$USER_HOME$/Desktop" /> + <property name="device.picker.selection" value="Nexus_5_API_23_x86" /> </component> <component name="RecentsManager"> <key name="CreateClassDialog.RecentsKey"> @@ -2151,6 +2140,7 @@ <recent name="com.nightscout.android" /> </key> <key name="CopyClassDialog.RECENTS_KEY"> + <recent name="com.nightscout.android.medtronic.message" /> <recent name="com.nightscout.android.USB" /> <recent name="com.nightscout.android.medtronic" /> </key> @@ -2169,10 +2159,23 @@ <option name="SHOW_LOGCAT_AUTOMATICALLY" value="true" /> <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" /> <option name="FORCE_STOP_RUNNING_APP" value="true" /> + <option name="DEBUGGER_TYPE" value="Java" /> <option name="USE_LAST_SELECTED_DEVICE" value="false" /> <option name="PREFERRED_AVD" value="" /> <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" /> <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" /> + <Native> + <option name="WORKING_DIR" value="" /> + <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" /> + </Native> + <Java /> + <Hybrid> + <option name="WORKING_DIR" value="" /> + <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" /> + </Hybrid> + <Profilers> + <option name="GAPID_DISABLE_PCS" value="false" /> + </Profilers> <option name="DEEP_LINK" value="" /> <option name="ACTIVITY_CLASS" value="" /> <method /> @@ -2191,10 +2194,23 @@ <option name="SHOW_LOGCAT_AUTOMATICALLY" value="true" /> <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" /> <option name="FORCE_STOP_RUNNING_APP" value="true" /> + <option name="DEBUGGER_TYPE" value="Java" /> <option name="USE_LAST_SELECTED_DEVICE" value="false" /> <option name="PREFERRED_AVD" value="" /> <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" /> <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" /> + <Native> + <option name="WORKING_DIR" value="" /> + <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" /> + </Native> + <Java /> + <Hybrid> + <option name="WORKING_DIR" value="" /> + <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" /> + </Hybrid> + <Profilers> + <option name="GAPID_DISABLE_PCS" value="false" /> + </Profilers> <method /> </configuration> <configuration default="true" type="Application" factoryName="Application"> @@ -2236,11 +2252,48 @@ <option name="Android.Gradle.BeforeRunTask" enabled="true" /> </method> </configuration> + <configuration default="true" type="JUnitTestDiscovery" factoryName="JUnit Test Discovery" changeList="All"> + <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" /> + <module name="" /> + <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> + <option name="ALTERNATIVE_JRE_PATH" /> + <option name="PACKAGE_NAME" /> + <option name="MAIN_CLASS_NAME" /> + <option name="METHOD_NAME" /> + <option name="TEST_OBJECT" value="class" /> + <option name="VM_PARAMETERS" /> + <option name="PARAMETERS" /> + <option name="WORKING_DIRECTORY" /> + <option name="ENV_VARIABLES" /> + <option name="PASS_PARENT_ENVS" value="true" /> + <option name="TEST_SEARCH_SCOPE"> + <value defaultName="singleModule" /> + </option> + <envs /> + <patterns /> + <method /> + </configuration> <configuration default="true" type="JarApplication" factoryName="JAR Application"> <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" /> <envs /> <method /> </configuration> + <configuration default="true" type="Java Scratch" factoryName="Java Scratch"> + <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" /> + <option name="SCRATCH_FILE_ID" value="0" /> + <option name="MAIN_CLASS_NAME" /> + <option name="VM_PARAMETERS" /> + <option name="PROGRAM_PARAMETERS" /> + <option name="WORKING_DIRECTORY" /> + <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> + <option name="ALTERNATIVE_JRE_PATH" /> + <option name="ENABLE_SWING_INSPECTOR" value="false" /> + <option name="ENV_VARIABLES" /> + <option name="PASS_PARENT_ENVS" value="true" /> + <module name="" /> + <envs /> + <method /> + </configuration> <configuration default="true" type="Remote" factoryName="Remote"> <option name="USE_SOCKET_TRANSPORT" value="true" /> <option name="SERVER_MODE" value="false" /> @@ -2277,7 +2330,35 @@ <listeners /> <method /> </configuration> - <configuration default="false" name="app" type="AndroidRunConfigurationType" factoryName="Android Application"> + <configuration default="true" type="TestNGTestDiscovery" factoryName="TestNG Test Discovery" changeList="All"> + <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" /> + <module name="" /> + <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> + <option name="ALTERNATIVE_JRE_PATH" /> + <option name="SUITE_NAME" /> + <option name="PACKAGE_NAME" /> + <option name="MAIN_CLASS_NAME" /> + <option name="METHOD_NAME" /> + <option name="GROUP_NAME" /> + <option name="TEST_OBJECT" value="CLASS" /> + <option name="VM_PARAMETERS" /> + <option name="PARAMETERS" /> + <option name="WORKING_DIRECTORY" /> + <option name="OUTPUT_DIRECTORY" /> + <option name="ANNOTATION_TYPE" /> + <option name="ENV_VARIABLES" /> + <option name="PASS_PARENT_ENVS" value="true" /> + <option name="TEST_SEARCH_SCOPE"> + <value defaultName="singleModule" /> + </option> + <option name="USE_DEFAULT_REPORTERS" value="false" /> + <option name="PROPERTIES_FILE" /> + <envs /> + <properties /> + <listeners /> + <method /> + </configuration> + <configuration default="false" name="app" type="AndroidRunConfigurationType" factoryName="Android Application" activateToolWindowBeforeRun="false"> <module name="app" /> <option name="DEPLOY" value="true" /> <option name="ARTIFACT_NAME" value="" /> @@ -2290,10 +2371,23 @@ <option name="SHOW_LOGCAT_AUTOMATICALLY" value="true" /> <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" /> <option name="FORCE_STOP_RUNNING_APP" value="true" /> + <option name="DEBUGGER_TYPE" value="Java" /> <option name="USE_LAST_SELECTED_DEVICE" value="true" /> <option name="PREFERRED_AVD" value="" /> <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" /> <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" /> + <Native> + <option name="WORKING_DIR" value="" /> + <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" /> + </Native> + <Java /> + <Hybrid> + <option name="WORKING_DIR" value="" /> + <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" /> + </Hybrid> + <Profilers> + <option name="GAPID_DISABLE_PCS" value="false" /> + </Profilers> <option name="DEEP_LINK" value="" /> <option name="ACTIVITY_CLASS" value="" /> <method /> @@ -2315,6 +2409,9 @@ </configuration> </component> <component name="ShelveChangesManager" show_recycled="false" /> + <component name="StructureViewFactory"> + <option name="ACTIVE_ACTIONS" value=",SHOW_INHERITED,ALPHA_COMPARATOR" /> + </component> <component name="SvnConfiguration"> <configuration /> </component> @@ -2325,6 +2422,13 @@ <option name="number" value="Default" /> <updated>1458694399637</updated> </task> + <task id="LOCAL-00001" summary="Commit working version of Uploader before refactoring messages to be "classier"."> + <created>1458970961158</created> + <option name="number" value="00001" /> + <option name="project" value="LOCAL" /> + <updated>1458970961158</updated> + </task> + <option name="localTasksCounter" value="2" /> <servers /> </component> <component name="TodoView"> @@ -2340,38 +2444,41 @@ <frame x="0" y="23" width="1400" height="783" extended-state="0" /> <editor active="true" /> <layout> - <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3297546" sideWeight="0.4970545" order="6" side_tool="false" content_ui="tabs" /> - <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3297546" sideWeight="0.49116346" order="7" side_tool="false" content_ui="tabs" /> - <window_info id="Build Variants" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.2496318" sideWeight="0.50800914" order="2" side_tool="true" content_ui="tabs" /> - <window_info id="Palette	" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> - <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> - <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.7960123" sideWeight="0.51178205" order="7" side_tool="true" content_ui="tabs" /> - <window_info id="Application Servers" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> - <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> - <window_info id="Android Monitor" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.5667167" sideWeight="0.48821798" order="7" side_tool="false" content_ui="tabs" /> - <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> - <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32833582" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> - <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32833582" sideWeight="0.49263623" order="7" side_tool="false" content_ui="tabs" /> - <window_info id="Captures" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> - <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> - <window_info id="Gradle Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" /> - <window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> - <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.2496318" sideWeight="0.49199083" order="0" side_tool="false" content_ui="combo" /> - <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.27286357" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> - <window_info id="Gradle" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> - <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.2496318" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> - <window_info id="Android Model" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" /> - <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" /> - <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.5217391" sideWeight="0.4867452" order="3" side_tool="false" content_ui="tabs" /> - <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> - <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> - <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> - <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" /> - <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> - <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" /> - <window_info id="Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3298969" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> + <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32833582" sideWeight="0.4970545" order="6" side_tool="false" content_ui="tabs" /> + <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32833582" sideWeight="0.48821798" order="7" side_tool="false" content_ui="tabs" /> + <window_info id="Build Variants" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.2496318" sideWeight="0.50800914" order="2" side_tool="true" content_ui="tabs" /> + <window_info id="Palette	" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> + <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> + <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.70464766" sideWeight="0.52061856" order="7" side_tool="true" content_ui="tabs" /> + <window_info id="Android Monitor" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.70464766" sideWeight="0.47938144" order="7" side_tool="false" content_ui="tabs" /> + <window_info id="Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3298969" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> + <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3298351" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> + <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32833582" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> + <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.47226387" sideWeight="0.4867452" order="7" side_tool="false" content_ui="tabs" /> + <window_info id="Captures" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> + <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> + <window_info id="Gradle Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" /> + <window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> + <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2496318" sideWeight="0.49199083" order="0" side_tool="false" content_ui="combo" /> + <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.60569715" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> + <window_info id="Gradle" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> + <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.2496318" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> + <window_info id="Android Model" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" /> + <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" /> + <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.42578712" sideWeight="0.47864506" order="3" side_tool="false" content_ui="tabs" /> + <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> + <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> + <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> + <window_info id="Application Servers" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> + <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> + <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" /> + <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> + <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.3988006" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" /> </layout> </component> + <component name="UpdateCopyrightCheckinHandler"> + <option name="UPDATE_COPYRIGHT" value="true" /> + </component> <component name="Vcs.Log.UiProperties"> <option name="RECENTLY_FILTERED_USER_GROUPS"> <collection /> @@ -2383,453 +2490,422 @@ <component name="VcsContentAnnotationSettings"> <option name="myLimit" value="2678400000" /> </component> + <component name="VcsManagerConfiguration"> + <option name="CHECK_CODE_CLEANUP_BEFORE_PROJECT_COMMIT" value="true" /> + <MESSAGE value="Commit working version of Uploader before refactoring messages to be "classier"." /> + <option name="LAST_COMMIT_MESSAGE" value="Commit working version of Uploader before refactoring messages to be "classier"." /> + <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="true" /> + <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="true" /> + <option name="REARRANGE_BEFORE_PROJECT_COMMIT" value="true" /> + </component> <component name="XDebuggerManager"> <breakpoint-manager> + <breakpoints> + <line-breakpoint enabled="true" type="java-line"> + <url>file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java</url> + <line>238</line> + <properties /> + <option name="timeStamp" value="66" /> + </line-breakpoint> + </breakpoints> <breakpoints-dialog> <breakpoints-dialog /> </breakpoints-dialog> - <option name="time" value="26" /> + <option name="time" value="73" /> </breakpoint-manager> <watches-manager /> </component> <component name="editorHistoryManager"> - <entry file="file://$PROJECT_DIR$/app/src/main/assets/logback.xml"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ChecksumException.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.45673078"> - <caret line="19" column="20" selection-start-line="19" selection-start-column="20" selection-end-line="19" selection-end-column="20" /> + <state vertical-scroll-proportion="0.11737089"> + <caret line="5" column="13" selection-start-line="5" selection-start-column="13" selection-end-line="5" selection-end-column="13" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/.navigation/app/raw/main.nvg.xml"> - <provider selected="true" editor-type-id="navigationeditor"> - <state /> - </provider> - <provider editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0"> - <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java"> + <provider selected="true" editor-type-id="text-editor"> + <state vertical-scroll-proportion="0.5164319"> + <caret line="22" column="0" selection-start-line="22" selection-start-column="0" selection-end-line="22" selection-end-column="0" /> </state> </provider> </entry> - <entry file="file://$USER_HOME$/Library/Android/sdk/sources/android-21/android/util/Log.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicMessage.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.21634616"> - <caret line="25" column="19" selection-start-line="25" selection-start-column="19" selection-end-line="25" selection-end-column="19" /> - <folding /> + <state vertical-scroll-proportion="1.6666666"> + <caret line="73" column="0" selection-start-line="73" selection-start-column="0" selection-end-line="73" selection-end-column="0" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/res/values/strings.xml"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeRequestMessage.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.5092025"> - <caret line="32" column="22" selection-start-line="32" selection-start-column="22" selection-end-line="32" selection-end-column="22" /> - <folding /> + <state vertical-scroll-proportion="0.23474178"> + <caret line="10" column="4" selection-start-line="10" selection-start-column="4" selection-end-line="10" selection-end-column="4" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/DeviceRecord.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessage.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.09615385"> - <caret line="4" column="13" selection-start-line="4" selection-start-column="13" selection-end-line="4" selection-end-column="13" /> - <folding /> + <state vertical-scroll-proportion="0.18779343"> + <caret line="8" column="13" selection-start-line="8" selection-start-column="13" selection-end-line="8" selection-end-column="13" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/MedtronicPumpRecord.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MessageUtils.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.072115384"> - <caret line="11" column="13" selection-start-line="11" selection-start-column="13" selection-end-line="11" selection-end-column="13" /> - <folding /> + <state vertical-scroll-proportion="0.7183099"> + <caret line="49" column="0" selection-start-line="49" selection-start-column="0" selection-end-line="49" selection-end-column="0" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/Record.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/GlucometerRecord.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.09615385"> + <state vertical-scroll-proportion="0.09389672"> <caret line="4" column="13" selection-start-line="4" selection-start-column="13" selection-end-line="4" selection-end-column="13" /> - <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/MedtronicSensorRecord.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicConstants.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.09615385"> - <caret line="5" column="13" selection-start-line="5" selection-start-column="13" selection-end-line="5" selection-end-column="13" /> - <folding /> + <state vertical-scroll-proportion="0.33333334"> + <caret line="84" column="28" selection-start-line="84" selection-start-column="28" selection-end-line="84" selection-end-column="28" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/GlucometerRecord.java"> + <entry file="file://$USER_HOME$/Library/Android/sdk/sources/android-21/android/view/View.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.3125"> - <caret line="13" column="0" selection-start-line="13" selection-start-column="0" selection-end-line="13" selection-end-column="0" /> + <state vertical-scroll-proportion="0.0"> + <caret line="4507" column="0" selection-start-line="4507" selection-start-column="0" selection-end-line="4507" selection-end-column="0" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/EGVRecord.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCGMService.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.09615385"> - <caret line="6" column="13" selection-start-line="6" selection-start-column="13" selection-end-line="6" selection-end-column="13" /> - <folding /> + <state vertical-scroll-proportion="0.60294116"> + <caret line="588" column="118" selection-start-line="588" selection-start-column="110" selection-end-line="588" selection-end-column="118" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/res/xml/preferences.xml"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Service.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-3.9519231"> - <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - <folding /> + <state vertical-scroll-proportion="0.58685446"> + <caret line="191" column="29" selection-start-line="191" selection-start-column="29" selection-end-line="191" selection-end-column="29" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/res/xml/example_appwidget_info.xml"> + <entry file="file://$USER_HOME$/Library/Android/sdk/sources/android-21/android/content/ContextWrapper.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0"> - <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - <folding /> + <state vertical-scroll-proportion="0.33171913"> + <caret line="611" column="15" selection-start-line="611" selection-start-column="15" selection-end-line="611" selection-end-column="15" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/res/xml/device_filter.xml"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/service/AbstractService.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.48076922"> - <caret line="20" column="54" selection-start-line="20" selection-start-column="54" selection-end-line="20" selection-end-column="54" /> - <folding /> + <state vertical-scroll-proportion="0.2542373"> + <caret line="55" column="16" selection-start-line="55" selection-start-column="16" selection-end-line="55" selection-end-column="16" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicReader.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/service/ServiceManager.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.024038462"> - <caret line="51" column="13" selection-start-line="51" selection-start-column="13" selection-end-line="51" selection-end-column="13" /> - <folding /> + <state vertical-scroll-proportion="-1.6962306"> + <caret line="50" column="29" selection-start-line="50" selection-start-column="20" selection-end-line="50" selection-end-column="29" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/res/layout/adb.xml"> - <provider editor-type-id="android-designer"> - <state /> - </provider> + <entry file="file://$USER_HOME$/Library/Android/sdk/sources/android-21/android/view/ContextThemeWrapper.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.039473683"> - <caret line="1" column="18" selection-start-line="1" selection-start-column="16" selection-end-line="1" selection-end-column="18" /> - <folding /> + <state vertical-scroll-proportion="0.33259425"> + <caret line="43" column="29" selection-start-line="43" selection-start-column="29" selection-end-line="43" selection-end-column="29" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/res/drawable-mdpi/ic_launcher.png"> - <provider selected="true" editor-type-id="images"> - <state /> - </provider> - </entry> - <entry file="file://$USER_HOME$/Library/Android/sdk/sources/android-21/android/content/Intent.java"> + <entry file="file://$USER_HOME$/Library/Android/sdk/sources/android-21/android/app/Activity.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.41483516"> - <caret line="4233" column="0" selection-start-line="4233" selection-start-column="0" selection-end-line="4233" selection-end-column="0" /> - <folding /> + <state vertical-scroll-proportion="0.33259425"> + <caret line="2079" column="21" selection-start-line="2079" selection-start-column="21" selection-end-line="2079" selection-end-column="21" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/build/intermediates/manifests/full/debug/AndroidManifest.xml"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/EndEHSMMessage.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.33251834"> - <caret line="66" column="0" selection-start-line="66" selection-start-column="0" selection-end-line="66" selection-end-column="0" /> + <state vertical-scroll-proportion="0.3286385"> + <caret line="14" column="31" selection-start-line="14" selection-start-column="31" selection-end-line="14" selection-end-column="31" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/AndroidManifest.xml"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/BeginEHSMMessage.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.49519232"> - <caret line="46" column="68" selection-start-line="46" selection-start-column="68" selection-end-line="46" selection-end-column="68" /> - <folding /> + <state vertical-scroll-proportion="0.28169015"> + <caret line="12" column="35" selection-start-line="12" selection-start-column="35" selection-end-line="12" selection-end-column="35" /> </state> </provider> </entry> - <entry file="file://$USER_HOME$/Library/Android/sdk/sources/android-21/android/os/Build.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.33333334"> - <caret line="570" column="32" selection-start-line="570" selection-start-column="32" selection-end-line="570" selection-end-column="32" /> + <state vertical-scroll-proportion="0.91549295"> + <caret line="71" column="74" selection-start-line="71" selection-start-column="74" selection-end-line="71" selection-end-column="74" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCGMService.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusResponseMessage.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.09775641"> - <caret line="71" column="6" selection-start-line="71" selection-start-column="4" selection-end-line="71" selection-end-column="6" /> - <folding> - <element signature="imports" expanded="false" /> - </folding> + <state vertical-scroll-proportion="0.25187033"> + <caret line="7" column="13" selection-start-line="7" selection-start-column="13" selection-end-line="7" selection-end-column="13" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/USB/CommonUsbSerialDriver.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeResponseMessage.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.28846154"> - <caret line="33" column="15" selection-start-line="33" selection-start-column="15" selection-end-line="33" selection-end-column="15" /> - <folding /> + <state vertical-scroll-proportion="0.5137157"> + <caret line="17" column="0" selection-start-line="17" selection-start-column="0" selection-end-line="17" selection-end-column="0" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/USB/CommonUsbDriver.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicReceiveMessage.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0"> - <caret line="31" column="52" selection-start-line="31" selection-start-column="52" selection-end-line="31" selection-end-column="52" /> - <folding> - <element signature="imports" expanded="false" /> - </folding> + <state vertical-scroll-proportion="0.34413967"> + <caret line="46" column="101" selection-start-line="46" selection-start-column="101" selection-end-line="46" selection-end-column="101" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/USB/USBPower.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/UnexpectedMessageException.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-0.009615385"> - <caret line="6" column="13" selection-start-line="6" selection-start-column="13" selection-end-line="6" selection-end-column="13" /> - <folding /> + <state vertical-scroll-proportion="0.11737089"> + <caret line="5" column="13" selection-start-line="5" selection-start-column="13" selection-end-line="5" selection-end-column="13" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/DexcomReader.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/DeviceRecord.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="4.121813"> - <caret line="115" column="30" selection-start-line="115" selection-start-column="26" selection-end-line="115" selection-end-column="31" /> - <folding /> + <state vertical-scroll-proportion="0.09389672"> + <caret line="4" column="13" selection-start-line="4" selection-start-column="13" selection-end-line="4" selection-end-column="13" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/USB/UsbSerialProber.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/Record.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="4.121813"> - <caret line="137" column="34" selection-start-line="137" selection-start-column="28" selection-end-line="137" selection-end-column="34" /> - <folding /> + <state vertical-scroll-proportion="0.09389672"> + <caret line="4" column="13" selection-start-line="4" selection-start-column="13" selection-end-line="4" selection-end-column="13" /> </state> </provider> </entry> - <entry file="file://$USER_HOME$/Library/Android/sdk/sources/android-21/android/hardware/usb/UsbDevice.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/MedtronicSensorRecord.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.33144477"> - <caret line="154" column="0" selection-start-line="154" selection-start-column="0" selection-end-line="154" selection-end-column="0" /> + <state vertical-scroll-proportion="0.09389672"> + <caret line="5" column="13" selection-start-line="5" selection-start-column="13" selection-end-line="5" selection-end-column="13" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Service.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/MedtronicPumpRecord.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.3621795"> - <caret line="256" column="36" selection-start-line="256" selection-start-column="34" selection-end-line="256" selection-end-column="36" /> - <folding> - <element signature="imports" expanded="false" /> - </folding> + <state vertical-scroll-proportion="0.5399061"> + <caret line="30" column="48" selection-start-line="30" selection-start-column="48" selection-end-line="30" selection-end-column="48" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/USB/HexDump.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicReader.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.04249292"> - <caret line="22" column="13" selection-start-line="22" selection-start-column="13" selection-end-line="22" selection-end-column="13" /> - <folding /> + <state vertical-scroll-proportion="0.28638497"> + <caret line="2848" column="16" selection-start-line="2848" selection-start-column="16" selection-end-line="2848" selection-end-column="16" /> </state> </provider> </entry> - <entry file="file://$USER_HOME$/Library/Android/sdk/sources/android-21/android/hardware/usb/UsbEndpoint.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusRequestMessage.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0"> - <caret line="60" column="0" selection-start-line="60" selection-start-column="0" selection-end-line="60" selection-end-column="0" /> + <state vertical-scroll-proportion="0.2112676"> + <caret line="9" column="54" selection-start-line="9" selection-start-column="54" selection-end-line="9" selection-end-column="54" /> </state> </provider> </entry> - <entry file="file://$USER_HOME$/Library/Android/sdk/sources/android-21/android/hardware/usb/UsbDeviceConnection.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicSendMessage.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-0.57417583"> - <caret line="176" column="0" selection-start-line="176" selection-start-column="0" selection-end-line="176" selection-end-column="0" /> + <state vertical-scroll-proportion="0.3568075"> + <caret line="20" column="7" selection-start-line="20" selection-start-column="7" selection-end-line="20" selection-end-column="7" /> </state> </provider> </entry> - <entry file="file://$USER_HOME$/Library/Android/sdk/sources/android-21/android/hardware/usb/UsbConstants.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/EGVRecord.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.2259887"> - <caret line="22" column="19" selection-start-line="22" selection-start-column="19" selection-end-line="22" selection-end-column="19" /> + <state vertical-scroll-proportion="0.28169015"> + <caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/USB/HidBridge.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/DexcomReader.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.9103139"> - <caret line="163" column="32" selection-start-line="163" selection-start-column="32" selection-end-line="163" selection-end-column="32" /> - <folding /> + <state vertical-scroll-proportion="-0.11737089"> + <caret line="311" column="16" selection-start-line="311" selection-start-column="16" selection-end-line="311" selection-end-column="16" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/USB/CdcAcmSerialDriver.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.26683939"> - <caret line="34" column="47" selection-start-line="34" selection-start-column="42" selection-end-line="34" selection-end-column="54" /> + <entry file="file://$PROJECT_DIR$/app/src/main/res/layout/widget_lock.xml"> + <provider editor-type-id="text-editor"> + <state vertical-scroll-proportion="0.0"> + <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> <folding /> </state> </provider> + <provider selected="true" editor-type-id="android-designer"> + <state /> + </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/service/AbstractService.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.36150235"> - <caret line="58" column="11" selection-start-line="58" selection-start-column="8" selection-end-line="58" selection-end-column="11" /> - <folding> - <element signature="imports" expanded="false" /> - <element signature="e#1288#1299#0" expanded="false" /> - </folding> + <entry file="file://$PROJECT_DIR$/app/src/main/res/layout/widget_main.xml"> + <provider editor-type-id="text-editor"> + <state vertical-scroll-proportion="0.0"> + <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> + <folding /> </state> </provider> + <provider selected="true" editor-type-id="android-designer"> + <state /> + </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/service/ServiceManager.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/AndroidManifest.xml"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-0.37254903"> - <caret line="50" column="29" selection-start-line="50" selection-start-column="20" selection-end-line="50" selection-end-column="29" /> - <folding> - <element signature="imports" expanded="false" /> - </folding> + <state vertical-scroll-proportion="-0.625"> + <caret line="15" column="99" selection-start-line="15" selection-start-column="99" selection-end-line="15" selection-end-column="99" /> + <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/USB/UsbSerialDriver.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/DataLog.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-0.3286385"> - <caret line="29" column="17" selection-start-line="29" selection-start-column="17" selection-end-line="29" selection-end-column="17" /> + <state vertical-scroll-proportion="0.09389672"> + <caret line="4" column="13" selection-start-line="4" selection-start-column="13" selection-end-line="4" selection-end-column="13" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/USB/UsbDriver.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/CommandSenderThread.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="1.1737089"> - <caret line="68" column="22" selection-start-line="68" selection-start-column="22" selection-end-line="68" selection-end-column="22" /> + <state vertical-scroll-proportion="0.23474178"> + <caret line="27" column="13" selection-start-line="27" selection-start-column="13" selection-end-line="27" selection-end-column="13" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/USB/UsbHidDriver.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/service/TestService.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.33260393"> - <caret line="96" column="68" selection-start-line="96" selection-start-column="12" selection-end-line="96" selection-end-column="68" /> + <state vertical-scroll-proportion="1.1737089"> + <caret line="66" column="95" selection-start-line="66" selection-start-column="95" selection-end-line="66" selection-end-column="95" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ChecksumException.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/settings/SettingsActivity.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.23474178"> - <caret line="10" column="0" selection-start-line="10" selection-start-column="0" selection-end-line="10" selection-end-column="0" /> - <folding> - <element signature="e#194#195#0" expanded="false" /> - <element signature="e#224#225#0" expanded="false" /> - </folding> + <state vertical-scroll-proportion="0.28169015"> + <caret line="13" column="1" selection-start-line="13" selection-start-column="1" selection-end-line="13" selection-end-column="1" /> + <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/service/TestService.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/res/values/strings.xml"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0"> - <caret line="42" column="9" selection-start-line="40" selection-start-column="8" selection-end-line="42" selection-end-column="9" /> + <state vertical-scroll-proportion="0.30612245"> + <caret line="12" column="30" selection-start-line="12" selection-start-column="30" selection-end-line="12" selection-end-column="30" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Activity.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/eula/Eula.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0"> - <caret line="963" column="0" selection-start-line="963" selection-start-column="0" selection-end-line="963" selection-end-column="0" /> + <state vertical-scroll-proportion="0.38967136"> + <caret line="125" column="34" selection-start-line="125" selection-start-column="34" selection-end-line="125" selection-end-column="34" /> <folding> - <element signature="imports" expanded="true" /> + <element signature="e#2820#2839#0" expanded="true" /> + <element signature="e#2943#3357#0" expanded="true" /> + <element signature="e#3356#3357#0" expanded="true" /> </folding> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/settings/SettingsFragment.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0"> - <caret line="115" column="33" selection-start-line="115" selection-start-column="33" selection-end-line="115" selection-end-column="33" /> + <state vertical-scroll-proportion="-0.12254902"> + <caret line="22" column="46" selection-start-line="22" selection-start-column="41" selection-end-line="22" selection-end-column="52" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLSession.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/res/xml/preferences.xml"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.75117373"> - <caret line="35" column="37" selection-start-line="35" selection-start-column="37" selection-end-line="35" selection-end-column="37" /> + <state vertical-scroll-proportion="0.025510205"> + <caret line="1" column="0" selection-start-line="51" selection-start-column="29" selection-end-line="51" selection-end-column="40" /> <folding> - <element signature="e#729#730#0" expanded="true" /> - <element signature="e#756#757#0" expanded="true" /> - <element signature="e#793#794#0" expanded="true" /> - <element signature="e#819#820#0" expanded="true" /> - <element signature="e#974#975#0" expanded="true" /> - <element signature="e#1004#1005#0" expanded="true" /> - <element signature="e#1073#1074#0" expanded="true" /> - <element signature="e#1205#1206#0" expanded="true" /> - <element signature="e#1251#1252#0" expanded="true" /> + <element signature="e#3657#3674#0" expanded="true" /> </folding> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/res/menu/menu.xml"> <provider selected="true" editor-type-id="text-editor"> <state vertical-scroll-proportion="0.0"> - <caret line="21" column="34" selection-start-line="21" selection-start-column="34" selection-end-line="21" selection-end-column="34" /> - <folding> - <element signature="imports" expanded="true" /> - </folding> + <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> + <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MessageUtils.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/Medtronic640gPumpRecord.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.3286385"> - <caret line="18" column="12" selection-start-line="18" selection-start-column="12" selection-end-line="18" selection-end-column="12" /> + <state vertical-scroll-proportion="1.8544601"> + <caret line="82" column="37" selection-start-line="82" selection-start-column="37" selection-end-line="82" selection-end-column="37" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicMessage.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Activity.java"> <provider selected="true" editor-type-id="text-editor"> <state vertical-scroll-proportion="0.0"> - <caret line="52" column="31" selection-start-line="52" selection-start-column="31" selection-end-line="52" selection-end-column="31" /> + <caret line="524" column="0" selection-start-line="524" selection-start-column="0" selection-end-line="524" selection-end-column="0" /> <folding> <element signature="imports" expanded="true" /> - <element signature="e#632#633#0" expanded="true" /> - <element signature="e#684#685#0" expanded="true" /> </folding> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLReader.java"> - <provider selected="true" editor-type-id="text-editor"> + <entry file="file://$PROJECT_DIR$/app/src/main/res/layout/adb.xml"> + <provider editor-type-id="text-editor"> <state vertical-scroll-proportion="0.0"> - <caret line="117" column="8" selection-start-line="117" selection-start-column="8" selection-end-line="117" selection-end-column="8" /> - <folding> - <element signature="imports" expanded="true" /> - <element signature="e#1312#1313#0" expanded="true" /> - <element signature="e#1344#1345#0" expanded="true" /> - </folding> + <caret line="5" column="27" selection-start-line="5" selection-start-column="27" selection-end-line="5" selection-end-column="27" /> + <folding /> </state> </provider> + <provider selected="true" editor-type-id="android-designer"> + <state /> + </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/MessageHandler.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/upload/UploadHelper.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.16431925"> - <caret line="7" column="26" selection-start-line="7" selection-start-column="26" selection-end-line="7" selection-end-column="26" /> + <state vertical-scroll-proportion="-1.1111112"> + <caret line="2" column="7" selection-start-line="2" selection-start-column="7" selection-end-line="2" selection-end-column="7" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessage.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLSession.java"> <provider selected="true" editor-type-id="text-editor"> <state vertical-scroll-proportion="0.0"> - <caret line="8" column="32" selection-start-line="8" selection-start-column="32" selection-end-line="8" selection-end-column="32" /> + <caret line="4" column="0" selection-start-line="4" selection-start-column="0" selection-end-line="4" selection-end-column="0" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java"> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java"> <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.28169015"> - <caret line="12" column="38" selection-start-line="12" selection-start-column="38" selection-end-line="12" selection-end-column="38" /> - <folding> - <element signature="imports" expanded="true" /> - </folding> + <state vertical-scroll-proportion="0.0"> + <caret line="105" column="0" selection-start-line="105" selection-start-column="0" selection-end-line="105" selection-end-column="0" /> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLReader.java"> + <provider selected="true" editor-type-id="text-editor"> + <state vertical-scroll-proportion="0.33802816"> + <caret line="189" column="91" selection-start-line="189" selection-start-column="91" selection-end-line="189" selection-end-column="91" /> + <folding /> </state> </provider> </entry> diff --git a/app/app.iml b/app/app.iml index 51075df..afe68c3 100644 --- a/app/app.iml +++ b/app/app.iml @@ -12,10 +12,7 @@ <option name="SELECTED_TEST_ARTIFACT" value="_android_test_" /> <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" /> <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" /> - <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" /> - <option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" /> <afterSyncTasks> - <task>generateDebugAndroidTestSources</task> <task>generateDebugSources</task> </afterSyncTasks> <option name="ALLOW_USER_CONFIGURATION" value="false" /> @@ -28,7 +25,7 @@ </component> <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false"> <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" /> - <output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" /> + <output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" /> <exclude-output /> <content url="file://$MODULE_DIR$"> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" /> @@ -50,6 +47,15 @@ <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/jni" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" /> @@ -57,6 +63,7 @@ <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" /> @@ -64,16 +71,36 @@ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" /> + <excludeFolder url="file://$MODULE_DIR$/build/.DS_Store" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/builds" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-classes" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-runtime-classes" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/restart-dex" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" /> <excludeFolder url="file://$MODULE_DIR$/build/outputs" /> diff --git a/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Activity.java b/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Activity.java index e38a52e..f179424 100644 --- a/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Activity.java +++ b/app/src/main/java/com/nightscout/android/dexcom/DexcomG4Activity.java @@ -3,6 +3,7 @@ package com.nightscout.android.dexcom; import java.io.File; import java.io.FileInputStream; import java.io.ObjectInputStream; +import java.text.DateFormat; import java.text.DecimalFormat; import org.slf4j.LoggerFactory; @@ -30,7 +31,9 @@ import android.os.Messenger; import android.os.RemoteException; import android.os.StrictMode; import android.preference.PreferenceManager; +import android.text.Html; import android.text.InputType; +import android.text.format.DateUtils; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.Menu; @@ -51,9 +54,9 @@ import com.nightscout.android.eula.Eula.OnEulaAgreedTo; import com.nightscout.android.medtronic.MedtronicCGMService; import com.nightscout.android.medtronic.service.MedtronicCNLService; import com.nightscout.android.medtronic.MedtronicConstants; -import com.nightscout.android.medtronic.service.TestService; import com.nightscout.android.service.ServiceManager; import com.nightscout.android.settings.SettingsActivity; +import com.nightscout.android.upload.Medtronic640gPumpRecord; import com.nightscout.android.upload.MedtronicSensorRecord; import com.nightscout.android.upload.Record; @@ -66,10 +69,10 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan public static final int CNL_24 = 2; private static final String TAG = DexcomG4Activity.class.getSimpleName(); - private int cgmSelected = DEXCOMG4; + private int cgmSelected = CNL_24; private int calibrationSelected = MedtronicConstants.CALIBRATION_GLUCOMETER; - private Handler mHandler = new Handler(); + private Handler mHandler = new DexcomG4ActivityHandler(); private int maxRetries = 20; private int retryCount = 0; @@ -94,22 +97,83 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan Boolean mHandlerActive = false; Object mHandlerActiveLock = new Object(); Boolean usbAllowedPermission = false; - final Messenger mMessenger = new Messenger(new IncomingHandler()); + //final Messenger mMessenger = new Messenger(new IncomingHandler()); ActivityManager manager = null; final Context ctx = this; SharedPreferences settings = null; SharedPreferences prefs = null; private static final boolean ISDEBUG = true; + // TODO - merge this with IncomingHandler + public class DexcomG4ActivityHandler extends Handler { + public static final int MSG_ERROR = 1; + public static final int MSG_STATUS = 2; + public static final int MSG_DATA = 3; + + @Override + public void handleMessage(Message msg) { + Log.d( TAG, "Got message from Service." ); + switch ( cgmSelected ) { + case CNL_24: + //usbAllowedPermission = true; + switch (msg.what) { + case MSG_ERROR: + display.setText(msg.obj.toString(), BufferType.EDITABLE); + break; + case MSG_STATUS: + display.setText(msg.obj.toString(), BufferType.EDITABLE); + break; + case MSG_DATA: + Medtronic640gPumpRecord record = (Medtronic640gPumpRecord) msg.obj; + + DecimalFormat df = null; + if (prefs.getBoolean("mmolDecimals", false)) + df = new DecimalFormat("#.##"); + else + df = new DecimalFormat("#.#"); + String bglString = "---"; + String unitsString = "mg/dL"; + if (prefs.getBoolean("mmolxl", false)) { + try { + float fBgValue = Float.valueOf(record.sensorBGL); + bglString = df.format(fBgValue / 18.016f); + unitsString = "mmol/L"; + log.info("mmolxl true --> " + bglString); + } catch (Exception e) { + + } + } else { + bglString = String.valueOf(record.sensorBGL); + log.info("mmolxl false --> " + bglString); + } + + mTitleTextView.setText(Html.fromHtml( + String.format( "<big><b>%s</b></big> <small>%s</small>", bglString, unitsString))); + + mDumpTextView.setTextColor(Color.WHITE); + mDumpTextView.setText(Html.fromHtml( + String.format( "<b>BGL at:</b> %s<br/><b>Pump Time:</b> %s<br/><b>Active Insulin: <b>%.3f<br/><b>Rate of Change: </b>%s", + DateUtils.formatDateTime(getBaseContext(),record.sensorBGLDate.getTime(),DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME), + DateUtils.formatDateTime(getBaseContext(),record.pumpDate.getTime(),DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME), + record.activeInsulin, + record.direction + ) + )); + + break; + } + default: + super.handleMessage(msg); + } + } + } + + /* class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MedtronicConstants.MSG_MEDTRONIC_CGM_MESSAGE_RECEIVED: - /*if (msgsDisplayed > 8){ - display.setText("", BufferType.EDITABLE); - msgsDisplayed = 0; - }*/ Log.i("MessageReceived", msg.getData().getString("data") + "\n"); if (ISDEBUG) { display.setText(display.getText() + "Medtronic CGM Message: " + msg.getData().getString("data") + "\n", BufferType.EDITABLE); @@ -181,7 +245,9 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan } } } + */ + /* private void showUseCalibConfirmation(final float num, final boolean calibrate, final boolean isCalFactorFromPump) { AlertDialog.Builder alert = new AlertDialog.Builder(ctx); alert.setTitle("Calibration Detected!!!"); @@ -244,7 +310,9 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan alert.show(); } + */ + /* private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { bService = service; @@ -278,9 +346,11 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan } } }; + */ //All I'm really doing here is creating a simple activity to launch and maintain the service + /* private Runnable updateDataView = new Runnable() { public void run() { synchronized (mHandlerActiveLock) { @@ -365,6 +435,28 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan } else mDumpTextView.setText("\n" + (System.currentTimeMillis() - record.displayDateTime) / 60000 + " min. ago\n" + record.bGValue + " " + record.trendArrow + "\n" + calib + "\n"); + } else if (cgmSelected == CNL_24 && auxRecord instanceof Medtronic640gPumpRecord && auxRecord != null) { + Medtronic640gPumpRecord record = (Medtronic640gPumpRecord) auxRecord; + + String bglString = "---"; + String unitsString = "mg/dL"; + if (prefs.getBoolean("mmolxl", false)) { + try { + float fBgValue = Float.valueOf(record.sensorBGL); + bglString = df.format(fBgValue / 18.016f); + unitsString = "mmol/L"; + log.info("mmolxl true --> " + bglString); + } catch (Exception e) { + + } + } else { + bglString = String.valueOf(record.sensorBGL); + log.info("mmolxl false --> " + bglString); + } + mDumpTextView.setTextColor(Color.WHITE); + mDumpTextView.setText(Html.fromHtml( + String.format( "<div><big><b>%s</b></big> <small>%s</small></div><br/>%s", bglString, unitsString, record.displayTime ) + )); } else if (auxRecord instanceof EGVRecord) { EGVRecord record = (EGVRecord) auxRecord; if (prefs.getBoolean("mmolxl", false)) { @@ -405,6 +497,7 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan } } }; + */ private class BatteryReceiver extends BroadcastReceiver { @@ -423,7 +516,6 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan @Override public void onCreate(Bundle savedInstanceState) { Log.i(TAG, "onCreate called"); - keepServiceAlive = Eula.show(this); super.onCreate(savedInstanceState); if (android.os.Build.VERSION.SDK_INT > 9) { @@ -435,25 +527,9 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan MedtronicConstants.PREFS_NAME, 0); PreferenceManager.getDefaultSharedPreferences(getBaseContext()).registerOnSharedPreferenceChangeListener(this); prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); - if (prefs.contains("monitor_type")) { - String type = prefs.getString("monitor_type", "1"); - if ("3".equalsIgnoreCase(type)) { - cgmSelected = CNL_24; - } else if ("2".equalsIgnoreCase(type)) { - cgmSelected = MEDTRONIC_CGM; - if (prefs.contains("calibrationType")) { - type = prefs.getString("calibrationType", "3"); - if ("3".equalsIgnoreCase(type)) - calibrationSelected = MedtronicConstants.CALIBRATION_MANUAL; - else if ("2".equalsIgnoreCase(type)) { - calibrationSelected = MedtronicConstants.CALIBRATION_SENSOR; - } else - calibrationSelected = MedtronicConstants.CALIBRATION_GLUCOMETER; - } - } else { - cgmSelected = DEXCOMG4; - } - } + + keepServiceAlive = Eula.show(this, prefs); + mArrow = new BatteryReceiver(); IntentFilter mIntentFilter = new IntentFilter(); mIntentFilter.addAction(Intent.ACTION_BATTERY_LOW); @@ -477,13 +553,13 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan if (isMyServiceRunning() && cgmSelected == MEDTRONIC_CGM) { doBindService(); } - mHandler.post(updateDataView); + //mHandler.post(updateDataView); mHandlerActive = true; } - mTitleTextView.setTextColor(Color.YELLOW); - mTitleTextView.setText("CGM Service Pending"); + //mTitleTextView.setTextColor(Color.YELLOW); + //mTitleTextView.setText("CGM Service Pending"); b1.setText("Stop Uploading CGM Data"); lnr.addView(b1); @@ -493,7 +569,7 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan b2.setText("Clear Log"); b2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1.0f)); b4 = new Button(this); - b4.setText("Test CNL"); + b4.setText("Get Now"); b4.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1.0f)); lnr3.addView(b4); if (menu != null) { @@ -534,12 +610,15 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan b4.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - display.setText("Yolo swag", BufferType.EDITABLE); display.setKeyListener(null); - if( !cgmService.isRunning() ) { - cgmService.start(); - } else { - cgmService.stop(); + Log.d( TAG, "Pursh de butten" ); + if( cgmService != null ) { + if (!cgmService.isRunning()) { + cgmService.start(); + } else { + cgmService.stop(); + cgmService.start(); + } } } }); @@ -550,17 +629,17 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan synchronized (mHandlerActiveLock) { if (b1.getText() == "Stop Uploading CGM Data") { mHandlerActive = false; - mHandler.removeCallbacks(updateDataView); + //mHandler.removeCallbacks(updateDataView); keepServiceAlive = false; stopCGMServices(); b1.setText("Start Uploading CGM Data"); - mTitleTextView.setTextColor(Color.RED); - mTitleTextView.setText("CGM Service Stopped"); + //mTitleTextView.setTextColor(Color.RED); + //mTitleTextView.setText("CGM Service Stopped"); finish(); } else { mHandlerActive = false; - mHandler.removeCallbacks(updateDataView); - mHandler.post(updateDataView); + //mHandler.removeCallbacks(updateDataView); + //mHandler.post(updateDataView); if (!usbAllowedPermission) if (mService == null && bService != null) { mService = new Messenger(bService); @@ -568,7 +647,7 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan if (mService != null) { try { Message msg = Message.obtain(null, MedtronicConstants.MSG_MEDTRONIC_CGM_REQUEST_PERMISSION, 0, 0); - msg.replyTo = mMessenger; + //msg.replyTo = mMessenger; mService.send(msg); } catch (RemoteException e) { mService = null; @@ -581,7 +660,16 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan } }); + } + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + startCGMServices(); + if( cgmService != null ) { + Log.d( TAG, "onPostCreate: Starting the service"); + cgmService.start(); + } } @Override @@ -596,6 +684,7 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan log.info("ON RESUME!"); super.onResume(); // Refresh the status + /* try { Record auxRecord = DexcomG4Activity.this.loadClassFile(new File( getBaseContext().getFilesDir(), "save.bin")); @@ -694,6 +783,7 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan } catch (Exception e) { e.printStackTrace(); } + */ } @@ -776,7 +866,7 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan if (mService != null) { try { Message msg = Message.obtain(null, MedtronicConstants.MSG_MEDTRONIC_SEND_GET_SENSORCAL_FACTOR); - msg.replyTo = mMessenger; + //msg.replyTo = mMessenger; mService.send(msg); } catch (RemoteException e) { StringBuffer sb1 = new StringBuffer(""); @@ -800,7 +890,7 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan if (mService != null) { try { Message msg = Message.obtain(null, MedtronicConstants.MSG_MEDTRONIC_SEND_GET_PUMP_INFO); - msg.replyTo = mMessenger; + //msg.replyTo = mMessenger; mService.send(msg); } catch (RemoteException e) { StringBuffer sb1 = new StringBuffer(""); @@ -848,7 +938,7 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan b.putString("sgv", value); prefs.edit().putString("manual_sgv", value).commit(); msg.setData(b); - msg.replyTo = mMessenger; + //msg.replyTo = mMessenger; mService.send(msg); } catch (RemoteException e) { StringBuffer sb1 = new StringBuffer(""); @@ -913,7 +1003,7 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan b.putString("sgv", value); prefs.edit().putString("instant_sgv", value).commit(); msg.setData(b); - msg.replyTo = mMessenger; + //msg.replyTo = mMessenger; mService.send(msg); } catch (RemoteException e) { StringBuffer sb1 = new StringBuffer(""); @@ -955,28 +1045,9 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan doBindService(); return; case CNL_24: - display.setText("Kicking lyrics right through your brain.", BufferType.EDITABLE); Log.d("DexcomActivity", "Starting Medtronic CNL service"); - this.cgmService = new ServiceManager(this, MedtronicCNLService.class, new Handler() { - @Override - public void handleMessage(Message msg) { - Log.d( TAG, "Got message from Service." ); - switch (msg.what) { - case MedtronicCNLService.MSG_STATUS: - display.setText( msg.obj.toString(), BufferType.EDITABLE ); - break; - case TestService.MSG_COUNTER: - // Receive counter value from service 1 - display.setText("Counter @ Service1:" + msg.arg1, BufferType.EDITABLE); - break; - case TestService.MSG_STATUS: - display.setText( msg.obj.toString(), BufferType.EDITABLE ); - break; - default: - super.handleMessage(msg); - } - } - }); + cgmService = new ServiceManager(this, MedtronicCNLService.class, mHandler ); + //cgmService.start(); break; default: startService(new Intent(DexcomG4Activity.this, DexcomG4Service.class)); @@ -993,7 +1064,9 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan } return; case CNL_24: - stopService(new Intent(DexcomG4Activity.this, MedtronicCNLService.class)); + if( cgmService != null ) { + cgmService.stop(); + } break; default: stopService(new Intent(DexcomG4Activity.this, DexcomG4Service.class)); @@ -1019,7 +1092,7 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan PreferenceManager.getDefaultSharedPreferences(getBaseContext()).unregisterOnSharedPreferenceChangeListener(this); unregisterReceiver(mArrow); synchronized (mHandlerActiveLock) { - mHandler.removeCallbacks(updateDataView); + //mHandler.removeCallbacks(updateDataView); doUnbindService(); if (keepServiceAlive) { killService(); @@ -1032,13 +1105,14 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan editor.commit(); super.onDestroy(); } + stopCGMServices(); } void doBindService() { if ((service != null && isMyServiceRunning()) || mIsBound) stopCGMServices(); service = new Intent(this, MedtronicCGMService.class); - bindService(service, mConnection, Context.BIND_AUTO_CREATE); + //bindService(service, mConnection, Context.BIND_AUTO_CREATE); mIsBound = true; } @@ -1051,14 +1125,14 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan if (mService != null) { try { Message msg = Message.obtain(null, MedtronicConstants.MSG_UNREGISTER_CLIENT); - msg.replyTo = mMessenger; + //msg.replyTo = mMessenger; mService.send(msg); } catch (RemoteException e) { // There is nothing special we need to do if the service has crashed. } } // Detach our existing connection. - unbindService(mConnection); + //unbindService(mConnection); mIsBound = false; } } @@ -1074,38 +1148,6 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { try { - if (sharedPreferences.contains("monitor_type")) { - String type = sharedPreferences.getString("monitor_type", "1"); - if ("3".equalsIgnoreCase(type)) { - cgmSelected = CNL_24; - } else if ("2".equalsIgnoreCase(type)) { - cgmSelected = MEDTRONIC_CGM; - if (sharedPreferences.contains("calibrationType")) { - type = sharedPreferences.getString("calibrationType", "3"); - if ("3".equalsIgnoreCase(type)) - calibrationSelected = MedtronicConstants.CALIBRATION_MANUAL; - else if ("2".equalsIgnoreCase(type)) { - calibrationSelected = MedtronicConstants.CALIBRATION_SENSOR; - } else - calibrationSelected = MedtronicConstants.CALIBRATION_GLUCOMETER; - } - } else { - cgmSelected = DEXCOMG4; - } - /*if (calibrationSelected == MedtronicConstants.CALIBRATION_MANUAL) - b4.setVisibility(View.VISIBLE); - else - b4.setVisibility(View.GONE);*/ - if (menu != null) { - if (calibrationSelected == MedtronicConstants.CALIBRATION_MANUAL) { - menu.getItem(3).setVisible(false); - menu.getItem(4).setVisible(true); - } else { - menu.getItem(3).setVisible(false); - menu.getItem(4).setVisible(false); - } - } - } if (cgmSelected == MEDTRONIC_CGM) { SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(getBaseContext()); @@ -1137,46 +1179,11 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan menu.getItem(1).setVisible(false); } - if (key.equals("monitor_type")) { - stopService(new Intent(DexcomG4Activity.this, DexcomG4Service.class)); - SharedPreferences settings = getSharedPreferences(MedtronicConstants.PREFS_NAME, 0); - SharedPreferences.Editor editor = settings.edit(); - String type = prefs.getString("monitor_type", "1"); - if ("1".equalsIgnoreCase(type)) { - editor.remove("lastGlucometerMessage"); - editor.remove("previousValue"); - editor.remove("expectedSensorSortNumber"); - editor.remove("knownDevices"); - editor.remove("isCalibrating"); - editor.remove("lastGlucometerMessage"); - editor.remove("previousValue"); - editor.remove("lastGlucometerValue"); - editor.remove("lastGlucometerDate"); - editor.remove("expectedSensorSortNumberForCalibration0"); - editor.remove("expectedSensorSortNumberForCalibration1"); - editor.remove("lastPumpAwake"); - editor.commit(); - } - if (!sharedPreferences.getBoolean("IUNDERSTAND", false)) { - synchronized (mHandlerActiveLock) { - mHandler.removeCallbacks(updateDataView); - mHandlerActive = false; - } - b1.setText("Start Uploading CGM Data"); - mTitleTextView.setTextColor(Color.RED); - mTitleTextView.setText("CGM Service Stopped"); - stopCGMServices(); - } else { - startCGMServices(); - mHandler.post(updateDataView); - mHandlerActive = true; - } - } //If i do not if (key.equals("IUNDERSTAND")) { if (!sharedPreferences.getBoolean("IUNDERSTAND", false)) { synchronized (mHandlerActiveLock) { - mHandler.removeCallbacks(updateDataView); + //mHandler.removeCallbacks(updateDataView); mHandlerActive = false; } b1.setText("Start Uploading CGM Data"); @@ -1185,7 +1192,7 @@ public class DexcomG4Activity extends Activity implements OnSharedPreferenceChan stopCGMServices(); } else { startCGMServices(); - mHandler.post(updateDataView); + //mHandler.post(updateDataView); mHandlerActive = true; } } diff --git a/app/src/main/java/com/nightscout/android/eula/Eula.java b/app/src/main/java/com/nightscout/android/eula/Eula.java index 8812739..f3994dd 100644 --- a/app/src/main/java/com/nightscout/android/eula/Eula.java +++ b/app/src/main/java/com/nightscout/android/eula/Eula.java @@ -25,20 +25,21 @@ import java.io.IOException; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.Closeable; +import java.util.Map; import com.nightscout.android.R; /** * Displays an EULA ("End User License Agreement") that the user has to accept before - * using the application. Your application should call {@link Eula#show(android.app.Activity)} + * using the application. Your application should call {@link Eula#show(android.app.Activity, SharedPreferences)} * in the onCreate() method of the first activity. If the user accepts the EULA, it will never * be shown again. If the user refuses, {@link android.app.Activity#finish()} is invoked * on your activity. */ public class Eula { private static final String ASSET_EULA = "EULA"; - private static final String PREFERENCE_EULA_ACCEPTED = "eula.accepted"; - private static final String PREFERENCES_EULA = "eula"; + private static final String PREFERENCE_EULA_ACCEPTED = "IUNDERSTAND"; + private static final String PREFERENCES_EULA = "Disclaimer"; private static AlertDialog aDialog = null; /** @@ -63,9 +64,11 @@ public class Eula { * @param activity The Activity to finish if the user rejects the EULA. * @return Whether the user has agreed already. */ - public static boolean show(final Activity activity) { - final SharedPreferences preferences = activity.getSharedPreferences(PREFERENCES_EULA, - Activity.MODE_PRIVATE); + public static boolean show(final Activity activity, final SharedPreferences preferences ) { + //final SharedPreferences preferences = activity.getSharedPreferences(PREFERENCES_EULA, + // Activity.MODE_PRIVATE); + + Map<String, ?> preferencesAll = preferences.getAll(); if (!preferences.getBoolean(PREFERENCE_EULA_ACCEPTED, false)) { final AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.eula_title); diff --git a/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLReader.java b/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLReader.java index e3aad63..b169ba3 100644 --- a/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLReader.java +++ b/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLReader.java @@ -4,18 +4,41 @@ import android.util.Log; import com.nightscout.android.USB.UsbHidDriver; import com.nightscout.android.dexcom.USB.HexDump; +import com.nightscout.android.medtronic.message.BeginEHSMMessage; import com.nightscout.android.medtronic.message.ChannelNegotiateMessage; +import com.nightscout.android.medtronic.message.ChecksumException; import com.nightscout.android.medtronic.message.ContourNextLinkBinaryMessage; +import com.nightscout.android.medtronic.message.ContourNextLinkCommandMessage; +import com.nightscout.android.medtronic.message.ContourNextLinkMessage; +import com.nightscout.android.medtronic.message.ContourNextLinkMessageHandler; +import com.nightscout.android.medtronic.message.EncryptionException; +import com.nightscout.android.medtronic.message.EndEHSMMessage; +import com.nightscout.android.medtronic.message.MedtronicMessage; +import com.nightscout.android.medtronic.message.MessageUtils; +import com.nightscout.android.medtronic.message.PumpStatusRequestMessage; +import com.nightscout.android.medtronic.message.PumpStatusResponseMessage; +import com.nightscout.android.medtronic.message.PumpTimeRequestMessage; +import com.nightscout.android.medtronic.message.PumpTimeResponseMessage; +import com.nightscout.android.medtronic.message.UnexpectedMessageException; import com.nightscout.android.medtronic.service.MedtronicCNLService; +import com.nightscout.android.upload.Medtronic640gPumpRecord; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; +import java.util.concurrent.TimeoutException; /** * Created by lgoedhart on 24/03/2016. */ -public class MedtronicCNLReader { +public class MedtronicCNLReader implements ContourNextLinkMessageHandler { private static final String TAG = MedtronicCNLService.class.getSimpleName(); @@ -23,15 +46,15 @@ public class MedtronicCNLReader { private static final int READ_TIMEOUT_MS = 5000; private static final String BAYER_USB_HEADER = "ABC"; - private static final byte[] RADIO_CHANNELS = { 0x14, 0x11, 0x0e, 0x17, 0x1a }; - public String deviceInfo; + private static final byte[] RADIO_CHANNELS = {0x14, 0x11, 0x0e, 0x17, 0x1a}; private UsbHidDriver mDevice; private MedtronicCNLSession mPumpSession = new MedtronicCNLSession(); + public MedtronicCNLReader(UsbHidDriver device) { mDevice = device; } - public byte[] readMessage() throws IOException { + public byte[] readMessage() throws IOException, TimeoutException { ByteArrayOutputStream responseMessage = new ByteArrayOutputStream(); byte[] responseBuffer = new byte[USB_BLOCKSIZE]; @@ -40,6 +63,12 @@ public class MedtronicCNLReader { do { bytesRead = mDevice.read(responseBuffer, READ_TIMEOUT_MS); + + if (bytesRead == 0) { + throw new TimeoutException("Timeout waiting for response from pump"); + } + + // Validate the header ByteBuffer header = ByteBuffer.allocate(3); header.put(responseBuffer, 0, 3); String headerString = new String(header.array()); @@ -51,12 +80,30 @@ public class MedtronicCNLReader { } while (bytesRead > 0 && (messageSize + 4) == bytesRead); // TODO - how to deal with messages that finish on the boundary? + // FIXME - remove debugging String responseString = HexDump.dumpHexString(responseMessage.toByteArray()); Log.d(TAG, "READ: " + responseString); return responseMessage.toByteArray(); } + @Override + public void sendMessage(ContourNextLinkMessage message) throws IOException { + sendMessage(message.encode()); + if (message instanceof ContourNextLinkBinaryMessage) { + mPumpSession.incrBayerSequenceNumber(); + } + + if (message instanceof MedtronicMessage) { + mPumpSession.incrMedtronicSequenceNumber(); + } + } + + @Override + public ContourNextLinkMessage receiveMessage() { + return null; + } + public void sendMessage(byte[] message) throws IOException { int pos = 0; @@ -76,65 +123,210 @@ public class MedtronicCNLReader { } } - public void sendMessage(byte message) throws IOException { - byte[] msg = {message}; - sendMessage(msg); + // TODO - get rid of this - it should be in a message decoder + private void checkControlMessage(byte[] msg, byte controlCharacter) throws IOException, TimeoutException, UnexpectedMessageException { + if (msg.length != 1 || msg[0] != controlCharacter) { + throw new UnexpectedMessageException(String.format("Expected to get control character '%d' Got '%d'.", + (int) controlCharacter, (int) msg[0])); + } } - private void checkControlMessage(byte controlCharacter) throws IOException { - byte[] msg = readMessage(); + public void requestDeviceInfo() throws IOException, TimeoutException, UnexpectedMessageException { + new ContourNextLinkCommandMessage("X").send(this); - if (msg.length != 1 || msg[0] != controlCharacter) { - throw new RuntimeException(String.format("Expected to get an %d control character.", (int) controlCharacter)); + boolean gotTimeout = false; + + // TODO - parse this into an ASTM record for the device info. + try { + // The stick will return either the ASTM message, or the ENQ first. The order can change, + // so we need to handle both cases + byte[] response1 = readMessage(); + byte[] response2 = readMessage(); + + if (response1[0] == ASCII.EOT.value) { + // response 1 is the ASTM message + checkControlMessage(response2, ASCII.ENQ.value); + } else { + // response 2 is the ASTM message + checkControlMessage(response1, ASCII.ENQ.value); + } + } catch (TimeoutException e) { + // Terminate comms with the pump, then try again + new ContourNextLinkCommandMessage(ASCII.EOT.value).send(this); + gotTimeout = true; + } finally { + // If we timed out - try to start the session again. + if (gotTimeout) { + requestDeviceInfo(); + } } } - public void requestDeviceInfo() throws IOException { - sendMessage((byte) 'X'); + public void enterControlMode() throws IOException, TimeoutException, UnexpectedMessageException { + new ContourNextLinkCommandMessage(ASCII.NAK.value).send(this); + checkControlMessage(readMessage(), ASCII.EOT.value); + new ContourNextLinkCommandMessage(ASCII.ENQ.value).send(this); + checkControlMessage(readMessage(), ASCII.ACK.value); - // TODO - parse this into an ASTM record for the device info. - byte[] response = readMessage(); + } - checkControlMessage(ASCII.ENQ.value); + public void enterPassthroughMode() throws IOException, TimeoutException, UnexpectedMessageException { + new ContourNextLinkCommandMessage("W|").send(this); + checkControlMessage(readMessage(), ASCII.ACK.value); + new ContourNextLinkCommandMessage("Q|").send(this); + checkControlMessage(readMessage(), ASCII.ACK.value); + new ContourNextLinkCommandMessage("1|").send(this); + checkControlMessage(readMessage(), ASCII.ACK.value); } - public void enterControlMode() throws IOException { - sendMessage(ASCII.NAK.value); - checkControlMessage(ASCII.EOT.value); - sendMessage(ASCII.ENQ.value); - checkControlMessage(ASCII.ACK.value); + public void openConnection() throws IOException, TimeoutException { + new ContourNextLinkBinaryMessage(ContourNextLinkBinaryMessage.CommandType.OPEN_CONNECTION, mPumpSession, mPumpSession.getHMAC()).send(this); + // FIXME - We need to care what the response message is - wrong MAC and all that + readMessage(); + } + public void requestReadInfo() throws IOException, TimeoutException { + new ContourNextLinkBinaryMessage(ContourNextLinkBinaryMessage.CommandType.READ_INFO, mPumpSession, null).send(this); + // FIXME - pull the linkMAC and pumpMAC from here. It needs to go into the session. + readMessage(); } - public void enterPassthroughMode() throws IOException { - sendMessage("W|".getBytes()); - checkControlMessage(ASCII.ACK.value); - sendMessage("Q|".getBytes()); - checkControlMessage(ASCII.ACK.value); - sendMessage("1|".getBytes()); - checkControlMessage(ASCII.ACK.value); + public byte negotiateChannel() throws IOException, ChecksumException, TimeoutException { + for (byte channel : RADIO_CHANNELS) { + mPumpSession.setRadioChannel(channel); + new ChannelNegotiateMessage(mPumpSession).send(this); + + // Don't care what the 0x81 response message is at this stage + readMessage(); + // The 0x80 message + ContourNextLinkMessage response = ContourNextLinkBinaryMessage.fromBytes(readMessage()); + byte[] responseBytes = response.encode(); + + if (responseBytes.length > 46) { + // Looks promising, let's check the last byte of the payload to make sure + if (responseBytes[76] == mPumpSession.getRadioChannel()) { + break; + } else { + throw new IOException(String.format("Expected to get a message for channel %d. Got %d", mPumpSession.getRadioChannel(), responseBytes[76])); + } + } else { + mPumpSession.setRadioChannel((byte) 0); + } + } + + return mPumpSession.getRadioChannel(); } - public void openConnection() throws IOException { - ContourNextLinkBinaryMessage message = new ContourNextLinkBinaryMessage(ContourNextLinkBinaryMessage.CommandType.OPEN_CONNECTION, mPumpSession, mPumpSession.getHMAC()); - //message.send(this); - sendMessage(message.encode()); - // FIXME - We need to care what the response message is - wrong MAC and all that + public void beginEHSMSession() throws EncryptionException, IOException, TimeoutException { + new BeginEHSMMessage(mPumpSession).send(this); + // The Begin EHSM Session only has an 0x81 response readMessage(); } - public void requestReadInfo() throws IOException { - ContourNextLinkBinaryMessage message = new ContourNextLinkBinaryMessage(ContourNextLinkBinaryMessage.CommandType.READ_INFO, mPumpSession, null); - sendMessage(message.encode()); - // Don't care what the response message is at this stage + public void getPumpTime(Medtronic640gPumpRecord pumpRecord) throws EncryptionException, IOException, ChecksumException, TimeoutException { + // FIXME - throw if not in EHSM mode (add a state machine) + + new PumpTimeRequestMessage(mPumpSession).send(this); + // Read the 0x81 readMessage(); + + // Read the 0x80 + ContourNextLinkMessage response = PumpTimeResponseMessage.fromBytes(mPumpSession, readMessage()); + + if (response.encode().length < 57) { + // Invalid message. Don't try and parse it + return; + } + + // FIXME - this needs to go into PumpTimeResponseMessage + ByteBuffer dateBuffer = ByteBuffer.allocate(8); + dateBuffer.order(ByteOrder.BIG_ENDIAN); + dateBuffer.put(response.encode(), 61, 8); + long rtc = dateBuffer.getInt(0) & 0x00000000ffffffffL; + long offset = dateBuffer.getInt(4); + + Date pumpDate = MessageUtils.decodeDateTime(rtc, offset); + // FIXME - HAX! Add 1 hour during AEST until we can figure out what Medtronic is doing + Calendar cal = Calendar.getInstance(); + cal.setTime(pumpDate); + cal.add(Calendar.HOUR_OF_DAY, 1); + pumpDate = cal.getTime(); + // Set displayTime to be an ISO 8601 date (so that it's parsable). + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + pumpRecord.displayTime = dateFormat.format(pumpDate); + pumpRecord.pumpDate = pumpDate; } - public void negotiateChannel() throws IOException { - for( byte channel: RADIO_CHANNELS ) { - ChannelNegotiateMessage message = new ChannelNegotiateMessage( mPumpSession ); - sendMessage(message.encode()); + public void getPumpStatus(Medtronic640gPumpRecord pumpRecord) throws IOException, EncryptionException, ChecksumException, TimeoutException { + // FIXME - throw if not in EHSM mode (add a state machine) + + new PumpStatusRequestMessage(mPumpSession).send(this); + // Read the 0x81 + readMessage(); + + // Read the 0x80 + ContourNextLinkMessage response = PumpStatusResponseMessage.fromBytes(mPumpSession, readMessage()); + + if (response.encode().length < 57) { + // Invalid message. Don't try and parse it + return; } + + // FIXME - this needs to go into PumpStatusResponseMessage + ByteBuffer statusBuffer = ByteBuffer.allocate(96); + statusBuffer.order(ByteOrder.BIG_ENDIAN); + statusBuffer.put(response.encode(), 57, 96); + + // Read the data into the record + pumpRecord.activeInsulin = (statusBuffer.getShort(51) & 0x0000ffff) / 10000f; + pumpRecord.sensorBGL = statusBuffer.getShort(53) & 0x0000ffff; // In mg/DL. 0 means no CGM reading + long rtc; + long offset; + if( ( pumpRecord.sensorBGL & 0x200 ) == 0x200 ) { + // Sensor error. Let's reset. FIXME - solve this more elegantly later + pumpRecord.sensorBGL = 0; + rtc = 0; + offset = 0; + } else { + rtc = statusBuffer.getInt(55) & 0x00000000ffffffffL; + offset = statusBuffer.getInt(59); + pumpRecord.setTrend(Medtronic640gPumpRecord.fromMessageByte( statusBuffer.get(64))); + } + pumpRecord.sensorBGLDate = MessageUtils.decodeDateTime(rtc, offset); + // FIXME - HAX! Add 1 hour during AEST until we can figure out what Medtronic is doing + Calendar cal = Calendar.getInstance(); + cal.setTime(pumpRecord.sensorBGLDate); + cal.add(Calendar.HOUR_OF_DAY, 1); + pumpRecord.sensorBGLDate = cal.getTime(); + pumpRecord.recentBolusWizard = statusBuffer.get(72) != 0; + pumpRecord.bolusWizardBGL = statusBuffer.getShort(73); // In mg/DL + } + + public void endEHSMSession() throws EncryptionException, IOException, TimeoutException { + new EndEHSMMessage(mPumpSession).send(this); + // The End EHSM Session only has an 0x81 response + readMessage(); + } + + public void closeConnection() throws IOException, TimeoutException { + new ContourNextLinkBinaryMessage(ContourNextLinkBinaryMessage.CommandType.CLOSE_CONNECTION, mPumpSession, null).send(this); + // FIXME - We need to care what the response message is - wrong MAC and all that + readMessage(); + } + + public void endPassthroughMode() throws IOException, TimeoutException, UnexpectedMessageException { + new ContourNextLinkCommandMessage("W|").send(this); + checkControlMessage(readMessage(), ASCII.ACK.value); + new ContourNextLinkCommandMessage("Q|").send(this); + checkControlMessage(readMessage(), ASCII.ACK.value); + new ContourNextLinkCommandMessage("0|").send(this); + checkControlMessage(readMessage(), ASCII.ACK.value); + } + + public void endControlMode() throws IOException, TimeoutException, UnexpectedMessageException { + new ContourNextLinkCommandMessage(ASCII.EOT.value).send(this); + checkControlMessage(readMessage(), ASCII.ENQ.value); } public enum ASCII { diff --git a/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLSession.java b/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLSession.java index da26731..13fe680 100644 --- a/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLSession.java +++ b/app/src/main/java/com/nightscout/android/medtronic/MedtronicCNLSession.java @@ -6,9 +6,11 @@ import com.nightscout.android.medtronic.message.MessageUtils; * Created by lgoedhart on 26/03/2016. */ public class MedtronicCNLSession { + // FIXME - Lennart's hard coded key and HMAC private final static byte[] HMAC = MessageUtils.hexStringToByteArray("e28fe4e5cf3c1eb6d6a2ec5a093093d4f397237dc60b3f2c1ef64f31e32077c4"); private final static byte[] KEY = MessageUtils.hexStringToByteArray("57833334130906a587b7a0437bc28a69"); + // FIXME - Lennart's hard coded serial numbers private final static long linkMAC = 1055866 + 0x0023F70682000000L; private final static long pumpMAC = 1057941 + 0x0023F745EE000000L; @@ -20,12 +22,13 @@ public class MedtronicCNLSession { return HMAC; } - public static byte[] getKEY() { + public static byte[] getKey() { return KEY; } public byte[] getIV() { - byte[] iv = HMAC; - iv[0] = (byte) radioChannel; + byte[] iv = new byte[KEY.length]; + System.arraycopy(KEY,0,iv,0,KEY.length); + iv[0] = radioChannel; return iv; } @@ -48,4 +51,16 @@ public class MedtronicCNLSession { public byte getRadioChannel() { return radioChannel; } + + public void incrBayerSequenceNumber() { + bayerSequenceNumber++; + } + + public void incrMedtronicSequenceNumber() { + medtronicSequenceNumber++; + } + + public void setRadioChannel(byte radioChannel) { + this.radioChannel = radioChannel; + } } diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/BeginEHSMMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/BeginEHSMMessage.java new file mode 100644 index 0000000..1424952 --- /dev/null +++ b/app/src/main/java/com/nightscout/android/medtronic/message/BeginEHSMMessage.java @@ -0,0 +1,17 @@ +package com.nightscout.android.medtronic.message; + +import com.nightscout.android.medtronic.MedtronicCNLSession; + +/** + * Created by lgoedhart on 26/03/2016. + */ +public class BeginEHSMMessage extends MedtronicSendMessage { + public BeginEHSMMessage(MedtronicCNLSession pumpSession) throws EncryptionException { + super(SendMessageType.BEGIN_EHSM_SESSION, pumpSession, buildPayload()); + } + + protected static byte[] buildPayload() { + // Not sure what the payload of a null byte means, but it's the same every time. + return new byte[] { 0x00 }; + } +} diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java index ea4fb47..e188941 100644 --- a/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java +++ b/app/src/main/java/com/nightscout/android/medtronic/message/ChannelNegotiateMessage.java @@ -10,19 +10,21 @@ import java.nio.ByteOrder; */ public class ChannelNegotiateMessage extends MedtronicMessage { public ChannelNegotiateMessage(MedtronicCNLSession pumpSession) { - super(CommandType.SEND_MESSAGE, CommandAction.CHANNEL_NEGOTIATE, pumpSession); + super(CommandType.SEND_MESSAGE, CommandAction.CHANNEL_NEGOTIATE, pumpSession, buildPayload(pumpSession)); + } + protected static byte[] buildPayload( MedtronicCNLSession pumpSession ) { ByteBuffer payload = ByteBuffer.allocate(26); payload.order(ByteOrder.LITTLE_ENDIAN); // The MedtronicMessage sequence number is always sent as 1 for this message, // even though the sequence should keep incrementing as normal payload.put((byte) 1); - payload.put(mPumpSession.getRadioChannel()); + payload.put(pumpSession.getRadioChannel()); byte[] unknownBytes = {0, 0, 0, 0x07, 0x07, 0, 0, 0x02}; payload.put(unknownBytes); - payload.putLong(mPumpSession.getLinkMAC()); - payload.putLong(mPumpSession.getPumpMAC()); + payload.putLong(pumpSession.getLinkMAC()); + payload.putLong(pumpSession.getPumpMAC()); - setPayload(payload.array()); + return payload.array(); } } diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java index b06979f..964ed9f 100644 --- a/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java +++ b/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java @@ -8,11 +8,11 @@ import java.nio.ByteOrder; /** * Created by lgoedhart on 26/03/2016. */ -public class ContourNextLinkBinaryMessage { - protected ByteBuffer mBayerEnvelope; - protected ByteBuffer mBayerPayload; - protected MedtronicCNLSession mPumpSession; - protected CommandType mCommandType = CommandType.NO_TYPE; +public class ContourNextLinkBinaryMessage extends ContourNextLinkMessage{ + //protected ByteBuffer mBayerEnvelope; + //protected ByteBuffer mBayerPayload; + //protected MedtronicCNLSession mPumpSession; + //protected CommandType mCommandType = CommandType.NO_TYPE; static int ENVELOPE_SIZE = 33; @@ -36,64 +36,44 @@ public class ContourNextLinkBinaryMessage { } public ContourNextLinkBinaryMessage(CommandType commandType, MedtronicCNLSession pumpSession, byte[] payload) { - mPumpSession = pumpSession; - - setPayload(payload); + super(buildPayload(commandType, pumpSession, payload)); } - protected void setPayload(byte[] payload) { - if( payload != null ) { - mBayerPayload = ByteBuffer.allocate( payload.length); - mBayerPayload.put(payload); - } + protected static byte[] buildPayload(CommandType commandType, MedtronicCNLSession pumpSession, byte[] payload) { + int payloadLength = payload == null ? 0 : payload.length; - mBayerEnvelope = ByteBuffer.allocate(ENVELOPE_SIZE); - mBayerEnvelope.order(ByteOrder.LITTLE_ENDIAN); - mBayerEnvelope.put((byte) 0x51); - mBayerEnvelope.put((byte) 0x3); - mBayerEnvelope.put("000000".getBytes()); // Text of Pump serial, but 000000 for 640g + ByteBuffer payloadBuffer = ByteBuffer.allocate( ENVELOPE_SIZE + payloadLength ); + payloadBuffer.order(ByteOrder.LITTLE_ENDIAN); + + payloadBuffer.put((byte) 0x51); + payloadBuffer.put((byte) 0x3); + payloadBuffer.put("000000".getBytes()); // Text of Pump serial, but 000000 for 640g byte[] unknownBytes = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - mBayerEnvelope.put(unknownBytes); - mBayerEnvelope.put(mCommandType.value); - mBayerEnvelope.putInt(mPumpSession.getBayerSequenceNumber()); + payloadBuffer.put(unknownBytes); + payloadBuffer.put(commandType.value); + payloadBuffer.putInt(pumpSession.getBayerSequenceNumber()); byte[] unknownBytes2 = {0, 0, 0, 0, 0}; - mBayerEnvelope.put(unknownBytes2); - mBayerEnvelope.putInt(mBayerPayload == null ? 0 : mBayerPayload.capacity()); - mBayerEnvelope.put(messageCrc()); - } + payloadBuffer.put(unknownBytes2); + payloadBuffer.putInt(payloadLength); + payloadBuffer.put((byte) 0); // Placeholder for the CRC - private byte messageCrc() { - byte sum = MessageUtils.oneByteSum(mBayerEnvelope.array()); - // Don't include the checkum byte in the checksum calculation! - sum -= mBayerEnvelope.get(32); - if (mBayerPayload != null) { - sum += MessageUtils.oneByteSum(mBayerPayload.array()); + if( payloadLength != 0 ) { + payloadBuffer.put(payload); } - return sum; - } - public byte[] encode() { - if (mBayerPayload != null) { - ByteBuffer out = ByteBuffer.allocate(mBayerEnvelope.capacity() + mBayerPayload.capacity()); - out.put(mBayerEnvelope.array()); - out.put(mBayerPayload.array()); - return out.array(); - } else { - return mBayerEnvelope.array(); - } + // Now that we have the payload, calculate the message CRC + payloadBuffer.position(32); + payloadBuffer.put(MessageUtils.oneByteSum(payloadBuffer.array())); + + return payloadBuffer.array(); } - public static ContourNextLinkBinaryMessage fromBytes(byte[] bytes) throws ChecksumException { - ContourNextLinkBinaryMessage message = new ContourNextLinkBinaryMessage(CommandType.NO_TYPE, null, null); - message.mBayerEnvelope = ByteBuffer.allocate(ENVELOPE_SIZE); - message.mBayerEnvelope.put(bytes, 0, ENVELOPE_SIZE); - int payloadSize = bytes.length - ENVELOPE_SIZE; - message.mBayerPayload = ByteBuffer.allocate( payloadSize); - message.mBayerPayload.put(bytes, ENVELOPE_SIZE, payloadSize); + public static ContourNextLinkMessage fromBytes(byte[] bytes) throws ChecksumException { + ContourNextLinkMessage message = new ContourNextLinkMessage(bytes); // Validate checksum - byte messageChecksum = message.mBayerEnvelope.get(32); - byte calculatedChecksum = message.messageCrc(); + byte messageChecksum = message.mPayload.get(32); + byte calculatedChecksum = (byte) (MessageUtils.oneByteSum(message.mPayload.array()) - messageChecksum); if (messageChecksum != calculatedChecksum) { throw new ChecksumException(String.format("Expected to get %d. Got %d", (int) calculatedChecksum, (int) messageChecksum)); diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkCommandMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkCommandMessage.java new file mode 100644 index 0000000..91021b2 --- /dev/null +++ b/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkCommandMessage.java @@ -0,0 +1,16 @@ +package com.nightscout.android.medtronic.message; + +import java.nio.ByteBuffer; + +/** + * Created by lgoedhart on 26/03/2016. + */ +public class ContourNextLinkCommandMessage extends ContourNextLinkMessage { + public ContourNextLinkCommandMessage(byte command) { + super(new byte[]{command}); + } + + public ContourNextLinkCommandMessage(String command) { + super(command.getBytes()); + } +} diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessage.java index d964715..3c4a503 100644 --- a/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessage.java +++ b/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessage.java @@ -1,5 +1,6 @@ package com.nightscout.android.medtronic.message; +import java.io.IOException; import java.nio.ByteBuffer; /** @@ -7,4 +8,25 @@ import java.nio.ByteBuffer; */ public class ContourNextLinkMessage { protected ByteBuffer mPayload; + + public ContourNextLinkMessage(byte[] bytes) { + if (bytes != null) { + this.mPayload = ByteBuffer.allocate(bytes.length); + this.mPayload.put(bytes); + } + } + + public byte[] encode() { + return mPayload.array(); + } + + public void send(ContourNextLinkMessageHandler handler) throws IOException { + handler.sendMessage(this); + } + + // FIXME - get rid of this - make a Builder instead + protected void setPayload(byte[] payload) { + mPayload = ByteBuffer.allocate(payload.length); + mPayload.put(payload); + } } diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessageHandler.java b/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessageHandler.java new file mode 100644 index 0000000..434a0a9 --- /dev/null +++ b/app/src/main/java/com/nightscout/android/medtronic/message/ContourNextLinkMessageHandler.java @@ -0,0 +1,11 @@ +package com.nightscout.android.medtronic.message; + +import java.io.IOException; + +/** + * Created by lgoedhart on 26/03/2016. + */ +public interface ContourNextLinkMessageHandler { + void sendMessage( ContourNextLinkMessage message ) throws IOException; + ContourNextLinkMessage receiveMessage(); +} diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/EncryptionException.java b/app/src/main/java/com/nightscout/android/medtronic/message/EncryptionException.java new file mode 100644 index 0000000..5e86774 --- /dev/null +++ b/app/src/main/java/com/nightscout/android/medtronic/message/EncryptionException.java @@ -0,0 +1,10 @@ +package com.nightscout.android.medtronic.message; + +/** + * Created by lgoedhart on 26/03/2016. + */ +public class EncryptionException extends Throwable { + public EncryptionException(String message) { + super(message); + } +} diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/EndEHSMMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/EndEHSMMessage.java new file mode 100644 index 0000000..46f119b --- /dev/null +++ b/app/src/main/java/com/nightscout/android/medtronic/message/EndEHSMMessage.java @@ -0,0 +1,17 @@ +package com.nightscout.android.medtronic.message; + +import com.nightscout.android.medtronic.MedtronicCNLSession; + +/** + * Created by lgoedhart on 26/03/2016. + */ +public class EndEHSMMessage extends MedtronicSendMessage { + public EndEHSMMessage(MedtronicCNLSession pumpSession) throws EncryptionException { + super(SendMessageType.END_EHSM_SESSION, pumpSession, buildPayload()); + } + + protected static byte[] buildPayload() { + // Not sure what the payload byte means, but it's the same every time. + return new byte[] { 0x01 }; + } +} diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicMessage.java index 6140979..d27b366 100644 --- a/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicMessage.java +++ b/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicMessage.java @@ -4,6 +4,16 @@ import com.nightscout.android.medtronic.MedtronicCNLSession; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; /** * Created by lgoedhart on 26/03/2016. @@ -11,7 +21,6 @@ import java.nio.ByteOrder; public class MedtronicMessage extends ContourNextLinkBinaryMessage { static int ENVELOPE_SIZE = 2; static int CRC_SIZE = 2; - protected CommandAction mCommandAction = CommandAction.NO_TYPE; public enum CommandAction { NO_TYPE(0x0), @@ -26,32 +35,68 @@ public class MedtronicMessage extends ContourNextLinkBinaryMessage { } } - protected MedtronicMessage(CommandType commandType, CommandAction commandAction, MedtronicCNLSession pumpSession) { - super(commandType, pumpSession, null); - mCommandAction = commandAction; + protected MedtronicMessage(CommandType commandType, CommandAction commandAction, MedtronicCNLSession pumpSession, byte[] payload) { + super(commandType, pumpSession, buildPayload(commandAction, payload)); } - @Override - protected void setPayload(byte[] payload) { - /* - MedtronicMessage: - +---------------+-------------------+----------------------+--------------------+ - | CommandAction | byte Payload Size | byte[] Payload bytes | LE short CCITT CRC | - +---------------+-------------------+----------------------+--------------------+ - */ - + /** + * MedtronicMessage: + * +---------------+-------------------+----------------------+--------------------+ + * | CommandAction | byte Payload Size | byte[] Payload bytes | LE short CCITT CRC | + * +---------------+-------------------+----------------------+--------------------+ + */ + protected static byte[] buildPayload(CommandAction commandAction, byte[] payload) { byte payloadLength = (byte) (payload == null ? 0 : payload.length); - ByteBuffer payloadBuffer = ByteBuffer.allocate( ENVELOPE_SIZE + payloadLength + CRC_SIZE ); + ByteBuffer payloadBuffer = ByteBuffer.allocate(ENVELOPE_SIZE + payloadLength + CRC_SIZE); payloadBuffer.order(ByteOrder.LITTLE_ENDIAN); - payloadBuffer.put(mCommandAction.value); - payloadBuffer.put(payloadLength); - if (payloadLength != 0 ) { - payloadBuffer.put(payload); + payloadBuffer.put(commandAction.value); + payloadBuffer.put((byte) (ENVELOPE_SIZE + payloadLength)); + if (payloadLength != 0) { + payloadBuffer.put(payload != null ? payload : new byte[0]); + } + + payloadBuffer.putShort((short) MessageUtils.CRC16CCITT(payloadBuffer.array(), 0xffff, 0x1021, ENVELOPE_SIZE + payloadLength)); + + return payloadBuffer.array(); + } + + public static ContourNextLinkMessage fromBytes(byte[] bytes) throws ChecksumException { + ContourNextLinkMessage message = ContourNextLinkBinaryMessage.fromBytes(bytes); + + // TODO - Validate the CCITT + return message; + } + + // TODO - maybe move the SecretKeySpec, IvParameterSpec and Cipher construction into the PumpSession? + protected static byte[] encrypt(byte[] key, byte[] iv, byte[] clear) throws EncryptionException { + SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); + IvParameterSpec ivSpec = new IvParameterSpec(iv); + byte[] encrypted = new byte[0]; + + try { + Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding"); + cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec); + encrypted = cipher.doFinal(clear); + } catch (Exception e) { + throw new EncryptionException( "Could not encrypt Medtronic Message" ); } - payloadBuffer.putShort(MessageUtils.ccittChecksum(payloadBuffer.array())); + return encrypted; + } + + protected static byte[] decrypt(byte[] key, byte[] iv, byte[] encrypted) throws EncryptionException { + SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); + IvParameterSpec ivSpec = new IvParameterSpec(iv); + byte[] decrypted; - super.setPayload( payloadBuffer.array() ); + try { + Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding"); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec); + decrypted = cipher.doFinal(encrypted); + } catch (Exception e ) { + throw new EncryptionException( "Could not decrypt Medtronic Message" ); + } + return decrypted; } } diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicReceiveMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicReceiveMessage.java new file mode 100644 index 0000000..2d7401a --- /dev/null +++ b/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicReceiveMessage.java @@ -0,0 +1,64 @@ +package com.nightscout.android.medtronic.message; + +import com.nightscout.android.medtronic.MedtronicCNLSession; + +import java.nio.ByteBuffer; + +/** + * Created by lgoedhart on 26/03/2016. + */ +public class MedtronicReceiveMessage extends MedtronicMessage { + static int ENVELOPE_SIZE = 22; + static int ENCRYPTED_ENVELOPE_SIZE = 3; + static int CRC_SIZE = 2; + + protected MedtronicReceiveMessage(CommandType commandType, CommandAction commandAction, MedtronicCNLSession pumpSession, byte[] payload) { + super(commandType, commandAction, pumpSession, payload); + } + + public enum ReceiveMessageType { + NO_TYPE(0x0), + TIME_RESPONSE(0x407); + + private short value; + + ReceiveMessageType(int messageType) { + value = (short) messageType; + } + } + + /** + * MedtronicReceiveMessage: + * +------------------+-----------------+-----------------+---------------------------------+-------------------+--------------------------------+ + * | LE short unknown | LE long pumpMAC | LE long linkMAC | byte[3] responseSequenceNumber? | byte Payload size | byte[] Encrypted Payload bytes | + * +------------------+-----------------+-----------------+---------------------------------+-------------------+--------------------------------+ + * <p/> + * MedtronicReceiveMessage (decrypted payload): + * +----------------------------+-----------------------------+----------------------+--------------------+ + * | byte receiveSequenceNumber | BE short receiveMessageType | byte[] Payload bytes | BE short CCITT CRC | + * +----------------------------+-----------------------------+----------------------+--------------------+ + */ + public static ContourNextLinkMessage fromBytes(MedtronicCNLSession pumpSession, byte[] bytes) throws ChecksumException, EncryptionException { + // TODO - turn this into a factory + ContourNextLinkMessage message = MedtronicMessage.fromBytes(bytes); + + // TODO - Validate the message, inner CCITT, serial numbers, etc + + // If there's not 57 bytes, then we got back a bad message. Not sure how to process these yet. + if( bytes.length >= 57 ) { + // Replace the encrypted bytes by their decrypted equivalent (same block size) + byte encryptedPayloadSize = bytes[56]; + + ByteBuffer encryptedPayload = ByteBuffer.allocate(encryptedPayloadSize); + encryptedPayload.put(bytes, 57, encryptedPayloadSize); + byte[] decryptedPayload = decrypt(pumpSession.getKey(), pumpSession.getIV(), encryptedPayload.array()); + + // Now that we have the decrypted payload, rewind the mPayload, and overwrite the bytes + // TODO - because this messes up the existing CCITT, do we want to have a separate buffer for the decrypted payload? + // Should be fine provided we check the CCITT first... + message.mPayload.position(57); + message.mPayload.put(decryptedPayload); + } + return message; + } +} diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicSendMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicSendMessage.java new file mode 100644 index 0000000..f187f3d --- /dev/null +++ b/app/src/main/java/com/nightscout/android/medtronic/message/MedtronicSendMessage.java @@ -0,0 +1,83 @@ +package com.nightscout.android.medtronic.message; + +import com.nightscout.android.medtronic.MedtronicCNLSession; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by lgoedhart on 26/03/2016. + */ +public class MedtronicSendMessage extends MedtronicMessage { + static int ENVELOPE_SIZE = 11; + static int ENCRYPTED_ENVELOPE_SIZE = 3; + static int CRC_SIZE = 2; + + public enum SendMessageType { + NO_TYPE(0x0), + BEGIN_EHSM_SESSION(0x412), + TIME_REQUEST(0x0403), + READ_PUMP_STATUS_REQUEST(0x0112), + END_EHSM_SESSION(0x412); + + private short value; + + SendMessageType(int messageType) { + value = (short) messageType; + } + } + + protected MedtronicSendMessage(SendMessageType sendMessageType, MedtronicCNLSession pumpSession, byte[] payload) throws EncryptionException { + super(CommandType.SEND_MESSAGE, CommandAction.PUMP_REQUEST, pumpSession, buildPayload(sendMessageType, pumpSession, payload)); + } + + /** + * MedtronicSendMessage: + * +-----------------+------------------------------+--------------+-------------------+--------------------------------+ + * | LE long pumpMAC | byte medtronicSequenceNumber | byte unknown | byte Payload size | byte[] Encrypted Payload bytes | + * +-----------------+------------------------------+--------------+-------------------+--------------------------------+ + * <p/> + * MedtronicSendMessage (decrypted payload): + * +-------------------------+----------------------+----------------------+--------------------+ + * | byte sendSequenceNumber | BE short sendMessageType | byte[] Payload bytes | BE short CCITT CRC | + * +-------------------------+----------------------+----------------------+--------------------+ + */ + protected static byte[] buildPayload(SendMessageType sendMessageType, MedtronicCNLSession pumpSession, byte[] payload) throws EncryptionException { + byte payloadLength = (byte) (payload == null ? 0 : payload.length); + + ByteBuffer sendPayloadBuffer = ByteBuffer.allocate(ENCRYPTED_ENVELOPE_SIZE + payloadLength + CRC_SIZE); + sendPayloadBuffer.order(ByteOrder.BIG_ENDIAN); // I know, this is the default - just being explicit + + sendPayloadBuffer.put(sendSequenceNumber(sendMessageType)); + sendPayloadBuffer.putShort(sendMessageType.value); + if (payloadLength != 0) { + sendPayloadBuffer.put(payload); + } + + sendPayloadBuffer.putShort((short) MessageUtils.CRC16CCITT(sendPayloadBuffer.array(), 0xffff, 0x1021, ENCRYPTED_ENVELOPE_SIZE + payloadLength)); + + ByteBuffer payloadBuffer = ByteBuffer.allocate( ENVELOPE_SIZE + sendPayloadBuffer.capacity() ); + payloadBuffer.order(ByteOrder.LITTLE_ENDIAN); + + payloadBuffer.putLong(pumpSession.getPumpMAC()); + payloadBuffer.put((byte) pumpSession.getMedtronicSequenceNumber()); + payloadBuffer.put((byte) 0x10); + payloadBuffer.put((byte) sendPayloadBuffer.capacity()); + payloadBuffer.put(encrypt( pumpSession.getKey(), pumpSession.getIV(), sendPayloadBuffer.array())); + + return payloadBuffer.array(); + } + + protected static byte sendSequenceNumber(SendMessageType sendMessageType) { + switch (sendMessageType) { + case BEGIN_EHSM_SESSION: + return (byte) 0x80; + case TIME_REQUEST: + return (byte) 0x02; + case READ_PUMP_STATUS_REQUEST: + return (byte) 0x03; + default: + return 0x00; + } + } +} diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/MessageHandler.java b/app/src/main/java/com/nightscout/android/medtronic/message/MessageHandler.java deleted file mode 100644 index 7d1f0ef..0000000 --- a/app/src/main/java/com/nightscout/android/medtronic/message/MessageHandler.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.nightscout.android.medtronic.message; - -/** - * Created by lgoedhart on 26/03/2016. - */ -public interface MessageHandler { - void send( ContourNextLinkMessage message ); - ContourNextLinkMessage receive(); -} diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/MessageUtils.java b/app/src/main/java/com/nightscout/android/medtronic/message/MessageUtils.java index f06da4b..aaf21d7 100644 --- a/app/src/main/java/com/nightscout/android/medtronic/message/MessageUtils.java +++ b/app/src/main/java/com/nightscout/android/medtronic/message/MessageUtils.java @@ -1,5 +1,9 @@ package com.nightscout.android.medtronic.message; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.TimeZone; + /** * Created by lgoedhart on 26/03/2016. */ @@ -14,32 +18,20 @@ public class MessageUtils { return sum; } - static public short ccittChecksum(byte[] bytes) { - // From http://stackoverflow.com/questions/7961964/android-crc-ccitt - short crc = (short) 0xFFFF; - int temp; - int crc_byte; - - for (int byte_index = 0; byte_index < bytes.length; byte_index++) { - crc_byte = bytes[byte_index]; - - for (int bit_index = 0; bit_index < 8; bit_index++) { - - temp = ((crc >> 15)) ^ ((crc_byte >> 7)); - + public static int CRC16CCITT(byte[] data, int initialValue, int polynomial, int bytesToCheck) { + // From http://introcs.cs.princeton.edu/java/61data/CRC16CCITT.java + int crc = initialValue; + for (int c = 0; c < bytesToCheck; c++) { + byte b = data[c]; + for (int i = 0; i < 8; i++) { + boolean bit = ((b >> (7 - i) & 1) == 1); + boolean c15 = ((crc >> 15 & 1) == 1); crc <<= 1; - crc &= 0xFFFF; - - if (temp > 0) { - crc ^= 0x1021; - crc &= 0xFFFF; - } - - crc_byte <<= 1; - crc_byte &= 0xFF; + if (c15 ^ bit) crc ^= polynomial; } } + crc &= 0xffff; return crc; } @@ -52,4 +44,15 @@ public class MessageUtils { } return data; } + + public static Date decodeDateTime( long rtc, long offset ) { + TimeZone currentTz = java.util.Calendar.getInstance().getTimeZone(); + GregorianCalendar gregorianCalendar = new GregorianCalendar(2000, 0, 1, 0, 0, 0); + gregorianCalendar.setTimeZone(currentTz); + + long epochTime = gregorianCalendar.getTime().getTime(); + + Date pumpDate = new Date(epochTime + (( rtc + offset ) * 1000 ) ); + return pumpDate; + } } diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusRequestMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusRequestMessage.java new file mode 100644 index 0000000..4d2e4e8 --- /dev/null +++ b/app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusRequestMessage.java @@ -0,0 +1,12 @@ +package com.nightscout.android.medtronic.message; + +import com.nightscout.android.medtronic.MedtronicCNLSession; + +/** + * Created by lgoedhart on 26/03/2016. + */ +public class PumpStatusRequestMessage extends MedtronicSendMessage { + public PumpStatusRequestMessage(MedtronicCNLSession pumpSession) throws EncryptionException { + super(SendMessageType.READ_PUMP_STATUS_REQUEST, pumpSession, null); + } +} diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusResponseMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusResponseMessage.java new file mode 100644 index 0000000..bc31af2 --- /dev/null +++ b/app/src/main/java/com/nightscout/android/medtronic/message/PumpStatusResponseMessage.java @@ -0,0 +1,21 @@ +package com.nightscout.android.medtronic.message; + +import com.nightscout.android.medtronic.MedtronicCNLSession; + +/** + * Created by lgoedhart on 27/03/2016. + */ +public class PumpStatusResponseMessage extends MedtronicReceiveMessage { + protected PumpStatusResponseMessage(CommandType commandType, CommandAction commandAction, MedtronicCNLSession pumpSession, byte[] payload) { + super(commandType, commandAction, pumpSession, payload); + } + + public static ContourNextLinkMessage fromBytes(MedtronicCNLSession pumpSession, byte[] bytes) throws ChecksumException, EncryptionException { + // TODO - turn this into a factory + ContourNextLinkMessage message = MedtronicReceiveMessage.fromBytes(pumpSession, bytes); + + // TODO - Validate the MessageType + + return message; + } +} diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeRequestMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeRequestMessage.java new file mode 100644 index 0000000..abcb9e7 --- /dev/null +++ b/app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeRequestMessage.java @@ -0,0 +1,12 @@ +package com.nightscout.android.medtronic.message; + +import com.nightscout.android.medtronic.MedtronicCNLSession; + +/** + * Created by lgoedhart on 26/03/2016. + */ +public class PumpTimeRequestMessage extends MedtronicSendMessage { + public PumpTimeRequestMessage(MedtronicCNLSession pumpSession) throws EncryptionException { + super(SendMessageType.TIME_REQUEST, pumpSession, null); + } +} diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeResponseMessage.java b/app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeResponseMessage.java new file mode 100644 index 0000000..410e54e --- /dev/null +++ b/app/src/main/java/com/nightscout/android/medtronic/message/PumpTimeResponseMessage.java @@ -0,0 +1,24 @@ +package com.nightscout.android.medtronic.message; + +import com.nightscout.android.medtronic.MedtronicCNLSession; + +import java.nio.ByteBuffer; +import java.util.Date; + +/** + * Created by lgoedhart on 27/03/2016. + */ +public class PumpTimeResponseMessage extends MedtronicReceiveMessage { + protected PumpTimeResponseMessage(CommandType commandType, CommandAction commandAction, MedtronicCNLSession pumpSession, byte[] payload) { + super(commandType, commandAction, pumpSession, payload); + } + + public static ContourNextLinkMessage fromBytes(MedtronicCNLSession pumpSession, byte[] bytes) throws ChecksumException, EncryptionException { + // TODO - turn this into a factory + ContourNextLinkMessage message = MedtronicReceiveMessage.fromBytes(pumpSession, bytes); + + // TODO - Validate the MessageType + + return message; + } +} diff --git a/app/src/main/java/com/nightscout/android/medtronic/message/UnexpectedMessageException.java b/app/src/main/java/com/nightscout/android/medtronic/message/UnexpectedMessageException.java new file mode 100644 index 0000000..0fe4e94 --- /dev/null +++ b/app/src/main/java/com/nightscout/android/medtronic/message/UnexpectedMessageException.java @@ -0,0 +1,10 @@ +package com.nightscout.android.medtronic.message; + +/** + * Created by lgoedhart on 26/03/2016. + */ +public class UnexpectedMessageException extends Throwable { + public UnexpectedMessageException(String message) { + super(message); + } +} diff --git a/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java b/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java index c15e399..ae82286 100644 --- a/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java +++ b/app/src/main/java/com/nightscout/android/medtronic/service/MedtronicCNLService.java @@ -3,7 +3,9 @@ package com.nightscout.android.medtronic.service; import android.annotation.SuppressLint; import android.app.Notification; import android.app.NotificationManager; +import android.app.PendingIntent; import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; import android.graphics.BitmapFactory; import android.hardware.usb.UsbManager; @@ -15,25 +17,30 @@ import android.os.Handler; import android.os.Message; import android.preference.PreferenceManager; import android.util.Log; -import android.view.Gravity; -import android.widget.LinearLayout; -import android.widget.TextView; -import android.widget.Toast; import com.nightscout.android.R; import com.nightscout.android.USB.UsbHidDriver; +import com.nightscout.android.dexcom.DexcomG4Activity; import com.nightscout.android.medtronic.MedtronicCNLReader; +import com.nightscout.android.medtronic.message.ChecksumException; +import com.nightscout.android.medtronic.message.EncryptionException; +import com.nightscout.android.medtronic.message.UnexpectedMessageException; import com.nightscout.android.service.AbstractService; +import com.nightscout.android.upload.Medtronic640gPumpRecord; import com.nightscout.android.upload.UploadHelper; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.TimeoutException; @SuppressLint("NewApi") public class MedtronicCNLService extends AbstractService { - public static final int MSG_STATUS = 1; - public final static int USB_VID = 0x1a79; public final static int USB_PID = 0x6210; @@ -46,6 +53,7 @@ public class MedtronicCNLService extends AbstractService { private UploadHelper mUploader; private WifiManager mWifiManager; private UsbManager mUsbManager; + private SharedPreferences prefs; @Override public void onStartService() { @@ -53,12 +61,15 @@ public class MedtronicCNLService extends AbstractService { mContext = this.getBaseContext(); mWifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); mUsbManager = (UsbManager) this.getSystemService(Context.USB_SERVICE); + prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); + // Add a small start delay - for some reason, having no start delay causes initial + // binding/rendering issues mTimer.scheduleAtFixedRate(new TimerTask() { public void run() { doReadAndUpload(); } - }, 0, FIVE_MINS_MS); + }, 250, FIVE_MINS_MS); } @Override @@ -84,17 +95,26 @@ public class MedtronicCNLService extends AbstractService { @Override public void onReceiveMessage(Message msg) { - } protected void doReadAndUpload() { mUploader = new UploadHelper(getBaseContext()); mHidDevice = UsbHidDriver.acquire(mUsbManager, USB_VID, USB_PID); - if( !isOnline() ) { - displayMessage("NET connection error"); - } else if ( mHidDevice == null ) { - displayMessage("CNL connection error"); + // Load the initial data to the display + Medtronic640gPumpRecord pumpRecord = loadData(); + send(Message.obtain(null, DexcomG4Activity.DexcomG4ActivityHandler.MSG_DATA, pumpRecord)); + + if (!isOnline()) { + String title = "Internet connection error"; + String msg = "Please check that you're connected to the Internet"; + //showNotification(title, msg); + send(Message.obtain(null, DexcomG4Activity.DexcomG4ActivityHandler.MSG_ERROR, title + "\n" + msg)); + } else if (mHidDevice == null) { + String title = "USB connection error"; + String msg = "Is the Bayer Contour NextLink plugged in?"; + //showNotification(title, msg); + send(Message.obtain(null, DexcomG4Activity.DexcomG4ActivityHandler.MSG_ERROR, title + "\n" + msg)); } else { try { mHidDevice.open(); @@ -108,18 +128,46 @@ public class MedtronicCNLService extends AbstractService { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); try { - send(Message.obtain(null, MSG_STATUS, "Connecting to the Contour CareLink Next...")); + send(Message.obtain(null, DexcomG4Activity.DexcomG4ActivityHandler.MSG_STATUS, "Connecting to the Contour CareLink Next...")); cnlReader.requestDeviceInfo(); cnlReader.enterControlMode(); cnlReader.enterPassthroughMode(); cnlReader.openConnection(); cnlReader.requestReadInfo(); - send(Message.obtain(null, MSG_STATUS, "Connected to Contour CareLink Next.")); + byte radioChannel = cnlReader.negotiateChannel(); + if (radioChannel == 0) { + send(Message.obtain(null, DexcomG4Activity.DexcomG4ActivityHandler.MSG_ERROR, "Could not communicate with the 640g. Are you near the pump?")); + } else { + send(Message.obtain(null, DexcomG4Activity.DexcomG4ActivityHandler.MSG_STATUS, String.format("Connected to Contour CareLink Next on channel %d.", (int) radioChannel))); + cnlReader.beginEHSMSession(); + + cnlReader.getPumpTime(pumpRecord); + cnlReader.getPumpStatus(pumpRecord); + writeData(pumpRecord); + send(Message.obtain(null, DexcomG4Activity.DexcomG4ActivityHandler.MSG_DATA, pumpRecord)); + cnlReader.endEHSMSession(); + } + cnlReader.closeConnection(); + cnlReader.endPassthroughMode(); + cnlReader.endControlMode(); } catch (IOException e) { Log.e(TAG, "Error getting BGLs", e); + send(Message.obtain(null, DexcomG4Activity.DexcomG4ActivityHandler.MSG_ERROR, "Error connecting to Contour CareLink Next.")); + } catch (ChecksumException e) { + Log.e(TAG, "Checksum error", e); + send(Message.obtain(null, DexcomG4Activity.DexcomG4ActivityHandler.MSG_ERROR, "Checksum error getting message from the Contour CareLink Next.")); + } catch (EncryptionException e) { + Log.e(TAG, "Encryption exception", e); + send(Message.obtain(null, DexcomG4Activity.DexcomG4ActivityHandler.MSG_ERROR, "Error decrypting messages from Contour CareLink Next.")); + } catch (TimeoutException e) { + Log.e(TAG, "Timeout communicating with Contour", e); + send(Message.obtain(null, DexcomG4Activity.DexcomG4ActivityHandler.MSG_ERROR, "Timeout communicating with the Contour CareLink Next.")); + } catch (UnexpectedMessageException e) { + Log.e(TAG, "Unexpected Message", e); + send(Message.obtain(null, DexcomG4Activity.DexcomG4ActivityHandler.MSG_ERROR, "Communication Error: " + e.getMessage())); } - //mUploader.execute(dexcomReader.mRD[dexcomReader.mRD.length - 1]); + mUploader.execute(pumpRecord); if (prefs.getBoolean("EnableWifiHack", false)) { doWifiHack(); @@ -164,39 +212,57 @@ public class MedtronicCNLService extends AbstractService { return netInfo != null && netInfo.isConnectedOrConnecting(); } - private void displayMessage(String message) { - Toast toast = Toast.makeText(getBaseContext(), message, Toast.LENGTH_LONG); - toast.setGravity(Gravity.CENTER, 0, 0); - LinearLayout toastLayout = (LinearLayout) toast.getView(); - TextView toastTV = (TextView) toastLayout.getChildAt(0); - if (toastTV != null) { - toastTV.setTextSize(20); - toastTV.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL); - } - toast.show(); - } - - private void showNotification() { + private void showNotification(String title, String message) { nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); - // In this sample, we'll use the same text for the ticker and the expanded notification - // Set the icon, scrolling text and timestamp // The PendingIntent to launch our activity if the user selects this notification - // Set the info for the views that show in the notification panel. - - String text = "Test service, yo"; - nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); + PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, DexcomG4Activity.class), 0); Notification n = new Notification.Builder(mContext) .setDefaults(Notification.DEFAULT_ALL) - .setContentTitle("Devices time mismatch!") + .setContentTitle(title) .setStyle(new Notification.BigTextStyle() - .bigText(text)) - .setContentText("Check that devices times match") - .setTicker("Devices time mismatch!") - .setSmallIcon(R.drawable.ic_action_warning) + .bigText(message)) + .setContentText(message) + .setTicker(message) + //.setSmallIcon(R.drawable.ic_action_warning) + .setSmallIcon(R.drawable.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)) + .setContentIntent(contentIntent) .getNotification(); nm.notify(R.string.app_name, n); } + + private void writeData(Medtronic640gPumpRecord mostRecentData) { + //Write most recent data + try { + Context context = getBaseContext(); + ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(context.getFilesDir(), "save.bin"))); //Select where you wish to save the file... + oos.writeObject(mostRecentData); // write the class as an 'object' + oos.flush(); // flush the stream to insure all of the information was written to 'save.bin' + oos.close();// close the stream + } catch (Exception e) { + Log.e(TAG, "write to OutputStream failed", e); + } + } + + private Medtronic640gPumpRecord loadData() { + ObjectInputStream ois = null; + try { + Context context = getBaseContext(); + ois = new ObjectInputStream(new FileInputStream(new File(context.getFilesDir(), "save.bin"))); + Object o = ois.readObject(); + ois.close(); + return (Medtronic640gPumpRecord) o; + } catch (Exception ex) { + Log.w(TAG, " unable to load Medtronic640g data"); + try { + if (ois != null) + ois.close(); + } catch (Exception e) { + Log.e(TAG, " Error closing ObjectInputStream"); + } + } + return new Medtronic640gPumpRecord(); + } } diff --git a/app/src/main/java/com/nightscout/android/settings/SettingsFragment.java b/app/src/main/java/com/nightscout/android/settings/SettingsFragment.java index a4fa9f5..0a62144 100644 --- a/app/src/main/java/com/nightscout/android/settings/SettingsFragment.java +++ b/app/src/main/java/com/nightscout/android/settings/SettingsFragment.java @@ -76,80 +76,10 @@ public class SettingsFragment extends PreferenceFragment implements OnSharedPref } private void addMedtronicOptionsListener(){ - final ListPreference mon_type = (ListPreference)findPreference("monitor_type"); - final EditTextPreference med_id = (EditTextPreference)findPreference("medtronic_cgm_id"); - final EditTextPreference gluc_id = (EditTextPreference)findPreference("glucometer_cgm_id"); - final EditTextPreference sensor_id = (EditTextPreference)findPreference("sensor_cgm_id"); - final ListPreference calib_type = (ListPreference)findPreference("calibrationType"); - final ListPreference pumpPeriod = (ListPreference)findPreference("pumpPeriod"); - final ListPreference glucSrcType = (ListPreference)findPreference("glucSrcTypes"); - final ListPreference historicPeriod = (ListPreference)findPreference("historicPeriod"); - final ListPreference historicMixPeriod = (ListPreference)findPreference("historicMixPeriod"); final SwitchPreference enableRest = (SwitchPreference)findPreference("EnableRESTUpload"); - final SwitchPreference enableMongo = (SwitchPreference)findPreference("EnableMongoUpload"); enableRest.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final Boolean val = (Boolean)newValue; - if (enableMongo.isChecked() == val && val) - enableMongo.setChecked(!val); - return true; - } - }); - enableMongo.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference preference, Object newValue) { - final Boolean val = (Boolean)newValue; - if (enableRest.isChecked() == val && val) - enableRest.setChecked(!val); - return true; - } - }); - int index = mon_type.findIndexOfValue(mon_type.getValue()); - int index2 = calib_type.findIndexOfValue(calib_type.getValue()); - if(index==1){ - med_id.setEnabled(true); - gluc_id.setEnabled(true); - sensor_id.setEnabled(true); - }else{ - med_id.setEnabled(false); - gluc_id.setEnabled(false); - sensor_id.setEnabled(false); - } - index = glucSrcType.findIndexOfValue(glucSrcType.getValue()); - - - calib_type.setEnabled(med_id.isEnabled()); - pumpPeriod.setEnabled(index2==1); - glucSrcType.setEnabled(med_id.isEnabled()); - historicPeriod.setEnabled(index==1 && med_id.isEnabled() ); - historicMixPeriod.setEnabled(index==2 && med_id.isEnabled() ); - glucSrcType.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference preference, Object newValue) { - final String val = newValue.toString(); - int index = glucSrcType.findIndexOfValue(val); - historicPeriod.setEnabled(index==1 && med_id.isEnabled()); - historicMixPeriod.setEnabled(index==2 && med_id.isEnabled() ); - return true; - } - }); - mon_type.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference preference, Object newValue) { - final String val = newValue.toString(); - int index = mon_type.findIndexOfValue(val); - if(index==1){ - med_id.setEnabled(true); - gluc_id.setEnabled(true); - sensor_id.setEnabled(true); - }else{ - med_id.setEnabled(false); - gluc_id.setEnabled(false); - sensor_id.setEnabled(false); - } - index = glucSrcType.findIndexOfValue(glucSrcType.getValue()); - calib_type.setEnabled(med_id.isEnabled()); - pumpPeriod.setEnabled(med_id.isEnabled()); - glucSrcType.setEnabled(med_id.isEnabled()); - historicPeriod.setEnabled(index==1 && med_id.isEnabled()); - historicMixPeriod.setEnabled(index==2 && med_id.isEnabled() ); return true; } }); diff --git a/app/src/main/java/com/nightscout/android/upload/Medtronic640gPumpRecord.java b/app/src/main/java/com/nightscout/android/upload/Medtronic640gPumpRecord.java new file mode 100644 index 0000000..0ad7c2d --- /dev/null +++ b/app/src/main/java/com/nightscout/android/upload/Medtronic640gPumpRecord.java @@ -0,0 +1,112 @@ +package com.nightscout.android.upload; + +import java.io.Serializable; +import java.util.Date; + +/** + * Created by lgoedhart on 27/03/2016. + */ +public class Medtronic640gPumpRecord extends DeviceRecord implements Serializable { + public enum TREND { + NONE(0), + DOUBLE_UP(1), + SINGLE_UP(2), + FOURTY_FIVE_UP(3), + FLAT(4), + FOURTY_FIVE_DOWN(5), + SINGLE_DOWN(6), + DOUBLE_DOWN(7), + NOT_COMPUTABLE(8), + RATE_OUT_OF_RANGE(9), + NOT_SET(10); + + private byte value; + TREND(int trend) { + this.value = (byte)value; + } + } + public String alarm = "---"; // Not sure where this is yet + public String temporaryBasal = "---"; // Not sure where this is yet + public String batteryPercentage = "---"; + public String batteryVoltage = "---"; // Available? + public String model = "---"; // Available? + private TREND trend = TREND.NOT_SET; + + public Date pumpDate = new Date(); // Store as a date, so we can parse to string later. + public float activeInsulin = 0f; + public int sensorBGL = 0; // in mg/dL. 0 means no sensor reading + public Date sensorBGLDate = new Date(); + public boolean recentBolusWizard = false; // Whether a bolus wizard has been run recently + public int bolusWizardBGL = 0; // in mg/dL. 0 means no recent bolus wizard reading. + public String direction; + + public Medtronic640gPumpRecord() { + // TODO - Add serial number + this.deviceName = "medtronic-640g"; + } + + public void setTrend( TREND trend ) { + this.trend = trend; + + switch( trend ) { + case NONE: + this.direction = "NONE"; + break; + case DOUBLE_UP: + this.direction = "DoubleUp"; + break; + case SINGLE_UP: + this.direction = "SingleUp"; + break; + case FOURTY_FIVE_UP: + this.direction = "FortyFiveUp"; + break; + case FLAT: + this.direction = "Flat"; + break; + case FOURTY_FIVE_DOWN: + this.direction = "FortyFiveDown"; + break; + case SINGLE_DOWN: + this.direction = "SingleDown"; + break; + case DOUBLE_DOWN: + this.direction = "DoubleDown"; + break; + case NOT_COMPUTABLE: + this.direction = "NOT COMPUTABLE"; + break; + case RATE_OUT_OF_RANGE: + this.direction = "RATE OUT OF RANGE"; + break; + case NOT_SET: + this.direction = "NONE"; + break; + } + } + + public TREND getTrend() { + return trend; + } + + public static TREND fromMessageByte(byte messageByte) { + switch( messageByte ) { + case (byte) 0x60: + return TREND.FLAT; + case (byte) 0xc0: + return TREND.DOUBLE_UP; + case (byte) 0xa0: + return TREND.SINGLE_UP; + case (byte) 0x80: + return TREND.FOURTY_FIVE_UP; + case (byte) 0x40: + return TREND.FOURTY_FIVE_DOWN; + case (byte) 0x20: + return TREND.SINGLE_DOWN; + case (byte) 0x00: + return TREND.DOUBLE_DOWN; + default: + return TREND.NOT_COMPUTABLE; + } + } +} diff --git a/app/src/main/java/com/nightscout/android/upload/UploadHelper.java b/app/src/main/java/com/nightscout/android/upload/UploadHelper.java index b639136..eedd833 100644 --- a/app/src/main/java/com/nightscout/android/upload/UploadHelper.java +++ b/app/src/main/java/com/nightscout/android/upload/UploadHelper.java @@ -1,24 +1,27 @@ package com.nightscout.android.upload; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.URI; -import java.net.URISyntaxException; -import java.security.MessageDigest; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; - -import javax.crypto.spec.GCMParameterSpec; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; +import android.preference.PreferenceManager; +import android.util.Log; -import static com.mongodb.client.model.Filters.*; +import com.mongodb.MongoClient; +import com.mongodb.MongoClientOptions; +import com.mongodb.MongoClientOptions.Builder; +import com.mongodb.MongoCredential; +import com.mongodb.ServerAddress; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import com.nightscout.android.dexcom.DexcomG4Activity; +import com.nightscout.android.dexcom.EGVRecord; +import com.nightscout.android.medtronic.MedtronicConstants; +import com.nightscout.android.medtronic.MedtronicReader; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; @@ -33,45 +36,30 @@ import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; -import org.bson.BsonDocument; import org.bson.Document; import org.json.JSONArray; import org.json.JSONObject; - import org.slf4j.LoggerFactory; -import android.content.Context; -import android.content.SharedPreferences; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Message; -import android.os.Messenger; -import android.os.RemoteException; -import android.preference.PreferenceManager; -import android.util.Log; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URI; +import java.net.URISyntaxException; +import java.security.MessageDigest; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; import ch.qos.logback.classic.Logger; -import ch.qos.logback.core.status.WarnStatus; -import com.mongodb.BasicDBObject; -import com.mongodb.DB; -import com.mongodb.DBCollection; -import com.mongodb.DBCursor; -import com.mongodb.DBObject; -import com.mongodb.MongoClient; -import com.mongodb.MongoClientOptions; -import com.mongodb.MongoClientOptions.Builder; -import com.mongodb.client.FindIterable; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoCursor; -import com.mongodb.client.MongoDatabase; -import com.mongodb.MongoCredential; -import com.mongodb.ServerAddress; -import com.mongodb.WriteConcern; -import com.nightscout.android.dexcom.DexcomG4Activity; -import com.nightscout.android.dexcom.EGVRecord; -import com.nightscout.android.medtronic.MedtronicConstants; -import com.nightscout.android.medtronic.MedtronicReader; +import static com.mongodb.client.model.Filters.eq; public class UploadHelper extends AsyncTask<Record, Integer, Long> { @@ -212,7 +200,6 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> { /** * Sends an error message to be printed in the display (DEBUG) if it is repeated, It is not printed again. If UI is not visible, It will launch a pop-up message. * @param valuetosend - * @param clear, if true, the display is cleared before printing "valuetosend" */ private void sendErrorMessageToUI(String valuetosend) { Log.e("medtronicCGMService", valuetosend); @@ -697,14 +684,25 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> { } private void populateV1APIEntry(JSONObject json, Record oRecord) throws Exception { - Date date = DATE_FORMAT.parse(oRecord.displayTime); - json.put("date", date.getTime()); + if (oRecord instanceof Medtronic640gPumpRecord) { + json.put("date", ((Medtronic640gPumpRecord) oRecord).sensorBGLDate.getTime()); + json.put("dateString", oRecord.displayTime); + } else { + Date date = DATE_FORMAT.parse(oRecord.displayTime); + json.put("date", date.getTime()); + } - if (oRecord instanceof GlucometerRecord){ - json.put("gdValue", ((GlucometerRecord)oRecord).numGlucometerValue); - json.put("device", getSelectedDeviceName()); - json.put("type", "mbg"); - json.put("mbg", ((GlucometerRecord)oRecord).numGlucometerValue); + if (oRecord instanceof GlucometerRecord) { + json.put("gdValue", ((GlucometerRecord) oRecord).numGlucometerValue); + json.put("device", getSelectedDeviceName()); + json.put("type", "mbg"); + json.put("mbg", ((GlucometerRecord) oRecord).numGlucometerValue); + }else if (oRecord instanceof Medtronic640gPumpRecord){ + Medtronic640gPumpRecord pumpRecord = (Medtronic640gPumpRecord) oRecord; + json.put("sgv", pumpRecord.sensorBGL); + json.put("direction", pumpRecord.direction); + json.put("device", pumpRecord.getDeviceName()); + json.put("type", "sgv"); }else if (oRecord instanceof EGVRecord){ EGVRecord record = (EGVRecord) oRecord; json.put("device", getSelectedDeviceName()); diff --git a/app/src/main/res/layout/adb.xml b/app/src/main/res/layout/adb.xml index 6ab863a..b5cef5f 100644 --- a/app/src/main/res/layout/adb.xml +++ b/app/src/main/res/layout/adb.xml @@ -2,15 +2,15 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:orientation="vertical" > + android:orientation="vertical" + android:paddingTop="15dp"> <TextView android:id="@+id/demoTitle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_centerInParent="true" - android:textSize="50px" + android:textSize="70sp" android:gravity="center" android:textStyle="bold" @@ -19,15 +19,16 @@ <ScrollView android:id="@+id/demoScroller" android:layout_width="match_parent" - android:layout_height="wrap_content" > + android:layout_height="wrap_content" + android:padding="10dp"> <TextView android:id="@+id/demoText" android:layout_width="match_parent" - android:layout_height="match_parent" - android:textSize="40px" + android:layout_height="wrap_content" + android:textSize="30sp" - android:gravity="center" /> + android:gravity="left" /> </ScrollView> <LinearLayout android:id="@+id/container" android:orientation="vertical" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9d418e5..13c01b2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <string name="hello">Hello World, DemoActivity!</string> + <string name="hello">---</string> <string name="app_name">NightScout</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> @@ -28,8 +28,6 @@ <item name="android:shadowRadius">2</item> </style> <string-array name="types"> - <item>Dexcom G4</item> - <item>Medtronic CGM</item> <item>Contour NextLink 2.4</item> </string-array> <string-array name="types_values"> diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 1d66584..6f17cf6 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -7,8 +7,8 @@ android:disableDependentsState="false" android:switchTextOn="mmol/l" android:switchTextOff="mg/dl" - android:summaryOn="mmol/l. Values are shown and setted in mmol/l" - android:summaryOff="mg/dl. Values are shown and setted in mg/dl"> + android:summaryOn="mmol/l. Values are shown and set in mmol/l" + android:summaryOff="mg/dl. Values are shown and set in mg/dl"> </com.nightscout.android.utils.CustomSwitchPreference> <com.nightscout.android.utils.CustomSwitchPreference android:title="mmol/l decimals" @@ -20,79 +20,13 @@ android:summaryOn="Activated. 2 Decimal values will be shown ." android:summaryOff="Deactivated. 1 Decimal value will be shown ."> </com.nightscout.android.utils.CustomSwitchPreference> - <ListPreference - android:key="monitor_type" - android:disableDependentsState="false" - android:title="Type" - android:summary="Select item from array" - android:entries="@array/types" - android:entryValues="@array/types_values" - android:defaultValue="1" - /> - <EditTextPreference - android:title="Pump ID" - android:key="medtronic_cgm_id" - android:dialogTitle="Enter your Guardian/Pump ID"/> - <EditTextPreference - android:title="Glucometer ID" - android:key="glucometer_cgm_id" - android:dialogTitle="Enter your Glucometer ID"/> - <EditTextPreference - android:title="Sensor ID" - android:key="sensor_cgm_id" - android:dialogTitle="Enter your Sensor ID"/> - <ListPreference - android:key="calibrationType" - android:disableDependentsState="false" - android:title="Calibration Type" - android:summary="Select item from array" - android:entries="@array/calibrationTypes" - android:entryValues="@array/calib_types_values" - android:defaultValue="3" - /> - <ListPreference - android:key="pumpPeriod" - android:disableDependentsState="false" - android:title="Pump Request Period" - android:summary="Select item from array" - android:entries="@array/pumpPeriodList" - android:entryValues="@array/pumpperiod_values" - android:defaultValue="1" - /> - <ListPreference - android:key="glucSrcTypes" - android:disableDependentsState="false" - android:title="Glucose Value Source" - android:summary="Select item from array" - android:entries="@array/sourceTypes" - android:entryValues="@array/calib_types_values" - android:defaultValue="1" - /> - <ListPreference - android:key="historicPeriod" - android:disableDependentsState="false" - android:title="Historic Log Request Period" - android:summary="Select item from array" - android:entries="@array/historicPeriodList" - android:entryValues="@array/pumpperiod_values" - android:defaultValue="1" - /> - <ListPreference - android:key="historicMixPeriod" - android:disableDependentsState="false" - android:title="Period after failure" - android:summary="Select item from array" - android:entries="@array/historicMixPeriodList" - android:entryValues="@array/historicMixPeriodVal" - android:defaultValue="3" - /> </PreferenceCategory> <PreferenceCategory android:title="Sharing"> <com.nightscout.android.utils.CustomSwitchPreference - android:title="API Upload (REST)" + android:title="REST API Upload" android:key="EnableRESTUpload" android:disableDependentsState="false" - android:summary="The REST API is an alternative to direct mongodb upload"> + android:summary="Enable upload of BGL data to Nightscout"> </com.nightscout.android.utils.CustomSwitchPreference> <EditTextPreference android:dependency="EnableRESTUpload" @@ -102,58 +36,6 @@ android:defaultValue="http://{YOUR-API-SERVER}/api" android:dialogMessage="This only the base URL, the uploader will automatically append /entries for the POST of CGM data and /gdentries for the POST of glucometer data values"> </EditTextPreference> - <com.nightscout.android.utils.CustomSwitchPreference - android:title="MongoDB Upload" - android:key="EnableMongoUpload" - android:disableDependentsState="false" - android:summary="If you're using MongoLab and Azure this should be enabled"> - </com.nightscout.android.utils.CustomSwitchPreference> - <com.nightscout.android.utils.CustomSwitchPreference - android:title="MongoDB REST Upload" - android:key="isMongoRest" - android:disableDependentsState="false" - android:switchTextOn="YES" - android:switchTextOff="NO" - android:summaryOn="Activated. USING MONGO REST API.Mogo Driver is disabled. Mongodb 3.0" - android:summaryOff="Deactivated. USING MONGO DRIVER.Mogo Rest is disabled. Mongodb 2.6 and older"> - </com.nightscout.android.utils.CustomSwitchPreference> - <EditTextPreference - android:dependency="EnableMongoUpload" - android:title="MongoDB URI" - android:key="MongoDB URI" - android:dialogTitle="Enter MongoDB URI" - android:dialogMessage="Replace example values in {}'s with your correct values" - android:defaultValue="mongodb://{user}:{password}@{host}.mongolab.com:{11111}/{database}"> - </EditTextPreference> - <EditTextPreference - android:dependency="EnableMongoUpload" - android:title="APIKEY" - android:key="apiKey" - android:dialogTitle="Enter API Key" - android:dialogMessage="get your API KEY from mongolabs" - android:defaultValue=""> - </EditTextPreference> - <EditTextPreference - android:title="Database Name" - android:key="dbName" - android:dialogTitle="Enter Database Name" - android:dialogMessage="set your Database Name" - android:defaultValue=""> - </EditTextPreference> - <EditTextPreference - android:dependency="EnableMongoUpload" - android:title="Collection Name" - android:key="Collection Name" - android:dialogTitle="Enter Collection Name" - android:dialogMessage="This is the name of the collection where the CGM data will be stored"> - </EditTextPreference> - <EditTextPreference - android:dependency="EnableMongoUpload" - android:title="Glucometer Data Collection Name" - android:key="gcdCollectionName" - android:dialogTitle="Enter Collection Name" - android:dialogMessage="This is the name of the collection where the glucometer data will be stored"> - </EditTextPreference> <com.nightscout.android.utils.CustomSwitchPreference android:title="Wifi Hack" android:key="EnableWifiHack" @@ -163,15 +45,6 @@ android:summaryOff="The uploader won't try to disable Wifi even if there is a timeout" > </com.nightscout.android.utils.CustomSwitchPreference> - <com.nightscout.android.utils.CustomSwitchPreference - android:title="2 Days at Startup" - android:key="InitialTwoDayUpload" - android:disableDependentsState="false" - android:defaultValue="true" - android:summaryOn="When the upload application first starts it will upload ~2.5 days of data" - android:summaryOff="The uploader won't try upload old data" - > - </com.nightscout.android.utils.CustomSwitchPreference> </PreferenceCategory> <PreferenceCategory android:title="Disclaimer"> <com.nightscout.android.utils.CustomSwitchPreference diff --git a/build.gradle b/build.gradle index f4d8c54..856d3d7 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.5.0' + classpath 'com.android.tools.build:gradle:2.1.0' } } diff --git a/build/intermediates/dex-cache/cache.xml b/build/intermediates/dex-cache/cache.xml index fba8db8..891c580 100644 --- a/build/intermediates/dex-cache/cache.xml +++ b/build/intermediates/dex-cache/cache.xml @@ -1,2 +1,47 @@ <?xml version="1.0" encoding="utf-8"?> -<items version="2" /> +<items version="2" > + + <item + jar="/Users/lgoedhart/StudioProjects/MedtronicUploader/app/libs/physicaloidlibrary.jar" + jumboMode="true" + revision="23.0.1" + sha1="391534fe92fec965996d9aaf3a328b5f0c2b0740"> + <dex dex="/Users/lgoedhart/StudioProjects/MedtronicUploader/app/build/intermediates/transforms/dex/debug/folders/1000/2/physicaloidlibrary_9ccb0a9459a35113b137cb56f3f46bde93a6197b/classes.dex" /> + </item> + <item + jar="/Users/lgoedhart/StudioProjects/MedtronicUploader/app/libs/logback-android-1.1.1-3.jar" + jumboMode="true" + revision="23.0.1" + sha1="9df53e0d7c6a4d8b31979a012722d48a275e5d28"> + <dex dex="/Users/lgoedhart/StudioProjects/MedtronicUploader/app/build/intermediates/transforms/dex/debug/folders/1000/2/logback-android-1.1.1-3_26faaac8eb6179a49c85c550f2570a85dcf9ec77/classes.dex" /> + </item> + <item + jar="/Users/lgoedhart/StudioProjects/MedtronicUploader/app/build/intermediates/incremental-runtime-classes/debug/instant-run.jar" + jumboMode="true" + revision="23.0.1" + sha1="8a0b448c242e45651aa3eff4da2565f5d2472c67"> + <dex dex="/Users/lgoedhart/StudioProjects/MedtronicUploader/app/build/intermediates/transforms/dex/debug/folders/1000/10/instant-run_ab0e4833222d2576fa652ea70850f6721d7c4c56/classes.dex" /> + </item> + <item + jar="/Users/lgoedhart/StudioProjects/MedtronicUploader/app/libs/mongo-java-driver-3.0.2.jar" + jumboMode="true" + revision="23.0.1" + sha1="7d3880dec6c8a2f07c1f544776c326834b513712"> + <dex dex="/Users/lgoedhart/StudioProjects/MedtronicUploader/app/build/intermediates/transforms/dex/debug/folders/1000/2/mongo-java-driver-3.0.2_cf135c838ae634eaa0bde6ebd7ab91ae93691ade/classes.dex" /> + </item> + <item + jar="/Users/lgoedhart/StudioProjects/MedtronicUploader/app/build/intermediates/incremental-classes/debug/instant-run-bootstrap.jar" + jumboMode="true" + revision="23.0.1" + sha1="028bcebc4e2ad003732150e4f2c394474c8eff42"> + <dex dex="/Users/lgoedhart/StudioProjects/MedtronicUploader/app/build/intermediates/transforms/dex/debug/folders/1000/10/instant-run-bootstrap_a4562f9a19a66a867fdb86514799366913b783f6/classes.dex" /> + </item> + <item + jar="/Users/lgoedhart/StudioProjects/MedtronicUploader/app/libs/slf4j-api-1.7.2.jar" + jumboMode="true" + revision="23.0.1" + sha1="0081d61b7f33ebeab314e07de0cc596f8e858d97"> + <dex dex="/Users/lgoedhart/StudioProjects/MedtronicUploader/app/build/intermediates/transforms/dex/debug/folders/1000/2/slf4j-api-1.7.2_aba40428135bcd9ffb23cf7b91dad2955f2763e7/classes.dex" /> + </item> + +</items> diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f23df6e..52e3cb7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Oct 21 11:34:03 PDT 2015 +#Sun May 01 23:04:04 AEST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip -- GitLab