--- /dev/null
+# Built application files
+*.apk
+*.aar
+*.ap_
+*.aab
+
+# Files for the ART/Dalvik VM
+*.dex
+
+# Java class files
+*.class
+
+# Generated files
+bin/
+gen/
+out/
+# Uncomment the following line in case you need and you don't have the release build type files in your app
+# release/
+
+# Gradle files
+.gradle/
+build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Log Files
+*.log
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# IntelliJ
+*.iml
+.idea/workspace.xml
+.idea/tasks.xml
+.idea/gradle.xml
+.idea/assetWizardSettings.xml
+.idea/dictionaries
+.idea/libraries
+# Android Studio 3 in .gitignore file.
+.idea/caches
+.idea/modules.xml
+# Comment next line if keeping position of elements in Navigation Editor is relevant for you
+.idea/navEditor.xml
+
+# Keystore files
+# Uncomment the following lines if you do not want to check your keystore files in.
+#*.jks
+#*.keystore
+
+# External native build folder generated in Android Studio 2.2 and later
+.externalNativeBuild
+.cxx/
+
+# Google Services (e.g. APIs or Firebase)
+# google-services.json
+
+# Freeline
+freeline.py
+freeline/
+freeline_project_description.json
+
+# fastlane
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots
+fastlane/test_output
+fastlane/readme.md
+
+# Version control
+vcs.xml
+
+# lint
+lint/intermediates/
+lint/generated/
+lint/outputs/
+lint/tmp/
+# lint/reports/
+
+# Android Profiling
+*.hprof
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="AnalysisProjectProfileManager">
+ <option name="PROJECT_PROFILE" />
+ <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" />
+ <list size="0" />
+ </component>
+ <component name="SuppressionsComponent">
+ <option name="suppComments" value="[]" />
+ </component>
+</project>
\ No newline at end of file
--- /dev/null
+# Default ignored files
+/shelf/
+/workspace.xml
--- /dev/null
+Temperature
\ No newline at end of file
--- /dev/null
+<component name="ProjectCodeStyleConfiguration">
+ <code_scheme name="Project" version="173">
+ <JetCodeStyleSettings>
+ <option name="PACKAGES_TO_USE_STAR_IMPORTS">
+ <value>
+ <package name="java.util" alias="false" withSubpackages="false" />
+ <package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
+ <package name="io.ktor" alias="false" withSubpackages="true" />
+ </value>
+ </option>
+ <option name="PACKAGES_IMPORT_LAYOUT">
+ <value>
+ <package name="" alias="false" withSubpackages="true" />
+ <package name="java" alias="false" withSubpackages="true" />
+ <package name="javax" alias="false" withSubpackages="true" />
+ <package name="kotlin" alias="false" withSubpackages="true" />
+ <package name="" alias="true" withSubpackages="true" />
+ </value>
+ </option>
+ <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
+ </JetCodeStyleSettings>
+ <codeStyleSettings language="XML">
+ <option name="FORCE_REARRANGE_MODE" value="1" />
+ <indentOptions>
+ <option name="CONTINUATION_INDENT_SIZE" value="4" />
+ </indentOptions>
+ <arrangement>
+ <rules>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>xmlns:android</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
+ </AND>
+ </match>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>xmlns:.*</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
+ </AND>
+ </match>
+ <order>BY_NAME</order>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>.*:id</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+ </AND>
+ </match>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>.*:name</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+ </AND>
+ </match>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>name</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
+ </AND>
+ </match>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>style</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
+ </AND>
+ </match>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>.*</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
+ </AND>
+ </match>
+ <order>BY_NAME</order>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>.*</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+ </AND>
+ </match>
+ <order>ANDROID_ATTRIBUTE_ORDER</order>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>.*</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>.*</XML_NAMESPACE>
+ </AND>
+ </match>
+ <order>BY_NAME</order>
+ </rule>
+ </section>
+ </rules>
+ </arrangement>
+ </codeStyleSettings>
+ <codeStyleSettings language="kotlin">
+ <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
+ </codeStyleSettings>
+ </code_scheme>
+</component>
\ No newline at end of file
--- /dev/null
+<component name="ProjectCodeStyleConfiguration">
+ <state>
+ <option name="USE_PER_PROJECT_SETTINGS" value="true" />
+ </state>
+</component>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="CompilerConfiguration">
+ <bytecodeTargetLevel target="1.8" />
+ </component>
+</project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="RemoteRepositoriesConfiguration">
+ <remote-repository>
+ <option name="id" value="central" />
+ <option name="name" value="Maven Central repository" />
+ <option name="url" value="https://repo1.maven.org/maven2" />
+ </remote-repository>
+ <remote-repository>
+ <option name="id" value="jboss.community" />
+ <option name="name" value="JBoss Community repository" />
+ <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+ </remote-repository>
+ <remote-repository>
+ <option name="id" value="BintrayJCenter" />
+ <option name="name" value="BintrayJCenter" />
+ <option name="url" value="https://jcenter.bintray.com/" />
+ </remote-repository>
+ <remote-repository>
+ <option name="id" value="Google" />
+ <option name="name" value="Google" />
+ <option name="url" value="https://dl.google.com/dl/android/maven2/" />
+ </remote-repository>
+ </component>
+</project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="FindBugsConfigurable">
+ <option name="make" value="true" />
+ <option name="effort" value="default" />
+ <option name="priority" value="Medium" />
+ <option name="excludeFilter" value="" />
+ </component>
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+ <output url="file://$PROJECT_DIR$/build/classes" />
+ </component>
+ <component name="ProjectType">
+ <option name="id" value="Android" />
+ </component>
+ <component name="SuppressionsComponent">
+ <option name="suppComments" value="[]" />
+ </component>
+</project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="AnalysisProjectProfileManager">
+ <option name="PROJECT_PROFILE" value="Project Default" />
+ <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" />
+ <scopes />
+ <profiles>
+ <profile profile_name="Project Default" version="1.0" is_locked="false">
+ <coding_rule class="AM_CREATES_EMPTY_JAR_FILE_ENTRY" level="MAJOR" enabled="true" />
+ <coding_rule class="AM_CREATES_EMPTY_ZIP_FILE_ENTRY" level="MAJOR" enabled="true" />
+ <coding_rule class="AT_OPERATION_SEQUENCE_ON_CONCURRENT_ABSTRACTION" level="CRITICAL" enabled="false" />
+ <coding_rule class="BAC_BAD_APPLET_CONSTRUCTOR" level="MAJOR" enabled="false" />
+ <coding_rule class="BC_BAD_CAST_TO_ABSTRACT_COLLECTION" level="MAJOR" enabled="true" />
+ <coding_rule class="BC_BAD_CAST_TO_CONCRETE_COLLECTION" level="CRITICAL" enabled="true" />
+ <coding_rule class="BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS" level="CRITICAL" enabled="true" />
+ <coding_rule class="BC_IMPOSSIBLE_CAST" level="BLOCKER" enabled="true" />
+ <coding_rule class="BC_IMPOSSIBLE_DOWNCAST" level="MAJOR" enabled="false" />
+ <coding_rule class="BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY" level="MAJOR" enabled="false" />
+ <coding_rule class="BC_IMPOSSIBLE_INSTANCEOF" level="CRITICAL" enabled="true" />
+ <coding_rule class="BC_UNCONFIRMED_CAST" level="CRITICAL" enabled="true" />
+ <coding_rule class="BC_UNCONFIRMED_CAST_OF_RETURN_VALUE" level="CRITICAL" enabled="false" />
+ <coding_rule class="BC_VACUOUS_INSTANCEOF" level="CRITICAL" enabled="true" />
+ <coding_rule class="BIT_ADD_OF_SIGNED_BYTE" level="CRITICAL" enabled="true" />
+ <coding_rule class="BIT_AND" level="CRITICAL" enabled="true" />
+ <coding_rule class="BIT_AND_ZZ" level="CRITICAL" enabled="true" />
+ <coding_rule class="BIT_IOR" level="CRITICAL" enabled="true" />
+ <coding_rule class="BIT_IOR_OF_SIGNED_BYTE" level="CRITICAL" enabled="true" />
+ <coding_rule class="BIT_SIGNED_CHECK" level="CRITICAL" enabled="true" />
+ <coding_rule class="BIT_SIGNED_CHECK_HIGH_BIT" level="CRITICAL" enabled="true" />
+ <coding_rule class="BOA_BADLY_OVERRIDDEN_ADAPTER" level="CRITICAL" enabled="true" />
+ <coding_rule class="BSHIFT_WRONG_ADD_PRIORITY" level="MAJOR" enabled="false" />
+ <coding_rule class="BX_BOXING_IMMEDIATELY_UNBOXED" level="MAJOR" enabled="true" />
+ <coding_rule class="BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION" level="MAJOR" enabled="true" />
+ <coding_rule class="BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR" level="MAJOR" enabled="true" />
+ <coding_rule class="BX_UNBOXING_IMMEDIATELY_REBOXED" level="CRITICAL" enabled="false" />
+ <coding_rule class="CAA_COVARIANT_ARRAY_ELEMENT_STORE" level="MAJOR" enabled="false" />
+ <coding_rule class="CAA_COVARIANT_ARRAY_FIELD" level="MAJOR" enabled="false" />
+ <coding_rule class="CAA_COVARIANT_ARRAY_LOCAL" level="MAJOR" enabled="false" />
+ <coding_rule class="CAA_COVARIANT_ARRAY_RETURN" level="MAJOR" enabled="false" />
+ <coding_rule class="CD_CIRCULAR_DEPENDENCY" level="MAJOR" enabled="false" />
+ <coding_rule class="CI_CONFUSED_INHERITANCE" level="MINOR" enabled="true" />
+ <coding_rule class="CNT_ROUGH_CONSTANT_VALUE" level="MAJOR" enabled="false" />
+ <coding_rule class="CN_IDIOM" level="MAJOR" enabled="true" />
+ <coding_rule class="CN_IDIOM_NO_SUPER_CALL" level="MAJOR" enabled="true" />
+ <coding_rule class="CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE" level="MAJOR" enabled="true" />
+ <coding_rule class="CO_ABSTRACT_SELF" level="MAJOR" enabled="true" />
+ <coding_rule class="CO_COMPARETO_INCORRECT_FLOATING" level="MAJOR" enabled="false" />
+ <coding_rule class="CO_COMPARETO_RESULTS_MIN_VALUE" level="CRITICAL" enabled="false" />
+ <coding_rule class="CO_SELF_NO_OBJECT" level="MAJOR" enabled="true" />
+ <coding_rule class="DB_DUPLICATE_BRANCHES" level="CRITICAL" enabled="true" />
+ <coding_rule class="DB_DUPLICATE_SWITCH_CLAUSES" level="CRITICAL" enabled="true" />
+ <coding_rule class="DC_DOUBLECHECK" level="MAJOR" enabled="true" />
+ <coding_rule class="DC_PARTIALLY_CONSTRUCTED" level="MAJOR" enabled="false" />
+ <coding_rule class="DE_MIGHT_DROP" level="MAJOR" enabled="true" />
+ <coding_rule class="DE_MIGHT_IGNORE" level="MAJOR" enabled="true" />
+ <coding_rule class="DLS_DEAD_LOCAL_INCREMENT_IN_RETURN" level="MAJOR" enabled="false" />
+ <coding_rule class="DLS_DEAD_LOCAL_STORE" level="CRITICAL" enabled="true" />
+ <coding_rule class="DLS_DEAD_LOCAL_STORE_IN_RETURN" level="CRITICAL" enabled="true" />
+ <coding_rule class="DLS_DEAD_LOCAL_STORE_OF_NULL" level="CRITICAL" enabled="true" />
+ <coding_rule class="DLS_DEAD_LOCAL_STORE_SHADOWS_FIELD" level="CRITICAL" enabled="false" />
+ <coding_rule class="DLS_DEAD_STORE_OF_CLASS_LITERAL" level="CRITICAL" enabled="true" />
+ <coding_rule class="DLS_OVERWRITTEN_INCREMENT" level="CRITICAL" enabled="true" />
+ <coding_rule class="DL_SYNCHRONIZATION_ON_BOOLEAN" level="CRITICAL" enabled="true" />
+ <coding_rule class="DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE" level="CRITICAL" enabled="true" />
+ <coding_rule class="DL_SYNCHRONIZATION_ON_SHARED_CONSTANT" level="CRITICAL" enabled="true" />
+ <coding_rule class="DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION" level="MAJOR" enabled="true" />
+ <coding_rule class="DMI_ARGUMENTS_WRONG_ORDER" level="CRITICAL" enabled="false" />
+ <coding_rule class="DMI_BAD_MONTH" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_BIGDECIMAL_CONSTRUCTED_FROM_DOUBLE" level="CRITICAL" enabled="false" />
+ <coding_rule class="DMI_BLOCKING_METHODS_ON_URL" level="BLOCKER" enabled="true" />
+ <coding_rule class="DMI_CALLING_NEXT_FROM_HASNEXT" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_COLLECTION_OF_URLS" level="BLOCKER" enabled="true" />
+ <coding_rule class="DMI_CONSTANT_DB_PASSWORD" level="BLOCKER" enabled="true" />
+ <coding_rule class="DMI_DOH" level="CRITICAL" enabled="false" />
+ <coding_rule class="DMI_EMPTY_DB_PASSWORD" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS" level="CRITICAL" enabled="false" />
+ <coding_rule class="DMI_FUTILE_ATTEMPT_TO_CHANGE_MAXPOOL_SIZE_OF_SCHEDULED_THREAD_POOL_EXECUTOR" level="MINOR" enabled="true" />
+ <coding_rule class="DMI_HARDCODED_ABSOLUTE_FILENAME" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_INVOKING_HASHCODE_ON_ARRAY" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_INVOKING_TOSTRING_ON_ARRAY" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_NONSERIALIZABLE_OBJECT_WRITTEN" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_RANDOM_USED_ONLY_ONCE" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_SCHEDULED_THREAD_POOL_EXECUTOR_WITH_ZERO_CORE_THREADS" level="MINOR" enabled="true" />
+ <coding_rule class="DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED" level="MAJOR" enabled="true" />
+ <coding_rule class="DMI_UNSUPPORTED_METHOD" level="MAJOR" enabled="true" />
+ <coding_rule class="DMI_USELESS_SUBSTRING" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION" level="CRITICAL" enabled="true" />
+ <coding_rule class="DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD" level="MINOR" enabled="true" />
+ <coding_rule class="DMI_VACUOUS_SELF_COLLECTION_CALL" level="CRITICAL" enabled="true" />
+ <coding_rule class="DM_BOOLEAN_CTOR" level="MAJOR" enabled="true" />
+ <coding_rule class="DM_BOXED_PRIMITIVE_FOR_COMPARE" level="MAJOR" enabled="false" />
+ <coding_rule class="DM_BOXED_PRIMITIVE_FOR_PARSING" level="MAJOR" enabled="false" />
+ <coding_rule class="DM_BOXED_PRIMITIVE_TOSTRING" level="MAJOR" enabled="true" />
+ <coding_rule class="DM_CONVERT_CASE" level="INFO" enabled="true" />
+ <coding_rule class="DM_DEFAULT_ENCODING" level="CRITICAL" enabled="false" />
+ <coding_rule class="DM_EXIT" level="MAJOR" enabled="true" />
+ <coding_rule class="DM_FP_NUMBER_CTOR" level="MAJOR" enabled="true" />
+ <coding_rule class="DM_GC" level="MAJOR" enabled="true" />
+ <coding_rule class="DM_INVALID_MIN_MAX" level="MAJOR" enabled="false" />
+ <coding_rule class="DM_MONITOR_WAIT_ON_CONDITION" level="MAJOR" enabled="true" />
+ <coding_rule class="DM_NEW_FOR_GETCLASS" level="MAJOR" enabled="true" />
+ <coding_rule class="DM_NEXTINT_VIA_NEXTDOUBLE" level="MAJOR" enabled="true" />
+ <coding_rule class="DM_NUMBER_CTOR" level="CRITICAL" enabled="true" />
+ <coding_rule class="DM_RUN_FINALIZERS_ON_EXIT" level="MAJOR" enabled="true" />
+ <coding_rule class="DM_STRING_CTOR" level="MAJOR" enabled="true" />
+ <coding_rule class="DM_STRING_TOSTRING" level="INFO" enabled="true" />
+ <coding_rule class="DM_STRING_VOID_CTOR" level="MAJOR" enabled="true" />
+ <coding_rule class="DM_USELESS_THREAD" level="MAJOR" enabled="true" />
+ <coding_rule class="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED" level="MAJOR" enabled="true" />
+ <coding_rule class="DP_DO_INSIDE_DO_PRIVILEGED" level="MAJOR" enabled="true" />
+ <coding_rule class="EC_ARRAY_AND_NONARRAY" level="CRITICAL" enabled="true" />
+ <coding_rule class="EC_BAD_ARRAY_COMPARE" level="CRITICAL" enabled="true" />
+ <coding_rule class="EC_INCOMPATIBLE_ARRAY_COMPARE" level="MAJOR" enabled="false" />
+ <coding_rule class="EC_NULL_ARG" level="CRITICAL" enabled="true" />
+ <coding_rule class="EC_UNRELATED_CLASS_AND_INTERFACE" level="CRITICAL" enabled="true" />
+ <coding_rule class="EC_UNRELATED_INTERFACES" level="CRITICAL" enabled="true" />
+ <coding_rule class="EC_UNRELATED_TYPES" level="CRITICAL" enabled="true" />
+ <coding_rule class="EC_UNRELATED_TYPES_USING_POINTER_EQUALITY" level="CRITICAL" enabled="true" />
+ <coding_rule class="EI_EXPOSE_REP" level="MAJOR" enabled="true" />
+ <coding_rule class="EI_EXPOSE_REP2" level="MAJOR" enabled="true" />
+ <coding_rule class="EI_EXPOSE_STATIC_REP2" level="MAJOR" enabled="true" />
+ <coding_rule class="EQ_ABSTRACT_SELF" level="MAJOR" enabled="true" />
+ <coding_rule class="EQ_ALWAYS_FALSE" level="BLOCKER" enabled="true" />
+ <coding_rule class="EQ_ALWAYS_TRUE" level="BLOCKER" enabled="true" />
+ <coding_rule class="EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS" level="MAJOR" enabled="true" />
+ <coding_rule class="EQ_COMPARETO_USE_OBJECT_EQUALS" level="CRITICAL" enabled="true" />
+ <coding_rule class="EQ_COMPARING_CLASS_NAMES" level="MAJOR" enabled="true" />
+ <coding_rule class="EQ_DOESNT_OVERRIDE_EQUALS" level="MAJOR" enabled="false" />
+ <coding_rule class="EQ_DONT_DEFINE_EQUALS_FOR_ENUM" level="MAJOR" enabled="true" />
+ <coding_rule class="EQ_GETCLASS_AND_CLASS_CONSTANT" level="CRITICAL" enabled="true" />
+ <coding_rule class="EQ_OTHER_NO_OBJECT" level="MAJOR" enabled="true" />
+ <coding_rule class="EQ_OTHER_USE_OBJECT" level="MAJOR" enabled="true" />
+ <coding_rule class="EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC" level="MAJOR" enabled="true" />
+ <coding_rule class="EQ_SELF_NO_OBJECT" level="MAJOR" enabled="true" />
+ <coding_rule class="EQ_SELF_USE_OBJECT" level="MAJOR" enabled="true" />
+ <coding_rule class="EQ_UNUSUAL" level="MINOR" enabled="true" />
+ <coding_rule class="ES_COMPARING_PARAMETER_STRING_WITH_EQ" level="MAJOR" enabled="true" />
+ <coding_rule class="ES_COMPARING_STRINGS_WITH_EQ" level="MAJOR" enabled="true" />
+ <coding_rule class="ESync_EMPTY_SYNC" level="MAJOR" enabled="true" />
+ <coding_rule class="FB_MISSING_EXPECTED_WARNING" level="CRITICAL" enabled="false" />
+ <coding_rule class="FB_UNEXPECTED_WARNING" level="CRITICAL" enabled="false" />
+ <coding_rule class="FE_FLOATING_POINT_EQUALITY" level="CRITICAL" enabled="true" />
+ <coding_rule class="FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER" level="CRITICAL" enabled="true" />
+ <coding_rule class="FI_EMPTY" level="MAJOR" enabled="true" />
+ <coding_rule class="FI_EXPLICIT_INVOCATION" level="MAJOR" enabled="true" />
+ <coding_rule class="FI_FINALIZER_NULLS_FIELDS" level="MAJOR" enabled="true" />
+ <coding_rule class="FI_FINALIZER_ONLY_NULLS_FIELDS" level="MAJOR" enabled="true" />
+ <coding_rule class="FI_MISSING_SUPER_CALL" level="MAJOR" enabled="true" />
+ <coding_rule class="FI_NULLIFY_SUPER" level="CRITICAL" enabled="true" />
+ <coding_rule class="FI_PUBLIC_SHOULD_BE_PROTECTED" level="MAJOR" enabled="true" />
+ <coding_rule class="FI_USELESS" level="MINOR" enabled="true" />
+ <coding_rule class="FL_MATH_USING_FLOAT_PRECISION" level="CRITICAL" enabled="true" />
+ <coding_rule class="GC_UNCHECKED_TYPE_IN_GENERIC_CALL" level="CRITICAL" enabled="true" />
+ <coding_rule class="GC_UNRELATED_TYPES" level="CRITICAL" enabled="true" />
+ <coding_rule class="HE_EQUALS_NO_HASHCODE" level="MAJOR" enabled="true" />
+ <coding_rule class="HE_EQUALS_USE_HASHCODE" level="CRITICAL" enabled="true" />
+ <coding_rule class="HE_HASHCODE_NO_EQUALS" level="CRITICAL" enabled="true" />
+ <coding_rule class="HE_HASHCODE_USE_OBJECT_EQUALS" level="CRITICAL" enabled="true" />
+ <coding_rule class="HE_INHERITS_EQUALS_USE_HASHCODE" level="CRITICAL" enabled="true" />
+ <coding_rule class="HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS" level="CRITICAL" enabled="true" />
+ <coding_rule class="HE_USE_OF_UNHASHABLE_CLASS" level="CRITICAL" enabled="true" />
+ <coding_rule class="HRS_REQUEST_PARAMETER_TO_COOKIE" level="MAJOR" enabled="true" />
+ <coding_rule class="HRS_REQUEST_PARAMETER_TO_HTTP_HEADER" level="MAJOR" enabled="true" />
+ <coding_rule class="HSC_HUGE_SHARED_STRING_CONSTANT" level="CRITICAL" enabled="true" />
+ <coding_rule class="IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD" level="MAJOR" enabled="true" />
+ <coding_rule class="ICAST_BAD_SHIFT_AMOUNT" level="CRITICAL" enabled="true" />
+ <coding_rule class="ICAST_IDIV_CAST_TO_DOUBLE" level="CRITICAL" enabled="true" />
+ <coding_rule class="ICAST_INTEGER_MULTIPLY_CAST_TO_LONG" level="CRITICAL" enabled="true" />
+ <coding_rule class="ICAST_INT_2_LONG_AS_INSTANT" level="CRITICAL" enabled="false" />
+ <coding_rule class="ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL" level="CRITICAL" enabled="true" />
+ <coding_rule class="ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND" level="CRITICAL" enabled="true" />
+ <coding_rule class="ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT" level="CRITICAL" enabled="true" />
+ <coding_rule class="IC_INIT_CIRCULARITY" level="CRITICAL" enabled="true" />
+ <coding_rule class="IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION" level="MAJOR" enabled="true" />
+ <coding_rule class="IIL_ELEMENTS_GET_LENGTH_IN_LOOP" level="MAJOR" enabled="false" />
+ <coding_rule class="IIL_PATTERN_COMPILE_IN_LOOP" level="MAJOR" enabled="false" />
+ <coding_rule class="IIL_PATTERN_COMPILE_IN_LOOP_INDIRECT" level="MAJOR" enabled="false" />
+ <coding_rule class="IIL_PREPARE_STATEMENT_IN_LOOP" level="MAJOR" enabled="false" />
+ <coding_rule class="IIO_INEFFICIENT_INDEX_OF" level="MAJOR" enabled="false" />
+ <coding_rule class="IIO_INEFFICIENT_LAST_INDEX_OF" level="MAJOR" enabled="false" />
+ <coding_rule class="IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD" level="CRITICAL" enabled="true" />
+ <coding_rule class="IJU_BAD_SUITE_METHOD" level="CRITICAL" enabled="true" />
+ <coding_rule class="IJU_NO_TESTS" level="CRITICAL" enabled="true" />
+ <coding_rule class="IJU_SETUP_NO_SUPER" level="CRITICAL" enabled="true" />
+ <coding_rule class="IJU_SUITE_NOT_STATIC" level="CRITICAL" enabled="true" />
+ <coding_rule class="IJU_TEARDOWN_NO_SUPER" level="CRITICAL" enabled="true" />
+ <coding_rule class="IL_CONTAINER_ADDED_TO_ITSELF" level="CRITICAL" enabled="true" />
+ <coding_rule class="IL_INFINITE_LOOP" level="CRITICAL" enabled="true" />
+ <coding_rule class="IL_INFINITE_RECURSIVE_LOOP" level="CRITICAL" enabled="true" />
+ <coding_rule class="IMA_INEFFICIENT_MEMBER_ACCESS" level="MAJOR" enabled="false" />
+ <coding_rule class="IMSE_DONT_CATCH_IMSE" level="MAJOR" enabled="true" />
+ <coding_rule class="IM_AVERAGE_COMPUTATION_COULD_OVERFLOW" level="CRITICAL" enabled="true" />
+ <coding_rule class="IM_BAD_CHECK_FOR_ODD" level="CRITICAL" enabled="true" />
+ <coding_rule class="IM_MULTIPLYING_RESULT_OF_IREM" level="CRITICAL" enabled="true" />
+ <coding_rule class="INT_BAD_COMPARISON_WITH_INT_VALUE" level="CRITICAL" enabled="false" />
+ <coding_rule class="INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE" level="CRITICAL" enabled="true" />
+ <coding_rule class="INT_BAD_COMPARISON_WITH_SIGNED_BYTE" level="CRITICAL" enabled="true" />
+ <coding_rule class="INT_BAD_REM_BY_1" level="CRITICAL" enabled="true" />
+ <coding_rule class="INT_VACUOUS_BIT_OPERATION" level="CRITICAL" enabled="true" />
+ <coding_rule class="INT_VACUOUS_COMPARISON" level="CRITICAL" enabled="true" />
+ <coding_rule class="IO_APPENDING_TO_OBJECT_OUTPUT_STREAM" level="CRITICAL" enabled="true" />
+ <coding_rule class="IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN" level="CRITICAL" enabled="true" />
+ <coding_rule class="IS2_INCONSISTENT_SYNC" level="CRITICAL" enabled="true" />
+ <coding_rule class="ISC_INSTANTIATE_STATIC_CLASS" level="MAJOR" enabled="true" />
+ <coding_rule class="IS_FIELD_NOT_GUARDED" level="CRITICAL" enabled="true" />
+ <coding_rule class="ITA_INEFFICIENT_TO_ARRAY" level="CRITICAL" enabled="true" />
+ <coding_rule class="IT_NO_SUCH_ELEMENT" level="MINOR" enabled="true" />
+ <coding_rule class="J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION" level="CRITICAL" enabled="true" />
+ <coding_rule class="JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS" level="MINOR" enabled="true" />
+ <coding_rule class="JLM_JSR166_LOCK_MONITORENTER" level="CRITICAL" enabled="true" />
+ <coding_rule class="JLM_JSR166_UTILCONCURRENT_MONITORENTER" level="CRITICAL" enabled="false" />
+ <coding_rule class="JML_JSR166_CALLING_WAIT_RATHER_THAN_AWAIT" level="CRITICAL" enabled="false" />
+ <coding_rule class="LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE" level="MAJOR" enabled="false" />
+ <coding_rule class="LI_LAZY_INIT_STATIC" level="CRITICAL" enabled="true" />
+ <coding_rule class="LI_LAZY_INIT_UPDATE_STATIC" level="CRITICAL" enabled="true" />
+ <coding_rule class="ME_ENUM_FIELD_SETTER" level="MAJOR" enabled="false" />
+ <coding_rule class="ME_MUTABLE_ENUM_FIELD" level="MAJOR" enabled="false" />
+ <coding_rule class="MF_CLASS_MASKS_FIELD" level="MAJOR" enabled="true" />
+ <coding_rule class="MF_METHOD_MASKS_FIELD" level="MAJOR" enabled="true" />
+ <coding_rule class="ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD" level="MAJOR" enabled="true" />
+ <coding_rule class="ML_SYNC_ON_UPDATED_FIELD" level="MAJOR" enabled="true" />
+ <coding_rule class="MSF_MUTABLE_SERVLET_FIELD" level="MAJOR" enabled="true" />
+ <coding_rule class="MS_CANNOT_BE_FINAL" level="MAJOR" enabled="true" />
+ <coding_rule class="MS_EXPOSE_REP" level="CRITICAL" enabled="true" />
+ <coding_rule class="MS_FINAL_PKGPROTECT" level="MAJOR" enabled="true" />
+ <coding_rule class="MS_MUTABLE_ARRAY" level="MAJOR" enabled="true" />
+ <coding_rule class="MS_MUTABLE_COLLECTION" level="MAJOR" enabled="false" />
+ <coding_rule class="MS_MUTABLE_COLLECTION_PKGPROTECT" level="MAJOR" enabled="false" />
+ <coding_rule class="MS_MUTABLE_HASHTABLE" level="MAJOR" enabled="true" />
+ <coding_rule class="MS_OOI_PKGPROTECT" level="MAJOR" enabled="true" />
+ <coding_rule class="MS_PKGPROTECT" level="MAJOR" enabled="true" />
+ <coding_rule class="MS_SHOULD_BE_FINAL" level="MAJOR" enabled="true" />
+ <coding_rule class="MS_SHOULD_BE_REFACTORED_TO_BE_FINAL" level="CRITICAL" enabled="false" />
+ <coding_rule class="MTIA_SUSPECT_SERVLET_INSTANCE_FIELD" level="CRITICAL" enabled="true" />
+ <coding_rule class="MTIA_SUSPECT_STRUTS_INSTANCE_FIELD" level="CRITICAL" enabled="true" />
+ <coding_rule class="MWN_MISMATCHED_NOTIFY" level="CRITICAL" enabled="true" />
+ <coding_rule class="MWN_MISMATCHED_WAIT" level="CRITICAL" enabled="true" />
+ <coding_rule class="NM_BAD_EQUAL" level="MAJOR" enabled="false" />
+ <coding_rule class="NM_CLASS_NAMING_CONVENTION" level="MAJOR" enabled="false" />
+ <coding_rule class="NM_CLASS_NOT_EXCEPTION" level="MAJOR" enabled="true" />
+ <coding_rule class="NM_CONFUSING" level="MAJOR" enabled="true" />
+ <coding_rule class="NM_FIELD_NAMING_CONVENTION" level="MAJOR" enabled="false" />
+ <coding_rule class="NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER" level="MAJOR" enabled="true" />
+ <coding_rule class="NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER" level="MAJOR" enabled="true" />
+ <coding_rule class="NM_LCASE_HASHCODE" level="MAJOR" enabled="false" />
+ <coding_rule class="NM_LCASE_TOSTRING" level="MAJOR" enabled="false" />
+ <coding_rule class="NM_METHOD_CONSTRUCTOR_CONFUSION" level="MAJOR" enabled="true" />
+ <coding_rule class="NM_METHOD_NAMING_CONVENTION" level="MAJOR" enabled="false" />
+ <coding_rule class="NM_SAME_SIMPLE_NAME_AS_INTERFACE" level="MAJOR" enabled="true" />
+ <coding_rule class="NM_SAME_SIMPLE_NAME_AS_SUPERCLASS" level="MAJOR" enabled="true" />
+ <coding_rule class="NM_VERY_CONFUSING" level="MAJOR" enabled="true" />
+ <coding_rule class="NM_VERY_CONFUSING_INTENTIONAL" level="MAJOR" enabled="true" />
+ <coding_rule class="NM_WRONG_PACKAGE" level="MAJOR" enabled="true" />
+ <coding_rule class="NM_WRONG_PACKAGE_INTENTIONAL" level="MAJOR" enabled="true" />
+ <coding_rule class="NN_NAKED_NOTIFY" level="CRITICAL" enabled="true" />
+ <coding_rule class="NOISE_FIELD_REFERENCE" level="MAJOR" enabled="false" />
+ <coding_rule class="NOISE_METHOD_CALL" level="MAJOR" enabled="false" />
+ <coding_rule class="NOISE_NULL_DEREFERENCE" level="MAJOR" enabled="false" />
+ <coding_rule class="NOISE_OPERATION" level="MAJOR" enabled="false" />
+ <coding_rule class="NO_NOTIFY_NOT_NOTIFYALL" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_ALWAYS_NULL" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_ALWAYS_NULL_EXCEPTION" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_ARGUMENT_MIGHT_BE_NULL" level="MAJOR" enabled="true" />
+ <coding_rule class="NP_BOOLEAN_RETURN_NULL" level="MAJOR" enabled="true" />
+ <coding_rule class="NP_CLONE_COULD_RETURN_NULL" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_CLOSING_NULL" level="MAJOR" enabled="false" />
+ <coding_rule class="NP_DEREFERENCE_OF_READLINE_VALUE" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_GUARANTEED_DEREF" level="BLOCKER" enabled="true" />
+ <coding_rule class="NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_IMMEDIATE_DEREFERENCE_OF_READLINE" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_LOAD_OF_KNOWN_NULL_VALUE" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_METHOD_PARAMETER_TIGHTENS_ANNOTATION" level="MAJOR" enabled="false" />
+ <coding_rule class="NP_METHOD_RETURN_RELAXING_ANNOTATION" level="MAJOR" enabled="false" />
+ <coding_rule class="NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" level="CRITICAL" enabled="false" />
+ <coding_rule class="NP_NONNULL_PARAM_VIOLATION" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_NONNULL_RETURN_VIOLATION" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_NULL_INSTANCEOF" level="BLOCKER" enabled="true" />
+ <coding_rule class="NP_NULL_ON_SOME_PATH" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_NULL_ON_SOME_PATH_EXCEPTION" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_NULL_PARAM_DEREF" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_NULL_PARAM_DEREF_NONVIRTUAL" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_OPTIONAL_RETURN_NULL" level="MAJOR" enabled="false" />
+ <coding_rule class="NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_STORE_INTO_NONNULL_FIELD" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_SYNC_AND_NULL_CHECK_FIELD" level="MAJOR" enabled="true" />
+ <coding_rule class="NP_TOSTRING_COULD_RETURN_NULL" level="CRITICAL" enabled="true" />
+ <coding_rule class="NP_UNWRITTEN_FIELD" level="MAJOR" enabled="false" />
+ <coding_rule class="NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD" level="CRITICAL" enabled="false" />
+ <coding_rule class="NS_DANGEROUS_NON_SHORT_CIRCUIT" level="CRITICAL" enabled="true" />
+ <coding_rule class="NS_NON_SHORT_CIRCUIT" level="MAJOR" enabled="true" />
+ <coding_rule class="OBL_UNSATISFIED_OBLIGATION" level="CRITICAL" enabled="false" />
+ <coding_rule class="OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE" level="CRITICAL" enabled="false" />
+ <coding_rule class="ODR_OPEN_DATABASE_RESOURCE" level="CRITICAL" enabled="true" />
+ <coding_rule class="ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH" level="CRITICAL" enabled="true" />
+ <coding_rule class="OS_OPEN_STREAM" level="CRITICAL" enabled="true" />
+ <coding_rule class="OS_OPEN_STREAM_EXCEPTION_PATH" level="CRITICAL" enabled="true" />
+ <coding_rule class="PS_PUBLIC_SEMAPHORES" level="CRITICAL" enabled="true" />
+ <coding_rule class="PT_ABSOLUTE_PATH_TRAVERSAL" level="CRITICAL" enabled="false" />
+ <coding_rule class="PT_RELATIVE_PATH_TRAVERSAL" level="CRITICAL" enabled="false" />
+ <coding_rule class="PZLA_PREFER_ZERO_LENGTH_ARRAYS" level="MAJOR" enabled="true" />
+ <coding_rule class="PZ_DONT_REUSE_ENTRY_OBJECTS_IN_ITERATORS" level="CRITICAL" enabled="false" />
+ <coding_rule class="QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT" level="CRITICAL" enabled="true" />
+ <coding_rule class="QF_QUESTIONABLE_FOR_LOOP" level="CRITICAL" enabled="true" />
+ <coding_rule class="RANGE_ARRAY_INDEX" level="MAJOR" enabled="false" />
+ <coding_rule class="RANGE_ARRAY_LENGTH" level="MAJOR" enabled="false" />
+ <coding_rule class="RANGE_ARRAY_OFFSET" level="MAJOR" enabled="false" />
+ <coding_rule class="RANGE_STRING_INDEX" level="MAJOR" enabled="false" />
+ <coding_rule class="RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE" level="CRITICAL" enabled="true" />
+ <coding_rule class="RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES" level="CRITICAL" enabled="true" />
+ <coding_rule class="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE" level="CRITICAL" enabled="true" />
+ <coding_rule class="RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE" level="CRITICAL" enabled="true" />
+ <coding_rule class="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE" level="CRITICAL" enabled="true" />
+ <coding_rule class="RC_REF_COMPARISON" level="CRITICAL" enabled="true" />
+ <coding_rule class="RC_REF_COMPARISON_BAD_PRACTICE" level="MAJOR" enabled="false" />
+ <coding_rule class="RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN" level="MAJOR" enabled="false" />
+ <coding_rule class="REC_CATCH_EXCEPTION" level="MAJOR" enabled="true" />
+ <coding_rule class="RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION" level="CRITICAL" enabled="true" />
+ <coding_rule class="RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION" level="CRITICAL" enabled="true" />
+ <coding_rule class="RE_POSSIBLE_UNINTENDED_PATTERN" level="CRITICAL" enabled="true" />
+ <coding_rule class="RI_REDUNDANT_INTERFACES" level="MAJOR" enabled="true" />
+ <coding_rule class="RR_NOT_CHECKED" level="MAJOR" enabled="true" />
+ <coding_rule class="RS_READOBJECT_SYNC" level="CRITICAL" enabled="true" />
+ <coding_rule class="RU_INVOKE_RUN" level="MAJOR" enabled="true" />
+ <coding_rule class="RV_01_TO_INT" level="MAJOR" enabled="true" />
+ <coding_rule class="RV_ABSOLUTE_VALUE_OF_HASHCODE" level="CRITICAL" enabled="true" />
+ <coding_rule class="RV_ABSOLUTE_VALUE_OF_RANDOM_INT" level="CRITICAL" enabled="true" />
+ <coding_rule class="RV_CHECK_COMPARETO_FOR_SPECIFIC_RETURN_VALUE" level="CRITICAL" enabled="false" />
+ <coding_rule class="RV_CHECK_FOR_POSITIVE_INDEXOF" level="MINOR" enabled="true" />
+ <coding_rule class="RV_DONT_JUST_NULL_CHECK_READLINE" level="MAJOR" enabled="true" />
+ <coding_rule class="RV_EXCEPTION_NOT_THROWN" level="CRITICAL" enabled="true" />
+ <coding_rule class="RV_NEGATING_RESULT_OF_COMPARETO" level="CRITICAL" enabled="false" />
+ <coding_rule class="RV_REM_OF_HASHCODE" level="CRITICAL" enabled="true" />
+ <coding_rule class="RV_REM_OF_RANDOM_INT" level="CRITICAL" enabled="true" />
+ <coding_rule class="RV_RETURN_VALUE_IGNORED" level="MINOR" enabled="true" />
+ <coding_rule class="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" level="MAJOR" enabled="true" />
+ <coding_rule class="RV_RETURN_VALUE_IGNORED_INFERRED" level="CRITICAL" enabled="false" />
+ <coding_rule class="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT" level="MAJOR" enabled="false" />
+ <coding_rule class="RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED" level="MAJOR" enabled="false" />
+ <coding_rule class="RpC_REPEATED_CONDITIONAL_TEST" level="MAJOR" enabled="true" />
+ <coding_rule class="SA_FIELD_DOUBLE_ASSIGNMENT" level="CRITICAL" enabled="true" />
+ <coding_rule class="SA_FIELD_SELF_ASSIGNMENT" level="CRITICAL" enabled="true" />
+ <coding_rule class="SA_FIELD_SELF_COMPARISON" level="CRITICAL" enabled="true" />
+ <coding_rule class="SA_FIELD_SELF_COMPUTATION" level="CRITICAL" enabled="true" />
+ <coding_rule class="SA_LOCAL_DOUBLE_ASSIGNMENT" level="CRITICAL" enabled="true" />
+ <coding_rule class="SA_LOCAL_SELF_ASSIGNMENT" level="CRITICAL" enabled="true" />
+ <coding_rule class="SA_LOCAL_SELF_ASSIGNMENT_INSTEAD_OF_FIELD" level="CRITICAL" enabled="false" />
+ <coding_rule class="SA_LOCAL_SELF_COMPARISON" level="CRITICAL" enabled="true" />
+ <coding_rule class="SA_LOCAL_SELF_COMPUTATION" level="CRITICAL" enabled="true" />
+ <coding_rule class="SBSC_USE_STRINGBUFFER_CONCATENATION" level="CRITICAL" enabled="true" />
+ <coding_rule class="SC_START_IN_CTOR" level="CRITICAL" enabled="true" />
+ <coding_rule class="SE_BAD_FIELD" level="MINOR" enabled="false" />
+ <coding_rule class="SE_BAD_FIELD_INNER_CLASS" level="MINOR" enabled="true" />
+ <coding_rule class="SE_BAD_FIELD_STORE" level="CRITICAL" enabled="true" />
+ <coding_rule class="SE_COMPARATOR_SHOULD_BE_SERIALIZABLE" level="MAJOR" enabled="true" />
+ <coding_rule class="SE_INNER_CLASS" level="MAJOR" enabled="true" />
+ <coding_rule class="SE_METHOD_MUST_BE_PRIVATE" level="MAJOR" enabled="true" />
+ <coding_rule class="SE_NONFINAL_SERIALVERSIONID" level="CRITICAL" enabled="true" />
+ <coding_rule class="SE_NONLONG_SERIALVERSIONID" level="MAJOR" enabled="true" />
+ <coding_rule class="SE_NONSTATIC_SERIALVERSIONID" level="MAJOR" enabled="true" />
+ <coding_rule class="SE_NO_SERIALVERSIONID" level="MAJOR" enabled="true" />
+ <coding_rule class="SE_NO_SUITABLE_CONSTRUCTOR" level="MAJOR" enabled="true" />
+ <coding_rule class="SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION" level="MAJOR" enabled="true" />
+ <coding_rule class="SE_PRIVATE_READ_RESOLVE_NOT_INHERITED" level="MAJOR" enabled="true" />
+ <coding_rule class="SE_READ_RESOLVE_IS_STATIC" level="MAJOR" enabled="true" />
+ <coding_rule class="SE_READ_RESOLVE_MUST_RETURN_OBJECT" level="MAJOR" enabled="true" />
+ <coding_rule class="SE_TRANSIENT_FIELD_NOT_RESTORED" level="MAJOR" enabled="true" />
+ <coding_rule class="SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS" level="MAJOR" enabled="true" />
+ <coding_rule class="SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH" level="MAJOR" enabled="false" />
+ <coding_rule class="SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_THROW" level="MAJOR" enabled="false" />
+ <coding_rule class="SF_SWITCH_FALLTHROUGH" level="MAJOR" enabled="false" />
+ <coding_rule class="SF_SWITCH_NO_DEFAULT" level="MAJOR" enabled="false" />
+ <coding_rule class="SIC_INNER_SHOULD_BE_STATIC" level="MAJOR" enabled="true" />
+ <coding_rule class="SIC_INNER_SHOULD_BE_STATIC_ANON" level="MAJOR" enabled="true" />
+ <coding_rule class="SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS" level="MAJOR" enabled="true" />
+ <coding_rule class="SIC_THREADLOCAL_DEADLY_EMBRACE" level="MAJOR" enabled="false" />
+ <coding_rule class="SIO_SUPERFLUOUS_INSTANCEOF" level="CRITICAL" enabled="true" />
+ <coding_rule class="SI_INSTANCE_BEFORE_FINALS_ASSIGNED" level="CRITICAL" enabled="true" />
+ <coding_rule class="SP_SPIN_ON_FIELD" level="MAJOR" enabled="true" />
+ <coding_rule class="SQL_BAD_PREPARED_STATEMENT_ACCESS" level="CRITICAL" enabled="true" />
+ <coding_rule class="SQL_BAD_RESULTSET_ACCESS" level="CRITICAL" enabled="true" />
+ <coding_rule class="SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE" level="CRITICAL" enabled="true" />
+ <coding_rule class="SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING" level="CRITICAL" enabled="true" />
+ <coding_rule class="SR_NOT_CHECKED" level="MAJOR" enabled="true" />
+ <coding_rule class="SS_SHOULD_BE_STATIC" level="MAJOR" enabled="true" />
+ <coding_rule class="STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE" level="CRITICAL" enabled="true" />
+ <coding_rule class="STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE" level="CRITICAL" enabled="true" />
+ <coding_rule class="STCAL_STATIC_CALENDAR_INSTANCE" level="CRITICAL" enabled="true" />
+ <coding_rule class="STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE" level="CRITICAL" enabled="true" />
+ <coding_rule class="STI_INTERRUPTED_ON_CURRENTTHREAD" level="CRITICAL" enabled="true" />
+ <coding_rule class="STI_INTERRUPTED_ON_UNKNOWNTHREAD" level="CRITICAL" enabled="true" />
+ <coding_rule class="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" level="CRITICAL" enabled="true" />
+ <coding_rule class="SWL_SLEEP_WITH_LOCK_HELD" level="CRITICAL" enabled="true" />
+ <coding_rule class="SW_SWING_METHODS_INVOKED_IN_SWING_THREAD" level="MAJOR" enabled="true" />
+ <coding_rule class="TLW_TWO_LOCK_WAIT" level="MAJOR" enabled="true" />
+ <coding_rule class="TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED" level="CRITICAL" enabled="true" />
+ <coding_rule class="TQ_COMPARING_VALUES_WITH_INCOMPATIBLE_TYPE_QUALIFIERS" level="CRITICAL" enabled="false" />
+ <coding_rule class="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK" level="CRITICAL" enabled="true" />
+ <coding_rule class="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK" level="CRITICAL" enabled="true" />
+ <coding_rule class="TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK" level="CRITICAL" enabled="true" />
+ <coding_rule class="TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK" level="CRITICAL" enabled="true" />
+ <coding_rule class="TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED" level="CRITICAL" enabled="true" />
+ <coding_rule class="TQ_UNKNOWN_VALUE_USED_WHERE_ALWAYS_STRICTLY_REQUIRED" level="CRITICAL" enabled="false" />
+ <coding_rule class="UCF_USELESS_CONTROL_FLOW" level="CRITICAL" enabled="true" />
+ <coding_rule class="UCF_USELESS_CONTROL_FLOW_NEXT_LINE" level="CRITICAL" enabled="true" />
+ <coding_rule class="UC_USELESS_CONDITION" level="MAJOR" enabled="false" />
+ <coding_rule class="UC_USELESS_CONDITION_TYPE" level="MAJOR" enabled="false" />
+ <coding_rule class="UC_USELESS_OBJECT" level="MAJOR" enabled="false" />
+ <coding_rule class="UC_USELESS_OBJECT_STACK" level="MAJOR" enabled="false" />
+ <coding_rule class="UC_USELESS_VOID_METHOD" level="MAJOR" enabled="false" />
+ <coding_rule class="UG_SYNC_SET_UNSYNC_GET" level="MAJOR" enabled="true" />
+ <coding_rule class="UI_INHERITANCE_UNSAFE_GETRESOURCE" level="MAJOR" enabled="true" />
+ <coding_rule class="UL_UNRELEASED_LOCK" level="CRITICAL" enabled="true" />
+ <coding_rule class="UL_UNRELEASED_LOCK_EXCEPTION_PATH" level="CRITICAL" enabled="true" />
+ <coding_rule class="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS" level="CRITICAL" enabled="true" />
+ <coding_rule class="UM_UNNECESSARY_MATH" level="CRITICAL" enabled="true" />
+ <coding_rule class="UPM_UNCALLED_PRIVATE_METHOD" level="CRITICAL" enabled="true" />
+ <coding_rule class="URF_UNREAD_FIELD" level="MAJOR" enabled="true" />
+ <coding_rule class="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD" level="CRITICAL" enabled="false" />
+ <coding_rule class="UR_UNINIT_READ" level="MAJOR" enabled="true" />
+ <coding_rule class="UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR" level="MAJOR" enabled="false" />
+ <coding_rule class="USM_USELESS_ABSTRACT_METHOD" level="MAJOR" enabled="false" />
+ <coding_rule class="USM_USELESS_SUBCLASS_METHOD" level="MAJOR" enabled="false" />
+ <coding_rule class="UUF_UNUSED_FIELD" level="MAJOR" enabled="true" />
+ <coding_rule class="UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD" level="CRITICAL" enabled="false" />
+ <coding_rule class="UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" level="MAJOR" enabled="false" />
+ <coding_rule class="UWF_NULL_FIELD" level="CRITICAL" enabled="true" />
+ <coding_rule class="UWF_UNWRITTEN_FIELD" level="MAJOR" enabled="false" />
+ <coding_rule class="UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD" level="CRITICAL" enabled="false" />
+ <coding_rule class="UW_UNCOND_WAIT" level="MAJOR" enabled="true" />
+ <coding_rule class="VA_FORMAT_STRING_BAD_ARGUMENT" level="CRITICAL" enabled="true" />
+ <coding_rule class="VA_FORMAT_STRING_BAD_CONVERSION" level="CRITICAL" enabled="true" />
+ <coding_rule class="VA_FORMAT_STRING_BAD_CONVERSION_FROM_ARRAY" level="MAJOR" enabled="true" />
+ <coding_rule class="VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN" level="MAJOR" enabled="true" />
+ <coding_rule class="VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_SUPPLIED" level="MAJOR" enabled="false" />
+ <coding_rule class="VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED" level="MAJOR" enabled="true" />
+ <coding_rule class="VA_FORMAT_STRING_ILLEGAL" level="CRITICAL" enabled="true" />
+ <coding_rule class="VA_FORMAT_STRING_MISSING_ARGUMENT" level="CRITICAL" enabled="true" />
+ <coding_rule class="VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT" level="CRITICAL" enabled="true" />
+ <coding_rule class="VA_FORMAT_STRING_USES_NEWLINE" level="CRITICAL" enabled="false" />
+ <coding_rule class="VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG" level="CRITICAL" enabled="true" />
+ <coding_rule class="VO_VOLATILE_INCREMENT" level="CRITICAL" enabled="false" />
+ <coding_rule class="VO_VOLATILE_REFERENCE_TO_ARRAY" level="MAJOR" enabled="true" />
+ <coding_rule class="VR_UNRESOLVABLE_REFERENCE" level="MAJOR" enabled="false" />
+ <coding_rule class="WA_AWAIT_NOT_IN_LOOP" level="CRITICAL" enabled="true" />
+ <coding_rule class="WA_NOT_IN_LOOP" level="CRITICAL" enabled="true" />
+ <coding_rule class="WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL" level="CRITICAL" enabled="true" />
+ <coding_rule class="WMI_WRONG_MAP_ITERATOR" level="CRITICAL" enabled="true" />
+ <coding_rule class="WS_WRITEOBJECT_SYNC" level="CRITICAL" enabled="true" />
+ <coding_rule class="XFB_XML_FACTORY_BYPASS" level="CRITICAL" enabled="true" />
+ <coding_rule class="XSS_REQUEST_PARAMETER_TO_JSP_WRITER" level="CRITICAL" enabled="true" />
+ <coding_rule class="XSS_REQUEST_PARAMETER_TO_SEND_ERROR" level="CRITICAL" enabled="true" />
+ <coding_rule class="XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER" level="CRITICAL" enabled="true" />
+ </profile>
+ </profiles>
+ <list size="0" />
+ </component>
+</project>
\ No newline at end of file
--- /dev/null
+/build
\ No newline at end of file
--- /dev/null
+plugins {
+ id 'com.android.application'
+ id 'kotlin-android'
+ id 'kotlin-kapt'
+}
+
+android {
+ compileSdkVersion 29
+
+ defaultConfig {
+ applicationId "com.ic.temperature"
+ minSdkVersion 19
+ targetSdkVersion 29
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+ dataBinding {
+ enabled = true
+ }
+}
+
+dependencies {
+
+ def lifecycle_version = "2.2.0"
+
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+ implementation 'androidx.core:core-ktx:1.3.2'
+ implementation 'androidx.appcompat:appcompat:1.2.0'
+ implementation 'com.google.android.material:material:1.2.1'
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.2'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+ implementation 'com.github.silvestrpredko:dot-progress-bar:1.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
+}
\ No newline at end of file
--- /dev/null
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
--- /dev/null
+package com.ic.temperature
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.ic.temperature", appContext.packageName)
+ }
+}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.ic.temperature">
+
+ <application
+ android:name=".App"
+ android:allowBackup="true"
+ android:icon="@mipmap/ic_launcher"
+ android:label="@string/app_name"
+ android:roundIcon="@mipmap/ic_launcher_round"
+ android:supportsRtl="true"
+ android:theme="@style/AppTheme">
+ <activity android:name=".MainActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
\ No newline at end of file
--- /dev/null
+// ITempAidlInterface.aidl
+package com.ic.aidl.temp;
+
+interface ITempAidlInterface {
+ /**
+ * Demonstrates some basic types that you can use as parameters
+ * and return values in AIDL.
+ */
+ void updateCurrTempValue(double value,double animal,double tempOut);
+ void updateResultTempValue(double value,double animal,double tempOut);
+}
--- /dev/null
+// ITempRemoteService.aidl
+package com.ic.aidl.temp;
+
+// Declare any non-default types here with import statements
+
+import com.ic.aidl.temp.ITempAidlInterface;
+
+interface ITempRemoteService {
+ /**
+ * Demonstrates some basic types that you can use as parameters
+ * and return values in AIDL.
+ */
+ void registerCallback(ITempAidlInterface cb);
+ void unregisterCallback(ITempAidlInterface cb);
+
+ void onStartQueryTemp();
+ void onStopQueryTemp();
+}
--- /dev/null
+package com.ic.temperature
+
+import android.app.Application
+import android.content.Context
+
+class App : Application() {
+
+ init {
+ instance = this
+ }
+
+ companion object {
+ private var instance: App? = null
+
+ fun applicationContext(): Context {
+ return instance!!.applicationContext
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+package com.ic.temperature
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.lifecycle.ViewModelProvider
+import com.ic.temperature.databinding.ActivityMainBinding
+import com.ic.temperature.utils.ICViewModelFactory
+import com.ic.temperature.viewmodel.TemperatureViewModel
+
+/**
+ * 这个是健康的界面,如果没有佩戴的话,不做检查。
+ * <p>
+ * 获取当前是否佩戴的状态key为:persist.sys.ic_antioff
+ * <p>
+ * 这个是主动获取的。
+ * <p>
+ * 被动通知可以通过广播的方式监听佩戴状态的变化。
+ * <p>
+ * 广播相关的内容:
+ * <p>
+ * public static String ACTION_ANTI_OFF0 = "com.ic.ACTION_ANTIOFF";
+ * //integer eventID =1 脱落, eventID =0 佩戴
+ * public static String KEY_ANTI_EVENT="eventID";
+ */
+class MainActivity : AppCompatActivity() {
+ private val viewModel by lazy {
+ ViewModelProvider(this,
+ ICViewModelFactory()
+ ).get(TemperatureViewModel::class.java)
+ }
+
+ private val binding by lazy {
+ ActivityMainBinding.inflate(layoutInflater)
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(binding.root)
+ initObserver()
+ }
+
+ /**
+ * 观察ViewModel中的数据变化,然后去设置UI
+ */
+ private fun initObserver() {
+ val that = this
+ viewModel.apply {
+ mBodyTemp.observe(that) {
+ //体温
+ binding.bodyTemp = it
+ }
+ mWristTemp.observe(that) {
+ //腕部温度
+ binding.wristTemp = it
+ }
+ mEnvTemp.observe(that) {
+ //环境温度
+ binding.envTemp = it
+ }
+ mCheckTips.observe(that) {
+ //检查状态
+ binding.checkTips = it
+ }
+ mShowLoading.observe(that) {
+ //显示Loading
+ binding.showLoading = it
+ }
+ mDisableWristTemp.observe(that) {
+ //是否开启腕部温度
+ binding.disableWristTemp = it
+ }
+ mDisableEnvTemp.observe(that) {
+ //是否开启环境温度
+ binding.disableEnvTemp = it
+ }
+ mFinishActivity.observe(that) {
+ //关闭Activity
+ if (it) {
+ finish()
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+package com.ic.temperature.repository
+
+class TemperatureRepository {
+
+}
\ No newline at end of file
--- /dev/null
+package com.ic.temperature.utils
+
+object Constants {
+ const val ACTION_ANTI_OFF0: String = "com.ic.ACTION_ANTIOFF"
+
+ //integer eventID =1 脱落, eventID =0 佩戴
+ const val KEY_ANTI_EVENT = "eventID"
+ const val STATE_ANTI_ON = 0
+ const val STATE_ANTI_OFF = 1
+ const val STATE_ANTI_NONE = -1
+ const val ACTION_REMOTE_WORK_SERVICE = "com.ic.action.WORK_SERVICE"
+ const val PACKAGE_REMOTE_WORK_SERVICE = "com.ic.temp"
+}
\ No newline at end of file
--- /dev/null
+package com.ic.temperature.utils
+
+import android.content.Context
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import com.ic.temperature.App
+
+/**
+ * ViewModel的创建工厂,把context和repository给到ViewModel里头
+ */
+class ICViewModelFactory : ViewModelProvider.Factory {
+
+ override fun <T : ViewModel?> create(modelClass: Class<T>): T {
+ println("App.applicationContext() ${App.applicationContext()}")
+ return modelClass.getConstructor(
+ Context::class.java,
+ ).newInstance(App.applicationContext())
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package com.ic.temperature.utils
+
+import android.util.Log
+
+import com.ic.temperature.BuildConfig;
+
+object IcLog {
+ private val DOT = "."
+ private var isDebug: Boolean = BuildConfig.DEBUG
+ private var tagHead = ""
+
+ fun v(tag: String, msg: String?) {
+ if (isDebug) {
+ Log.v(mergeHeadTag(tag), msg)
+ }
+ }
+
+ fun d(tag: String, msg: String?) {
+ if (isDebug) {
+ Log.d(mergeHeadTag(tag), msg)
+ }
+ }
+
+ fun i(tag: String, msg: String?) {
+ if (isDebug) {
+ Log.i(mergeHeadTag(tag), msg)
+ }
+ }
+
+ fun w(tag: String, msg: String?) {
+ if (isDebug) {
+ Log.w(mergeHeadTag(tag), msg)
+ }
+ }
+
+ fun e(tag: String, msg: String?, e: Throwable?) {
+ if (isDebug) {
+ Log.e(mergeHeadTag(tag), msg, e)
+ }
+ }
+
+ fun setDebug(debug: Boolean) {
+ isDebug = debug
+ }
+
+ fun setLogHead(head: String) {
+ tagHead = head + DOT
+ }
+
+ private fun mergeHeadTag(tag: String): String? {
+ return tagHead + tag
+ }
+}
\ No newline at end of file
--- /dev/null
+package com.ic.temperature.utils
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.ServiceConnection
+
+object ServiceUtil {
+
+ fun startServiceUtil(context: Context, serviceAction: String?, packageName: String?) {
+ val intent = getExplicitIntent(context, Intent(serviceAction))
+ if (intent != null) {
+ intent.setPackage(packageName)
+ context.startService(intent)
+ }
+ }
+
+ fun bindServiceUtil(
+ context: Context,
+ action: String?,
+ connection: ServiceConnection?,
+ pck: String?
+ ) {
+ val targetIntent = getExplicitIntent(context, Intent(action))
+ if (targetIntent != null) {
+ targetIntent.setPackage(pck)
+ context.bindService(targetIntent, connection!!, Context.BIND_AUTO_CREATE)
+ }
+ }
+
+ fun unBindServiceUtil(context: Context, connection: ServiceConnection?) {
+ if (connection != null) {
+ context.unbindService(connection)
+ }
+ }
+
+ private fun getExplicitIntent(context: Context, impl: Intent): Intent? {
+ val resolveInfo = context.packageManager.queryIntentServices(impl, 0)
+ if (resolveInfo.size != 1) return null
+ val intent = Intent(impl)
+ val info = resolveInfo[0].serviceInfo ?: return null
+ intent.component = ComponentName(info.packageName, info.name)
+ return intent
+ }
+}
\ No newline at end of file
--- /dev/null
+package com.ic.temperature.utils
+
+import java.text.DecimalFormat
+
+object StringUtils {
+
+ private val sDf = DecimalFormat("#.0")
+
+ private const val MAX_TEM = 99.9
+
+ fun formatTem(temp: Double): String? {
+ var temp = temp
+ if (temp > MAX_TEM) {
+ temp = MAX_TEM
+ }
+ var format = sDf.format(temp)
+ if (".0" == format) {
+ format = "0.0"
+ }
+ return format
+ }
+}
\ No newline at end of file
--- /dev/null
+package com.ic.temperature.utils
+
+import java.io.FileInputStream
+
+object SystemUtils {
+ fun GetCidFromSystem(): String? {
+ val cid_file = getSystemProperties("ro.product.partitionpath") + "miscdata"
+ val resCid = ByteArray(16)
+ try {
+ val buf = ByteArray(50)
+ val inputStream = FileInputStream(cid_file)
+ val len = inputStream.read(buf)
+ if (len < 50) return null
+ for (i in 0..15) {
+ resCid[i] = buf[i + 28]
+ }
+ for (i in 0..15) {
+ if (resCid[i] >= 0x30 && resCid[i] <= 0x39 || resCid[i] >= 0x61 && resCid[i] <= 0x7A || resCid[i] >= 0x41 && resCid[i] <= 0x5A) {
+ // valid
+ } else {
+ // invalid
+ for (j in 28 until 28 + 16) {
+ resCid[j] = 0x30
+ }
+ break
+ }
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return String(resCid)
+ }
+
+ fun showOutTemp(): Boolean {
+ var show = true
+ show = !getSystemPropertiesBoolean("persyst.sys.disableTempOut", false)
+ return show
+ }
+
+ fun isL02(): Boolean {
+ val launcher = getLauncherName()
+ return launcher == "l02"
+ }
+
+ fun isDC001(): Boolean {
+ val launcher = getLauncherName()
+ return launcher == "dc001"
+ }
+
+ fun h88tinyMode(): Boolean {
+ val launcher = getLauncherName()
+ return launcher == "h88tiny"
+ }
+
+ fun isH88(): Boolean {
+ val launcher = getLauncherName()
+ return launcher == "h88"
+ }
+
+ fun isS123(): Boolean {
+ val launcher = getLauncherName()
+ return launcher == "s123"
+ }
+
+ fun isq3fyt(): Boolean {
+ val launcher = getLauncherName()
+ return launcher == "q3fyt"
+ }
+
+ fun getLauncherName(): String {
+ return getSystemPropertiesString("persist.sys.launcherName", "l02")
+ }
+
+ fun isYT(): Boolean {
+ val launcher = getLauncherName()
+ return launcher == "q3fyt"
+ }
+
+
+ fun getSystemPropertiesString(prop: String?, defaultvlaue: String): String {
+ var ret = defaultvlaue
+ val temp = getSystemProperties(prop)
+ if (temp.trim { it <= ' ' }.isNotEmpty()) {
+ ret = temp
+ }
+ return ret
+ }
+
+ fun getSystemPropertiesBoolean(prop: String?, defaultvlaue: Boolean): Boolean {
+ var ret = defaultvlaue
+ val temp = getSystemProperties(prop)
+ if (temp.trim { it <= ' ' }.isNotEmpty()) {
+ if (temp.trim { it <= ' ' } == "true") {
+ ret = true
+ } else if (temp.trim { it <= ' ' } == "false") {
+ ret = false
+ }
+ }
+ return ret
+ }
+
+ fun getSystemProperties(prop: String?): String {
+ var str = ""
+ var clazz: Class<*>? = null
+ try {
+ clazz = Class.forName("android.os.SystemProperties")
+ str = clazz.getMethod("get", *arrayOf<Class<*>>(String::class.java))
+ .invoke(clazz, *arrayOf<Any?>(prop)) as String
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return str
+ }
+
+ fun setSystemProperties(key: String?, defaultValue: String) {
+ try {
+ val c = Class.forName("android.os.SystemProperties")
+ val get = c.getMethod("set", String::class.java, String::class.java)
+ get.invoke(c, key, defaultValue)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+package com.ic.temperature.viewmodel
+
+import android.content.*
+import android.os.IBinder
+import android.os.RemoteException
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.ic.aidl.temp.ITempAidlInterface
+import com.ic.aidl.temp.ITempRemoteService
+import com.ic.temperature.R
+import com.ic.temperature.utils.*
+import com.ic.temperature.utils.Constants.ACTION_REMOTE_WORK_SERVICE
+import com.ic.temperature.utils.Constants.KEY_ANTI_EVENT
+import com.ic.temperature.utils.Constants.PACKAGE_REMOTE_WORK_SERVICE
+import com.ic.temperature.utils.Constants.STATE_ANTI_NONE
+import com.ic.temperature.utils.Constants.STATE_ANTI_OFF
+import com.ic.temperature.utils.Constants.STATE_ANTI_ON
+import kotlinx.coroutines.launch
+
+class TemperatureViewModel() : ViewModel() {
+
+
+ lateinit var mContext: Context
+
+ constructor(context: Context) : this() {
+ println("context == > $context")
+ this.mContext = context
+ //注册广播,监听佩戴状态的变化
+ registerBroadcast()
+ checkWristWear()
+ }
+
+
+ /**
+ * 是否支持腕温检测
+ */
+ private val isDisableWristTemp by lazy {
+ SystemUtils.getSystemPropertiesBoolean(
+ "persyst.sys.disableWristTemp",
+ false
+ )
+ }
+
+ /**
+ * 是否支持环境温度检测
+ */
+ private val isDisableEnvTemp by lazy {
+ SystemUtils.getSystemPropertiesBoolean(
+ "persyst.sys.disableTempOut",
+ true
+ )
+ }
+
+ /**
+ * true(off)表示没有佩戴,false表示已经佩戴了
+ */
+ private val isWristWear by lazy {
+ SystemUtils.getSystemPropertiesBoolean(
+ "persist.sys.ic_antioff",
+ false
+ );
+ }
+
+ /**
+ * 一进来就检查一下是否有佩戴,如果已经佩戴了,那么就绑定远程服务
+ * 如果没有戴表,那么就不绑定服务,接收到佩戴的广播以后再绑定。
+ */
+ private fun checkWristWear() {
+ if (!isWristWear && mService == null) {
+ bindWorkService(mContext)
+ } else {
+ //给出提示:未正确佩戴设备
+ mCheckTips.value = mContext.getString(R.string.no_wearing_device_tips_text)
+ }
+ }
+
+ private var mHasWear = false
+
+ companion object {
+ const val TAG = "TemperatureViewModel"
+ }
+
+ private val mIntentReceiver by lazy {
+ println("init receiver")
+ DialogDismissReceiver()
+ }
+
+ private val mAntiStateReceiver by lazy {
+ WristWearStateReceiver()
+ }
+ private val mRemoteConnection by lazy {
+ RemoteServiceConnection()
+ }
+
+ private val remoteDataCallback by lazy {
+ Callback4Remote()
+ }
+
+ private var mService: ITempRemoteService? = null
+
+ //关心的数据
+ val mBodyTemp = MutableLiveData<String>()
+ val mWristTemp = MutableLiveData<String>()
+ val mEnvTemp = MutableLiveData<String>()
+ val mCheckTips = MutableLiveData<String>()
+ val mShowLoading = MutableLiveData<Boolean>()
+ val mFinishActivity = MutableLiveData<Boolean>()
+ val mDisableWristTemp by lazy {
+ val mutableLiveData = MutableLiveData<Boolean>()
+ mutableLiveData.value = isDisableWristTemp
+ mutableLiveData
+ }
+ val mDisableEnvTemp by lazy {
+ val mutableLiveData = MutableLiveData<Boolean>()
+ mutableLiveData.value = isDisableEnvTemp
+ mutableLiveData
+ }
+
+ /**
+ * 注册广播接收者,主要是监听佩戴和一个Dialog的退出
+ * 这个Dialog的退出广播是祖传代码,具体case目前不明确
+ */
+ private fun registerBroadcast() {
+ val filter = IntentFilter()
+ filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
+ mContext.registerReceiver(mIntentReceiver, filter)
+ //注册监听是否有佩戴的广播
+ val antiStateFilter = IntentFilter()
+ antiStateFilter.addAction(Constants.ACTION_ANTI_OFF0)
+ mContext.registerReceiver(mAntiStateReceiver, antiStateFilter)
+ }
+
+ override fun onCleared() {
+ super.onCleared()
+ //取消广播注册
+ mContext.unregisterReceiver(mIntentReceiver)
+ mContext.unregisterReceiver(mAntiStateReceiver)
+ ServiceUtil.unBindServiceUtil(mContext, mRemoteConnection)
+ }
+
+ /**
+ * 绑定远程服务
+ *
+ * @param context
+ */
+ private fun bindWorkService(context: Context) {
+ IcLog.i(TAG, "bind remote service..")
+ ServiceUtil.bindServiceUtil(
+ context,
+ ACTION_REMOTE_WORK_SERVICE,
+ mRemoteConnection,
+ PACKAGE_REMOTE_WORK_SERVICE
+ )
+ }
+
+ /**
+ * 远程服务的回调
+ */
+ inner class RemoteServiceConnection : ServiceConnection {
+ override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
+ mService = ITempRemoteService.Stub.asInterface(service)
+ //把回调接口设置给对方
+ mService?.registerCallback(remoteDataCallback)
+ getRemoteData()
+ }
+
+ override fun onServiceDisconnected(name: ComponentName?) {
+ mService = null
+ }
+ }
+
+ private fun getRemoteData() {
+ //展示Loading,也 就是进度条那个
+ mShowLoading.postValue(true)
+ //设置UI正在检测中
+ mCheckTips.postValue(mContext.getString(R.string.activity_temp_tips_check))
+ IcLog.d(TAG, "getRemoteData...")
+ try {
+ viewModelScope.launch {
+ //调用开始查询温度
+ mService?.onStartQueryTemp()
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+
+ inner class WristWearStateReceiver : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ //如果来了佩戴的广播,判断到没有绑定远程服务的话,那么就绑定吧
+ val state = intent!!.getIntExtra(KEY_ANTI_EVENT, STATE_ANTI_NONE)
+ IcLog.i(TAG, "on AntiStateChange....$state")
+ if (state == STATE_ANTI_NONE) {
+ IcLog.i(TAG, "state error === > $state")
+ return
+ }
+
+ if (state == STATE_ANTI_OFF) {
+ mCheckTips.value = context!!.getString(R.string.no_wearing_device_tips_text)
+ //脱落了,给出提示
+ //停止Loading
+ mShowLoading.value = false
+ } else if (state == STATE_ANTI_ON && mService == null) {
+ bindWorkService(context!!)
+ }
+
+ mHasWear = state == STATE_ANTI_ON
+ if (mHasWear) {
+ //判断状态,如果已经检测完了,就显示检测完成
+ // 按客户需求,马上进来显示检测完成,看起来不爽
+ //那就再次检测吧,底层做了处理,多次调用测试也没关系,如果判断到繁忙的话会不处理的。
+ //heatBinding.setCheckTips(getString(R.string.activity_temp_tips_end));
+ getRemoteData()
+ }
+ }
+ }
+
+ inner class Callback4Remote : ITempAidlInterface.Stub() {
+ @Throws(RemoteException::class)
+ /**
+ * bodyOrWristTemp:体温或者腕温(当不支持腕温的时候,就是体温)
+ * maybeBodyTemp:可能是体温(如果支持腕温的时候)
+ * envTemp:环境温度
+ */
+ override fun updateCurrTempValue(
+ bodyOrWristTemp: Double,
+ maybeBodyTemp: Double,
+ envTemp: Double
+ ) {
+ IcLog.d(
+ TAG,
+ "updateCurrTempValue... "
+ + bodyOrWristTemp +
+ " maybeBodyTemp --> "
+ + maybeBodyTemp +
+ " envTemp + > "
+ + envTemp
+ )
+ updateUiData(bodyOrWristTemp, maybeBodyTemp, envTemp)
+ }
+
+ /**
+ * bodyOrWristTemp:体温或者腕温(当不支持腕温的时候,就是体温)
+ * maybeBodyTemp:可能是体温(如果支持腕温的时候)
+ * envTemp:环境温度
+ */
+ @Throws(RemoteException::class)
+ override fun updateResultTempValue(
+ bodyOrWristTemp: Double,
+ maybeBodyTemp: Double,
+ envTemp: Double
+ ) {
+ IcLog.d(
+ TAG,
+ "final ... "
+ + bodyOrWristTemp +
+ " maybeBodyTemp --> "
+ + maybeBodyTemp +
+ " envTemp + > "
+ + envTemp
+ )
+ //最后的结果
+ updateUiData(bodyOrWristTemp, maybeBodyTemp, envTemp)
+ //结束一些loading和文字提示
+ mShowLoading.postValue(false)
+ mCheckTips.postValue(mContext.getString(R.string.activity_temp_tips_end))
+ }
+ }
+
+ private fun updateUiData(
+ bodyOrWristTemp: Double,
+ maybeBodyTemp: Double,
+ envTemp: Double
+ ) {
+ mDisableWristTemp.value = isDisableWristTemp
+ //数据更新
+ if (isDisableWristTemp) {
+ mBodyTemp.value = StringUtils.formatTem(bodyOrWristTemp)
+ } else {
+ mBodyTemp.value = StringUtils.formatTem(maybeBodyTemp)
+ mWristTemp.value = StringUtils.formatTem(bodyOrWristTemp)
+ }
+ mEnvTemp.value = StringUtils.formatTem(envTemp)
+ }
+
+ inner class DialogDismissReceiver : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ if (intent != null &&
+ Intent.ACTION_CLOSE_SYSTEM_DIALOGS == intent.action
+ ) {
+ val reason = intent.getStringExtra("reason")
+ if ("homekey" == reason) {
+ // 按下HOME健
+ mFinishActivity.value = true
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportWidth="108"
+ android:viewportHeight="108">
+ <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:endX="85.84757"
+ android:endY="92.4963"
+ android:startX="42.9492"
+ android:startY="49.59793"
+ android:type="linear">
+ <item
+ android:color="#44000000"
+ android:offset="0.0" />
+ <item
+ android:color="#00000000"
+ android:offset="1.0" />
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:fillColor="#FFFFFF"
+ android:fillType="nonZero"
+ android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
+ android:strokeWidth="1"
+ android:strokeColor="#00000000" />
+</vector>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportWidth="108"
+ android:viewportHeight="108">
+ <path
+ android:fillColor="#3DDC84"
+ android:pathData="M0,0h108v108h-108z" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M9,0L9,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,0L19,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M29,0L29,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M39,0L39,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M49,0L49,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M59,0L59,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M69,0L69,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M79,0L79,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M89,0L89,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M99,0L99,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,9L108,9"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,19L108,19"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,29L108,29"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,39L108,39"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,49L108,49"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,59L108,59"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,69L108,69"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,79L108,79"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,89L108,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,99L108,99"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,29L89,29"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,39L89,39"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,49L89,49"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,59L89,59"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,69L89,69"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,79L89,79"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M29,19L29,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M39,19L39,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M49,19L49,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M59,19L59,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M69,19L69,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M79,19L79,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+</vector>
--- /dev/null
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="1025"
+ android:viewportHeight="1024">
+ <path
+ android:pathData="M378.88,503.81c62.46,0 121.34,-24.58 165.38,-69.12 44.03,-44.54 68.61,-103.94 68.61,-166.91s-24.58,-122.37 -68.61,-166.91C499.71,55.3 441.34,30.72 378.88,30.72c-62.46,0 -121.34,24.58 -165.38,69.12 -44.03,44.54 -68.61,103.94 -68.61,166.91S169.47,389.12 213.5,433.66c44.03,45.57 102.91,70.14 165.38,70.14zM630.78,561.15c-28.16,-25.09 -53.76,-38.4 -98.3,-38.4 -10.75,0 -20.99,5.12 -28.16,13.31l-124.93,153.6 -126.46,-153.6c-7.17,-8.19 -16.9,-13.31 -28.16,-13.31 -58.37,0 -113.15,23.04 -154.62,64.51 -41.47,41.47 -70.14,97.28 -70.14,156.16v214.53c0,16.9 11.26,30.21 26.62,34.82h621.57c-50.18,-54.27 -82.43,-135.68 -82.43,-226.3 0,-79.36 24.58,-151.55 65.02,-205.31zM960.51,658.43L960.51,241.15c0,-58.37 -39.42,-136.7 -129.02,-136.7 -96.77,0 -130.05,77.82 -130.05,136.7v417.28c-41.47,31.74 -64,83.46 -64,141.82 0,97.79 73.73,204.29 192.51,204.29 118.27,0 195.58,-107.01 195.58,-204.29 -1.02,-58.37 -23.55,-110.08 -65.02,-141.82zM831.49,942.59c-76.29,0 -138.75,-64 -138.75,-141.82 0,-53.25 31.74,-97.79 73.22,-122.37L765.95,239.1c0,-38.91 27.14,-71.17 65.02,-71.17 37.89,0 64,31.74 64,71.17v438.78c41.47,25.09 74.24,71.17 74.24,122.37 0.51,78.34 -61.44,142.34 -137.73,142.34zM865.79,699.39L865.79,282.11c0,-19.46 -15.36,-35.33 -34.82,-35.33 -18.94,0 -34.82,15.87 -34.82,35.33v417.28c-39.94,14.34 -69.12,53.25 -69.12,101.38 0,58.37 46.59,106.5 103.94,106.5 57.34,0 103.94,-48.13 103.94,-106.5 0.51,-46.59 -29.18,-85.5 -69.12,-101.38z"
+ android:fillColor="#FB8C00"/>
+</vector>
--- /dev/null
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="1024"
+ android:viewportHeight="1024">
+ <path
+ android:pathData="M537.59,230.65c-34.06,-24.39 -127.96,-25.59 -127.96,-25.59l102.37,-102.37c39.77,16.43 179.14,153.55 179.14,153.55l-102.37,76.78s-17.12,-77.98 -51.18,-102.37zM959.24,673.88c-47.11,53.85 -96.56,105.21 -140.45,161.64 -100.5,129.11 -234.42,186.49 -394.5,187.87 -61.16,0.54 -138.35,-0.03 -182.14,0 -43.79,0.05 -43.79,-9.32 -78.54,-44.35 82.41,0 161.13,5.5 239.67,7.91 179.71,5.5 326.24,-72.58 426.95,-222.11 32.91,-48.85 76.42,-89.14 115.47,-133.9 18.3,-20.93 16.81,-40.92 -5.81,-63.31 -7.19,-7.09 -13.44,-17.61 -15.07,-27.41 -19.27,-113.63 -84.04,-196.34 -169.39,-266.13 -79.13,-64.67 -157.59,-127.19 -230.63,-198.75 -36.7,-35.93 -83.2,-46.04 -128.29,-22.65 -46.07,23.88 -93.1,46.3 -135.53,76.39 -17.22,12.23 -39.33,32.25 -18.81,51.62 43.51,41.15 100.68,74.63 161.13,79.13 19.99,1.46 46.37,-6.01 60.75,-20.99 28.18,-29.35 45.17,-11 64.49,14.54 20.63,27.26 33.06,52.51 36.83,86.04 7.17,63.9 34.57,137.76 40.92,179.14 2.76,18.2 -6.17,25.54 -19.3,31.32 -24.13,6.42 -46.01,6.04 -70.07,7.24 -50.95,2.61 -98.22,19.88 -124.2,64.7 -9.85,17.07 -23.7,41.02 -43.74,41.02 -20.17,0 -127.5,-2.53 -197.21,18.66 -18.94,5.71 -37.26,13.51 -55.97,19.96 -15.53,5.35 -34.09,15.69 -42.82,-7.01 -7.47,-19.55 10.83,-25.82 24.8,-31.61 74.14,-30.66 150.35,-52.16 231.66,-41 27.36,3.74 43.07,-2.53 59.76,-26.33 38.98,-55.56 94.59,-85.37 164.43,-81.84 27.18,1.38 35.73,-3.58 25.52,-32.42 -16.25,-45.73 -24.64,-93.61 -31.79,-141.83 -8.11,-54.74 -24.11,-63.57 -74.63,-48.65 -77.85,22.98 -213.69,-37.36 -249.16,-110.07 -11.03,-22.57 -7.27,-41.59 11.08,-57.25A625.9,625.9 0,0 1,424.3 4.83c34.78,-11.62 70.15,-2.15 98.71,22.44 108.53,93.44 218.07,185.85 324.53,281.59 57.79,51.98 92.92,119.69 112.81,194.8 3.12,11.7 4.38,25.87 11.82,34.11 45.89,50.77 24.8,93.08 -12.92,136.1zM348.95,662.85h0.05,-0.05z"
+ android:fillColor="#00ACC1"/>
+</vector>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools">
+
+ <data>
+
+ <import type="android.view.View" />
+
+ <variable
+ name="bodyTemp"
+ type="String" />
+
+ <variable
+ name="wristTemp"
+ type="String" />
+
+ <variable
+ name="envTemp"
+ type="String" />
+
+ <variable
+ name="checkTips"
+ type="String" />
+
+ <variable
+ name="showLoading"
+ type="boolean" />
+
+ <variable
+ name="disableWristTemp"
+ type="boolean" />
+
+ <variable
+ name="disableEnvTemp"
+ type="boolean" />
+ </data>
+
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@mipmap/qs_background"
+ tools:context=".AnimalHeatActivity">
+
+ <androidx.constraintlayout.widget.Guideline
+ android:id="@+id/guideline"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_percent="0.25" />
+
+ <ImageView
+ android:id="@+id/imageView2"
+ android:layout_width="50dp"
+ android:layout_height="50dp"
+ android:layout_marginTop="10dp"
+ android:layout_marginEnd="20dp"
+ android:background="@android:color/transparent"
+ android:src="@drawable/ic_temp_human"
+ app:layout_constraintEnd_toStartOf="@+id/guideline7"
+ app:layout_constraintTop_toTopOf="parent" />
+
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:color/transparent"
+ android:text="@string/activity_temp_unit"
+ android:textColor="#FFFFFF"
+ android:textSize="38sp"
+ android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
+ app:layout_constraintBottom_toTopOf="@+id/guideline6"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="@+id/guideline8"
+ app:layout_constraintTop_toTopOf="@+id/guideline5" />
+
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:color/transparent"
+ android:text="@string/activity_temp_str"
+ android:textColor="#FFFFFF"
+ android:textSize="26sp"
+ app:layout_constraintBottom_toTopOf="@+id/guideline"
+ app:layout_constraintEnd_toStartOf="@+id/imageView2"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:color/transparent"
+ android:text="@string/activity_temp_wrist_str"
+ android:textColor="#FFFFFF"
+ android:textSize="26sp"
+ android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
+ app:layout_constraintBottom_toTopOf="@+id/guideline5"
+ app:layout_constraintEnd_toStartOf="@+id/imageView"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="@+id/guideline" />
+
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:color/transparent"
+ android:text="@string/activity_temp_unit"
+ android:textColor="#FFFFFF"
+ android:textSize="38sp"
+ android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
+ app:layout_constraintBottom_toTopOf="@+id/guideline5"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="@+id/guideline8"
+ app:layout_constraintTop_toTopOf="@+id/guideline" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:color/transparent"
+ android:text="@string/activity_temp_unit"
+ android:textColor="#FFFFFF"
+ android:textSize="38sp"
+ app:layout_constraintBottom_toTopOf="@+id/guideline"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="@+id/guideline8"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <androidx.constraintlayout.widget.Guideline
+ android:id="@+id/guideline5"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_percent="0.5" />
+
+ <ImageView
+ android:id="@+id/imageView"
+ android:layout_width="50dp"
+ android:layout_height="50dp"
+ android:layout_marginTop="10dp"
+ android:layout_marginEnd="20dp"
+ android:background="@android:color/transparent"
+ android:src="@drawable/ic_temp_wrist"
+ android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
+ app:layout_constraintEnd_toStartOf="@+id/guideline7"
+ app:layout_constraintTop_toTopOf="@+id/guideline" />
+
+ <ImageView
+ android:id="@+id/imageView3"
+ android:layout_width="50dp"
+ android:layout_height="50dp"
+ android:layout_marginEnd="20dp"
+ android:background="@android:color/transparent"
+ android:src="@mipmap/outtemp"
+ android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
+ app:layout_constraintBottom_toTopOf="@+id/guideline6"
+ app:layout_constraintEnd_toStartOf="@+id/guideline7"
+ app:layout_constraintTop_toTopOf="@+id/guideline5" />
+
+ <androidx.constraintlayout.widget.Guideline
+ android:id="@+id/guideline6"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_percent="0.75" />
+
+ <androidx.constraintlayout.widget.Guideline
+ android:id="@+id/guideline9"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_percent="0.90" />
+
+ <androidx.constraintlayout.widget.Guideline
+ android:id="@+id/guideline7"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ app:layout_constraintGuide_percent="0.49" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:color/transparent"
+ android:text="@{checkTips}"
+ android:textColor="#FFFFFF"
+ android:textSize="28sp"
+ app:layout_constraintBottom_toTopOf="@+id/guideline9"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="@+id/guideline6" />
+
+ <androidx.constraintlayout.widget.Guideline
+ android:id="@+id/guideline8"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ app:layout_constraintGuide_percent="0.8" />
+
+ <com.github.silvestrpredko.dotprogressbar.DotProgressBar
+ android:id="@+id/dot_progress_bar"
+ android:layout_width="match_parent"
+ android:layout_height="30dp"
+ android:background="@android:color/transparent"
+ android:visibility="@{showLoading ? View.VISIBLE : View.GONE}"
+ app:amount="5"
+ app:animationDirection="left"
+ app:duration="@android:integer/config_mediumAnimTime"
+ app:endColor="@color/teal_A200"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintTop_toTopOf="@+id/guideline9"
+ app:startColor="@color/lime_A400"
+ tools:layout_editor_absoluteX="4dp" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:color/transparent"
+ android:text="@string/activity_temp_outside"
+ android:textColor="#FFFFFF"
+ android:textSize="26sp"
+ android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
+ app:layout_constraintBottom_toTopOf="@+id/guideline6"
+ app:layout_constraintEnd_toStartOf="@+id/imageView3"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="@+id/guideline5" />
+
+
+ <TextView
+ android:id="@+id/textView2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:color/transparent"
+ android:text="@{envTemp}"
+ android:textColor="#FFFFFF"
+ android:textSize="50sp"
+ android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
+ app:layout_constraintBottom_toTopOf="@+id/guideline6"
+ app:layout_constraintEnd_toStartOf="@+id/guideline8"
+ app:layout_constraintTop_toTopOf="@+id/guideline5" />
+
+ <TextView
+ android:id="@+id/textView"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:color/transparent"
+ android:text="@{bodyTemp}"
+ android:textColor="#FFFFFF"
+ android:textSize="50sp"
+ android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
+ app:layout_constraintBottom_toTopOf="@+id/guideline"
+ app:layout_constraintEnd_toStartOf="@+id/guideline8"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:color/transparent"
+ android:text="@{wristTemp}"
+ android:textColor="#FFFFFF"
+ android:textSize="50sp"
+ android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
+ app:layout_constraintBottom_toTopOf="@+id/guideline5"
+ app:layout_constraintEnd_toStartOf="@+id/guideline8"
+ app:layout_constraintTop_toTopOf="@+id/guideline" />
+
+ </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_launcher_background" />
+ <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_launcher_background" />
+ <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <color name="colorPrimary">#008577</color>
+ <color name="colorPrimaryDark">#00574B</color>
+ <color name="colorAccent">#D81B60</color>
+
+ <color name="colorMainBg">#000000</color>
+
+</resources>
\ No newline at end of file
--- /dev/null
+<resources>
+ <string name="app_name">Temperature</string>
+ <string name="activity_temp_unit">℃</string>
+ <string name="activity_temp_wrist_str">腕温</string>
+ <string name="activity_temp_str">体温</string>
+ <string name="activity_temp_outside">环境</string>
+ <string name="no_wearing_device_tips_text">未配戴设备</string>
+ <string name="activity_temp_tips_check">正在测量</string>
+ <string name="activity_temp_tips_end">测量完成</string>
+</resources>
\ No newline at end of file
--- /dev/null
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!-- Base application theme. -->
+ <style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
+ <!-- Customize your theme here. -->
+ <item name="colorPrimary">@color/colorPrimary</item>
+ <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+ <item name="colorAccent">@color/colorAccent</item>
+ <item name="android:background">@color/colorMainBg</item>
+ </style>
+</resources>
\ No newline at end of file
--- /dev/null
+package com.ic.temperature
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
--- /dev/null
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+ ext.kotlin_version = "1.4.20"
+ repositories {
+ google()
+ jcenter()
+ }
+ dependencies {
+ classpath "com.android.tools.build:gradle:4.1.0"
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
\ No newline at end of file
--- /dev/null
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app"s APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Automatically convert third-party libraries to use AndroidX
+android.enableJetifier=true
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=official
\ No newline at end of file
--- /dev/null
+#Wed Dec 02 15:32:17 CST 2020
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
--- /dev/null
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
--- /dev/null
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
--- /dev/null
+include ':app'
+rootProject.name = "Temperature"
\ No newline at end of file