Pārlūkot izejas kodu

简化医生端的流程
修改pdf报告字段内容

lt 5 gadi atpakaļ
vecāks
revīzija
84f4185613
100 mainītis faili ar 18816 papildinājumiem un 0 dzēšanām
  1. 13 0
      .gitignore
  2. 116 0
      .idea/codeStyles/Project.xml
  3. 4 0
      .idea/encodings.xml
  4. 28 0
      .idea/gradle.xml
  5. 208 0
      .idea/inspectionProfiles/Project_Default.xml
  6. 50 0
      .idea/jarRepositories.xml
  7. 61 0
      .idea/misc.xml
  8. 12 0
      .idea/runConfigurations.xml
  9. 7 0
      .idea/vcs.xml
  10. 1 0
      .svn/entries
  11. 1 0
      .svn/format
  12. 228 0
      .svn/pristine/00/0017ed69fa2d2a156d20df139659ac3bb5bcb1d3.svn-base
  13. 96 0
      .svn/pristine/00/002ed9bdb419d4aed6b319d393b85f020348c34a.svn-base
  14. 20 0
      .svn/pristine/00/00a5fcc2283fac69300461add2af298c2eb22e0d.svn-base
  15. 235 0
      .svn/pristine/00/00b620da0951f26984c97e0a1c9514bf4a55a542.svn-base
  16. 84 0
      .svn/pristine/01/01b0c36ff93ca15cbfc382aea6dc3ad668b6762a.svn-base
  17. 5 0
      .svn/pristine/01/01b97b7741931efab1f0ad6bafda47a5ed49f4e5.svn-base
  18. 197 0
      .svn/pristine/01/01ba1f8cc216da3b4124ef65a561ed1b710177e7.svn-base
  19. 25 0
      .svn/pristine/01/01d47eaa4e2b038890f97bf13e2a4a53c3d26f2c.svn-base
  20. 66 0
      .svn/pristine/01/01d939b9b4654e3086ceec8557f2c2a6dcde3832.svn-base
  21. 108 0
      .svn/pristine/01/01e00863f63e9fd7f9f07894d16685b87eb996e1.svn-base
  22. 222 0
      .svn/pristine/02/020495f4e09309715c0e2c92ee5167274eb06f43.svn-base
  23. 436 0
      .svn/pristine/02/02081366d16221cc5d6b3275355a01c83c933369.svn-base
  24. 108 0
      .svn/pristine/02/0209b3fd44fcc28544485d1bba7c40065c421eab.svn-base
  25. 721 0
      .svn/pristine/02/0220e9ef121645686903690158e0dff1762db16b.svn-base
  26. BIN
      .svn/pristine/02/02365ac73f433a06612e7f6477a0e2c2f792969e.svn-base
  27. 428 0
      .svn/pristine/02/02378b75a6006753a2af8d5f2b6dd34122ea5ea0.svn-base
  28. 417 0
      .svn/pristine/02/024338a068b6200a00acb3cb6955746cb73bb93c.svn-base
  29. 70 0
      .svn/pristine/02/02d8ff118a3a1e6bdbb7589cf71022ba49681379.svn-base
  30. 114 0
      .svn/pristine/03/031aa9ae6a7446f66ecc3c71ff8944ab9ab384ef.svn-base
  31. 843 0
      .svn/pristine/03/032242a12b8fbccc003bf8194f38d90a60f3d641.svn-base
  32. BIN
      .svn/pristine/03/035cb40647d98611f6aead224433c19941f251c9.svn-base
  33. 159 0
      .svn/pristine/03/0381131f09500039b734ebe2ba53df11ecb23115.svn-base
  34. BIN
      .svn/pristine/03/03b8c389075406d89ab409ff11216c3c071b274f.svn-base
  35. 74 0
      .svn/pristine/03/03c09e37455d245a66889b2bfddc2927d590f22f.svn-base
  36. 8 0
      .svn/pristine/03/03da9b625a0bad106340201111467456d6f48288.svn-base
  37. 42 0
      .svn/pristine/03/03ff356b8d4d7439b608017fde89962e4864326f.svn-base
  38. 59 0
      .svn/pristine/04/04026e05e9b20501499628f23d39977f48ce03df.svn-base
  39. 58 0
      .svn/pristine/04/040bec66b83f6711f054eb3016ac99475ab930f3.svn-base
  40. 407 0
      .svn/pristine/04/040c8403e6f384f12f29c194cee8e3a22c14cd69.svn-base
  41. BIN
      .svn/pristine/04/044831a7ad49e805d8aff7cdf83c4dbc1ae65e2a.svn-base
  42. 25 0
      .svn/pristine/04/0454abd1638f991d9cb11e23cd9c95a09ddd9af0.svn-base
  43. 182 0
      .svn/pristine/04/047a116f85f66e714464c418423ed7caaf281fdf.svn-base
  44. 803 0
      .svn/pristine/04/04c9aa5cd042453fa2841c5f6c8a40a086350294.svn-base
  45. 20 0
      .svn/pristine/04/04cc9e8f808bfecad2a893139c10d53c393dbdb6.svn-base
  46. 10 0
      .svn/pristine/05/0506cf2adaa4a6bb9fa5c09b65e28804e0938a91.svn-base
  47. 192 0
      .svn/pristine/05/050a43b5720a15804addcf9525a0970a729e506a.svn-base
  48. 1 0
      .svn/pristine/05/051b18d658934ebfc19458bac034fed7363b1c7a.svn-base
  49. 354 0
      .svn/pristine/05/0556c9ddf1c67f4d48124f198bce12ff3a38a99c.svn-base
  50. BIN
      .svn/pristine/05/0558706e9b6777582154571addd15b8606681551.svn-base
  51. 184 0
      .svn/pristine/05/05619cad7fa07b055dd27f65a13aa1aeb2b2f504.svn-base
  52. 14 0
      .svn/pristine/05/058e690eb60107ce71a4d62234f7b2f9ea54e7d2.svn-base
  53. 728 0
      .svn/pristine/05/059c39e707511043533b0e043f174afb42e21bfd.svn-base
  54. 45 0
      .svn/pristine/05/05be5769e02309ac174a5fea2524dfaef6cb0ca2.svn-base
  55. 36 0
      .svn/pristine/06/0629c6ffc031c894953741a9dc2c4ef81ffb66c8.svn-base
  56. 529 0
      .svn/pristine/06/0634c67b4cb597d86b2d5374b570d7d8ea603efa.svn-base
  57. 94 0
      .svn/pristine/06/064e49165bf30f7b4b284495d4490b7dc76eb379.svn-base
  58. 37 0
      .svn/pristine/06/0676823e6ce781c31c82a542b3d61891cd80e911.svn-base
  59. 173 0
      .svn/pristine/06/069b380b5ebb4fecacccd1245692018ba9e428fe.svn-base
  60. 229 0
      .svn/pristine/06/06a2ea569573c658d5f41b9cdf10018c309e5cdd.svn-base
  61. 9 0
      .svn/pristine/06/06a7130de24f41b672206b854fe475416200cbe6.svn-base
  62. 598 0
      .svn/pristine/06/06f1cad05ca5866e1c861a35ef737e3ae417d30c.svn-base
  63. 450 0
      .svn/pristine/06/06fb3396a1c058a951952a631b193634e1038105.svn-base
  64. BIN
      .svn/pristine/06/06fda20f90e3b6885e36f02a0036368808a645d9.svn-base
  65. 429 0
      .svn/pristine/07/0721f8c9e41380f22377e5bd9a58023fed378d48.svn-base
  66. 66 0
      .svn/pristine/07/075fb993fd8d970ca15b4af9b5de8c38e9cb08db.svn-base
  67. 318 0
      .svn/pristine/08/08020a804970d96642bc9d9b1571cd6da62cdbad.svn-base
  68. 84 0
      .svn/pristine/08/08443de5427dd67950b34fa5aaf280d4de2980af.svn-base
  69. 201 0
      .svn/pristine/08/087ee1d97dcef534e7da4c8ba1624e2293e7405c.svn-base
  70. 537 0
      .svn/pristine/08/0887eb695056fb87e5b6c80423d4219b8e8423a5.svn-base
  71. 163 0
      .svn/pristine/08/08993dcf3996f7c412aca4a6578bb47bb17b7418.svn-base
  72. 136 0
      .svn/pristine/08/08ae8e569ab2236b6c9e7d54c5fae34248c9b76b.svn-base
  73. 162 0
      .svn/pristine/09/09535e226ff509fbfe2f59cba85e3b64a2a32800.svn-base
  74. 21 0
      .svn/pristine/09/09712df68144a94e71d42209d6c523ece7f3bb30.svn-base
  75. 88 0
      .svn/pristine/09/09b50d15af2cbbdaeb093afc52d9376fd35c7a13.svn-base
  76. 225 0
      .svn/pristine/09/09ce692a84bd6fdc00abccec2625a1787e33836e.svn-base
  77. 98 0
      .svn/pristine/0a/0a082b4e89625967817454b2a1d2f4b75e47229f.svn-base
  78. BIN
      .svn/pristine/0a/0a0901dfe3e836f8a08edf90cc91708007a796f1.svn-base
  79. BIN
      .svn/pristine/0a/0a09a2084e6659ac2a268d3815b7bafd389ae502.svn-base
  80. 46 0
      .svn/pristine/0a/0ad3d9e860fd4436a94d02a548fc50226497447a.svn-base
  81. 84 0
      .svn/pristine/0a/0adb0c48f7ec808f541b6c6aa97135deeff36f94.svn-base
  82. 170 0
      .svn/pristine/0b/0b054ed482dfb15497256bf5a154f6c3f59533cc.svn-base
  83. 550 0
      .svn/pristine/0b/0b0560ae98525a0aba3ff84c9db99a3fec6185ca.svn-base
  84. BIN
      .svn/pristine/0b/0b21f541d74b6dd042b53925ee810f10caa6d050.svn-base
  85. 56 0
      .svn/pristine/0b/0b6a88c2632aad13ff89099f4050bcef9007f4ec.svn-base
  86. 182 0
      .svn/pristine/0b/0b8d7204e04f34207c2830d32d7940b1d3695b82.svn-base
  87. 29 0
      .svn/pristine/0b/0bb329376ffde75260fdf6ae9ee0e1c4e4e1dc04.svn-base
  88. 691 0
      .svn/pristine/0b/0bc7a69134a19cfaf3940e30adc4c2a2a74ad248.svn-base
  89. BIN
      .svn/pristine/0b/0be6f188decf629212495c885b9cec3a02f00d24.svn-base
  90. 189 0
      .svn/pristine/0c/0c2e9b709bf359017b7e180c63a96ea3188560e6.svn-base
  91. 752 0
      .svn/pristine/0c/0c563405ca815678661f018560f1839ab601a594.svn-base
  92. 793 0
      .svn/pristine/0c/0c6580dbd717d50f7cb237dc8c38e38de169a456.svn-base
  93. 165 0
      .svn/pristine/0c/0c71d2e0f697db6194c79928d12a311afe92b601.svn-base
  94. 483 0
      .svn/pristine/0c/0c7d3663418fd2163e665fa2d671f442bfd9e076.svn-base
  95. 157 0
      .svn/pristine/0c/0c8b988227e36a6e337208a599453529058190d6.svn-base
  96. BIN
      .svn/pristine/0c/0ca9c51af111e99c9edf08df5f4e303453da32a7.svn-base
  97. 528 0
      .svn/pristine/0c/0ce4ee5eef23abd4b09ab05752d6e406aab5131b.svn-base
  98. 37 0
      .svn/pristine/0d/0d14fc1eefe0ce89e6f4b26dc8fa94b3a7bb46ac.svn-base
  99. 749 0
      .svn/pristine/0d/0d28a18363d469e65fab8e7ab68c43cd5f205b64.svn-base
  100. 183 0
      .svn/pristine/0d/0d7a50b3cb5d4b9adee61fc572a000198feb1e85.svn-base

+ 13 - 0
.gitignore

@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild

+ 116 - 0
.idea/codeStyles/Project.xml

@@ -0,0 +1,116 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <codeStyleSettings language="XML">
+      <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>
+  </code_scheme>
+</component>

+ 4 - 0
.idea/encodings.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding" addBOMForNewFiles="with NO BOM" />
+</project>

+ 28 - 0
.idea/gradle.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <compositeConfiguration>
+          <compositeBuild compositeDefinitionSource="SCRIPT" />
+        </compositeConfiguration>
+        <option name="delegatedBuild" value="false" />
+        <option name="distributionType" value="DEFAULT_WRAPPED" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/app" />
+            <option value="$PROJECT_DIR$/base" />
+            <option value="$PROJECT_DIR$/dialog" />
+            <option value="$PROJECT_DIR$/image" />
+            <option value="$PROJECT_DIR$/widget" />
+          </set>
+        </option>
+        <option name="resolveModulePerSourceSet" value="false" />
+        <option name="testRunner" value="PLATFORM" />
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>

+ 208 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -0,0 +1,208 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="ArrayCreationWithoutNewKeyword" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="ArraysAsListWithZeroOrOneArgument" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="AssertEqualsBetweenInconvertibleTypes" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="AssertionCanBeIf" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AtomicFieldUpdaterIssues" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="AtomicFieldUpdaterNotStaticFinal" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="BigDecimalMethodWithoutRoundingCalled" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="BooleanConstructor" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="BooleanMethodIsAlwaysInverted" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="BoxingBoxedValue" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="CatchMayIgnoreExceptionMerged" />
+    <inspection_tool class="CaughtExceptionImmediatelyRethrown" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ClassEscapesItsScope" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ClassInitializerMayBeStatic" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ClassMayBeInterface" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="CloneDeclaresCloneNotSupported" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ConfusingElse" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="reportWhenNoStatementFollow" value="true" />
+    </inspection_tool>
+    <inspection_tool class="ConstantStringIntern" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ContinueOrBreakFromFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ControlFlowStatementWithoutBraces" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="Convert2streamapi" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="DanglingJavadoc" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="DataProviderReturnType" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="Dependency" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="DeprecatedAPI" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="DeprecatedIsStillUsed" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="Deprecation" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="DialogTitleCapitalization" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="DiamondCanBeReplacedWithExplicitTypeArguments" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="DuplicateAlternationBranch" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="DuplicateSwitchCase" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="DuplicatedDataProviderNames" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="EmptyCatchBlock" enabled="false" level="WARNING" enabled_by_default="false">
+      <option name="m_includeComments" value="true" />
+      <option name="m_ignoreTestCases" value="true" />
+      <option name="m_ignoreIgnoreParameter" value="true" />
+    </inspection_tool>
+    <inspection_tool class="EmptyFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="EmptyTryBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="EndlessLoop" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="EqualityInConditionalOperator" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="EqualityOperatorComparesObjects" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="EqualsReplaceableByObjectsCall" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="ExcessiveLambdaUsage" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ExternalizableWithoutPublicNoArgConstructor" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="FinallyBlockCannotCompleteNormally" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="FormatSpecifiers" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="FunctionImplicitDeclarationInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="HidesUpperScope" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="HidingNonVirtualFunction" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="IfCanBeAssertion" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="ImplicitIntegerAndEnumConversion" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ImplicitPointerAndIntegerConversion" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="IncompatibleEnums" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="IncompatibleInitializers" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="IncompatibleMask" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="IncompatiblePointers" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="InstantiatingObjectToGetClassObject" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="InterfaceMethodClashesWithObject" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="JUnit4AnnotatedMethodInJUnit3TestCase" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="Java8ArraySetAll" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="JavaDoc" enabled="false" level="WARNING" enabled_by_default="false">
+      <option name="TOP_LEVEL_CLASS_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="INNER_CLASS_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="METHOD_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
+        </value>
+      </option>
+      <option name="FIELD_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="IGNORE_DEPRECATED" value="false" />
+      <option name="IGNORE_JAVADOC_PERIOD" value="true" />
+      <option name="IGNORE_DUPLICATED_THROWS" value="false" />
+      <option name="IGNORE_POINT_TO_ITSELF" value="false" />
+      <option name="myAdditionalJavadocTags" value="" />
+    </inspection_tool>
+    <inspection_tool class="JavacQuirks" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="JavadocHtmlLint" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="JavadocReference" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="KRUnspecifiedParameters" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="LambdaBodyCanBeCodeBlock" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="LambdaCanBeMethodCall" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="LambdaCanBeReplacedWithAnonymous" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="LambdaParameterTypeCanBeSpecified" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="LocalValueEscapesScope" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="LongLiteralsEndingWithLowercaseL" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="LossyEncoding" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ManualArrayCopy" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ManualArrayToCollectionCopy" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="MethodCanBeVariableArityMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="MethodNameSameAsClassName" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="MethodRefCanBeReplacedWithLambda" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="MissingOverrideAnnotation" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="ignoreObjectMethods" value="true" />
+      <option name="ignoreAnonymousClassMethods" value="false" />
+    </inspection_tool>
+    <inspection_tool class="MissingReturn" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="MissingSwitchCase" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="MultiCatchCanBeSplit" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="MultipleRepositoryUrls" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="NoExplicitFinalizeCalls" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="NotImplementedFunctions" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="NotInitializedVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="NotSuperclass" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="NumericOverflow" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="OCDFAInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="OCLoopDoesntUseConditionVariableInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="OCSimplifyInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="OCUnusedGlobalDeclarationInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="OCUnusedMacroInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="OCUnusedStructInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="OCUnusedTemplateParameterInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="OctalLiteral" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="OptionalUsedAsFieldOrParameterType" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="PointlessArithmeticExpression" enabled="false" level="WARNING" enabled_by_default="false">
+      <option name="m_ignoreExpressionsContainingConstants" value="true" />
+    </inspection_tool>
+    <inspection_tool class="PointlessBitwiseExpression" enabled="false" level="WARNING" enabled_by_default="false">
+      <option name="m_ignoreExpressionsContainingConstants" value="false" />
+    </inspection_tool>
+    <inspection_tool class="RawTypeCanBeGeneric" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="RedundantArrayCreation" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="RedundantCast" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="RedundantLambdaParameterType" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="RedundantStringFormatCall" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="RedundantTypeArguments" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="RepeatedSpace" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ReplaceInefficientStreamCount" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ResourceNotFoundInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ReturnFromFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ReturnSeparatedFromComputation" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="ShiftOutOfRange" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="SignednessMismatch" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="SimplifiableIfStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="SingleCharAlternation" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="SingleElementAnnotation" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="SingleStatementInBlock" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="StaticInitializerReferencesSubClass" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="StreamToLoop" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="StringBufferReplaceableByString" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="StringConcatenationInLoops" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="StringConcatenationInsideStringBufferAppend" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="StringConstructor" enabled="false" level="WARNING" enabled_by_default="false">
+      <option name="ignoreSubstringArguments" value="false" />
+    </inspection_tool>
+    <inspection_tool class="StringOperationCanBeSimplified" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="StringToString" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="SubstringZero" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="SynchronizationOnGetClass" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="SynchronizationOnLocalVariableOrMethodParameter" enabled="false" level="WARNING" enabled_by_default="false">
+      <option name="reportLocalVariables" value="true" />
+      <option name="reportMethodParameters" value="true" />
+    </inspection_tool>
+    <inspection_tool class="SynchronizeOnNonFinalField" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ThrowFromFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ThrowablePrintedToSystemOut" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="TryStatementWithMultipleResources" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="TypeParameterHidesVisibleType" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UNCHECKED_WARNING" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UNUSED_IMPORT" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UnnecessaryEmptyArrayUsage" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UnnecessaryInitCause" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UnnecessaryLocalVariable" enabled="false" level="WARNING" enabled_by_default="false">
+      <option name="m_ignoreImmediatelyReturnedVariables" value="false" />
+      <option name="m_ignoreAnnotatedVariables" value="false" />
+    </inspection_tool>
+    <inspection_tool class="UnnecessaryParentheses" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="ignoreClarifyingParentheses" value="false" />
+      <option name="ignoreParenthesesOnConditionals" value="false" />
+      <option name="ignoreParenthesesOnLambdaParameter" value="false" />
+    </inspection_tool>
+    <inspection_tool class="UnnecessaryTemporaryOnConversionFromString" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UnnecessaryTemporaryOnConversionToString" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UnreachableCode" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UnresolvedPropertyKey" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="UnusedExpressionResult" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UnusedImportStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UnusedLocalVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UnusedLocalization" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UnusedParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UnusedValue" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="UseBulkOperation" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="ValueMayNotFitIntoReceiver" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="VarargParameter" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="WrongPackageStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+  </profile>
+</component>

+ 50 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,50 @@
+<?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="maven4" />
+      <option name="name" value="maven4" />
+      <option name="url" value="http://maven.aliyun.com/nexus/content/repositories/gradle-plugin" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="MavenRepo" />
+      <option name="name" value="MavenRepo" />
+      <option name="url" value="https://repo.maven.apache.org/maven2/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven3" />
+      <option name="name" value="maven3" />
+      <option name="url" value="http://maven.aliyun.com/nexus/content/repositories/google" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven5" />
+      <option name="name" value="maven5" />
+      <option name="url" value="https://jitpack.io" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven" />
+      <option name="name" value="maven" />
+      <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven2" />
+      <option name="name" value="maven2" />
+      <option name="url" value="http://maven.aliyun.com/nexus/content/repositories/jcenter" />
+    </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>

+ 61 - 0
.idea/misc.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="NullableNotNullManager">
+    <option name="myDefaultNullable" value="org.jetbrains.annotations.Nullable" />
+    <option name="myDefaultNotNull" value="androidx.annotation.RecentlyNonNull" />
+    <option name="myNullables">
+      <value>
+        <list size="12">
+          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
+          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
+          <item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
+          <item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
+          <item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
+          <item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
+          <item index="6" class="java.lang.String" itemvalue="android.annotation.Nullable" />
+          <item index="7" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
+          <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
+          <item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
+          <item index="10" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
+          <item index="11" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
+        </list>
+      </value>
+    </option>
+    <option name="myNotNulls">
+      <value>
+        <list size="11">
+          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
+          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
+          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
+          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
+          <item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
+          <item index="5" class="java.lang.String" itemvalue="android.annotation.NonNull" />
+          <item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
+          <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
+          <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
+          <item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
+          <item index="10" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
+        </list>
+      </value>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" 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="SvnBranchConfigurationManager">
+    <option name="myConfigurationMap">
+      <map>
+        <entry key="$PROJECT_DIR$">
+          <value>
+            <SvnBranchConfiguration>
+              <option name="trunkUrl" value="https://192.168.1.99/svn/Android/eVVM/eVVM_Android" />
+            </SvnBranchConfiguration>
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
+</project>

+ 12 - 0
.idea/runConfigurations.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RunConfigurationProducerService">
+    <option name="ignoredProducers">
+      <set>
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
+      </set>
+    </option>
+  </component>
+</project>

+ 7 - 0
.idea/vcs.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="svn" />
+    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+  </component>
+</project>

+ 1 - 0
.svn/entries

@@ -0,0 +1 @@
+12

+ 1 - 0
.svn/format

@@ -0,0 +1 @@
+12

+ 228 - 0
.svn/pristine/00/0017ed69fa2d2a156d20df139659ac3bb5bcb1d3.svn-base

@@ -0,0 +1,228 @@
+package eVVM.apk.ui.vaccination;
+
+import android.app.Activity;
+import android.app.Service;
+import android.content.Intent;
+import android.os.Vibrator;
+import android.support.annotation.Nullable;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageView;
+
+import org.json.JSONArray;
+
+import java.util.regex.Pattern;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import cn.bingoogolapple.photopicker.activity.BGAPhotoPickerActivity;
+import cn.bingoogolapple.qrcode.core.QRCodeView;
+import cn.bingoogolapple.qrcode.zxing.ZXingView;
+import eVVM.apk.R;
+import eVVM.apk.common.MyActivity;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.helper.SoundPoolHelper;
+
+public class QrCodeActivity extends MyActivity implements QRCodeView.Delegate {
+
+
+    @BindView(R.id.zxingview)
+    ZXingView mZXingView;
+    private static final String TAG = QrCodeActivity.class.getSimpleName();
+    private static final int REQUEST_CODE_CHOOSE_QRCODE_FROM_GALLERY = 666;
+    @BindView(R.id.img_flashlight)
+    ImageView imgFlashlight;
+    private SoundPoolHelper soundPoolHelper;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_qr_code;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.tb_sao_title;
+    }
+
+    @Override
+    public void onRightClick(View v) {
+          /*
+                从相册选取二维码图片,这里为了方便演示,使用的是
+                https://github.com/bingoogolapple/BGAPhotoPicker-Android
+                这个库来从图库中选择二维码图片,这个库不是必须的,你也可以通过自己的方式从图库中选择图片
+                 */
+        Intent photoPickerIntent = new BGAPhotoPickerActivity.IntentBuilder(this)
+                .cameraFileDir(null)
+                .maxChooseCount(1)
+                .selectedPhotos(null)
+                .pauseOnScroll(false)
+                .build();
+        startActivityForResult(photoPickerIntent, REQUEST_CODE_CHOOSE_QRCODE_FROM_GALLERY);
+    }
+
+    @Override
+    protected void initView() {
+        mZXingView.setDelegate(this);
+
+     /*   soundPoolHelper = new SoundPoolHelper(2, SoundPoolHelper.TYPE_MUSIC)
+                .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC)
+                .loadDefault(QrCodeActivity.this)
+                .load(QrCodeActivity.this, "saomiaotishi", R.raw.saomiaotishi);*/
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+    private boolean flashlightIsOpen = false;
+
+    @OnClick({R.id.tv_addbyhand, R.id.tv_skip, R.id.img_flashlight})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.tv_addbyhand:
+                //toast("手动输入");
+                startActivity(InoculationRegistActivity.class);
+                break;
+            case R.id.tv_skip:
+                SPUtils.remove("INOCULATOR_LIST");
+                startActivityFinish(ReadingActivity.class);
+                break;
+            case R.id.img_flashlight:
+                if (flashlightIsOpen) {
+                    imgFlashlight.setImageResource(R.mipmap.flashlight_);
+                    mZXingView.closeFlashlight(); // 关闭闪光灯
+                    flashlightIsOpen = false;
+                } else {
+                    imgFlashlight.setImageResource(R.mipmap.flashlight);
+                    mZXingView.openFlashlight(); // 打开闪光灯
+                    flashlightIsOpen = true;
+                }
+                break;
+        }
+    }
+
+    @Override
+    public void onScanQRCodeSuccess(String result) {
+        try {
+            vibrate(); //震动
+            mZXingView.stopSpot(); // 停止识别
+//            result = Encrypt.decrypt(result);
+            if (result.split("▇").length == 6) {
+                //toast("请将手机相应位置靠近疫苗芯片位置");
+                //String str = (String) SPUtils.get("INOCULATOR_LIST", "");
+                JSONArray inoculatorArr = new JSONArray();
+                /*if (!str.equals("")) {
+                    inoculatorArr = new JSONArray(str);
+                }*/
+                inoculatorArr.put(result);
+                SPUtils.put("INOCULATOR_LIST", inoculatorArr.toString());
+                startActivityFinish(ReadingActivity.class);
+
+            } else {
+                toast("未能识别二维码");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            toast("未能识别二维码");
+        }
+
+    }
+
+    @Override
+    public void finish() {
+        mZXingView.closeFlashlight(); // 关闭闪光灯
+        super.finish();
+    }
+
+    public static boolean isInteger(String str) {
+        Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
+        return pattern.matcher(str).matches();
+    }
+
+    @Override
+    public void onCameraAmbientBrightnessChanged(boolean isDark) {
+        // 这里是通过修改提示文案来展示环境是否过暗的状态,接入方也可以根据 isDark 的值来实现其他交互效果
+        String tipText = mZXingView.getScanBoxView().getTipText();
+        String ambientBrightnessTip = "\n环境过暗,请打开闪光灯";
+        if (isDark) {
+            if (!tipText.contains(ambientBrightnessTip)) {
+                mZXingView.getScanBoxView().setTipText(tipText + ambientBrightnessTip);
+            }
+        } else {
+            if (tipText.contains(ambientBrightnessTip)) {
+                tipText = tipText.substring(0, tipText.indexOf(ambientBrightnessTip));
+                mZXingView.getScanBoxView().setTipText(tipText);
+            }
+        }
+    }
+
+    @Override
+    public void onScanQRCodeOpenCameraError() {
+        Log.e(TAG, "打开相机出错");
+    }
+
+    private void vibrate() {
+        Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
+        vib.vibrate(new long[]{100, 200}, -1);
+
+    }
+
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+
+        mZXingView.startSpotAndShowRect(); // 显示扫描框,并开始识别
+
+        if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_CHOOSE_QRCODE_FROM_GALLERY) {
+            final String picturePath = BGAPhotoPickerActivity.getSelectedPhotos(data).get(0);
+            // 本来就用到 QRCodeView 时可直接调 QRCodeView 的方法,走通用的回调
+            mZXingView.decodeQRCode(picturePath);
+            /*
+            没有用到 QRCodeView 时可以调用 QRCodeDecoder 的 syncDecodeQRCode 方法
+            这里为了偷懒,就没有处理匿名 AsyncTask 内部类导致 Activity 泄漏的问题
+            请开发在使用时自行处理匿名内部类导致Activity内存泄漏的问题,处理方式可参考 https://github
+            .com/GeniusVJR/LearningNotes/blob/master/Part1/Android/Android%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E6%80%BB%E7%BB%93.md
+             */
+//            new AsyncTask<Void, Void, String>() {
+//                @Override
+//                protected String doInBackground(Void... params) {
+//                    return QRCodeDecoder.syncDecodeQRCode(picturePath);
+//                }
+//
+//                @Override
+//                protected void onPostExecute(String result) {
+//                    if (TextUtils.isEmpty(result)) {
+//                        Toast.makeText(TestScanActivity.this, "未发现二维码", Toast.LENGTH_SHORT).show();
+//                    } else {
+//                        Toast.makeText(TestScanActivity.this, result, Toast.LENGTH_SHORT).show();
+//                    }
+//                }
+//            }.execute();
+        }
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        mZXingView.startCamera(); // 打开后置摄像头开始预览,但是并未开始识别
+//        mZXingView.startCamera(Camera.CameraInfo.CAMERA_FACING_FRONT); // 打开前置摄像头开始预览,但是并未开始识别
+        mZXingView.startSpotAndShowRect(); // 显示扫描框,并开始识别
+    }
+
+    @Override
+    protected void onStop() {
+        mZXingView.stopCamera(); // 关闭摄像头预览,并且隐藏扫描框
+        super.onStop();
+    }
+
+    @Override
+    protected void onDestroy() {
+        mZXingView.onDestroy(); // 销毁二维码扫描控件
+      //  soundPoolHelper.release();
+        super.onDestroy();
+    }
+
+
+}

+ 96 - 0
.svn/pristine/00/002ed9bdb419d4aed6b319d393b85f020348c34a.svn-base

@@ -0,0 +1,96 @@
+package eVVM.apk.api;
+
+import com.google.gson.JsonObject;
+
+import java.util.Date;
+import java.util.Map;
+import eVVM.apk.ui.bean.LoginBean;
+import eVVM.apk.ui.bean.UploadChipBean;
+import eVVM.apk.ui.bean.User;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+import eVVM.apk.ui.bean.VnListBean;
+import eVVM.apk.ui.bean.VnNameBean;
+import eVVM.apk.ui.toreview.bean.ToreviewBean;
+import io.reactivex.Observable;
+import retrofit2.http.Body;
+import retrofit2.http.Field;
+import retrofit2.http.FieldMap;
+import retrofit2.http.FormUrlEncoded;
+import retrofit2.http.GET;
+import retrofit2.http.POST;
+import retrofit2.http.QueryMap;
+
+/**
+ * Created by Android Studio.
+ * User:  zbb
+ * Date: 2019/6/1
+ * Describe: ApiService
+ */
+public interface ApiService {
+
+    /**
+     * get 请求,参数以map的形式传入
+     *
+     * @param map
+     * @return
+     */
+    @GET(ApiUrl.ARTICLE_LIST) //测试的  没有作用
+    Observable<ToreviewBean> getceshi(@QueryMap Map<String, String> map);
+
+
+    //登录
+    @POST(ApiUrl.ARTICLE_LIST+"login")
+    Observable<LoginBean> login(@QueryMap Map<String, String> map);
+
+    //注册
+    @POST(ApiUrl.ARTICLE_LIST+"register")
+    Observable<VerificationCodeBean> register(@QueryMap Map<String, String> map);
+
+    //获取验证码
+    @POST(ApiUrl.ARTICLE_LIST+"sendVerificationCodeByPhone")
+    Observable<VerificationCodeBean> getCode(@QueryMap Map<String, String> map);
+
+    //找回密码
+    @POST(ApiUrl.ARTICLE_LIST+"updatePasswordByTelephone")
+    Observable<VerificationCodeBean> findpwd(@QueryMap Map<String, String> map);
+
+    //修改个人信息(医生端)
+    @POST(ApiUrl.ARTICLE_USER+"doctorModifyByPhone")
+    Observable<VerificationCodeBean> informationdoc(@QueryMap Map<String, String> map, @Body User data);
+
+    //请求未复核信息
+    @POST(ApiUrl.ARTICLE_REVIEW+"doctorNotReview")
+    Observable<ToreviewBean> notreview(@QueryMap Map<String, String> map);
+
+    //请求复核信息
+    @POST(ApiUrl.ARTICLE_REVIEW+"doctorHasReview")
+    Observable<ToreviewBean> review(@QueryMap Map<String, String> map);
+
+    //接种者信息注册
+    @POST(ApiUrl.ARTICLE_INOCULATOR+"addInoculator")
+    Observable<VerificationCodeBean> addInoculator(@QueryMap Map<String, String> map);
+
+    //操作员录入
+    @FormUrlEncoded
+    @POST(ApiUrl.ARTICLE_CHIP+"saveChip")
+    Observable<UploadChipBean> saveChip(@FieldMap Map<String, Object> map);
+
+    //操作员录入
+    @FormUrlEncoded
+    @POST(ApiUrl.ARTICLE_CHIP+"uploadChip")
+    Observable<UploadChipBean> uploadChip(@FieldMap Map<String, Object> map);
+
+    //获取全部疫苗品类
+    @POST(ApiUrl.ARTICLE_VACCINECATEGORY+"listVaccineCategory")
+    Observable<VnNameBean> getVnName(@QueryMap Map<String, String> map);
+
+
+    //获取全部疫苗品类
+    @FormUrlEncoded
+    @POST(ApiUrl.ARTICLE_CHIP+"vaccineReport")
+    Observable<VnListBean> searchVnList(@Field("chipNumber") String chipNumber,
+                                        @Field("vaccineCategoryId") String vaccineCategoryId,
+                                        @Field("status") String status,
+                                        @Field("beginTime") Date beginTime,
+                                        @Field("endTime") Date endTime);
+}

+ 20 - 0
.svn/pristine/00/00a5fcc2283fac69300461add2af298c2eb22e0d.svn-base

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item
+        android:id="@+id/menu_home"
+        android:icon="@drawable/ic_selector_selectable_home_index"
+        android:title=""/>
+
+
+    <item
+        android:id="@+id/home_message"
+        android:icon="@drawable/ic_selector_selectable_home_message"
+        android:title=""
+        />
+
+    <item
+        android:id="@+id/home_me"
+        android:icon="@drawable/ic_selector_selectable_home_me"
+        android:title=""/>
+</menu>

+ 235 - 0
.svn/pristine/00/00b620da0951f26984c97e0a1c9514bf4a55a542.svn-base

@@ -0,0 +1,235 @@
+package eVVM.apk.ui.vaccination;
+
+import android.content.Intent;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.bean.VnDetailBean;
+import eVVM.apk.ui.report.vndetail.VnDetailContract;
+import eVVM.apk.ui.report.vndetail.VnDetailPresenter;
+import eVVM.apk.ui.webview.WebActivity;
+
+public class VnReportDetailForDoctorActivity extends MvpActivity<VnDetailPresenter> implements VnDetailContract.View {
+
+    private boolean isWarning = true;
+    private VnDetailBean.DataBean chipModel = null;
+
+    @BindView(R.id.vndetail_tv_vncode)
+    TextView vndetailTvVncode;
+    @BindView(R.id.vndetail_tv_vndate)
+    TextView vndetailTvVndate;
+    @BindView(R.id.vndetail_tv_factoryName)
+    TextView vndetailTvFactoryName;
+    @BindView(R.id.vndetail_tv_gmpName)
+    TextView vndetailTvGmpName;
+    @BindView(R.id.vndetail_tv_gmpPath)
+    TextView vndetailTvGmpPath;
+    @BindView(R.id.vndetail_tv_hospitalName)
+    TextView vndetailTvHospitalName;
+    @BindView(R.id.vndetail_tv_doctorName)
+    TextView vndetailTvDoctorName;
+    @BindView(R.id.vndetail_tv_doctorTelephone)
+    TextView vndetailTvDoctorTelephone;
+    @BindView(R.id.vndetail_tv_chatImage)
+    ImageView vndetailTvChatImage;
+    @BindView(R.id.vndetail_tv_othervn1)
+    TextView vndetailTvOthervn1;
+    @BindView(R.id.vndetail_tv_othervn2)
+    TextView vndetailTvOthervn2;
+    @BindView(R.id.vndetail_tv_othervn3)
+    TextView vndetailTvOthervn3;
+    @BindView(R.id.vndetail_iv_tipsimg)
+    ImageView vndetailIvTipsimg;
+    @BindView(R.id.vndetail_tv_tips)
+    TextView vndetailTvTips;
+    @BindView(R.id.vndetail_tv_disclaimer)
+    TextView vndetailTvDisclaimer;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_vn_report_detail_for_doctor;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.tb_vndetail_title;
+    }
+
+    @Override
+    protected void initView() {
+    }
+
+    @Override
+    protected void initData() {
+        Intent in = getIntent();
+        chipModel = (VnDetailBean.DataBean) in.getSerializableExtra("dataBean");
+        //给页面赋值
+        setViewData(chipModel);
+        isWarning = in.getBooleanExtra("isWarning",true);
+
+        if (isWarning){
+            vndetailTvChatImage.setImageResource(R.mipmap.report_warning_ico);
+        }else{
+            vndetailTvChatImage.setImageResource(R.mipmap.report_normal_ico);
+        }
+    }
+
+    private void setViewData(final VnDetailBean.DataBean dataBean) {
+
+        vndetailTvVncode.setText("evvm Code "+dataBean.getCode());
+        vndetailTvVndate.setText(""+dataBean.getBeginDate());
+        vndetailTvFactoryName.setText(""+dataBean.getFactoryName());
+        vndetailTvHospitalName.setText(""+dataBean.getHospitalName());
+        vndetailTvDoctorName.setText(""+dataBean.getDoctorName());
+        vndetailTvDoctorTelephone.setText(""+dataBean.getDoctorTelephone());
+        vndetailTvChatImage.setScaleType(ImageView.ScaleType.CENTER);
+
+
+        SpannableString spanGmpPath = new SpannableString(dataBean.getGmpName());
+        spanGmpPath.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getGmpPath() == null || TextUtils.isEmpty(dataBean.getGmpPath())){
+                    toast("暂时无法提供,需索取");
+                }else {
+                    Intent in = new Intent(VnReportDetailForDoctorActivity.this,WebActivity.class);
+                    in.putExtra("WebViewUrl",""+dataBean.getGmpPath()+"");
+                    startActivity(in);
+                }
+            }
+        }, 0, spanGmpPath.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvGmpName.setText(spanGmpPath);
+        vndetailTvGmpName.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn0 = new SpannableString("点击查看");
+        spanvndetailTvOthervn0.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getBatchCertificate() == null || TextUtils.isEmpty(dataBean.getBatchCertificate())){
+                    toast("暂时无法提供,需索取");
+                }else {
+                    Intent in = new Intent(VnReportDetailForDoctorActivity.this,WebActivity.class);
+                    in.putExtra("WebViewUrl",""+dataBean.getBatchCertificate()+"");
+                    startActivity(in);
+                }
+            }
+        }, 0, spanvndetailTvOthervn0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvGmpPath.setText(spanvndetailTvOthervn0);
+        vndetailTvGmpPath.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn1 = new SpannableString("点击查询");
+        spanvndetailTvOthervn1.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameBatchOtherColdChain() == null || TextUtils.isEmpty(dataBean.getSameBatchOtherColdChain())){
+                    toast("暂时无法提供,需索取");
+                }else {
+                    Intent in = new Intent(VnReportDetailForDoctorActivity.this,WebActivity.class);
+                    in.putExtra("WebViewUrl",""+dataBean.getSameBatchOtherColdChain()+"");
+                    startActivity(in);
+                }
+            }
+        }, 0, spanvndetailTvOthervn1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn1.setText(spanvndetailTvOthervn1);
+        vndetailTvOthervn1.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+
+        SpannableString spanvndetailTvOthervn2 = new SpannableString("点击查询");
+        spanvndetailTvOthervn2.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameBatchOtherFlow() == null || TextUtils.isEmpty(dataBean.getSameBatchOtherFlow())){
+                    toast("暂时无法提供,需索取");
+                }else {
+                    Intent in = new Intent(VnReportDetailForDoctorActivity.this,WebActivity.class);
+                    in.putExtra("WebViewUrl",""+dataBean.getSameBatchOtherFlow()+"");
+                    startActivity(in);
+                }
+            }
+        }, 0, spanvndetailTvOthervn2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn2.setText(spanvndetailTvOthervn2);
+        vndetailTvOthervn2.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn3 = new SpannableString("点击查询");
+        spanvndetailTvOthervn3.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameFactoryOtherVaccines() == null || TextUtils.isEmpty(dataBean.getSameFactoryOtherVaccines())){
+                    toast("暂时无法提供,需索取");
+                }else {
+                    Intent in = new Intent(VnReportDetailForDoctorActivity.this,WebActivity.class);
+                    in.putExtra("WebViewUrl",""+dataBean.getSameFactoryOtherVaccines()+"");
+                    startActivity(in);
+                }
+            }
+        }, 0, spanvndetailTvOthervn3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn3.setText(spanvndetailTvOthervn3);
+        vndetailTvOthervn3.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+    }
+
+    @OnClick({R.id.send_btn_report,R.id.next_btn_report})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.send_btn_report:
+                getPresenter().sendMailToInoculator(chipModel.getChipNumber());
+                break;
+            case R.id.next_btn_report:
+                finish();
+                break;
+        }
+    }
+
+    @Override
+    protected VnDetailPresenter createPresenter() {
+        return new VnDetailPresenter();
+    }
+
+    @Override
+    public void getSendMailSuccess(VnDetailBean data) {
+        finish();
+    }
+
+    @Override
+    public void getDetailError(String msg) {
+
+    }
+
+    @Override
+    public void getDetailSuccess(VnDetailBean data) {
+
+    }
+
+    @Override
+    public void getSendMailError(String msg) {
+        toast(msg);
+    }
+    public static void i(String tag, String msg) {  //信息太长,分段打印
+        //因为String的length是字符数量不是字节数量所以为了防止中文字符过多,
+        //  把4*1024的MAX字节打印长度改为2001字符数
+        int max_str_length = 2001 - tag.length();
+        //大于4000时
+        while (msg.length() > max_str_length) {
+            Log.i(tag, msg.substring(0, max_str_length));
+            msg = msg.substring(max_str_length);
+        }
+        //剩余部分
+        Log.i(tag, msg);
+
+    }
+}

+ 84 - 0
.svn/pristine/01/01b0c36ff93ca15cbfc382aea6dc3ad668b6762a.svn-base

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout 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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".ui.launcher.LikeActivity">
+
+
+    <com.hjq.bar.TitleBar
+        android:id="@+id/like_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="#5680FA"
+        app:lineSize="0dp"
+        app:backButton="false"
+        app:rightColor="@color/white"
+        app:rightTitle="跳过此页" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="145dp"
+        android:background="#5680FA"
+        android:layout_below="@id/like_title"
+        android:orientation="vertical"
+        android:paddingLeft="18dp">
+
+        <TextView
+            android:id="@+id/likes_tv_genju"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:text="@string/like_title_genju"
+            android:textColor="@color/white"
+            android:textSize="20sp" />
+
+        <TextView
+            android:id="@+id/likes_tv_tuijian"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:text="@string/like_title_tuijian"
+            android:textColor="@color/white"
+            android:textSize="20sp" />
+    </LinearLayout>
+
+    <eVVM.apk.widget.RoundRectLayout
+        android:id="@+id/likesbg"
+        android:layout_below="@id/like_title"
+        android:layout_width="331dp"
+        android:layout_height="314dp"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="100dp"
+        android:paddingTop="18.5dp"
+        android:background="@color/white">
+
+        <eVVM.apk.widget.LineBreakLayout
+            android:id="@+id/like_lineBreakLayout"
+            android:layout_margin="20dp"
+            app:leftAndRightSpace="20dp"
+            app:rowSpace="10dp"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+        </eVVM.apk.widget.LineBreakLayout>
+
+    </eVVM.apk.widget.RoundRectLayout>
+
+
+    <Button
+        android:id="@+id/like_btn_true"
+        android:layout_width="283dp"
+        android:layout_height="48dp"
+        android:layout_below="@id/likesbg"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="29dp"
+        android:background="@drawable/selector_button"
+        android:text="@string/dialog_confirm"
+        android:textColor="@color/white"
+        android:textSize="15.3sp" />
+
+
+</RelativeLayout>

+ 5 - 0
.svn/pristine/01/01b97b7741931efab1f0ad6bafda47a5ed49f4e5.svn-base

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
+    android:animation="@anim/item_animation_from_bottom"
+    android:animationOrder="normal"
+    android:delay="15%" />

+ 197 - 0
.svn/pristine/01/01ba1f8cc216da3b4124ef65a561ed1b710177e7.svn-base

@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout 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"
+    android:layout_width="match_parent"
+    android:layout_height="800dp"
+    android:orientation="vertical">
+
+    <com.hjq.bar.TitleBar
+        android:id="@+id/reading_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="#5680FA"
+        app:backButton="false"
+        app:leftColor="@color/white"
+        app:rightColor="@color/white"
+        app:rightTitle="退出"
+        app:title="eVVM信息读取"
+        app:titleColor="@color/white">
+
+    </com.hjq.bar.TitleBar>
+
+    <ImageView
+        android:id="@+id/reading_bg"
+        android:layout_width="wrap_content"
+        android:layout_height="322dp"
+        android:layout_below="@id/reading_title"
+        android:scaleType="center"
+        android:src="@mipmap/iv_reading" />
+
+
+    <ImageView
+        android:id="@+id/reading__round"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="93dp"
+        android:layout_marginTop="113dp"
+        android:src="@mipmap/iv_round" />
+
+    <ImageView
+        android:id="@+id/reading__line"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="93dp"
+        android:layout_marginTop="113dp"
+        android:src="@mipmap/iv_sao_args" />
+
+    <ProgressBar
+        android:id="@+id/reading_progress"
+        style="@android:style/Widget.ProgressBar.Horizontal"
+        android:layout_width="174dp"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/reading__round"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="35dp"
+        android:max="100"
+        android:maxHeight="4dp"
+        android:minHeight="4dp"
+        android:progress="20"
+        android:progressDrawable="@drawable/m_progress_horizontal"
+        android:secondaryProgress="20"
+        android:visibility="gone" />
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/reading_bg"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="42dp"
+        android:orientation="vertical">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="请将微电子标签贴近您手机"
+            android:textSize="16sp" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="5dp"
+            android:textSize="16sp"
+            android:text="背部的N F C天线标识位置" />
+    </LinearLayout>
+
+    <RelativeLayout
+        android:id="@+id/fly_phonerl"
+        android:visibility="gone"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/reading_progress"
+        android:layout_centerHorizontal="true">
+
+        <ImageView
+            android:id="@+id/reading_phone"
+            android:layout_width="232dp"
+            android:layout_height="400dp"
+            android:layout_marginTop="30dp"
+            android:scaleType="fitCenter"
+            android:src="@mipmap/iv_reading_phone" />
+
+        <TableLayout
+            android:layout_width="222dp"
+            android:layout_height="wrap_content"
+            android:layout_alignLeft="@+id/reading_phone"
+            android:layout_alignTop="@+id/reading_phone"
+            android:layout_alignRight="@+id/reading_phone"
+            android:paddingLeft="8dp"
+            android:paddingTop="8dp"
+            android:paddingRight="8dp">
+
+            <TableRow>
+
+                <ImageView
+                    android:id="@+id/reading_antenna1"
+                    android:layout_width="70dp"
+                    android:layout_height="70dp"
+                    android:src="@mipmap/iv_deng"
+                    android:text="one"
+                    android:visibility="invisible" />
+
+                <ImageView
+                    android:id="@+id/reading_antenna2"
+                    android:layout_width="70dp"
+                    android:layout_height="70dp"
+                    android:src="@mipmap/iv_deng"
+                    android:text="two"
+                    android:visibility="invisible" />
+
+                <ImageView
+                    android:id="@+id/reading_antenna3"
+                    android:layout_width="70dp"
+                    android:layout_height="70dp"
+                    android:src="@mipmap/iv_deng"
+                    android:text="three"
+                    android:visibility="invisible" />
+
+            </TableRow>
+
+            <TableRow>
+
+                <ImageView
+                    android:id="@+id/reading_antenna4"
+                    android:layout_width="70dp"
+                    android:layout_height="70dp"
+                    android:src="@mipmap/iv_deng"
+                    android:text="one"
+                    android:visibility="invisible" />
+
+                <ImageView
+                    android:id="@+id/reading_antenna5"
+                    android:layout_width="70dp"
+                    android:layout_height="70dp"
+                    android:src="@mipmap/iv_deng"
+                    android:text="two"
+                    android:visibility="invisible" />
+
+                <ImageView
+                    android:id="@+id/reading_antenna6"
+                    android:layout_width="70dp"
+                    android:layout_height="70dp"
+                    android:src="@mipmap/iv_deng"
+                    android:text="three"
+                    android:visibility="invisible" />
+
+            </TableRow>
+
+            <TableRow>
+
+                <ImageView
+                    android:id="@+id/reading_antenna7"
+                    android:layout_width="70dp"
+                    android:layout_height="70dp"
+                    android:src="@mipmap/iv_deng"
+                    android:text="one"
+                    android:visibility="invisible" />
+
+                <ImageView
+                    android:id="@+id/reading_antenna8"
+                    android:layout_width="70dp"
+                    android:layout_height="70dp"
+                    android:src="@mipmap/iv_deng"
+                    android:text="two"
+                    android:visibility="invisible" />
+
+                <ImageView
+                    android:id="@+id/reading_antenna9"
+                    android:layout_width="70dp"
+                    android:layout_height="70dp"
+                    android:src="@mipmap/iv_deng"
+                    android:text="three"
+                    android:visibility="invisible" />
+
+            </TableRow>
+        </TableLayout>
+    </RelativeLayout>
+</RelativeLayout>

+ 25 - 0
.svn/pristine/01/01d47eaa4e2b038890f97bf13e2a4a53c3d26f2c.svn-base

@@ -0,0 +1,25 @@
+-- Merging decision tree log ---
+manifest
+ADDED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml:1:1-36
+INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml:1:1-36
+INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml:1:1-36
+	package
+		ADDED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml:1:11-33
+		INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml
+		INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml
+	xmlns:android
+		ADDED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml:1:1-36
+uses-sdk
+INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml
+INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml
+INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml
+INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml
+	android:targetSdkVersion
+		INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml
+		ADDED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml
+		INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml
+	android:minSdkVersion
+		INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml
+		ADDED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml
+		INJECTED from D:\studiowork\evvm\eVVM_Android\image\src\main\AndroidManifest.xml

+ 66 - 0
.svn/pristine/01/01d939b9b4654e3086ceec8557f2c2a6dcde3832.svn-base

@@ -0,0 +1,66 @@
+package eVVM.apk.widget;
+
+import android.content.Context;
+import android.support.design.widget.CollapsingToolbarLayout;
+import android.util.AttributeSet;
+
+/**
+ *    desc   : 支持监听渐变的CollapsingToolbarLayout
+ */
+public final class XCollapsingToolbarLayout extends CollapsingToolbarLayout {
+
+    private OnScrimsListener mListener; // 渐变监听
+    private boolean isScrimsShown;  // 当前渐变状态
+
+    public XCollapsingToolbarLayout(Context context) {
+        super(context);
+    }
+
+    public XCollapsingToolbarLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public XCollapsingToolbarLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    @Override
+    public void setScrimsShown(boolean shown, boolean animate) {
+        super.setScrimsShown(shown, true);
+        // 判断渐变状态是否改变了
+        if (isScrimsShown != shown) {
+            // 如果是就记录并且回调监听器
+            isScrimsShown = shown;
+            if (mListener != null) {
+                mListener.onScrimsStateChange(isScrimsShown);
+            }
+        }
+    }
+
+    /**
+     * 获取当前的渐变状态
+     */
+    public boolean isScrimsShown() {
+        return isScrimsShown;
+    }
+
+    /**
+     * 设置CollapsingToolbarLayout渐变监听
+     */
+    public void setOnScrimsListener(OnScrimsListener l) {
+        mListener = l;
+    }
+
+    /**
+     * CollapsingToolbarLayout渐变监听器
+     */
+    public interface OnScrimsListener {
+
+        /**
+         * 渐变状态变化
+         *
+         * @param shown         渐变开关
+         */
+        void onScrimsStateChange(boolean shown);
+    }
+}

+ 108 - 0
.svn/pristine/01/01e00863f63e9fd7f9f07894d16685b87eb996e1.svn-base

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout 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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".ui.first.ReadingActivity">
+
+
+    <com.hjq.bar.TitleBar
+
+        android:id="@+id/reading_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="#5680FA"
+        app:leftIcon="@drawable/back_white_logo"
+        app:leftColor="@color/white"
+        app:titleColor="@color/white"
+        app:title="eVVM信息读取"  >
+
+    </com.hjq.bar.TitleBar>
+    <TextView
+        android:id="@+id/again_bt"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:text="再次扫描"
+        android:paddingLeft="20dp"
+        android:gravity="bottom"
+        android:paddingRight="20dp"
+        android:paddingBottom="18dp"
+        android:layout_alignBottom="@+id/reading_title"
+        android:layout_alignTop="@+id/reading_title"
+        android:textColor="@color/white"
+        android:textSize="15sp"
+        android:background="@color/transparent"/>
+
+
+    <ImageView
+        android:id="@+id/reading_bg"
+        android:layout_below="@id/reading_title"
+        android:src="@mipmap/iv_reading"
+        android:scaleType="center"
+        android:layout_width="wrap_content"
+        android:layout_height="322dp" />
+
+    <ImageView
+        android:id="@+id/reading__round"
+        android:layout_marginLeft="93dp"
+        android:layout_marginTop="113dp"
+        android:src="@mipmap/iv_round"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+    <ImageView
+        android:id="@+id/reading__line"
+        android:layout_marginLeft="93dp"
+        android:layout_marginTop="113dp"
+        android:src="@mipmap/iv_sao_args"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <ProgressBar
+        android:id="@+id/reading_progress"
+        android:layout_below="@id/reading_title"
+        android:layout_marginTop="235dp"
+        android:layout_centerHorizontal="true"
+        style="@android:style/Widget.ProgressBar.Horizontal"
+        android:layout_width="174dp"
+        android:layout_height="wrap_content"
+        android:max="100"
+        android:maxHeight="4dp"
+        android:minHeight="4dp"
+        android:progress="20"
+        android:progressDrawable="@drawable/m_progress_horizontal"
+        android:secondaryProgress="20" />
+
+    <LinearLayout
+        android:layout_below="@id/reading_bg"
+        android:layout_marginTop="13.4dp"
+        android:layout_marginLeft="52dp"
+        android:orientation="horizontal"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+        <TextView
+            android:ems="1"
+            android:textSize="13.4sp"
+            android:layout_marginRight="7dp"
+            android:text="请将微电子标签贴近您手机"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+        <TextView
+            android:ems="1"
+            android:text="背部的N F C天线标识位置"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+    </LinearLayout>
+
+    <ImageView
+        android:layout_marginBottom="2dp"
+        android:layout_alignParentBottom="true"
+        android:src="@mipmap/iv_reading_phone"
+        android:scaleType="center"
+        android:layout_marginLeft="125.8dp"
+        android:layout_width="wrap_content"
+        android:layout_height="322dp" />
+
+</RelativeLayout>

+ 222 - 0
.svn/pristine/02/020495f4e09309715c0e2c92ee5167274eb06f43.svn-base

@@ -0,0 +1,222 @@
+package eVVM.apk.ui.login;
+
+import android.text.TextUtils;
+import android.view.View;
+
+import com.hjq.widget.SettingBar;
+
+import org.greenrobot.eventbus.EventBus;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.basepicker.DataPickerDialog;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.bean.CityBean;
+import eVVM.apk.ui.bean.CompanyBean;
+import eVVM.apk.ui.event.CompanyEvent;
+import eVVM.apk.ui.login.city.CityContract;
+import eVVM.apk.ui.login.city.CityPresenter;
+
+public class CompanyChooseActivity extends MvpActivity<CityPresenter> implements CityContract.View {
+
+    @BindView(R.id.company_sheng)
+    SettingBar companySheng;
+    @BindView(R.id.company_shi)
+    SettingBar companyShi;
+    @BindView(R.id.company_xian)
+    SettingBar companyXian;
+    @BindView(R.id.company_cname)
+    SettingBar companyCname;
+
+    private int areaType = 0;
+    private int shengParentId = 0;
+    private int shiParentId = 0;
+    private int xianParentId = 0;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_company_choose;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.tb_cpmpany_title;
+    }
+
+    @Override
+    protected void initView() {
+
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+
+    @OnClick({R.id.company_sheng, R.id.company_shi, R.id.company_xian, R.id.company_cname})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.company_sheng:
+
+                areaType = 1;
+                getCityDiago(1);
+                //getCityDiago2();
+                break;
+            case R.id.company_shi:
+                areaType = 2;
+                getCityDiago(2);
+                break;
+            case R.id.company_xian:
+                areaType = 3;
+                getCityDiago(3);
+                break;
+            case R.id.company_cname:
+                if (TextUtils.isEmpty(companySheng.getLeftText()) || TextUtils.isEmpty(companyShi.getLeftText()) || TextUtils.isEmpty(companyXian.getLeftText())) {
+                    toast("请先选择地区");
+                } else {
+                    //toast("danwei");
+                    if (xianParentId == 0) {
+                        toast("程序逻辑有误");
+                    }
+                    getPresenter().getCompany(xianParentId);
+                }
+                break;
+        }
+    }
+
+
+    private void getCityDiago(int type) {
+
+        switch (type) {
+            case 1:
+                getPresenter().getCity(0);
+                break;
+            case 2:
+                if (TextUtils.isEmpty(companySheng.getLeftText().toString())) {
+                    toast("请先选择省份");
+                    return;
+                }
+
+                // Log.e("CityparentId", "" + parentId);
+                getPresenter().getCity(shengParentId);
+                break;
+            case 3:
+                if (TextUtils.isEmpty(companySheng.getLeftText().toString())) {
+                    toast("请先选择省份");
+                    return;
+                }
+                if (TextUtils.isEmpty(companyShi.getLeftText().toString())) {
+                    toast("请先选择城市");
+                    return;
+                }
+
+                getPresenter().getCity(shiParentId);
+                break;
+        }
+    }
+
+    private void setCityText(String province, String city, String area) {
+        companySheng.setLeftText(province);
+        companyShi.setLeftText(city);
+        companyXian.setLeftText(area);
+    }
+
+    @Override
+    protected CityPresenter createPresenter() {
+        return new CityPresenter();
+    }
+
+    @Override
+    public void getCityError(String msg) {
+
+        toast(msg);
+    }
+
+    @Override
+    public void getCitySuccess(CityBean data) {
+
+        final List<CityBean.DataBean> shengList = data.getData();
+        List<String> namelist = new ArrayList<>();
+        for (int i = 0; i < shengList.size(); i++) {
+            namelist.add(shengList.get(i).getAreaName());
+        }
+        DataPickerDialog.Builder builder = new DataPickerDialog.Builder(this);
+
+        DataPickerDialog dialog = builder.setData(namelist).setSelection(0).setTitle("区域选择")
+                .setOnDataSelectedListener(new DataPickerDialog.OnDataSelectedListener() {
+                    @Override
+                    public void onDataSelected(String itemValue) {
+                        //toast(itemValue);
+
+                        if (areaType == 1) {
+                            companySheng.setLeftText(itemValue);
+                            companyShi.setLeftText("");
+                            companyXian.setLeftText("");
+                        } else if (areaType == 2) {
+                            companyShi.setLeftText(itemValue);
+                            companyXian.setLeftText("");
+                        } else if (areaType == 3) {
+                            companyXian.setLeftText(itemValue);
+                        }
+
+                        for (int i = 0; i < shengList.size(); i++) {
+                            if (shengList.get(i).getAreaName().equals(itemValue)) {
+                                //parentId = shengList.get(i).getId();
+                                int parentId = shengList.get(i).getId();
+                                if (areaType == 1) {
+                                    shengParentId = parentId;
+                                } else if (areaType == 2) {
+                                    shiParentId = parentId;
+                                } else if (areaType == 3) {
+                                    xianParentId = parentId;
+                                }
+                            }
+                        }
+                    }
+                }).create();
+
+        dialog.show();
+    }
+
+    @Override
+    public void getCompanyError(String msg) {
+        toast(msg);
+    }
+
+    @Override
+    public void getCompanySuccess(CompanyBean data) {
+
+        final List<CompanyBean.DataBean> shengList = data.getData();
+        if (shengList.size() == 0) {
+            toast("该地区暂无单位");
+            return;
+        }
+        List<String> namelist = new ArrayList<>();
+        for (int i = 0; i < shengList.size(); i++) {
+            namelist.add(shengList.get(i).getName());
+        }
+        DataPickerDialog.Builder builder = new DataPickerDialog.Builder(this);
+
+        DataPickerDialog dialog = builder.setData(namelist).setSelection(0).setTitle("单位选择")
+                .setOnDataSelectedListener(new DataPickerDialog.OnDataSelectedListener() {
+                    @Override
+                    public void onDataSelected(String itemValue) {
+                        companyCname.setLeftText(itemValue);
+
+                        for (int i = 0; i < shengList.size(); i++) {
+                            if (shengList.get(i).getName().equals(itemValue)) {
+                                EventBus.getDefault().post(new CompanyEvent(itemValue, shengList.get(i).getType()));
+                            }
+                        }
+                        finish();
+                    }
+                }).create();
+
+        dialog.show();
+    }
+}

+ 436 - 0
.svn/pristine/02/02081366d16221cc5d6b3275355a01c83c933369.svn-base

@@ -0,0 +1,436 @@
+package eVVM.apk.ui.report;
+
+import android.app.Dialog;
+import android.content.Intent;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.ajguan.library.EasyRefreshLayout;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.hjq.bar.TitleBar;
+import com.hjq.dialog.DateDialog;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.helper.basepicker.DataPickerDialog;
+import eVVM.apk.mvp.MvpLazyFragment;
+import eVVM.apk.ui.adapter.VnListAdapter;
+import eVVM.apk.ui.bean.VnListBean;
+import eVVM.apk.ui.bean.VnNameBean;
+import eVVM.apk.ui.report.vndetail.VnReportDetailActivity;
+
+/**
+ * Created by Android Studio.
+ * User:  zbb
+ * Date: 2019/6/5
+ * Describe: ReportvnFragment
+ */
+public class ReportvnFragment extends MvpLazyFragment<ReportVnPresenter> implements ReportVnContract.View {
+
+    @BindView(R.id.tv_report_search)
+    EditText tvReportSearch;
+    @BindView(R.id.tv_report_gosearch)
+    TextView tvReportGosearch;
+    @BindView(R.id.tb_test_a_bar)
+    TitleBar tbTestABar;
+    @BindView(R.id.tv_vn_name)
+    TextView tvVnName;
+    @BindView(R.id.tv_vn_status)
+    TextView tvVnStatus;
+    @BindView(R.id.tv_vn_begintime)
+    TextView tvVnBegintime;
+    @BindView(R.id.tv_vn_endtime)
+    TextView tvVnEndtime;
+    @BindView(R.id.rl_reportvn)
+    RecyclerView rlReportvn;
+    @BindView(R.id.report_easylayout)
+    EasyRefreshLayout reportEasylayout;
+    private List<VnListBean.DataBean> vnDataList = new ArrayList<>();
+    private int page = 1;
+    private int size = 10;
+    private VnListAdapter vnListAdapter;
+    private int nameIdByName;
+    private int statusByString;
+    private String chipNumber;
+    private String vaccineCategoryId;
+    private String status;
+    private String beginTime;
+    private String endTime;
+    private String user_factory_id;
+
+    public static ReportvnFragment newInstance() {
+        return new ReportvnFragment();
+    }
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.report_fragment;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return 0;
+    }
+
+    @Override
+    protected void initView() {
+
+        user_factory_id = (String) SPUtils.get("USER_FACTORY_ID", "");
+
+        vnListAdapter = new VnListAdapter(R.layout.vnlistitem, vnDataList);
+        rlReportvn.setAdapter(vnListAdapter);
+        rlReportvn.setLayoutManager(new LinearLayoutManager(getBindingActivity()));
+
+        vnListAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
+            @Override
+            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
+                Intent in = new Intent(getBindingActivity(), VnReportDetailActivity.class);
+                in.putExtra("VnchipNumber", "" + vnDataList.get(position).getChipNumber());
+                startActivity(in);
+            }
+        });
+
+        reportEasylayout.addEasyEvent(new EasyRefreshLayout.EasyEvent() {
+            @Override
+            public void onLoadMore() {
+                page += 1;
+                search(page, size);
+            }
+
+            @Override
+            public void onRefreshing() {
+                page = 1;
+                search(page, size);
+            }
+        });
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+    private void search(int page, int size) {
+        getPresenter().searchVnList(chipNumber, vaccineCategoryId, user_factory_id, status, beginTime, endTime, page, size);
+    }
+
+    @OnClick({R.id.tv_report_gosearch, R.id.tv_vn_name, R.id.tv_vn_status, R.id.tv_vn_begintime, R.id.tv_vn_endtime})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.tv_report_gosearch:
+                //搜索
+//                if (TextUtils.isEmpty(tvReportSearch.getText().toString())||TextUtils.isEmpty(tvVnName.getText().toString())||TextUtils.isEmpty(tvVnStatus.getText().toString())
+//                        ||TextUtils.isEmpty(tvVnBegintime.getText().toString())||TextUtils.isEmpty(tvVnEndtime.getText().toString())){
+//                    toast("请选择搜索内容");
+//                }else {
+//
+//                }
+                showLoading();
+                page = 1;
+                nameIdByName = getNameIdByName(tvVnName.getText().toString());
+                statusByString = getStatusByString(tvVnStatus.getText().toString());
+                chipNumber = tvReportSearch.getText().toString().equals("") ? null : tvReportSearch.getText().toString();
+                vaccineCategoryId = nameIdByName == -1 ? null : String.valueOf(nameIdByName);
+                status = statusByString == -1 ? null : String.valueOf(statusByString);
+                beginTime = tvVnBegintime.getText().toString().equals("") ? null : tvVnBegintime.getText().toString();
+                endTime = tvVnEndtime.getText().toString().equals("") ? null : tvVnEndtime.getText().toString();
+
+                search(page, size);
+
+                break;
+            case R.id.tv_vn_name:
+                getPresenter().getName();
+
+                break;
+            case R.id.tv_vn_status:
+                DataPickerDialog.Builder builder = new DataPickerDialog.Builder(getBindingActivity());
+                List<String> statusStringList = new ArrayList<>();
+
+                statusStringList.add("全部");
+                //statusStringList.add("未用");
+                //statusStringList.add("正常");
+                //statusStringList.add("删除");
+                //statusStringList.add("风险");
+                statusStringList.add("报警");
+                //statusStringList.add("废弃");
+                statusStringList.add("正常已使用");
+                statusStringList.add("风险已使用");
+                statusStringList.add("报警已使用");
+                /*List<RoleTypeBean.RoleParen> parentlist = new ArrayList<>();
+                parentlist.add(new RoleTypeBean.RoleParen(6,"","医药企业"));
+                parentlist.add(new RoleTypeBean.RoleParen(7,"","预防接种机构"));
+                parentlist.add(new RoleTypeBean.RoleParen(8,"","预防接受种者"));
+                parentlist.add(new RoleTypeBean.RoleParen(9,"","物流公司"));*/
+                DataPickerDialog dialog = builder.setData(statusStringList).setSelection(0).setTitle("全部")
+                        .setOnDataSelectedListener(new DataPickerDialog.OnDataSelectedListener() {
+                            @Override
+                            public void onDataSelected(String itemValue) {
+
+                                tvVnStatus.setText(itemValue + "");
+                            }
+                        }).create();
+
+                dialog.show();
+
+                break;
+            case R.id.tv_vn_begintime:
+                new DateDialog.Builder(getBindingActivity())
+                        .setTitle("请选择日期")
+                        .setListener(new DateDialog.OnListener() {
+                            @Override
+                            public void onSelected(Dialog dialog, int year, int month, int day) {
+                                //toast(year + "年" + month + "月" + day + "日");
+                                tvVnBegintime.setText(year + "-" + month + "-" + day);
+                            }
+
+                            @Override
+                            public void onCancel(Dialog dialog) {
+                                //toast("取消了");
+                            }
+                        })
+                        .show();
+
+                break;
+            case R.id.tv_vn_endtime:
+                new DateDialog.Builder(getBindingActivity())
+                        .setTitle("请选择日期")
+                        .setListener(new DateDialog.OnListener() {
+                            @Override
+                            public void onSelected(Dialog dialog, int year, int month, int day) {
+                                tvVnEndtime.setText(year + "-" + month + "-" + day);
+                            }
+
+                            @Override
+                            public void onCancel(Dialog dialog) {
+                                //toast("取消了");
+                            }
+                        })
+                        .show();
+
+                break;
+        }
+    }
+
+    private int getStatusByString(String statusString) {
+        if ("未用".equals(statusString)) {
+            return 0;
+        }
+        if ("正常".equals(statusString)) {
+            return 1;
+        }
+        if ("删除".equals(statusString)) {
+            return 2;
+        }
+        if ("风险".equals(statusString)) {
+            return 3;
+        }
+        if ("报警".equals(statusString)) {
+            return 4;
+        }
+        if ("废弃".equals(statusString)) {
+            return 5;
+        }
+        if ("正常已使用".equals(statusString)) {
+            return 6;
+        }
+        if ("风险已使用".equals(statusString)) {
+            return 7;
+        }
+        if ("报警已使用".equals(statusString)) {
+            return 8;
+        }
+        return -1;
+    }
+
+    private int getNameIdByName(String name) {
+        for (VnNameBean.DataBean list : nameIdList) {
+            if (list.getName().equals(name)) {
+                return list.getId();
+            }
+        }
+        return -1;
+    }
+
+    @Override
+    protected ReportVnPresenter createPresenter() {
+        return new ReportVnPresenter();
+    }
+
+    @Override
+    public void getnameError(String msg) {
+
+        toast(msg + "");
+    }
+
+    List<VnNameBean.DataBean> nameIdList = new ArrayList<>();
+
+    //@RequiresApi(api = Build.VERSION_CODES.KITKAT)
+    @Override
+    public void getnameSuccess(VnNameBean data) {
+
+        List<VnNameBean.DataBean> nameLsit = data.getData();
+
+        if (nameLsit.size() == 0) {
+            return;
+        } else {
+            // toast("成功"+nameLsit.toString());
+            //showPopupWindow(nameLsit);
+            nameIdList.clear();
+            nameIdList.addAll(nameLsit);
+            showDownPicker(nameLsit);
+        }
+
+
+    }
+
+    @Override
+    public void searchError(String msg) {
+        showComplete();
+        toast(msg);
+        if (reportEasylayout.isRefreshing()) {
+            reportEasylayout.refreshComplete();
+        }
+        if (reportEasylayout.isLoading()) {
+            reportEasylayout.loadMoreComplete();
+        }
+    }
+
+    @Override
+    public void searchSuccess(VnListBean data) {
+        showComplete();
+        List<VnListBean.DataBean> vnListDatas = data.getData();
+        if (vnListDatas.size() == 0 && !reportEasylayout.isLoading()) {
+            toast("该类疫苗暂无报告");
+            vnDataList.clear();
+            vnDataList.addAll(vnListDatas);
+            vnListAdapter.setNewData(vnListDatas);
+            vnListAdapter.notifyDataSetChanged();
+            reportEasylayout.refreshComplete();
+            return;
+        }
+
+        if (page == 1) {
+            vnDataList.clear();
+            vnDataList.addAll(vnListDatas);
+            vnListAdapter.setNewData(vnListDatas);
+            vnListAdapter.notifyDataSetChanged();
+            reportEasylayout.refreshComplete();
+        } else {
+            if (vnListDatas.size() == 0) {
+                toast("没有更多啦");
+            }
+            vnDataList.addAll(vnListDatas);
+            vnListAdapter.getData().addAll(vnListDatas);
+            vnListAdapter.notifyDataSetChanged();
+            reportEasylayout.loadMoreComplete();
+        }
+    }
+
+    private void showDownPicker(List<VnNameBean.DataBean> nameLsit) {
+        DataPickerDialog.Builder builder = new DataPickerDialog.Builder(getBindingActivity());
+        List<String> nameStringList = new ArrayList<>();
+        nameStringList.add("全部");
+        for (int i = 0; i < nameLsit.size(); i++) {
+            nameStringList.add(nameLsit.get(i).getName());
+        }
+                /*List<RoleTypeBean.RoleParen> parentlist = new ArrayList<>();
+                parentlist.add(new RoleTypeBean.RoleParen(6,"","医药企业"));
+                parentlist.add(new RoleTypeBean.RoleParen(7,"","预防接种机构"));
+                parentlist.add(new RoleTypeBean.RoleParen(8,"","预防接受种者"));
+                parentlist.add(new RoleTypeBean.RoleParen(9,"","物流公司"));*/
+        DataPickerDialog dialog = builder.setData(nameStringList).setSelection(0).setTitle("全部")
+                .setOnDataSelectedListener(new DataPickerDialog.OnDataSelectedListener() {
+                    @Override
+                    public void onDataSelected(String itemValue) {
+
+                        tvVnName.setText(itemValue + "");
+                    }
+                }).create();
+
+        dialog.show();
+    }
+
+
+    /*@RequiresApi(api = Build.VERSION_CODES.KITKAT)
+    private void showPopupWindow(final List<VnNameBean.DataBean> nameLsit){
+        View view = LayoutInflater.from(getBindingActivity()).inflate(R.layout.vnnamepop,null);
+        //初始化List数据
+
+        //初始化RecyclerView
+        RecyclerView recyslerview = (RecyclerView) view.findViewById(R.id.rv_vnname);
+        //创建LinearLayoutManager 对象 这里使用 LinearLayoutManager 是线性布局的意思
+        ReportVnAdapter reportVnAdapter = new ReportVnAdapter(R.layout.rvvnname,nameLsit);
+        recyslerview.setAdapter(reportVnAdapter);
+        GridLayoutManager layoutmanager = new GridLayoutManager(getBindingActivity(),4);
+        //设置RecyclerView 布局
+        recyslerview.setLayoutManager(layoutmanager);
+
+
+        //解决android7.0以上手机的适配问题
+        final PopupWindow popupWindow = new PopupWindow(view, LinearLayout.LayoutParams.MATCH_PARENT, AutoSizeUtils.dp2px(getBindingActivity(),90)){
+            @Override
+            public void showAsDropDown(View anchor) {
+                if(Build.VERSION.SDK_INT >= 24){
+                    Rect visibleFrame = new Rect();
+                    anchor.getGlobalVisibleRect(visibleFrame);
+                    int height = anchor.getResources().getDisplayMetrics().heightPixels - visibleFrame.bottom;
+                    setHeight(height);
+                }
+                super.showAsDropDown(anchor);
+            }
+
+            @Override
+            public void showAsDropDown(View anchor, int xoff, int yoff) {
+                if(Build.VERSION.SDK_INT >= 24) {
+                    Rect rect = new Rect();
+                    anchor.getGlobalVisibleRect(rect);
+                    int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;
+                    setHeight(h);
+                }
+                super.showAsDropDown(anchor, xoff, yoff);
+            }
+        };
+        ColorDrawable dw = new ColorDrawable(0xFFF0F5FF);
+        popupWindow.setBackgroundDrawable(dw);
+        popupWindow.setOutsideTouchable(true);
+        popupWindow.setFocusable(true);
+
+        popupWindow.showAsDropDown(tvVnName, view.getHeight(), 0, Gravity.NO_GRAVITY);
+
+        reportVnAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
+            @Override
+            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
+                tvVnName.setText(""+nameLsit.get(position).getName());
+                popupWindow.dismiss();
+            }
+        });
+    }*/
+
+    @Override
+    public void onLoading() {
+
+    }
+
+    @Override
+    public void onComplete() {
+
+    }
+
+    @Override
+    public void onEmpty() {
+
+    }
+
+    @Override
+    public void onError() {
+
+    }
+}

+ 108 - 0
.svn/pristine/02/0209b3fd44fcc28544485d1bba7c40065c421eab.svn-base

@@ -0,0 +1,108 @@
+# 指定代码的压缩级别
+-optimizationpasses 5
+
+# 包明不混合大小写
+-dontusemixedcaseclassnames
+
+# 不去忽略非公共的库类
+-dontskipnonpubliclibraryclasses
+
+# 优化  不优化输入的类文件
+-dontoptimize
+
+# 预校验
+-dontpreverify
+
+# 混淆时是否记录日志
+-verbose
+
+# 混淆时所采用的算法
+-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
+
+# 保护注解
+-keepattributes *Annotation*
+
+# 保持哪些类不被混淆
+-keep public class * extends android.app.Fragment
+-keep public class * extends android.app.Activity
+-keep public class * extends android.app.Application
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+-keep public class * extends android.app.backup.BackupAgentHelper
+-keep public class * extends android.preference.Preference
+-keep public class com.android.vending.licensing.ILicensingService
+
+######## 记录生成的日志数据,gradle build时在本项目根目录输出 ########
+
+# apk 包内所有 class 的内部结构
+-dump class_files.txt
+# 未混淆的类和成员
+-printseeds seeds.txt
+# 列出从 apk 中删除的代码
+-printusage unused.txt
+# 混淆前后的映射
+-printmapping mapping.txt
+
+######## 记录生成的日志数据,gradle build时 在本项目根目录输出 ########
+
+# 保持 native 方法不被混淆
+-keepclasseswithmembernames class * {
+    native <methods>;
+}
+
+# 保持自定义控件类不被混淆
+-keepclassmembers class * extends android.app.Activity {
+   public void *(android.view.View);
+}
+-keep public class * extends android.view.View {
+    public <init>(android.content.Context);
+    public <init>(android.content.Context, android.util.AttributeSet);
+    public <init>(android.content.Context, android.util.AttributeSet, int);
+    public void set*(...);
+}
+
+# 保持 Parcelable 不被混淆
+-keep class * implements android.os.Parcelable {
+  public static final android.os.Parcelable$Creator *;
+}
+
+# 保持 Serializable 不被混淆
+-keepnames class * implements java.io.Serializable
+
+# 保持 Serializable 不被混淆并且enum 类也不被混淆
+-keepclassmembers class * implements java.io.Serializable {
+    static final long serialVersionUID;
+    private static final java.io.ObjectStreamField[] serialPersistentFields;
+    !static !transient <fields>;
+    !private <fields>;
+    !private <methods>;
+    private void writeObject(java.io.ObjectOutputStream);
+    private void readObject(java.io.ObjectInputStream);
+    java.lang.Object writeReplace();
+    java.lang.Object readResolve();
+}
+
+# 保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可
+-keepclassmembers enum * {
+  public static **[] values();
+  public static ** valueOf(java.lang.String);
+}
+
+-keepclassmembers class * {
+    public void *ButtonClicked(android.view.View);
+}
+
+# 不混淆资源类
+-keepclassmembers class **.R$* {
+    public static <fields>;
+}
+
+# 避免混淆泛型 如果混淆报错建议关掉
+-keepattributes Signature
+
+# Android 混淆的误区
+# 网上很多现成并且成熟的混淆规则,大家参考一下即可,但是不要盲目照找,我们现在大家理解每个混淆规则是什么意思,自己参照的时候注意一下。
+# 举个例子,我们现在开发 Android 我们肯定会引用 support-v4 、support-v7 ,但是 support 包里面的功能我们不可能全部都使用到。
+# 而网上有很多博客中写了 keep 掉 v7 v4 包,其实我们是没有必要的。要知道 v7 包足足有 15000 个左右的方法呢!进行混淆是很有必要的。
+# -dontwarn android.support.**

+ 721 - 0
.svn/pristine/02/0220e9ef121645686903690158e0dff1762db16b.svn-base

@@ -0,0 +1,721 @@
+package eVVM.apk.ui.vaccination;
+
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.annotation.SuppressLint;
+import android.app.Dialog;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Message;
+import android.support.annotation.RequiresApi;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.util.Log;
+import android.view.View;
+import android.view.animation.Animation;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.hjq.base.BaseDialog;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+
+import java.lang.ref.WeakReference;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.MyClickListener;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.helper.SoundPoolHelper;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.bean.ModelListBean;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+import eVVM.apk.ui.bean.VnDetailBean;
+import eVVM.apk.ui.home.HomeActivity;
+import eVVM.apk.ui.report.vndetail.VnDetailContract;
+import eVVM.apk.ui.report.vndetail.VnDetailPresenter;
+import eVVM.apk.ui.webview.WebActivity;
+import eVVM.apk.widget.EvvmMsgDiago;
+import eVVM.apk.widget.ZoomView;
+
+public class VnReportDetailForDoctorActivity extends MvpActivity<VnDetailPresenter> implements VnDetailContract.View, MyClickListener.MyClickCallBack {
+
+
+    @BindView(R.id.vndetail_tv_vnname)
+    TextView vndetailTvVnname;
+    @BindView(R.id.vndetail_tv_vnsc)
+    TextView vndetailTvVnsc;
+    @BindView(R.id.vndetail_tv_vncreatdate)
+    TextView vndetailTvVncreatdate;
+    @BindView(R.id.vndetail_tv_vnvalid)
+    TextView vndetailTvVnvalid;
+    @BindView(R.id.renyuan_type)
+    TextView renyuanType;
+    @BindView(R.id.vndetail_tv_szname)
+    TextView vndetailTvSzname;
+    @BindView(R.id.vndetail_tv_szsex)
+    TextView vndetailTvSzsex;
+    @BindView(R.id.vndetail_tv_szbirthday)
+    TextView vndetailTvSzbirthday;
+    @BindView(R.id.vndetail_tv_szid)
+    TextView vndetailTvSzid;
+    @BindView(R.id.vndetail_tv_szguardian)
+    TextView vndetailTvSzguardian;
+    @BindView(R.id.shouzhongrenyuan)
+    LinearLayout shouzhongrenyuan;
+    @BindView(R.id.jiezhognrenyuan)
+    LinearLayout jiezhognrenyuan;
+    @BindView(R.id.vndetail_tv_szTelephone)
+    TextView vndetailTvSzTelephone;
+    private boolean isWarning = true;
+    private VnDetailBean.DataBean chipModel = null;
+    private SoundPoolHelper soundPoolHelper;
+
+    @BindView(R.id.vndetail_tv_typemsg)
+    TextView vndetailTvTypemsg;
+    @BindView(R.id.vndetail_tv_vncode)
+    TextView vndetailTvVncode;
+    @BindView(R.id.vndetail_tv_vndate)
+    TextView vndetailTvVndate;
+    @BindView(R.id.vndetail_tv_factoryName)
+    TextView vndetailTvFactoryName;
+    @BindView(R.id.vndetail_tv_gmpName)
+    TextView vndetailTvGmpName;
+    @BindView(R.id.vndetail_tv_gmpPath)
+    TextView vndetailTvGmpPath;
+    @BindView(R.id.vndetail_tv_hospitalName)
+    TextView vndetailTvHospitalName;
+    @BindView(R.id.vndetail_tv_doctorName)
+    TextView vndetailTvDoctorName;
+    @BindView(R.id.vndetail_tv_doctorTelephone)
+    TextView vndetailTvDoctorTelephone;
+    @BindView(R.id.vndetail_tv_chatImage)
+    ImageView vndetailTvChatImage;
+    @BindView(R.id.vndetail_tv_othervn1)
+    TextView vndetailTvOthervn1;
+    @BindView(R.id.vndetail_tv_othervn2)
+    TextView vndetailTvOthervn2;
+    @BindView(R.id.vndetail_tv_othervn3)
+    TextView vndetailTvOthervn3;
+    @BindView(R.id.vndetail_iv_tipsimg)
+    ImageView vndetailIvTipsimg;
+    @BindView(R.id.vndetail_tv_tips)
+    TextView vndetailTvTips;
+    @BindView(R.id.vndetail_tv_disclaimer)
+    TextView vndetailTvDisclaimer;
+    @BindView(R.id.zv_report)
+    ZoomView myzoomview;
+    @BindView(R.id.vndetail_tv_chatImage_title)
+    TextView vndetail_tv_chatImage_title;
+    @BindView(R.id.coverview)
+    TextView coverview;
+
+    private int status;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_vn_report_detail_for_doctor;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.tb_vndetail_title;
+    }
+
+    @Override
+    protected void initView() {
+        myzoomview.setOnTouchListener(new MyClickListener(this));
+        soundPoolHelper = new SoundPoolHelper(4, SoundPoolHelper.TYPE_MUSIC)
+                .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC)
+                .loadDefault(VnReportDetailForDoctorActivity.this)
+                .load(VnReportDetailForDoctorActivity.this, "rewarning", R.raw.rewarning)
+                .load(VnReportDetailForDoctorActivity.this, "renormal", R.raw.renormal);
+
+
+    }
+
+    @Override
+    public void onLeftClick(View v) {
+        super.onLeftClick(v);
+        if (isWarning) {
+            if (status == 6 || status == 7 || status == 8) {
+
+            } else {
+                startActivityFinish(ReadingActivity.class);
+            }
+        }
+    }
+
+    @OnClick({R.id.next_btn_report, R.id.vndetail_bt_magnifier})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.next_btn_report:
+
+                if (status == 4) {
+                    startActivityFinish(ReadingActivity.class);
+                } else {
+                    if (status == 6 || status == 7 || status == 8) {
+                        startActivityFinish(HomeActivity.class);
+                    }
+                }
+
+                break;
+            case R.id.vndetail_bt_magnifier:
+                //放大
+                myzoomview.magnifier();
+                break;
+        }
+    }
+
+
+    private static class WarningHandler extends Handler {
+        private WeakReference<VnReportDetailForDoctorActivity> wactivity;
+
+        public WarningHandler(VnReportDetailForDoctorActivity activity) {
+            wactivity = new WeakReference<VnReportDetailForDoctorActivity>(activity);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+        }
+    }
+
+    private WarningHandler warninghandler = new WarningHandler(this);
+
+    private static class NormalHandler extends Handler {
+        private WeakReference<VnReportDetailForDoctorActivity> wactivity;
+
+        public NormalHandler(VnReportDetailForDoctorActivity activity) {
+            wactivity = new WeakReference<VnReportDetailForDoctorActivity>(activity);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+        }
+    }
+
+    private NormalHandler normalhandler = new NormalHandler(this);
+
+    private Runnable warningRunnable = new Runnable() {
+        @Override
+        public void run() {
+            //用户2秒没操作了
+            Log.e("DoctorVnReportActivity", "两秒未操作");
+            startActivityFinish(ReadingActivity.class);
+        }
+    };
+    private Runnable normalRunnable = new Runnable() {
+        @Override
+        public void run() {
+            //用户2秒没操作了
+            Log.e("DoctorVnReportActivity", "两秒未操作");
+            finish();
+        }
+    };
+
+    private int checki = 1;
+
+    @SuppressLint("WrongConstant")
+    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+    @Override
+    protected void initData() {
+        Intent in = getIntent();
+        chipModel = (VnDetailBean.DataBean) in.getSerializableExtra("dataBean");
+        //给页面赋值
+        setViewData(chipModel);
+        isWarning = in.getBooleanExtra("isWarning", true);
+
+        status = in.getIntExtra("status", 0);
+
+        if (status == 4) {
+            renyuanType.setText("接种人员");
+            shouzhongrenyuan.setVisibility(View.GONE);
+            jiezhognrenyuan.setVisibility(View.VISIBLE);
+        } else {
+            if (status == 6 || status == 7) {
+                renyuanType.setText("受种人员");
+                shouzhongrenyuan.setVisibility(View.VISIBLE);
+                jiezhognrenyuan.setVisibility(View.GONE);
+            } else if (status == 8) {
+                renyuanType.setText("接种人员");
+                shouzhongrenyuan.setVisibility(View.GONE);
+                jiezhognrenyuan.setVisibility(View.VISIBLE);
+            }
+        }
+
+        //设置验证信息
+        vndetailTvChatImage.setImageResource(R.mipmap.report_check_ico);
+        vndetailTvTypemsg.setText("疫苗企业验证通过");
+        //透明动画
+        ObjectAnimator animator = ObjectAnimator.ofFloat(vndetailTvChatImage, "alpha", 0.1f, 1f);
+        animator.setDuration(500); //一秒闪一次
+        animator.setRepeatCount(10); //总共闪十次
+        animator.setRepeatMode(Animation.REVERSE);
+        //为动画设置监听
+        animator.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                //动画结束
+                animation.resume();
+                /*AlphaAnimation alpha = new AlphaAnimation(0.1F, 1F);
+                alpha.setDuration(0);
+                alpha.setFillAfter(true);
+                vndetailTvChatImage.startAnimation(alpha);*/
+                setPageView(); //设置扫描到的信息
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+                //动画重复时  下方进行验证提示
+                //Log.e("onAnimationRepeat","onAnimationRepeat");
+                checki++;
+                setCheckText(checki);
+            }
+        });
+        animator.start();
+
+    }
+
+    private void setCheckText(int checki) {
+        switch (checki) {
+            case 1:
+                vndetailTvTypemsg.setText("疫苗企业验证通过");
+                break;
+            case 2:
+                vndetailTvTypemsg.setText("疫苗品种验证通过");
+                break;
+            case 3:
+                vndetailTvTypemsg.setText("疫苗规格验证通过");
+                break;
+            case 4:
+                vndetailTvTypemsg.setText("疫苗id验证通过");
+                break;
+            case 5:
+                vndetailTvTypemsg.setText("疫苗冷链验证通过");
+                break;
+            case 6:
+                vndetailTvTypemsg.setText("接种点验证通过");
+                break;
+            case 7:
+                vndetailTvTypemsg.setText("医生验证通过");
+                break;
+            case 8:
+                vndetailTvTypemsg.setText("受种者姓名验证通过");
+                break;
+            case 9:
+                vndetailTvTypemsg.setText("受种者年龄验证通过");
+                break;
+            case 10:
+                vndetailTvTypemsg.setText("受种者性别验证通过");
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void setPageView() {
+        if (status == 4) {
+            findViewById(R.id.btn_ll).setVisibility(View.VISIBLE);
+            vndetailTvTypemsg.setText("此疫苗需要进一步验证,请等待厂家复核");
+            vndetailTvTypemsg.setTextColor(Color.RED);
+            vndetailTvChatImage.setImageResource(R.mipmap.report_warning_ico);
+            coverview.setText("提示:温度追溯结果显示,该疫苗冷链可能有超温现象,厂家已收到相关信息。请立即停止使用该疫苗,等待复核结果。");
+            //播放提示语
+            postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    soundPoolHelper.play("rewarning", false);
+                }
+            }, 500);
+
+            getWarningOper();
+        } else {
+            if (status == 6 || status == 7) {
+                findViewById(R.id.btn_ll).setVisibility(View.VISIBLE);
+                vndetailTvTypemsg.setText(
+                        "疫苗信息已验证通过,冷链信息未发现异常,请核对疫苗内外包装与本报告所载数据是否一致,并按\"+\"三查七对\"+\"的规定使用");
+                vndetailTvTypemsg.setTextColor(Color.GREEN);
+                vndetailTvChatImage.setImageResource(R.mipmap.report_normal_ico);
+                /*vndetailTvChatImage.setVisibility(View.GONE);
+                vndetail_tv_chatImage_title.setVisibility(View.GONE);*/
+                coverview.setText("提示:注射疫苗后,请用注射专用创口贴或消毒棉球轻压针眼几分钟,至不出血。请勿揉搓接种部位。接种疫苗后休息30分钟再离开。");
+                postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        getnormalOper();
+                    }
+                }, 5000);
+
+                postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        soundPoolHelper.play("renormal", false);
+                    }
+                }, 500);
+            } else if (status == 8) {
+                vndetailTvTypemsg.setText("此疫苗需要进一步验证,请等待厂家复核");
+                vndetailTvTypemsg.setTextColor(Color.RED);
+                vndetailTvChatImage.setImageResource(R.mipmap.report_warning_ico);
+                coverview.setText("提示:温度追溯结果显示,该疫苗冷链可能有超温现象,厂家已收到相关信息。请立即停止使用该疫苗,等待复核结果。");
+                postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        soundPoolHelper.play("rewarning", false);
+                    }
+                }, 500);
+                normalhandler.postDelayed(normalRunnable, 1000 * 60);
+            }
+
+            // normalhandler.postDelayed(normalRunnable, 1000 * 10);
+        }
+    }
+
+    private void getnormalOper() {
+        final BaseDialog normalDiago = new EvvmMsgDiago.Builder(this)
+                .setTitle("pdf报告已自动保存到你指定的路径,医生已做好“三查七对”,并按规定完成接种,是否推送给受种者(监护人)?") // 标题可以不用填写
+                .setConfirm("发送给家长")
+                .setCancel("取消") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .setListener(new EvvmMsgDiago.OnListener() {
+
+                    @Override
+                    public void onConfirm(Dialog dialog) {
+                        String emailsOfInoculator = "";
+                        try {
+                            String str = (String) SPUtils.get("INOCULATOR_LIST", "");
+                            if (!str.equals("")) {
+                                JSONArray jsonArr = new JSONArray(str);
+                                for (int i = 0; i < jsonArr.length(); i++) {
+                                    String arr[] = jsonArr.getString(i).split("▇");
+                                    if (!arr[3].trim().equals("")) {
+                                        emailsOfInoculator += arr[3] + ",";
+                                    }
+                                }
+                                if (emailsOfInoculator.lastIndexOf(",") == emailsOfInoculator.length() - 1) {
+                                    emailsOfInoculator = emailsOfInoculator.substring(0, emailsOfInoculator.length() - 1);
+                                }
+                            }
+                        } catch (JSONException e) {
+                            e.printStackTrace();
+                        }
+
+                        getPresenter().sendMailToInoculator(chipModel.getChipNumber(), emailsOfInoculator);
+                    }
+
+                    @Override
+                    public void onCancel(Dialog dialog) {
+                        //toast("取消了");
+                    }
+                })
+                .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                    @Override
+                    public void onDismiss(BaseDialog dialog) {
+                        //toast("asfad");
+                        normalhandler.postDelayed(normalRunnable, 1000 * 30);
+                    }
+                })
+                .show();
+
+        postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                if (normalDiago.isShowing()) {
+                    normalDiago.dismiss();
+                }
+            }
+        }, 30000);
+    }
+
+    private void getWarningOper() {
+        final BaseDialog warningDiago = new EvvmMsgDiago.Builder(this)
+                .setTitle("此疫苗需复核,请换支疫苗") // 标题可以不用填写
+                .setConfirm("")
+                .setCancel("") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                    @Override
+                    public void onDismiss(BaseDialog dialog) {
+                        //toast("asfad");
+                        //warninghandler.postDelayed(warningRunnable, 1000 * 10);
+                    }
+                })
+                .show();
+        postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                if (warningDiago.isShowing()) {
+                    warningDiago.dismiss();
+                }
+            }
+        }, 5000);
+    }
+
+    private void setViewData(final VnDetailBean.DataBean dataBean) {
+
+        vndetailTvSzname.setText(TextUtils.isEmpty(dataBean.getInoculatroUserName()) ? "N/A" : "" + dataBean.getInoculatroUserName());
+        vndetailTvSzsex.setText(TextUtils.isEmpty(dataBean.getInoculatroSex()) ? "N/A" : "" + dataBean.getInoculatroSex());
+        vndetailTvSzbirthday.setText(TextUtils.isEmpty(dataBean.getInoculatroBirthdate()) ? "N/A" : "" + dataBean.getInoculatroBirthdate());
+        vndetailTvSzid.setText(TextUtils.isEmpty(dataBean.getInoculatroId()) ? "N/A" : "" + dataBean.getInoculatroId());
+        vndetailTvSzguardian.setText("N/A");
+        vndetailTvSzTelephone.setText(TextUtils.isEmpty(dataBean.getInoculatroTelePhone()) ? "N/A" : "" + dataBean.getInoculatroTelePhone());
+
+        vndetailTvVnname.setText(TextUtils.isEmpty(dataBean.getVaccineName()) ? "N/A" : dataBean.getVaccineName() + "");
+        vndetailTvVnsc.setText(TextUtils.isEmpty(dataBean.getVaccineCategory()) ? "N/A" : dataBean.getVaccineCategory() + "");
+        vndetailTvVncreatdate.setText(TextUtils.isEmpty(dataBean.getBeginDate()) ? "N/A" : dataBean.getBeginDate() + "");
+        vndetailTvVnvalid.setText(TextUtils.isEmpty(dataBean.getVaccineExpiryDate()) ? "N/A" : dataBean.getVaccineExpiryDate());
+
+
+        //vndetailTvVncode.setText("evvm Code " + dataBean.getCode());
+     /*   String codeStr = "";
+        for (int i = 0; i < dataBean.getCodeX().length(); i++) {
+            codeStr = codeStr + "*";
+        }*/
+        SpannableString spancode = new SpannableString("报告编号 " + dataBean.getCodeX());
+        spancode.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                /*if (dataBean.getCodeX() == null || TextUtils.isEmpty(dataBean.getCodeX())) {
+                    toast("你没有授权,请进行注册");
+                } else {
+                    gotoWebActivity(dataBean.getCodeX());
+                }*/
+            }
+        }, 5, 5 + dataBean.getCodeX().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvVncode.setText(spancode);
+        vndetailTvVncode.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+        vndetailTvVndate.setText(format1.format(new Date()));
+        vndetailTvFactoryName.setText("" + dataBean.getFactoryName());
+        vndetailTvHospitalName.setText("" + dataBean.getHospitalName());
+        vndetailTvDoctorName.setText("" + dataBean.getDoctorName());
+        vndetailTvDoctorTelephone.setText("" + dataBean.getDoctorTelephone());
+        vndetailTvChatImage.setScaleType(ImageView.ScaleType.CENTER);
+
+        SpannableString spanGmpPath = new SpannableString(TextUtils.isEmpty(dataBean.getGmpName()) ? "N/A" : dataBean.getGmpName());
+        spanGmpPath.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getGmpPath() == null || TextUtils.isEmpty(dataBean.getGmpPath())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getGmpPath());
+
+                }
+            }
+        }, 0, spanGmpPath.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvGmpName.setText(spanGmpPath);
+        vndetailTvGmpName.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn0 = new SpannableString("点击查看");
+        spanvndetailTvOthervn0.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getBatchCertificate() == null || TextUtils.isEmpty(dataBean.getBatchCertificate())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getBatchCertificate());
+                }
+            }
+        }, 0, spanvndetailTvOthervn0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvGmpPath.setText(spanvndetailTvOthervn0);
+        vndetailTvGmpPath.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn1 = new SpannableString("点击查询");
+        spanvndetailTvOthervn1.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameBatchOtherColdChain() == null || TextUtils.isEmpty(dataBean.getSameBatchOtherColdChain())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getSameBatchOtherColdChain());
+                }
+            }
+        }, 0, spanvndetailTvOthervn1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn1.setText(spanvndetailTvOthervn1);
+        vndetailTvOthervn1.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+
+        SpannableString spanvndetailTvOthervn2 = new SpannableString("点击查询");
+        spanvndetailTvOthervn2.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameBatchOtherFlow() == null || TextUtils.isEmpty(dataBean.getSameBatchOtherFlow())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getSameBatchOtherFlow());
+                }
+            }
+        }, 0, spanvndetailTvOthervn2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn2.setText(spanvndetailTvOthervn2);
+        vndetailTvOthervn2.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn3 = new SpannableString("点击查询");
+        spanvndetailTvOthervn3.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameFactoryOtherVaccines() == null || TextUtils.isEmpty(dataBean.getSameFactoryOtherVaccines())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getSameFactoryOtherVaccines());
+
+                }
+            }
+        }, 0, spanvndetailTvOthervn3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn3.setText(spanvndetailTvOthervn3);
+        vndetailTvOthervn3.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+    }
+
+    private void gotoWebActivity(String path) {
+        if (isWarning) {
+            warninghandler.removeCallbacks(warningRunnable);
+        } else {
+            normalhandler.removeCallbacks(normalRunnable);
+        }
+        Intent in = new Intent(VnReportDetailForDoctorActivity.this, WebActivity.class);
+        in.putExtra("WebViewUrl", "" + path + "");
+        startActivity(in);
+    }
+
+
+    @Override
+    protected VnDetailPresenter createPresenter() {
+        return new VnDetailPresenter();
+    }
+
+    @Override
+    public void getSendMailSuccess(VnDetailBean data) {
+        toast("邮件已发送");
+        //finish();
+    }
+
+    @Override
+    public void getmlistError(String msg) {
+        toast("邮件发送失败");
+    }
+
+    @Override
+    public void getmlistSuccess(ModelListBean data) {
+
+    }
+
+    @Override
+    public void getToReviewError(String msg) {
+
+    }
+
+    @Override
+    public void getToReviewSuccess(VerificationCodeBean data) {
+
+    }
+
+    @Override
+    public void getDetailError(String msg) {
+
+    }
+
+    @Override
+    public void getDetailSuccess(VnDetailBean data) {
+
+    }
+
+    @Override
+    public void getSendMailError(String msg) {
+        toast(msg);
+    }
+
+    public static void i(String tag, String msg) {  //信息太长,分段打印
+        //因为String的length是字符数量不是字节数量所以为了防止中文字符过多,
+        //  把4*1024的MAX字节打印长度改为2001字符数
+        int max_str_length = 2001 - tag.length();
+        //大于4000时
+        while (msg.length() > max_str_length) {
+            Log.i(tag, msg.substring(0, max_str_length));
+            msg = msg.substring(max_str_length);
+        }
+        //剩余部分
+        Log.i(tag, msg);
+
+    }
+
+    @Override
+    protected void onDestroy() {
+        if (status == 6 || status == 7 || status == 8) {
+            SPUtils.remove("INOCULATOR_LIST");
+        }
+        // soundPoolHelper.release();
+        if (normalhandler != null) {
+            normalhandler.removeCallbacksAndMessages(null);
+        }
+        if (warninghandler != null) {
+            warninghandler.removeCallbacksAndMessages(null);
+        }
+        super.onDestroy();
+    }
+
+    @Override
+    public void onDown() {
+        Log.e("DoctorVnReportActivity", "down");
+        if (isWarning) {
+            if (warninghandler != null) {
+                warninghandler.removeCallbacks(warningRunnable);
+            }
+        } else {
+            if (normalhandler != null) {
+                normalhandler.removeCallbacks(normalRunnable);
+            }
+        }
+    }
+
+    @Override
+    public void onUp() {
+        Log.e("DoctorVnReportActivity", "up");
+        if (isWarning) {
+            warninghandler.postDelayed(warningRunnable, 1000 * 10);
+        } else {
+            normalhandler.postDelayed(normalRunnable, 1000 * 10);
+        }
+    }
+
+    @Override
+    public void oneClick() {
+
+    }
+
+    @Override
+    public void doubleClick() {
+
+    }
+
+
+}

BIN
.svn/pristine/02/02365ac73f433a06612e7f6477a0e2c2f792969e.svn-base


+ 428 - 0
.svn/pristine/02/02378b75a6006753a2af8d5f2b6dd34122ea5ea0.svn-base

@@ -0,0 +1,428 @@
+package eVVM.apk.ui.login;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.IBinder;
+import android.text.Html;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.TextPaint;
+import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import com.hjq.base.BaseDialog;
+import com.hjq.base.BaseDialogFragment;
+import com.hjq.permissions.OnPermission;
+import com.hjq.permissions.Permission;
+import com.hjq.permissions.XXPermissions;
+import com.hjq.widget.ClearEditText;
+import com.tianma.netdetector.lib.NetworkType;
+
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.InputTextHelper;
+import eVVM.apk.helper.MD5;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.helper.SoftKeyBoardListener;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.My.ExamineActivity;
+import eVVM.apk.ui.bean.LoginBean;
+import eVVM.apk.ui.home.FactorAdminActivity;
+import eVVM.apk.ui.home.FactoryOperatorActivity;
+import eVVM.apk.ui.home.HomeActivity;
+import eVVM.apk.ui.login.login.LoginContract;
+import eVVM.apk.ui.login.login.LoginPresenter;
+
+public class LoginActivity extends MvpActivity<LoginPresenter> implements LoginContract.View {
+
+    @BindView(R.id.login_et_phone)
+    ClearEditText loginEtPhone;
+    @BindView(R.id.login_et_pwd)
+    ClearEditText loginEtPwd;  //密码输入框
+    @BindView(R.id.login_tv_forgetpwd)
+    TextView loginTvForgetpwd;  //忘记密码
+    @BindView(R.id.login_btn_login)
+    Button loginBtnLogin;     //登录
+    @BindView(R.id.login_tv_goregist)
+    TextView loginTvGoregist;  //去注册
+    @BindView(R.id.login_scrollview)
+    ScrollView loginScrollview;
+    @BindView(R.id.examine_cb_agree)
+    CheckBox examineCbAgree;
+    @BindView(R.id.examine_tv_protocol)
+    TextView examineTvProtocol;
+
+    private String getMD5Pwd;
+    private String userPhone;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_login;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return 0;
+    }
+
+    @Override
+    protected void initView() {
+        new InputTextHelper.Builder(this)
+                .setMain(loginBtnLogin)
+                .addView(loginEtPhone)
+                .addView(loginEtPwd)
+                .build();
+        loginScrollview.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View arg0, MotionEvent arg1) {
+                View v = getCurrentFocus();
+                if (isShouldHideKeyboard(v, arg1)) {
+                    hideKeyboard(v.getWindowToken());
+                }
+                //不能滑动
+                return true;
+                //可以滑动
+                //return false;
+            }
+        });
+        SoftKeyBoardListener.setListener(getActivity(), new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
+            @Override
+            public void keyBoardShow(int height) {
+                loginScrollview.smoothScrollTo(0, height / 2);
+            }
+
+            @Override
+            public void keyBoardHide(int height) {
+                loginScrollview.smoothScrollTo(0, 0);
+            }
+        });
+
+        getBtnStact();
+        toProtocol();
+    }
+
+    @Override
+    protected void initData() {
+        getPermissions();
+        String user_phone = (String) SPUtils.get("USER_PHONE", "");
+        String user_pwd = (String) SPUtils.get("USER_PWD", "");
+        if (TextUtils.isEmpty(user_phone) && TextUtils.isEmpty(user_pwd)) {
+            //用户没有登录过
+        } else {
+            showLoading();
+            //登陆过 进行自动登录
+            userPhone = user_phone;
+            getMD5Pwd = user_pwd;
+            getPresenter().login(user_phone, user_pwd);
+        }
+    }
+
+    private void getPermissions() {
+        // 联系人
+        String[] CONTACTS = new String[]{
+                Permission.CAMERA,
+                Permission.RECEIVE_SMS,
+                Permission.READ_SMS,
+                Permission.READ_EXTERNAL_STORAGE,
+                Permission.WRITE_EXTERNAL_STORAGE,
+                Permission.ACCESS_FINE_LOCATION,
+                Permission.ACCESS_COARSE_LOCATION,
+                Permission.REQUEST_INSTALL_PACKAGES};
+
+        XXPermissions.with(LoginActivity.this)
+                //.constantRequest() //可设置被拒绝后继续申请,直到用户授权或者永久拒绝
+                //.permission(Permission.SYSTEM_ALERT_WINDOW, Permission.REQUEST_INSTALL_PACKAGES) //支持请求6.0悬浮窗权限8.0请求安装权限
+                .permission(CONTACTS) //不指定权限则自动获取清单中的危险权限
+                .request(new OnPermission() {
+
+                    @Override
+                    public void hasPermission(List<String> granted, boolean isAll) {
+                        /*if (isAll) {
+                            toast("获取权限成功");
+                        }else {
+                            toast("获取权限成功,部分权限未正常授予");
+                        }*/
+                    }
+
+                    @Override
+                    public void noPermission(List<String> denied, boolean quick) {
+                        /*if(quick) {
+                            toast("被永久拒绝授权,请手动授予权限");
+                            //如果是被永久拒绝就跳转到应用权限系统设置页面
+                            XXPermissions.gotoPermissionSettings(LoginActivity.this);
+                        }else {
+                            //toast("获取权限失败,部分功能可能无法使用");
+                        }*/
+                    }
+                });
+    }
+
+    @OnClick({R.id.login_tv_forgetpwd, R.id.login_btn_login, R.id.login_tv_goregist})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.login_tv_forgetpwd:
+                startActivity(PasswordForgetActivity.class);
+                break;
+            case R.id.login_btn_login:
+                if (examineCbAgree.isChecked()) {
+                    if (loginEtPhone.getText().toString().length() != 11) {
+                        toast(getString(R.string.common_phone_input_error));
+                    } else {
+                        //登录 密码进行md5加密
+                        getMD5Pwd = MD5.GetMD5Code(loginEtPwd.getText().toString().trim());
+                        userPhone = loginEtPhone.getText().toString().trim();
+                        getPresenter().login(userPhone, getMD5Pwd);
+                        showLoading();
+                    }
+                } else {
+                    toast("请勾选用户协议");
+                }
+
+                break;
+            case R.id.login_tv_goregist:
+                startActivity(RegisterActivity.class);
+                break;
+        }
+    }
+
+    @Override
+    protected LoginPresenter createPresenter() {
+        return new LoginPresenter();
+    }
+
+    @Override
+    public void loginError(String msg) {
+        showComplete();
+        toast(msg);
+        if (msg.indexOf("请检查您的网络状态") != -1) {
+            String user_roleId = (String) SPUtils.get("USER_ROLEID", "");
+            if (!TextUtils.isEmpty(user_roleId)) {
+                switch (Integer.parseInt(user_roleId)) {
+                    case 2: //医生
+                        startActivityFinish(HomeActivity.class);
+                        break;
+                    case 3: //医药企业管理员
+                        startActivityFinish(FactorAdminActivity.class);
+                        break;
+                    case 4: //医药企业操作员
+                        if (!checkGpsAndNfc()) {
+                            return;
+                        }
+                        startActivityFinish(FactoryOperatorActivity.class);
+                        break;
+                    default:
+                        toast("当前版本不支持本角色登录");
+                        break;
+                }
+            }
+
+        }
+    }
+
+    @Override
+    public void loginSuccess(LoginBean data) {
+
+        // 处理登录
+        showComplete();
+        LoginBean.DataBean userData = data.getData();
+        SPUtils.put("USER_ID", userData.getId() + "");
+        SPUtils.put("USER_TOKEN", userData.getToken() + "");
+
+        if (userData.getStatus() == 1) {//状态(0禁用 1正常 2删除 3未审核 4审核未通过 5未完成注册 6未同意协议)
+
+            Log.e("userData", "" + userData.getPassword());
+            //保存用户数据
+            SPUtils.put("USER_PHONE", userPhone + "");
+            SPUtils.put("USER_PWD", getMD5Pwd + "");
+            SPUtils.put("USER_ROLEID", userData.getRoleId() + "");
+            SPUtils.put("USER_FACTORY_ID", userData.getFactoryId() + "");
+            SPUtils.put("USER_NAME", userData.getUserName() + "");
+            SPUtils.put("PHONE_MODEL", userData.getPhoneModel());
+            SPUtils.put("USER_EMAIL", userData.getEmail());
+            SPUtils.put("USER_CALLNUM", userData.getTelephone());
+
+            switch (userData.getRoleId()) {   //根据不同角色 跳转进入不同的页面 只有厂家管理员不需要判断nfc
+                case 2: //医生
+//                    if (!checkGpsAndNfc()) {
+//                        return;
+//                    }
+                    startActivityFinish(HomeActivity.class);
+                    break;
+                case 3: //医药企业管理员
+                    startActivityFinish(FactorAdminActivity.class);
+                    break;
+                case 4: //医药企业操作员
+                    if (!checkGpsAndNfc()) {
+                        return;
+                    }
+                    startActivityFinish(FactoryOperatorActivity.class);
+                    break;
+                default:
+                    toast("当前版本不支持本角色登录");
+                    break;
+            }
+        } else if (userData.getStatus() == 0) {
+            toast("当前账号已被禁用");
+        } else if (userData.getStatus() == 2) {
+            toast("当前账号已被删除");
+        } else if (userData.getStatus() == 3) {
+            Intent in = new Intent(this, ExamineActivity.class);
+            in.putExtra("LoginStatusCode", 3);
+            startActivity(in);
+            //toast("您的账号正在审核中,请耐心等待");
+        } else if (userData.getStatus() == 4) {
+            Intent in = new Intent(this, ExamineActivity.class);
+            in.putExtra("LoginStatusCode", 4);
+            startActivity(in);
+            //toast("审核未通过");
+        } else if (userData.getStatus() == 5) {
+//            toast("未完成注册");
+            Intent in = new Intent(this, AuthenticationActivity.class);
+            in.putExtra("registerUserId", data.getData().getId() + "");
+            startActivity(in);
+        } else if (userData.getStatus() == 6) {
+            Intent in = new Intent(this, ExamineActivity.class);
+            in.putExtra("LoginStatusCode", 6);
+            startActivity(in);
+        }
+    }
+
+    private void getBtnStact() {
+        examineCbAgree.setChecked(true);
+      /*  examineCbAgree.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+                if (b) {
+                    examineBtnTrue.setEnabled(true);
+                } else {
+                    //forgetBtnLogin.setClickable(false);
+                    examineBtnTrue.setEnabled(false);
+                }
+            }
+        });*/
+    }
+
+    private void toProtocol() {
+        ClickableSpan clickableSpan = new ClickableSpan() {
+            @Override
+            public void onClick(View widget) {
+                //startActivity(new Intent(SpecialLineCompanyListActivity.this, SpecialLineCreateCompanyActivity.class));//响应点击事件
+                // agreementView.setVisibility(View.VISIBLE);
+
+                new BaseDialogFragment.Builder(getActivity())
+                        .setContentView(R.layout.dialog_agree)
+                        .setAnimStyle(BaseDialog.AnimStyle.SCALE)
+                        .setText(R.id.agree_msg, Html.fromHtml(getString(R.string.agreement)))
+                        .setOnClickListener(R.id.agree_canale, new BaseDialog.OnClickListener<ImageView>() {
+
+                            @Override
+                            public void onClick(BaseDialog dialog, ImageView view) {
+                                dialog.dismiss();
+                            }
+                        })
+                        .addOnShowListener(new BaseDialog.OnShowListener() {
+                            @Override
+                            public void onShow(BaseDialog dialog) {
+                                //toast("Dialog  显示了");
+                            }
+                        })
+                        .addOnCancelListener(new BaseDialog.OnCancelListener() {
+                            @Override
+                            public void onCancel(BaseDialog dialog) {
+                                // toast("Dialog 取消了");
+                            }
+                        })
+                        .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                            @Override
+                            public void onDismiss(BaseDialog dialog) {
+                                //toast("Dialog 销毁了");
+                            }
+                        })
+                        .show();
+            }
+
+            @Override
+            public void updateDrawState(TextPaint ds) {
+                ds.setColor(Color.BLUE);//设置颜色
+                ds.setUnderlineText(false);//去掉下划线
+            }
+        };
+        SpannableStringBuilder builder = new SpannableStringBuilder(examineTvProtocol.getText().toString());
+
+        builder.setSpan(clickableSpan, 9, 14, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        examineTvProtocol.setText(builder);
+        examineTvProtocol.setMovementMethod(LinkMovementMethod.getInstance());//必须设置才能响应点击事件
+    }
+
+
+    //点击空白 隐藏软键盘
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+
+        if (event.getAction() == MotionEvent.ACTION_DOWN) {
+            View v = getCurrentFocus();
+            if (isShouldHideKeyboard(v, event)) {
+                hideKeyboard(v.getWindowToken());
+            }
+        }
+        return super.onTouchEvent(event);
+    }
+
+    /**
+     * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏
+     *
+     * @param v
+     * @param event
+     * @return
+     */
+    private boolean isShouldHideKeyboard(View v, MotionEvent event) {
+        if (v != null && (v instanceof EditText)) { //判断是否是EditText
+            int[] l = {0, 0};
+            v.getLocationInWindow(l);
+            int left = l[0],
+                    top = l[1],
+                    bottom = top + v.getHeight(),
+                    right = left + v.getWidth();
+            if (event.getX() > left && event.getX() < right
+                    && event.getY() > top && event.getY() < bottom) {
+                // 点击EditText的事件,忽略它。
+                return false;
+            } else {
+                return true;
+            }
+        }
+        // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点
+        return false;
+    }
+
+    /**
+     * 获取InputMethodManager,隐藏软键盘
+     *
+     * @param token
+     */
+    private void hideKeyboard(IBinder token) {
+        if (token != null) {
+            InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+            im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
+        }
+    }
+
+    @Override
+    public void onNetConnected(NetworkType networkType) {
+    }
+}

+ 417 - 0
.svn/pristine/02/024338a068b6200a00acb3cb6955746cb73bb93c.svn-base

@@ -0,0 +1,417 @@
+package eVVM.apk.common;
+
+import android.app.Dialog;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.graphics.drawable.Drawable;
+import android.provider.Settings;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+
+import com.allen.library.RxHttpUtils;
+import com.allen.library.interceptor.Transformer;
+import com.allen.library.observer.CommonObserver;
+import com.google.gson.Gson;
+import com.hjq.bar.OnTitleBarListener;
+import com.hjq.bar.TitleBar;
+import com.hjq.base.BaseDialog;
+import com.hjq.dialog.MenuDialog;
+import com.hjq.toast.ToastUtils;
+import com.tianma.netdetector.lib.NetStateChangeObserver;
+import com.tianma.netdetector.lib.NetStateChangeReceiver;
+import com.tianma.netdetector.lib.NetworkType;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import butterknife.ButterKnife;
+import butterknife.Unbinder;
+import eVVM.apk.api.ApiService;
+import eVVM.apk.app.MyApplication;
+import eVVM.apk.db.netteconnectdb.NetReConnectDaoOpe;
+import eVVM.apk.db.nrcreportdb.NRCReportDaoOpe;
+import eVVM.apk.entity.NRCReportEntity;
+import eVVM.apk.entity.NetReConnectEntity;
+import eVVM.apk.helper.ActivityStackManager;
+import eVVM.apk.helper.DebugUtils;
+import eVVM.apk.helper.GPS.LocationUtils;
+import eVVM.apk.helper.NfcUtil;
+import eVVM.apk.other.EventBusManager;
+import eVVM.apk.other.StatusManager;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+import eVVM.apk.ui.bean.VnDetailBean;
+import eVVM.apk.ui.bean.VnListBean;
+import eVVM.apk.ui.vaccination.VnReportDetailForNctActivity;
+import eVVM.apk.widget.EvvmMsgDiago;
+import okhttp3.ResponseBody;
+
+
+public abstract class MyActivity extends UIActivity implements OnTitleBarListener, NetStateChangeObserver {
+
+    @Override
+    protected void initActivity() {
+        super.initActivity();
+        ActivityStackManager.getInstance().onActivityCreated(this);
+    }
+
+    // ButterKnife 注解
+    private Unbinder mButterKnife;
+
+    @Override
+    protected void initLayout() {
+        super.initLayout();
+
+        // 初始化标题栏的监听
+        if (getTitleId() > 0) {
+            if (findViewById(getTitleId()) instanceof TitleBar) {
+                ((TitleBar) findViewById(getTitleId())).setOnTitleBarListener(this);
+            }
+        }
+
+        mButterKnife = ButterKnife.bind(this);
+        EventBusManager.register(this);
+        initOrientation();
+    }
+
+    /**
+     * 初始化横竖屏方向,会和 LauncherTheme 主题样式有冲突,注意不要同时使用
+     */
+    protected void initOrientation() {
+        // 当前 Activity 不能是透明的并且没有指定屏幕方向,默认设置为竖屏
+        if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
+            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+        }
+    }
+
+    /**
+     * 设置标题栏的标题
+     */
+    @Override
+    public void setTitle(int titleId) {
+        setTitle(getText(titleId));
+    }
+
+    /**
+     * 设置标题栏的标题
+     */
+    @Override
+    public void setTitle(CharSequence title) {
+        super.setTitle(title);
+        TitleBar titleBar = getTitleBar();
+        if (titleBar != null) {
+            titleBar.setTitle(title);
+        }
+    }
+
+    @Nullable
+    public TitleBar getTitleBar() {
+        if (getTitleId() > 0 && findViewById(getTitleId()) instanceof TitleBar) {
+            return findViewById(getTitleId());
+        }
+        return null;
+    }
+
+    @Override
+    public boolean statusBarDarkFont() {
+        //返回true表示黑色字体
+        return true;
+    }
+
+    /**
+     * {@link OnTitleBarListener}
+     */
+
+    // TitleBar 左边的View被点击了
+    @Override
+    public void onLeftClick(View v) {
+        onBackPressed();
+    }
+
+    // TitleBar 中间的View被点击了
+    @Override
+    public void onTitleClick(View v) {
+    }
+
+    // TitleBar 右边的View被点击了
+    @Override
+    public void onRightClick(View v) {
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        //  UmengClient.onResume(this);
+        if (needRegisterNetworkChangeObserver()) {
+            NetStateChangeReceiver.registerObserver(this);
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        // UmengClient.onPause(this);
+        super.onPause();
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        if (needRegisterNetworkChangeObserver()) {
+            NetStateChangeReceiver.unregisterObserver(this);
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (mButterKnife != null) mButterKnife.unbind();
+        EventBusManager.unregister(this);
+        ActivityStackManager.getInstance().onActivityDestroyed(this);
+    }
+
+    private List<String> toastList = new ArrayList<>();
+
+    /**
+     * 显示吐司
+     */
+    public void toast(CharSequence s) {
+        // ToastUtils.show(s);
+
+        toastList.clear();
+        toastList.add(s.toString());
+        final BaseDialog show = new MenuDialog.Builder(this)
+                .setCancel(null) // 设置 null 表示不显示取消按钮
+                .setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .setList(toastList)
+                .setGravity(Gravity.BOTTOM)
+                .setAnimStyle(BaseDialog.AnimStyle.BOTTOM)
+                .show();
+
+        postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                show.dismiss();
+            }
+        }, 2000);
+    }
+
+    public void toast(@StringRes int id) {
+        ToastUtils.show(getString(id));
+    }
+
+    public void toast(Object object) {
+        ToastUtils.show(object);
+    }
+
+    /**
+     * 打印日志
+     */
+    public void log(Object object) {
+        if (DebugUtils.isDebug(this)) {
+            Log.v(getClass().getSimpleName(), object != null ? object.toString() : "null");
+        }
+    }
+
+    /**
+     * 获取当前的 Application 对象
+     */
+    public final MyApplication getMyApplication() {
+        return (MyApplication) getApplication();
+    }
+
+    private final StatusManager mStatusManager = new StatusManager();
+
+    /**
+     * 显示加载中
+     */
+    public void showLoading() {
+        mStatusManager.showLoading(this);
+    }
+
+    /**
+     * 显示加载完成
+     */
+    public void showComplete() {
+        mStatusManager.showComplete();
+    }
+
+    /**
+     * 显示空提示
+     */
+    public void showEmpty() {
+        mStatusManager.showEmpty(getContentView());
+    }
+
+    /**
+     * 显示错误提示
+     */
+    public void showError() {
+        mStatusManager.showError(getContentView());
+    }
+
+    /**
+     * 显示自定义提示
+     */
+    public void showLayout(@DrawableRes int iconId, @StringRes int textId) {
+        mStatusManager.showLayout(getContentView(), iconId, textId);
+    }
+
+    public void showLayout(Drawable drawable, CharSequence hint) {
+        mStatusManager.showLayout(getContentView(), drawable, hint);
+    }
+
+
+    /**
+     * 判断是否支持GPS和NFC功能
+     */
+    protected boolean checkGpsAndNfc() {
+        switch (NfcUtil.isOPen(MyActivity.this)) {
+            case 0:
+                toast("您的手机没有NFC功能, 不能使用");
+                return false;
+            case 1:
+                toast("NFC功能未开启");
+                return false;
+        }
+
+        if (!LocationUtils.isOPen(MyActivity.this)) {
+            toast("GPS功能未开启");
+            return false;
+        }
+        return true;
+    }
+
+    protected boolean needRegisterNetworkChangeObserver() {
+        return true;
+    }
+
+    @Override
+    public void onNetConnected(NetworkType networkType) {
+        //Log.e("NetConnected", getActivity().getComponentName().getClassName()+":网络已连接");
+        final List<NetReConnectEntity> netReConnectEntities = NetReConnectDaoOpe.queryAll(this);
+        if (netReConnectEntities.size() == 0) {
+            // toast("wu");
+            return;
+        }
+
+        for (int i = 0; i < netReConnectEntities.size(); i++) {
+            final NetReConnectEntity netReConnectEntity = netReConnectEntities.get(i);
+            Map<String, Object> mapFromJson = getMapFromJson(netReConnectEntity.getJsonmap());
+            final int finalI = i;
+            RxHttpUtils.createApi(ApiService.class)
+                    .netReConnect("" + netReConnectEntity.getInterfaceName(), "" + netReConnectEntity.getInterfaceUrl(), mapFromJson)
+                    .compose(Transformer.<ResponseBody>switchSchedulers())
+                    .subscribe(new CommonObserver<ResponseBody>() {
+
+                        @Override
+                        protected void onError(String errorMsg) {
+                            toast(errorMsg + "");
+                        }
+
+                        @Override
+                        protected void onSuccess(ResponseBody data) {
+                            NetReConnectDaoOpe.deleteByKeyData(getActivity(), netReConnectEntity.getId());
+                            try {
+                                String json = data.string();
+                                VerificationCodeBean verificationCodeBean = new Gson().fromJson(json, VerificationCodeBean.class);
+                                if (verificationCodeBean.getCode() != 200) {
+                                    toast(verificationCodeBean.getMsg());
+                                }
+                                Gson gson = new Gson();
+                                if (netReConnectEntity.getType() == 1) {
+                                    VnDetailBean vnDetailBean = gson.fromJson(json, VnDetailBean.class);
+                                    if (vnDetailBean.getData() != null) {
+                                        String vnDetailBeanTostr = new Gson().toJson(vnDetailBean);
+                                        NRCReportEntity nrcReportEntity = new NRCReportEntity();
+                                        nrcReportEntity.setVnDetailBean(vnDetailBeanTostr);
+                                        nrcReportEntity.setIsWarning(netReConnectEntity.getIsWarning());
+                                        NRCReportDaoOpe.insertData(getActivity(), nrcReportEntity);
+                                    }
+
+                                    Log.e("netReConnectEntity", "请求成功" + vnDetailBean.toString());
+                                } else if (netReConnectEntity.getType() == 2) {
+                                    VnListBean vnListBean = gson.fromJson(json, VnListBean.class);
+                                    Log.e("netReConnectEntity", "请求成功" + vnListBean.toString());
+                                }
+
+                                if (finalI == netReConnectEntities.size() - 1) {
+                                    Log.e("netReConnectEntity", "最后一条");
+                                    List<NRCReportEntity> nrcReportEntities = NRCReportDaoOpe.queryAll(getActivity());
+                                    if (nrcReportEntities.size() > 0) {
+                                        VnDetailBean vnDetailBean = new Gson().fromJson(nrcReportEntities.get(0).getVnDetailBean(), VnDetailBean.class);
+                                        Intent in = new Intent(getActivity(), VnReportDetailForNctActivity.class);
+                                        in.putExtra("dataBean", vnDetailBean.getData());
+                                        in.putExtra("isWarning", nrcReportEntities.get(0).getIsWarning());
+                                        in.putExtra("status", vnDetailBean.getData().getStatus());
+                                        startActivity(in);
+                                    }
+
+                                }
+                            } catch (IOException e) {
+                                e.printStackTrace();
+                            }
+
+                        }
+                    });
+        }
+    }
+
+
+    @Override
+    public void onNetDisconnected() {
+        showNetDialog();
+    }
+
+    /**
+     * map转string
+     *
+     * @param jsonString
+     * @return
+     */
+    public Map<String, Object> getMapFromJson(String jsonString) {
+        Map map = new Gson().fromJson(jsonString, Map.class);
+        return map;
+    }
+
+    /**
+     * string转map
+     *
+     * @param map
+     * @return
+     */
+    public String mapToJson(Map<String, Object> map) {
+        String jsonString = new Gson().toJson(map);
+        return jsonString;
+    }
+
+    /**
+     * 弹出设置网络框
+     */
+    private void showNetDialog() {
+        //退出的操作
+        new EvvmMsgDiago.Builder(getActivity())
+                .setTitle("网络异常") // 标题可以不用填写
+                .setConfirm("设置")
+                .setCancel("取消") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .setListener(new EvvmMsgDiago.OnListener() {
+
+                    @Override
+                    public void onConfirm(Dialog dialog) {
+                        Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
+                        startActivity(intent);
+                    }
+
+                    @Override
+                    public void onCancel(Dialog dialog) {
+                        //toast("取消了");
+                    }
+                })
+                .show();
+    }
+}

+ 70 - 0
.svn/pristine/02/02d8ff118a3a1e6bdbb7589cf71022ba49681379.svn-base

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="eVVM.apk">
+
+    <uses-permission android:name="android.permission.READ_SMS" /> <!-- 阅读消息 -->
+    <uses-permission android:name="android.permission.RECEIVE_SMS" /> <!-- 接收消息 -->
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 外部存储读写权限 -->
+    <uses-permission android:name="android.permission.VIBRATE" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.CAMERA" /> <!-- 拍照权限 -->
+    <uses-permission android:name="android.permission.INTERNET" /> <!-- 联网权限 -->
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 访问当前网络状态权限 -->
+    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
+
+    <application
+        android:name=".app.MyApplication"
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:networkSecurityConfig="@xml/network_security_config"
+        android:roundIcon="@mipmap/ic_launcher_round"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme"
+        android:usesCleartextTraffic="true"
+        tools:targetApi="n">
+        <activity android:name=".ui.home.FactoryOperatorActivity"></activity>
+        <activity android:name=".ui.first.ReadingActivity" />
+        <activity android:name=".ui.My.ExamineActivity" />
+        <activity android:name=".ui.launcher.LikeActivity" />
+        <activity android:name=".ui.login.AuthenticationActivity" />
+        <activity android:name=".ui.first.InoculationRegistActivity" />
+        <activity android:name=".ui.first.QrCodeActivity" />
+        <activity android:name=".ui.My.InformationActivity" />
+        <activity android:name=".ui.My.AboutActivity" />
+
+        <meta-data
+            android:name="design_width_in_dp"
+            android:value="360" />
+        <meta-data
+            android:name="design_height_in_dp"
+            android:value="640" /> <!-- 适配Android 7.0文件意图 -->
+        <provider
+            android:name="android.support.v4.content.FileProvider"
+            android:authorities="${applicationId}.provider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths" />
+        </provider>
+
+        <activity android:name=".MainActivity" />
+        <activity android:name=".ui.launcher.LauncherActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".ui.login.RegisterActivity" />
+        <activity android:name=".ui.login.PasswordForgetActivity" />
+        <activity android:name=".ui.login.LoginActivity" /> <!-- 主页界面 -->
+        <activity
+            android:name=".ui.home.HomeActivity"
+            android:alwaysRetainTaskState="true"
+            android:launchMode="singleTask" />
+    </application>
+
+</manifest>

+ 114 - 0
.svn/pristine/03/031aa9ae6a7446f66ecc3c71ff8944ab9ab384ef.svn-base

@@ -0,0 +1,114 @@
+package eVVM.apk.ui.My;
+
+import android.graphics.Color;
+import android.os.Bundle;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.style.ForegroundColorSpan;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.common.MyActivity;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.My.examine.ExamineContract;
+import eVVM.apk.ui.My.examine.ExaminePresenter;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+
+public class ExamineActivity extends MvpActivity<ExaminePresenter> implements ExamineContract.View {
+
+
+    @BindView(R.id.examine_iv)
+    ImageView examineIv;
+    @BindView(R.id.examine_tv)
+    TextView examineTv;
+    @BindView(R.id.examine_cb_agree)
+    CheckBox examineCbAgree;
+    @BindView(R.id.examine_tv_protocol)
+    TextView examineTvProtocol;
+    @BindView(R.id.examine_btn_true)
+    Button examineBtnTrue;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_examine;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return 0;
+    }
+
+    @Override
+    protected void initView() {
+        //设置用户协议
+        toProtocol();
+
+        examineBtnTrue.setEnabled(false);
+
+        //设置 button的状态
+        getBtnStact();
+    }
+
+    private void toProtocol() {
+        SpannableStringBuilder builder = new SpannableStringBuilder(examineTvProtocol.getText().toString());
+        ForegroundColorSpan blueSpan = new ForegroundColorSpan(Color.BLUE);
+        //UnderlineSpan lineSpan = new UnderlineSpan();
+        // builder.setSpan(lineSpan,8,16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //下划线
+        builder.setSpan(blueSpan, 9, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //字体颜色
+
+        examineTvProtocol.setText(builder);
+    }
+
+    private void getBtnStact() {
+        examineCbAgree.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+                if (b) {
+                    examineBtnTrue.setEnabled(true);
+                } else {
+                    //forgetBtnLogin.setClickable(false);
+                    examineBtnTrue.setEnabled(false);
+                }
+            }
+        });
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+
+    @OnClick(R.id.examine_btn_true)
+    public void onViewClicked() {
+        String user_id = (String) SPUtils.get("USER_ID", "");
+        getPresenter().agreeProtocol(user_id + "");
+    }
+
+    @Override
+    protected ExaminePresenter createPresenter() {
+        return new ExaminePresenter();
+    }
+
+    @Override
+    public void agreeError(String msg) {
+
+        toast(msg);
+    }
+
+    @Override
+    public void agreeSuccess(VerificationCodeBean data) {
+
+        toast("认证成功,请进行登录");
+        finish();
+    }
+}

+ 843 - 0
.svn/pristine/03/032242a12b8fbccc003bf8194f38d90a60f3d641.svn-base

@@ -0,0 +1,843 @@
+package eVVM.apk.ui.vaccination;
+
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.annotation.SuppressLint;
+import android.app.Dialog;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Message;
+import android.support.annotation.RequiresApi;
+import android.text.SpannableString;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.text.style.SuperscriptSpan;
+import android.util.Log;
+import android.view.View;
+import android.view.animation.Animation;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.hjq.base.BaseDialog;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+
+import java.lang.ref.WeakReference;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.ActivityStackManager;
+import eVVM.apk.helper.MyClickListener;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.helper.SoundPoolHelper;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.bean.ModelListBean;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+import eVVM.apk.ui.bean.VnDetailBean;
+import eVVM.apk.ui.home.HomeActivity;
+import eVVM.apk.ui.report.vndetail.VnDetailContract;
+import eVVM.apk.ui.report.vndetail.VnDetailPresenter;
+import eVVM.apk.ui.webview.WebActivity;
+import eVVM.apk.widget.EvvmMsgDiago;
+import eVVM.apk.widget.ZoomView;
+
+public class VnReportDetailForDoctorActivity extends MvpActivity<VnDetailPresenter> implements VnDetailContract.View, MyClickListener.MyClickCallBack {
+
+
+    @BindView(R.id.vndetail_tv_vnname)
+    TextView vndetailTvVnname;
+    @BindView(R.id.vndetail_tv_vnsc)
+    TextView vndetailTvVnsc;
+    @BindView(R.id.vndetail_tv_vncreatdate)
+    TextView vndetailTvVncreatdate;
+    @BindView(R.id.vndetail_tv_vnvalid)
+    TextView vndetailTvVnvalid;
+    @BindView(R.id.renyuan_type)
+    TextView renyuanType;
+    @BindView(R.id.vndetail_tv_szname)
+    TextView vndetailTvSzname;
+    @BindView(R.id.vndetail_tv_szsex)
+    TextView vndetailTvSzsex;
+    @BindView(R.id.vndetail_tv_szbirthday)
+    TextView vndetailTvSzbirthday;
+    @BindView(R.id.vndetail_tv_szid)
+    TextView vndetailTvSzid;
+    @BindView(R.id.vndetail_tv_szguardian)
+    TextView vndetailTvSzguardian;
+    @BindView(R.id.shouzhongrenyuan)
+    LinearLayout shouzhongrenyuan;
+    @BindView(R.id.jiezhognrenyuan)
+    LinearLayout jiezhognrenyuan;
+    @BindView(R.id.vndetail_tv_szTelephone)
+    TextView vndetailTvSzTelephone;
+    private boolean isWarning = true;
+    private VnDetailBean.DataBean chipModel = null;
+    private SoundPoolHelper soundPoolHelper;
+
+    @BindView(R.id.vndetail_tv_typemsg)
+    TextView vndetailTvTypemsg;
+    @BindView(R.id.vndetail_tv_vncode)
+    TextView vndetailTvVncode;
+    @BindView(R.id.vndetail_tv_vndate)
+    TextView vndetailTvVndate;
+    @BindView(R.id.vndetail_tv_factoryName)
+    TextView vndetailTvFactoryName;
+    @BindView(R.id.vndetail_tv_gmpName)
+    TextView vndetailTvGmpName;
+    @BindView(R.id.vndetail_tv_gmpPath)
+    TextView vndetailTvGmpPath;
+    @BindView(R.id.vndetail_tv_hospitalName)
+    TextView vndetailTvHospitalName;
+    @BindView(R.id.vndetail_tv_doctorName)
+    TextView vndetailTvDoctorName;
+    @BindView(R.id.vndetail_tv_doctorTelephone)
+    TextView vndetailTvDoctorTelephone;
+    @BindView(R.id.vndetail_tv_chatImage)
+    ImageView vndetailTvChatImage;
+    @BindView(R.id.vndetail_tv_othervn1)
+    TextView vndetailTvOthervn1;
+    @BindView(R.id.vndetail_tv_othervn2)
+    TextView vndetailTvOthervn2;
+    @BindView(R.id.vndetail_tv_othervn3)
+    TextView vndetailTvOthervn3;
+    @BindView(R.id.vndetail_iv_tipsimg)
+    ImageView vndetailIvTipsimg;
+    @BindView(R.id.vndetail_tv_tips)
+    TextView vndetailTvTips;
+    @BindView(R.id.vndetail_tv_disclaimer)
+    TextView vndetailTvDisclaimer;
+    @BindView(R.id.zv_report)
+    ZoomView myzoomview;
+    @BindView(R.id.vndetail_tv_chatImage_title)
+    TextView vndetail_tv_chatImage_title;
+    @BindView(R.id.coverview)
+    TextView coverview;
+    @BindView(R.id.vndetail_tv_tt)
+    TextView vndetailTvTitle;
+    @BindView(R.id.vndetail_tv_title)
+    TextView vndetailTvtt;
+    private int status;
+
+    private List<TextView> textViews;
+    private List<TextView> yujingList;
+    private List<TextView> vntextviewList;
+    private List<TextView> zcList;
+
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_vn_report_detail_for_doctor;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.tb_vndetail_title;
+    }
+
+    @Override
+    protected void initView() {
+        myzoomview.setOnTouchListener(new MyClickListener(this));
+        soundPoolHelper = new SoundPoolHelper(4, SoundPoolHelper.TYPE_MUSIC)
+                .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC)
+                .loadDefault(VnReportDetailForDoctorActivity.this)
+                .load(VnReportDetailForDoctorActivity.this, "rewarning", R.raw.rewarning)
+                .load(VnReportDetailForDoctorActivity.this, "renormal", R.raw.renormal);
+        //设置上标
+        SpannableStringBuilder spanBuilder = new SpannableStringBuilder(vndetailTvtt.getText());
+        spanBuilder.setSpan(new SuperscriptSpan(), 5, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvtt.setText(spanBuilder);
+        textViews = new ArrayList<>();
+
+        //左边的
+        vntextviewList = new ArrayList<>();
+        vntextviewList.add(vndetailTvVnname);
+        vntextviewList.add(vndetailTvVnsc);
+        vntextviewList.add(vndetailTvFactoryName);
+        vntextviewList.add(vndetailTvGmpName);
+        vntextviewList.add(vndetailTvGmpPath);
+        vntextviewList.add(vndetailTvVncreatdate);
+        vntextviewList.add(vndetailTvVnvalid);
+
+        //不正常
+        yujingList = new ArrayList<>();
+        yujingList.add(vndetailTvHospitalName);
+        yujingList.add(vndetailTvDoctorName);
+        yujingList.add(vndetailTvDoctorTelephone);
+
+        //正常
+        zcList = new ArrayList<>();
+        zcList.add(vndetailTvSzname);
+        zcList.add(vndetailTvSzsex);
+        zcList.add(vndetailTvSzbirthday);
+        zcList.add(vndetailTvSzid);
+        zcList.add(vndetailTvSzguardian);
+        zcList.add(vndetailTvSzTelephone);
+    }
+
+    @Override
+    public void onLeftClick(View v) {
+        super.onLeftClick(v);
+        if (status == 6 || status == 7) {
+            startActivityFinish(HomeActivity.class);
+            ActivityStackManager.getInstance().finishAllActivities(HomeActivity.class);
+        } else {
+
+        }
+    }
+
+    @OnClick({R.id.next_btn_report, R.id.vndetail_bt_magnifier})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.next_btn_report:
+
+                if (status == 4 || status == 8) {
+                    startActivityFinish(ReadingActivity.class);
+                } else {
+                    if (status == 6 || status == 7) {
+                        startActivityFinish(HomeActivity.class);
+                        ActivityStackManager.getInstance().finishAllActivities(HomeActivity.class);
+                    }
+                }
+
+                break;
+            case R.id.vndetail_bt_magnifier:
+                //放大
+                myzoomview.magnifier();
+                break;
+        }
+    }
+
+
+    private static class WarningHandler extends Handler {
+        private WeakReference<VnReportDetailForDoctorActivity> wactivity;
+
+        public WarningHandler(VnReportDetailForDoctorActivity activity) {
+            wactivity = new WeakReference<VnReportDetailForDoctorActivity>(activity);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+        }
+    }
+
+    private WarningHandler warninghandler = new WarningHandler(this);
+
+    private static class NormalHandler extends Handler {
+        private WeakReference<VnReportDetailForDoctorActivity> wactivity;
+
+        public NormalHandler(VnReportDetailForDoctorActivity activity) {
+            wactivity = new WeakReference<VnReportDetailForDoctorActivity>(activity);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+        }
+    }
+
+    private NormalHandler normalhandler = new NormalHandler(this);
+
+
+    private static class PDFHandler extends Handler {
+        private WeakReference<VnReportDetailForDoctorActivity> wactivity;
+
+        public PDFHandler(VnReportDetailForDoctorActivity activity) {
+            wactivity = new WeakReference<VnReportDetailForDoctorActivity>(activity);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+        }
+    }
+
+    private PDFHandler pdfhandler = new PDFHandler(this);
+
+
+    private Runnable warningRunnable = new Runnable() {
+        @Override
+        public void run() {
+            //用户2秒没操作了
+            Log.e("DoctorVnReportActivity", "两秒未操作");
+            //startActivityFinish(ReadingActivity.class);
+        }
+    };
+    private Runnable normalRunnable = new Runnable() {
+        @Override
+        public void run() {
+            //用户2秒没操作了
+            Log.e("DoctorVnReportActivity", "两秒未操作");
+            finish();
+        }
+    };
+    private Runnable pdfRunnable = new Runnable() {
+        @Override
+        public void run() {
+            getnormalOper();
+        }
+    };
+
+    private int checki = 1;
+
+    @SuppressLint("WrongConstant")
+    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+    @Override
+    protected void initData() {
+        Intent in = getIntent();
+        chipModel = (VnDetailBean.DataBean) in.getSerializableExtra("dataBean");
+        //给页面赋值
+        setViewData(chipModel);
+        isWarning = in.getBooleanExtra("isWarning", true);
+
+        status = in.getIntExtra("status", 0);
+        textViews.clear();
+        if (status == 4) {
+            renyuanType.setText("接种人员");
+            shouzhongrenyuan.setVisibility(View.GONE);
+            jiezhognrenyuan.setVisibility(View.VISIBLE);
+            textViews.addAll(vntextviewList);
+            textViews.addAll(yujingList);
+        } else {
+            if (status == 6 || status == 7) {
+                renyuanType.setText("受种人员");
+                shouzhongrenyuan.setVisibility(View.VISIBLE);
+                jiezhognrenyuan.setVisibility(View.GONE);
+                textViews.addAll(vntextviewList);
+                textViews.addAll(zcList);
+            } else if (status == 8) {
+                renyuanType.setText("接种人员");
+                shouzhongrenyuan.setVisibility(View.GONE);
+                jiezhognrenyuan.setVisibility(View.VISIBLE);
+                textViews.addAll(vntextviewList);
+                textViews.addAll(yujingList);
+            }
+        }
+
+        textJump(textViews); //开始字符跳动
+
+        //设置验证信息
+        vndetailTvChatImage.setImageResource(R.mipmap.report_check_ico);
+        vndetailTvTypemsg.setText("疫苗企业验证通过");
+        //透明动画
+        ObjectAnimator animator = ObjectAnimator.ofFloat(vndetailTvChatImage, "alpha", 0.1f, 1f);
+        animator.setDuration(300); //一秒闪一次
+        animator.setRepeatCount(10); //总共闪十次
+        animator.setRepeatMode(Animation.REVERSE);
+        //为动画设置监听
+        animator.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                //动画结束
+                animation.resume();
+                /*AlphaAnimation alpha = new AlphaAnimation(0.1F, 1F);
+                alpha.setDuration(0);
+                alpha.setFillAfter(true);
+                vndetailTvChatImage.startAnimation(alpha);*/
+                setPageView(); //设置扫描到的信息
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+                //动画重复时  下方进行验证提示
+                //Log.e("onAnimationRepeat","onAnimationRepeat");
+                checki++;
+                setCheckText(checki);
+            }
+        });
+        animator.start();
+
+    }
+
+    private void setCheckText(int checki) {
+        switch (checki) {
+            case 1:
+                vndetailTvTypemsg.setText("疫苗企业验证通过");
+                break;
+            case 2:
+                vndetailTvTypemsg.setText("疫苗品种验证通过");
+                break;
+            case 3:
+                vndetailTvTypemsg.setText("疫苗规格验证通过");
+                break;
+            case 4:
+                vndetailTvTypemsg.setText("疫苗id验证通过");
+                break;
+            case 5:
+                vndetailTvTypemsg.setText("疫苗冷链验证通过");
+                break;
+            case 6:
+                vndetailTvTypemsg.setText("接种点验证通过");
+                break;
+            case 7:
+                vndetailTvTypemsg.setText("医生验证通过");
+                break;
+            case 8:
+                vndetailTvTypemsg.setText("受种者姓名验证通过");
+                break;
+            case 9:
+                vndetailTvTypemsg.setText("受种者年龄验证通过");
+                break;
+            case 10:
+                vndetailTvTypemsg.setText("受种者性别验证通过");
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void setPageView() {
+        if (status == 4 || status == 8) {
+            findViewById(R.id.btn_ll).setVisibility(View.VISIBLE);
+            vndetailTvTypemsg.setText("此疫苗需要进一步验证,请等待厂家复核");
+            //vndetailTvTypemsg.setTextColor(Color.RED);
+            vndetailTvChatImage.setImageResource(R.mipmap.report_warning_ico);
+            coverview.setText("提示:温度追溯结果显示,该疫苗冷链可能有超温现象,厂家已收到相关信息。请立即停止使用该疫苗,等待复核结果。");
+            //播放提示语
+            postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    soundPoolHelper.play("rewarning", false);
+                }
+            }, 500);
+
+            getWarningOper();
+        } else {
+            if (status == 6 || status == 7) {
+                findViewById(R.id.btn_ll).setVisibility(View.VISIBLE);
+                vndetailTvTypemsg.setText(
+                        "疫苗信息已验证通过,冷链信息未发现异常,请核对疫苗内外包装与本报告所载数据是否一致,并按\"三查七对\"的规定使用");
+                //vndetailTvTypemsg.setTextColor(Color.GREEN);
+                vndetailTvChatImage.setImageResource(R.mipmap.report_normal_ico);
+                /*vndetailTvChatImage.setVisibility(View.GONE);
+                vndetail_tv_chatImage_title.setVisibility(View.GONE);*/
+                coverview.setText("提示:注射疫苗后,请用注射专用创口贴或消毒棉球轻压针眼几分钟,至不出血。请勿揉搓接种部位。接种疫苗后休息30分钟再离开。");
+
+                pdfhandler.postDelayed(pdfRunnable, 1000 * 20);
+                normalhandler.postDelayed(normalRunnable, 1000 * 60);
+            }/* else if (status == 8) {
+                vndetailTvTypemsg.setText("此疫苗需要进一步验证,请等待厂家复核");
+                vndetailTvTypemsg.setTextColor(Color.RED);
+                vndetailTvChatImage.setImageResource(R.mipmap.report_warning_ico);
+                coverview.setText("提示:温度追溯结果显示,该疫苗冷链可能有超温现象,厂家已收到相关信息。请立即停止使用该疫苗,等待复核结果。");
+                postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        soundPoolHelper.play("rewarning", false);
+                    }
+                }, 500);
+                normalhandler.postDelayed(normalRunnable, 1000 * 60);
+            }*/
+        }
+    }
+
+    private void getnormalOper() {
+        postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                soundPoolHelper.play("renormal", false);
+            }
+        }, 500);
+        final BaseDialog normalDiago = new EvvmMsgDiago.Builder(this)
+                .setTitle("pdf报告已自动保存到你指定的路径,医生已做好“三查七对”,并按规定完成接种,是否推送给受种者(监护人)?") // 标题可以不用填写
+                .setConfirm("发送给家长")
+                .setCancel("取消") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .setListener(new EvvmMsgDiago.OnListener() {
+
+                    @Override
+                    public void onConfirm(Dialog dialog) {
+                        String emailsOfInoculator = "";
+                        try {
+                            String str = (String) SPUtils.get("INOCULATOR_LIST", "");
+                            if (!str.equals("")) {
+                                JSONArray jsonArr = new JSONArray(str);
+                                for (int i = 0; i < jsonArr.length(); i++) {
+                                    String arr[] = jsonArr.getString(i).split("▇");
+                                    if (!arr[3].trim().equals("")) {
+                                        emailsOfInoculator += arr[3] + ",";
+                                    }
+                                }
+                                if (emailsOfInoculator.lastIndexOf(",") == emailsOfInoculator.length() - 1) {
+                                    emailsOfInoculator = emailsOfInoculator.substring(0, emailsOfInoculator.length() - 1);
+                                }
+                            }
+                        } catch (JSONException e) {
+                            e.printStackTrace();
+                        }
+
+                        getPresenter().sendMailToInoculator(chipModel.getChipNumber(), emailsOfInoculator);
+                    }
+
+                    @Override
+                    public void onCancel(Dialog dialog) {
+                        //toast("取消了");
+                    }
+                })
+                .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                    @Override
+                    public void onDismiss(BaseDialog dialog) {
+                        //toast("asfad");
+
+                    }
+                })
+                .show();
+
+        postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                if (normalDiago.isShowing()) {
+                    normalDiago.dismiss();
+                }
+            }
+        }, 30000);
+    }
+
+    private void getWarningOper() {
+        final BaseDialog warningDiago = new EvvmMsgDiago.Builder(this)
+                .setTitle("此疫苗需复核,请换支疫苗") // 标题可以不用填写
+                .setConfirm("")
+                .setCancel("") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                    @Override
+                    public void onDismiss(BaseDialog dialog) {
+                        //toast("asfad");
+                        //warninghandler.postDelayed(warningRunnable, 1000 * 10);
+                    }
+                })
+                .show();
+        postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                if (warningDiago.isShowing()) {
+                    warningDiago.dismiss();
+                }
+            }
+        }, 5000);
+    }
+
+    private void setViewData(final VnDetailBean.DataBean dataBean) {
+        vndetailTvTitle.setText(dataBean.getVaccineName() + "" + dataBean.getBatch());
+        vndetailTvSzname.setText(TextUtils.isEmpty(dataBean.getInoculatroUserName()) ? "N/A" : "" + dataBean.getInoculatroUserName());
+        vndetailTvSzsex.setText(TextUtils.isEmpty(dataBean.getInoculatroSex()) ? "N/A" : "" + dataBean.getInoculatroSex());
+        vndetailTvSzbirthday.setText(TextUtils.isEmpty(dataBean.getInoculatroBirthdate()) ? "N/A" : "" + dataBean.getInoculatroBirthdate());
+        vndetailTvSzid.setText(addZero(dataBean.getInoculatroId()));
+        vndetailTvSzguardian.setText("N/A");
+        vndetailTvSzTelephone.setText(TextUtils.isEmpty(dataBean.getInoculatroTelePhone()) ? "N/A" : "" + dataBean.getInoculatroTelePhone());
+
+        vndetailTvVnname.setText(TextUtils.isEmpty(dataBean.getVaccineName()) ? "N/A" : dataBean.getVaccineName() + "");
+        vndetailTvVnsc.setText(TextUtils.isEmpty(dataBean.getVaccineCategory()) ? "N/A" : dataBean.getVaccineCategory() + "");
+        vndetailTvVncreatdate.setText(TextUtils.isEmpty(dataBean.getBeginDate()) ? "N/A" : dataBean.getBeginDate() + "");
+        vndetailTvVnvalid.setText(TextUtils.isEmpty(dataBean.getVaccineExpiryDate()) ? "N/A" : dataBean.getVaccineExpiryDate());
+
+
+        //vndetailTvVncode.setText("evvm Code " + dataBean.getCode());
+     /*   String codeStr = "";
+        for (int i = 0; i < dataBean.getCodeX().length(); i++) {
+            codeStr = codeStr + "*";
+        }*/
+       /* SpannableString spancode = new SpannableString("报告编号 " + dataBean.getCodeX());
+        spancode.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                *//*if (dataBean.getCodeX() == null || TextUtils.isEmpty(dataBean.getCodeX())) {
+                    toast("你没有授权,请进行注册");
+                } else {
+                    gotoWebActivity(dataBean.getCodeX());
+                }*//*
+            }
+        }, 5, 5 + dataBean.getCodeX().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);*/
+        vndetailTvVncode.setText("报告编号 " + dataBean.getCodeX());
+        //vndetailTvVncode.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+        vndetailTvVndate.setText(format1.format(new Date()));
+        vndetailTvFactoryName.setText("" + dataBean.getFactoryName());
+        vndetailTvHospitalName.setText("" + dataBean.getHospitalName());
+        vndetailTvDoctorName.setText("" + dataBean.getDoctorName());
+        vndetailTvDoctorTelephone.setText("" + dataBean.getDoctorTelephone());
+        vndetailTvChatImage.setScaleType(ImageView.ScaleType.CENTER);
+
+       /* SpannableString spanGmpPath = new SpannableString(TextUtils.isEmpty(dataBean.getGmpName()) ? "N/A" : dataBean.getGmpName());
+        spanGmpPath.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getGmpPath() == null || TextUtils.isEmpty(dataBean.getGmpPath())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getGmpPath());
+
+                }
+            }
+        }, 0, spanGmpPath.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);*/
+        vndetailTvGmpName.setText(TextUtils.isEmpty(dataBean.getGmpName()) ? "N/A" : dataBean.getGmpName());
+        //vndetailTvGmpName.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn0 = new SpannableString("点击查看");
+        spanvndetailTvOthervn0.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getBatchCertificate() == null || TextUtils.isEmpty(dataBean.getBatchCertificate())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getBatchCertificate());
+                }
+            }
+        }, 0, spanvndetailTvOthervn0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvGmpPath.setText(spanvndetailTvOthervn0);
+        vndetailTvGmpPath.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn1 = new SpannableString("点击查询");
+        spanvndetailTvOthervn1.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameBatchOtherColdChain() == null || TextUtils.isEmpty(dataBean.getSameBatchOtherColdChain())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getSameBatchOtherColdChain());
+                }
+            }
+        }, 0, spanvndetailTvOthervn1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn1.setText(spanvndetailTvOthervn1);
+        vndetailTvOthervn1.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+
+        SpannableString spanvndetailTvOthervn2 = new SpannableString("点击查询");
+        spanvndetailTvOthervn2.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameBatchOtherFlow() == null || TextUtils.isEmpty(dataBean.getSameBatchOtherFlow())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getSameBatchOtherFlow());
+                }
+            }
+        }, 0, spanvndetailTvOthervn2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn2.setText(spanvndetailTvOthervn2);
+        vndetailTvOthervn2.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn3 = new SpannableString("点击查询");
+        spanvndetailTvOthervn3.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameFactoryOtherVaccines() == null || TextUtils.isEmpty(dataBean.getSameFactoryOtherVaccines())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getSameFactoryOtherVaccines());
+
+                }
+            }
+        }, 0, spanvndetailTvOthervn3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn3.setText(spanvndetailTvOthervn3);
+        vndetailTvOthervn3.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+    }
+
+    private void gotoWebActivity(String path) {
+        if (isWarning) {
+            warninghandler.removeCallbacks(warningRunnable);
+        } else {
+            normalhandler.removeCallbacks(normalRunnable);
+        }
+        Intent in = new Intent(VnReportDetailForDoctorActivity.this, WebActivity.class);
+        in.putExtra("WebViewUrl", "" + path + "");
+        startActivity(in);
+    }
+
+    @Override
+    protected VnDetailPresenter createPresenter() {
+        return new VnDetailPresenter();
+    }
+
+    @Override
+    public void getSendMailSuccess(VnDetailBean data) {
+        toast("邮件已发送");
+        //finish();
+    }
+
+    @Override
+    public void getmlistError(String msg) {
+        toast("邮件发送失败");
+    }
+
+    @Override
+    public void getmlistSuccess(ModelListBean data) {
+
+    }
+
+    @Override
+    public void getToReviewError(String msg) {
+
+    }
+
+    @Override
+    public void getToReviewSuccess(VerificationCodeBean data) {
+
+    }
+
+    @Override
+    public void getDetailError(String msg) {
+
+    }
+
+    @Override
+    public void getDetailSuccess(VnDetailBean data) {
+
+    }
+
+    @Override
+    public void getSendMailError(String msg) {
+        toast(msg);
+    }
+
+
+    public String addZero(String msg) {
+        //Log.e("addZero1",""+msg + "  "+msg.length());
+        if (TextUtils.isEmpty(msg)) {
+            return "N/A";
+        }
+        if (msg.length() >= 11) {
+            return msg;
+        } else {
+            String remsg = msg;
+            for (int i = 0; i < 11 - msg.length(); i++) {
+                remsg = "0" + remsg;
+            }
+            // Log.e("addZero",""+remsg + "  "+remsg.length());
+            return remsg;
+        }
+    }
+
+    public static void i(String tag, String msg) {  //信息太长,分段打印
+        //因为String的length是字符数量不是字节数量所以为了防止中文字符过多,
+        //  把4*1024的MAX字节打印长度改为2001字符数
+        int max_str_length = 2001 - tag.length();
+        //大于4000时
+        while (msg.length() > max_str_length) {
+            Log.i(tag, msg.substring(0, max_str_length));
+            msg = msg.substring(max_str_length);
+        }
+        //剩余部分
+        Log.i(tag, msg);
+
+    }
+
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        if (isFinishing()) {
+            if (pdfhandler != null) {
+                pdfhandler.removeCallbacks(pdfRunnable);
+            }
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+
+        if (status == 6 || status == 7 || status == 8) {
+            SPUtils.remove("INOCULATOR_LIST");
+        }
+        // soundPoolHelper.release();
+        if (normalhandler != null) {
+            normalhandler.removeCallbacksAndMessages(null);
+        }
+        if (warninghandler != null) {
+            warninghandler.removeCallbacksAndMessages(null);
+        }
+        if (pdfhandler != null) {
+            pdfhandler.removeCallbacks(pdfRunnable);
+        }
+
+    }
+
+    @Override
+    public void onDown() {
+        Log.e("DoctorVnReportActivity", "down");
+        if (isWarning) {
+            if (warninghandler != null) {
+                warninghandler.removeCallbacks(warningRunnable);
+            }
+        } else {
+            if (normalhandler != null) {
+                normalhandler.removeCallbacks(normalRunnable);
+            }
+        }
+    }
+
+    @Override
+    public void onUp() {
+        Log.e("DoctorVnReportActivity", "up");
+        if (isWarning) {
+            warninghandler.postDelayed(warningRunnable, 1000 * 60);
+        } else {
+            normalhandler.postDelayed(normalRunnable, 1000 * 60);
+        }
+    }
+
+    @Override
+    public void oneClick() {
+
+    }
+
+    @Override
+    public void doubleClick() {
+
+    }
+
+
+    public void textJump(final List<TextView> tvList) {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                for (int i = 0; i < tvList.size(); i++) {
+                    try {
+                        Thread.sleep(3000 / tvList.size());
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                    final int finalI = i;
+                    if (getActivity() != null) {
+                        runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                tvList.get(finalI).setVisibility(View.VISIBLE);
+                            }
+                        });
+                    }
+                }
+            }
+        }).start();
+    }
+}

BIN
.svn/pristine/03/035cb40647d98611f6aead224433c19941f251c9.svn-base


+ 159 - 0
.svn/pristine/03/0381131f09500039b734ebe2ba53df11ecb23115.svn-base

@@ -0,0 +1,159 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion rootProject.ext.compileSdkVersion
+    buildToolsVersion rootProject.ext.buildToolsVersion
+    defaultConfig {
+        applicationId "eVVM.apk"
+        minSdkVersion 15
+        targetSdkVersion rootProject.ext.targetSdkVersion
+        versionCode 1
+        versionName "1.0"
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
+        javaCompileOptions {
+            annotationProcessorOptions {
+                // EventBus Apt 索引类生成位置
+                arguments = [eventBusIndex: applicationId + '.MyEventBusIndex']
+            }
+        }
+
+        ndk {
+            //选择要添加的对应 cpu 类型的 .so 库。
+            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
+            // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
+        }
+
+        manifestPlaceholders = [
+                JPUSH_PKGNAME: applicationId,
+                JPUSH_APPKEY : "a34cef708ddaa15e2d8367f0", //JPush 上注册的包名对应的 Appkey.
+                JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
+        ]
+    }
+
+    packagingOptions {
+        doNotStrip '*/mips/*.so'
+        doNotStrip '*/mips64/*.so'
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+
+    // JNI 目录
+    sourceSets {
+        main {
+            jniLibs.srcDirs = ['libs']
+        }
+    }
+
+}
+
+dependencies {
+    // 依赖 libs 目录下所有 jar 包
+    implementation fileTree(include: ['*.jar'], dir: 'libs')
+    // 依赖 libs 目录下所有 aar 包
+    implementation fileTree(include: ['*.aar'], dir: 'libs')
+
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+    // 基础库(不包任何第三方框架)
+    implementation project(':base')
+    // 自定义 View
+    implementation project(':widget')
+    // Dialog 封装
+    implementation project(':dialog')
+    // Glide 隔离
+    implementation project(':image')
+
+    implementation 'com.android.support:appcompat-v7:28.0.0'
+    implementation 'com.android.support:support-v4:28.0.0'
+    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+
+    implementation 'com.android.support:appcompat-v7:28.0.0'
+    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+    implementation "com.android.support:design:$rootProject.ext.supportLibraryVersion"
+
+    // Dex分包,解决 64k 问题
+    implementation 'com.android.support:multidex:1.0.3'
+
+    // ButterKnife 注解库:https://github.com/JakeWharton/butterknife
+    implementation 'com.jakewharton:butterknife:9.0.0-rc1'
+    annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'
+
+    // EventBus 事件总线
+    implementation "org.greenrobot:eventbus:3.1.1"
+    annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
+
+    //recyclerview
+    implementation 'com.android.support:appcompat-v7:28.0.0-alpha1'
+    implementation 'com.android.support:recyclerview-v7:28.0.0-alpha1'
+
+    // 状态栏沉浸:https://github.com/gyf-dev/ImmersionBar
+    implementation 'com.gyf.immersionbar:immersionbar:2.3.3'
+    // 侧滑功能:https://github.com/bingoogolapple/BGASwipeBackLayout-Android
+    implementation 'cn.bingoogolapple:bga-swipebacklayout:1.2.0'
+
+    // 权限请求框架:https://github.com/getActivity/XXPermissions
+    implementation 'com.hjq:xxpermissions:5.5'
+    // 标题栏:https://github.com/getActivity/TitleBar
+    implementation 'com.hjq:titlebar:5.0'
+    // 吐司工具类:https://github.com/getActivity/ToastUtils
+    implementation 'com.hjq:toast:6.0'
+
+    // 圆形的ImageView:https://github.com/hdodenhof/CircleImageView
+    implementation 'de.hdodenhof:circleimageview:2.2.0'
+
+    // 支持放大缩放的ImageView:https://github.com/chrisbanes/PhotoView 出问题了看看 https://www.jianshu.com/p/f7a7a8765294
+    implementation 'com.github.chrisbanes:PhotoView:2.0.0'
+
+    //AutoSize 今日头条屏幕适配方案终极版
+    implementation 'me.jessyan:autosize:1.1.2'
+
+    //BGAQRCode-Android 二维码  + Android 图片选择、预览、九宫格图片控件、拖拽排序九宫格图片控件
+    //https://github.com/bingoogolapple/BGAQRCode-Android + https://github.com/bingoogolapple/BGAPhotoPicker-Android
+    implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.3.6'
+    implementation 'cn.bingoogolapple:bga-photopicker:1.2.8'
+    implementation 'cn.bingoogolapple:bga-baseadapter:1.2.7'
+
+    //recyclerview适配器 https://github.com/CymChad/BaseRecyclerViewAdapterHelper
+    implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46'
+
+    //网络请求框架   https://github.com/lygttpod/RxHttpUtils
+    implementation 'com.github.lygttpod:RxHttpUtils:2.3.3'
+
+    //极光推送   官方文档 : https://docs.jiguang.cn/jpush/client/Android/android_api/
+    implementation 'cn.jiguang.sdk:jpush:3.3.2'
+    implementation 'cn.jiguang.sdk:jcore:2.0.1'
+
+    //上拉刷新下拉加载  https://github.com/anzaizai/EasyRefreshLayout  可结合BaseRecyclerViewAdapterHelper
+    implementation 'com.github.anzaizai:EasyRefreshLayout:1.3.1'
+
+    //pdfview   https://github.com/barteksc/AndroidPdfViewer
+    implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'
+
+    // 布局优化:https://github.com/getActivity/Layouts
+    // 分割线:https://github.com/getActivity/RecyclerItemDecoration
+    // 国际化:https://github.com/getActivity/MultiLanguages
+    // 悬浮窗:https://github.com/getActivity/XToast
+    // 网络请求:https://github.com/zhou-you/RxEasyHttp
+    // RxJava: https://github.com/ReactiveX/RxAndroid
+    // RecyclerView:https://github.com/CymChad/BaseRecyclerViewAdapterHelper
+    // 上拉刷新下拉加载:https://github.com/scwang90/SmartRefreshLayout
+    // 工具类:https://github.com/Blankj/AndroidUtilCode
+    // 图片选择:https://github.com/zhihu/Matisse
+    // 轮播图:https://github.com/bingoogolapple/BGABanner-Android
+    // 二维码:https://github.com/bingoogolapple/BGAQRCode-Android
+    // 第三方支付:https://github.com/getActivity/RxPay
+    // Log 打印:https://github.com/JakeWharton/timber
+    // 重要数据存储:https://github.com/Tencent/MMKV
+}

BIN
.svn/pristine/03/03b8c389075406d89ab409ff11216c3c071b274f.svn-base


+ 74 - 0
.svn/pristine/03/03c09e37455d245a66889b2bfddc2927d590f22f.svn-base

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector
+    android:height="108dp"
+    android:width="108dp"
+    android:viewportHeight="108"
+    android:viewportWidth="108"
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#008577"
+          android:pathData="M0,0h108v108h-108z"/>
+    <path android:fillColor="#00000000" android:pathData="M9,0L9,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,0L19,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M29,0L29,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M39,0L39,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M49,0L49,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M59,0L59,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M69,0L69,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M79,0L79,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M89,0L89,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M99,0L99,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,9L108,9"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,19L108,19"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,29L108,29"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,39L108,39"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,49L108,49"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,59L108,59"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,69L108,69"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,79L108,79"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,89L108,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,99L108,99"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,29L89,29"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,39L89,39"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,49L89,49"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,59L89,59"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,69L89,69"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,79L89,79"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M29,19L29,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M39,19L39,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M49,19L49,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M59,19L59,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M69,19L69,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M79,19L79,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+</vector>

+ 8 - 0
.svn/pristine/03/03da9b625a0bad106340201111467456d6f48288.svn-base

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <!-- 默认按钮的圆角大小 -->
+    <dimen name="button_round_size">5dp</dimen>
+    <!-- 登录按钮的圆角大小 -->
+    <dimen name="button_round_login">30dp</dimen>
+</resources>

+ 42 - 0
.svn/pristine/03/03ff356b8d4d7439b608017fde89962e4864326f.svn-base

@@ -0,0 +1,42 @@
+package eVVM.apk.ui.login.authentication;
+
+import java.util.List;
+
+import eVVM.apk.mvp.MvpPresenter;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+
+/**
+ * Created by Android Studio.
+ * User:  zbb
+ * Date: 2019/6/3
+ * Describe: AttctPresenter
+ */
+public class AttctPresenter extends MvpPresenter<AttctContract.View> implements AttctContract.Presenter, AttctOnListener {
+
+    private AttctModel attctModel;
+
+    @Override
+    public void start() {
+        attctModel = new AttctModel();
+    }
+
+    @Override
+    public void attct(int userId, String companyName, String userName, String idCard, String email, String roleId, int phoneType, String phoneModel, List<String> uploadimgpaths) {
+
+        attctModel.setListener(this);
+        attctModel.attct(userId, companyName, userName, idCard, email, roleId, phoneType, phoneModel, uploadimgpaths);
+
+    }
+
+    @Override
+    public void onSucceed(VerificationCodeBean data) {
+
+        getView().attctSuccess(data);
+
+    }
+
+    @Override
+    public void onFail(String msg) {
+        getView().attctError(msg);
+    }
+}

+ 59 - 0
.svn/pristine/04/04026e05e9b20501499628f23d39977f48ce03df.svn-base

@@ -0,0 +1,59 @@
+package eVVM.apk.ui.adapter;
+
+import android.support.annotation.Nullable;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.List;
+
+import eVVM.apk.R;
+import eVVM.apk.ui.bean.VnListBean;
+
+/**
+ * Created by Android Studio.
+ * User:  zbb
+ * Date: 2019/6/6
+ * Describe: VnListAdapter
+ */
+public class VnListAdapter extends BaseQuickAdapter<VnListBean.DataBean, BaseViewHolder> {
+
+
+    public VnListAdapter(int layoutResId, @Nullable List<VnListBean.DataBean> data) {
+        super(layoutResId, data);
+    }
+
+    @Override
+    protected void convert(BaseViewHolder helper, VnListBean.DataBean item) {
+
+        helper.setText(R.id.tv_vn_username, item.getCode());
+        //helper.setText(R.id.tv_vn_vnname,item.getVaccineName());
+
+
+        if(item.getDatetime() != null){
+            SimpleDateFormat sdfx = new SimpleDateFormat("yyyy/MM/dd");
+            SimpleDateFormat sdfh = new SimpleDateFormat("yyyy-MM-dd");
+            String nowTime2 = "";
+
+            try {
+                nowTime2 = sdfx.format(sdfh.parse(item.getDatetime()));
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+            helper.setText(R.id.tv_vn_vnnum, "" + nowTime2);
+
+        }else{
+            helper.setText(R.id.tv_vn_vnnum,"");
+        }
+
+
+
+
+
+
+
+
+    }
+}

+ 58 - 0
.svn/pristine/04/040bec66b83f6711f054eb3016ac99475ab930f3.svn-base

@@ -0,0 +1,58 @@
+package eVVM.apk.ui.toreview.already;
+
+import com.allen.library.RxHttpUtils;
+import com.allen.library.interceptor.Transformer;
+import com.allen.library.observer.CommonObserver;
+import com.hjq.toast.ToastUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import eVVM.apk.api.ApiService;
+import eVVM.apk.common.MyDataObsever;
+import eVVM.apk.mvp.MvpModel;
+import eVVM.apk.ui.toreview.bean.ToreviewBean;
+import eVVM.apk.ui.toreview.no.NoToreOnListener;
+
+/**
+ * Created by Android Studio.
+ * User:  zbb
+ * Date: 2019/6/4
+ * Describe: AlreadyTreModel
+ */
+public class AlreadyTreModel extends MvpModel<AlToreOnListener> {
+
+    public AlreadyTreModel() {
+    }
+
+
+    public void getData(int page, int size, String doctorId) {
+
+        Map<String, String> map = new HashMap<>();
+        map.put("page", page + "");
+        map.put("size", size + "");
+        map.put("doctorId", doctorId + "");
+        RxHttpUtils.createApi(ApiService.class)
+                .review(map)
+                .compose(Transformer.<ToreviewBean>switchSchedulers())
+                .subscribe(new MyDataObsever<ToreviewBean>() {
+                    @Override
+                    protected void onError(String errorMsg) {
+                        getListener().onFail(errorMsg);
+                    }
+
+                    @Override
+                    protected void onSuccess(ToreviewBean toreviewBean) {
+                        //ToastUtils.show(toreviewBean.getMsg());
+                        if (toreviewBean.getCode() == 200) {
+                            List<ToreviewBean.DataBean> data = toreviewBean.getData();
+                            getListener().onSucceed(data);
+                        } else {
+                            getListener().onFail(toreviewBean.getMsg());
+                        }
+                    }
+                });
+    }
+
+}

+ 407 - 0
.svn/pristine/04/040c8403e6f384f12f29c194cee8e3a22c14cd69.svn-base

@@ -0,0 +1,407 @@
+package eVVM.apk.ui.login;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.hjq.dialog.MessageDialog;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import cn.bingoogolapple.photopicker.activity.BGAPhotoPickerActivity;
+import cn.bingoogolapple.photopicker.imageloader.BGAImage;
+import eVVM.apk.R;
+import eVVM.apk.helper.InputTextHelper;
+import eVVM.apk.helper.basepicker.DataPickerDialog;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+import eVVM.apk.ui.launcher.LikeActivity;
+import eVVM.apk.ui.login.authentication.AttctContract;
+import eVVM.apk.ui.login.authentication.AttctPresenter;
+import me.jessyan.autosize.utils.AutoSizeUtils;
+
+/**
+ * 实名认证页
+ */
+public class AuthenticationActivity extends MvpActivity<AttctPresenter> implements AttctContract.View {
+
+
+    @BindView(R.id.attc_et_phone)
+    EditText attcEtPhone;
+    @BindView(R.id.attc_et_name)
+    EditText attcEtName;
+    @BindView(R.id.attc_et_code)
+    EditText attcEtCode;
+    @BindView(R.id.attc_et_email)
+    EditText attcEtEmail;
+
+    @BindView(R.id.attc_et_license)
+    ImageView attcEtLicense;
+    @BindView(R.id.attc_et_prove)
+    ImageView attcEtProve;
+    @BindView(R.id.attc_btn_register)
+    Button attcBtnRegister;
+    @BindView(R.id.tv_information_hospital)
+    TextView tvInformationHospital;
+    @BindView(R.id.tv_information_factory)
+    TextView tvInformationFactory;
+    @BindView(R.id.attc_ll_license)
+    LinearLayout attcLlLicense;
+    @BindView(R.id.attc_ll_prove)
+    LinearLayout attcLlProve;
+
+    private File takePhotoDir = new File(Environment.getExternalStorageDirectory(), "eVVM");
+    private static final int REQUEST_LICENSE_CHOOSE_FROM_GALLERY = 1325;
+    private static final int REQUEST_PROVE_CHOOSE_FROM_GALLERY = 1326;
+    private String registerUserId;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_authentication;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.attc_title;
+    }
+
+
+    @Override
+    public void onLeftClick(View v) {
+        new MessageDialog.Builder(this)
+                .setTitle("") // 标题可以不用填写
+                .setMessage("您未完成实名认证,是否退出")
+                .setConfirm("确定")
+                .setCancel("取消") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .setListener(new MessageDialog.OnListener() {
+
+                    @Override
+                    public void onConfirm(Dialog dialog) {
+                        finish();
+                    }
+
+                    @Override
+                    public void onCancel(Dialog dialog) {
+                        //toast("取消了");
+                    }
+                })
+                .show();
+
+
+    }
+
+    @Override
+    protected void initView() {
+        new InputTextHelper.Builder(this)
+                .setMain(attcBtnRegister)
+                .addView(attcEtPhone)
+                .addView(attcEtName)
+                .addView(attcEtCode)
+                .addView(attcEtEmail)
+                .addView(tvInformationHospital)
+                .addView(tvInformationFactory)
+                .build();
+        Intent in = getIntent();
+        registerUserId = in.getStringExtra("registerUserId");
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+    @OnClick({R.id.attc_et_license, R.id.attc_et_prove, R.id.attc_btn_register, R.id.tv_information_hospital, R.id.tv_information_factory})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.attc_et_license:
+                //上传营业执照
+
+                /*
+                从相册选取二维码图片,这里为了方便演示,使用的是
+                https://github.com/bingoogolapple/BGAPhotoPicker-Android
+                这个库来从图库中选择二维码图片,这个库不是必须的,你也可以通过自己的方式从图库中选择图片
+                 */
+                Intent licensePhotoPickerIntent = new BGAPhotoPickerActivity.IntentBuilder(this)
+                        .cameraFileDir(takePhotoDir)
+                        .maxChooseCount(1)
+                        .selectedPhotos(null)
+                        .pauseOnScroll(false)
+                        .build();
+                startActivityForResult(licensePhotoPickerIntent, REQUEST_LICENSE_CHOOSE_FROM_GALLERY);
+
+                break;
+            case R.id.attc_et_prove:
+                //上传授权证明
+
+                if (uploadimgpaths.size() == 0) {
+                    toast("请先上传营业执照");
+                } else {
+                    Intent provePhotoPickerIntent = new BGAPhotoPickerActivity.IntentBuilder(this)
+                            .cameraFileDir(takePhotoDir)
+                            .maxChooseCount(1)
+                            .selectedPhotos(null)
+                            .pauseOnScroll(false)
+                            .build();
+                    startActivityForResult(provePhotoPickerIntent, REQUEST_PROVE_CHOOSE_FROM_GALLERY);
+                }
+
+                break;
+            case R.id.attc_btn_register:
+                //进行实名认证
+
+                if ("预防接种机构".equals(tvInformationHospital.getText().toString())){
+                    if (uploadimgpaths.size() < 2) {
+                        toast("请上传营业执照及授权证明");
+                    } else {
+                        //String user_id = (String) SPUtils.get("USER_ID", "");
+                        if (TextUtils.isEmpty(registerUserId)) {
+
+                        } else {
+                            getPresenter().attct(Integer.parseInt(registerUserId), attcEtPhone.getText().toString()
+                                    , attcEtName.getText().toString(), attcEtCode.getText().toString(),
+                                    attcEtEmail.getText().toString(), getRoleId(tvInformationFactory.getText().toString()) + "",
+                                    0, Build.BRAND + " " + Build.MODEL, uploadimgpaths);
+                        }
+                    }
+                }else {
+                    if (TextUtils.isEmpty(registerUserId)) {
+
+                    } else {
+                        getPresenter().attct(Integer.parseInt(registerUserId), attcEtPhone.getText().toString()
+                                , attcEtName.getText().toString(), attcEtCode.getText().toString(),
+                                attcEtEmail.getText().toString(), getRoleId(tvInformationFactory.getText().toString()) + "",
+                                0, Build.BRAND + " " + Build.MODEL, uploadimgpaths);
+                    }
+                }
+                break;
+            case R.id.tv_information_hospital:
+                DataPickerDialog.Builder builder = new DataPickerDialog.Builder(this);
+                List<String> data = Arrays.asList(new String[]{"医药企业", "预防接种机构", "预防接受种者", "物流公司"});
+                /*List<RoleTypeBean.RoleParen> parentlist = new ArrayList<>();
+                parentlist.add(new RoleTypeBean.RoleParen(6,"","医药企业"));
+                parentlist.add(new RoleTypeBean.RoleParen(7,"","预防接种机构"));
+                parentlist.add(new RoleTypeBean.RoleParen(8,"","预防接受种者"));
+                parentlist.add(new RoleTypeBean.RoleParen(9,"","物流公司"));*/
+                DataPickerDialog dialog = builder.setData(data).setSelection(0).setTitle("标题")
+                        .setOnDataSelectedListener(new DataPickerDialog.OnDataSelectedListener() {
+                            @Override
+                            public void onDataSelected(String itemValue) {
+                                if (!TextUtils.isEmpty(tvInformationHospital.getText().toString())) {
+                                    tvInformationFactory.setText("");
+                                }
+                                tvInformationHospital.setText(itemValue + "");
+                                if ("预防接种机构".equals(itemValue)){
+                                    attcLlLicense.setVisibility(View.VISIBLE);
+                                    attcLlProve.setVisibility(View.VISIBLE);
+                                }else {
+                                    attcLlLicense.setVisibility(View.GONE);
+                                    attcLlProve.setVisibility(View.GONE);
+                                }
+                            }
+                        }).create();
+
+                dialog.show();
+                break;
+            case R.id.tv_information_factory:
+                if (TextUtils.isEmpty(tvInformationHospital.getText().toString())) {
+                    toast("请先选择所属类型");
+                    return;
+                } else {
+                    int roleParentId = getRoleParentId(tvInformationHospital.getText().toString());
+                    List<String> roleType = getRoleType(roleParentId);
+                    DataPickerDialog.Builder builder2 = new DataPickerDialog.Builder(this);
+                /*List<String> data2 = Arrays.asList(new String[]{"品控人员", "生产人员", "物流人员", "管理人员", "护士", "受种者家属",
+                        "管理人员", "操作人员","后台管理者"});*/
+
+                    DataPickerDialog dialog2 = builder2.setData(roleType).setSelection(0).setTitle("职务")
+                            .setOnDataSelectedListener(new DataPickerDialog.OnDataSelectedListener() {
+                                @Override
+                                public void onDataSelected(String itemValue) {
+                                    tvInformationFactory.setText(itemValue + "");
+                                    //Toast.makeText(getApplicationContext(), itemValue, Toast.LENGTH_SHORT).show();
+                                }
+
+                            }).create();
+
+                    dialog2.show();
+                }
+                break;
+        }
+    }
+
+    //根据parent名字返回id
+    private int getRoleParentId(String name) {
+
+        if ("医药企业".equals(name))
+            return 6;
+        if ("预防接种机构".equals(name))
+            return 7;
+        if ("预防接受种者".equals(name))
+            return 8;
+        if ("物流公司".equals(name))
+            return 9;
+
+        return 0;
+    }
+
+    //根据id返回字列表
+    private List<String> getRoleType(int parentId) {
+
+        List<String> list = new ArrayList<>();
+        switch (parentId) {
+            case 6:
+                list.clear();
+                list.add("管理员");
+                list.add("操作员");
+                list.add("品控人员");
+                list.add("生产人员");
+                list.add("物流人员");
+                list.add("后台管理员");
+                return list;
+
+            case 7:
+                list.clear();
+                list.add("医生");
+                list.add("管理人员");
+                list.add("护士");
+                return list;
+
+            case 8:
+                list.clear();
+                list.add("受种者本人");
+                list.add("受种者家属");
+                return list;
+
+            case 9:
+                list.clear();
+                list.add("管理人员");
+                list.add("操作人员");
+                return list;
+            default:
+                return null;
+        }
+
+
+    }
+
+
+    //根据名字返回id
+    private int getRoleId(String name) {
+        if ("超级管理员".equals(name))
+            return 1;
+        if ("医生".equals(name))
+            return 2;
+        if ("管理员".equals(name))
+            return 3;
+        if ("操作员".equals(name))
+            return 4;
+        if ("受种着本人".equals(name))
+            return 5;
+        if ("医药企业".equals(name))
+            return 6;
+        if ("预防接种机构".equals(name))
+            return 7;
+        if ("预防接种者".equals(name))
+            return 8;
+        if ("物流公司".equals(name))
+            return 9;
+        if ("其他".equals(name))
+            return 10;
+        if ("品控人员".equals(name))
+            return 11;
+        if ("生产人员".equals(name))
+            return 12;
+        if ("物流人员".equals(name))
+            return 13;
+        if ("管理人员".equals(name) && "预防接种机构".equals(tvInformationHospital.getText().toString()))
+            return 14;
+        if ("护士".equals(name))
+            return 15;
+        if ("受种者家属".equals(name))
+            return 16;
+        if ("管理人员".equals(name) && "物流公司".equals(tvInformationHospital.getText().toString()))
+            return 17;
+        if ("操作人员".equals(name))
+            return 18;
+        if ("后台管理者".equals(name))
+            return 19;
+
+        return 0;
+    }
+
+
+    @Override
+    protected AttctPresenter createPresenter() {
+        return new AttctPresenter();
+    }
+
+    @Override
+    public void attctError(String msg) {
+        toast(msg);
+    }
+
+    @Override
+    public void attctSuccess(VerificationCodeBean data) {
+
+        toast("注册成功");
+        startActivityFinish(LikeActivity.class);
+    }
+
+    private List<String> uploadimgpaths = new ArrayList<>();
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+
+        if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_LICENSE_CHOOSE_FROM_GALLERY) {
+            //营业执照回调
+            String picturePath = BGAPhotoPickerActivity.getSelectedPhotos(data).get(0);
+
+            if (uploadimgpaths.size() == 0) {   //这里主要是为了让第一张图片必须是营业执照 第二张是授权证明
+                uploadimgpaths.add(picturePath);
+            } else if (uploadimgpaths.size() > 0) {
+                uploadimgpaths.remove(0);
+                uploadimgpaths.add(0, picturePath);
+            }
+            BGAImage.display(attcEtLicense, R.mipmap.iv_upload_icon, picturePath, AutoSizeUtils.dp2px(this, 77), AutoSizeUtils.dp2px(this, 43));
+
+
+            Log.e("uploadimgpaths1", "" + uploadimgpaths.toString());
+
+        } else if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_PROVE_CHOOSE_FROM_GALLERY) {
+
+            //授权证明回调
+            String picturePath = BGAPhotoPickerActivity.getSelectedPhotos(data).get(0);
+            if (uploadimgpaths.size() == 2) {
+                uploadimgpaths.remove(1);
+                uploadimgpaths.add(picturePath);
+            } else {
+                uploadimgpaths.add(picturePath);
+            }
+            BGAImage.display(attcEtProve, R.mipmap.iv_upload_icon, picturePath, AutoSizeUtils.dp2px(this, 77), AutoSizeUtils.dp2px(this, 43));
+
+            Log.e("uploadimgpaths2", "" + uploadimgpaths.toString());
+        }
+    }
+
+
+}

BIN
.svn/pristine/04/044831a7ad49e805d8aff7cdf83c4dbc1ae65e2a.svn-base


+ 25 - 0
.svn/pristine/04/0454abd1638f991d9cb11e23cd9c95a09ddd9af0.svn-base

@@ -0,0 +1,25 @@
+-- Merging decision tree log ---
+manifest
+ADDED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml:1:1-38
+INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml:1:1-38
+INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml:1:1-38
+	package
+		ADDED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml:1:11-35
+		INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml
+		INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml
+	xmlns:android
+		ADDED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml:1:1-38
+uses-sdk
+INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml
+INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml
+INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml
+INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml
+	android:targetSdkVersion
+		INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml
+		ADDED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml
+		INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml
+	android:minSdkVersion
+		INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml
+		ADDED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml
+		INJECTED from D:\studiowork\evvm\eVVM_Android\dialog\src\main\AndroidManifest.xml

+ 182 - 0
.svn/pristine/04/047a116f85f66e714464c418423ed7caaf281fdf.svn-base

@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".ui.vaccination.InoculationRegistActivity">
+
+    <com.hjq.bar.TitleBar
+        android:id="@+id/tb_registicl_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:title="@string/inoculation_regist_title" />
+
+    <LinearLayout
+        android:layout_marginLeft="9.6dp"
+        android:layout_marginRight="9.6dp"
+        android:layout_marginTop="11.6dp"
+        android:background="@color/white"
+        android:gravity="center_vertical"
+        android:layout_width="match_parent"
+        android:orientation="horizontal"
+        android:layout_height="57.6dp">
+
+        <ImageView
+            android:src="@mipmap/iv_information_name"
+            android:layout_marginLeft="11.8dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+        <TextView
+            android:text="@string/personal_data_name"
+            android:layout_marginLeft="10dp"
+            android:textSize="15.3sp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+        <EditText
+            android:id="@+id/registicl_et_name"
+            android:background="@null"
+            android:textSize="15.3sp"
+            android:layout_marginLeft="50.5dp"
+            android:hint="@string/personal_data_name_hint"
+            android:layout_weight="1"
+            android:layout_width="0dp"
+            android:text="小欧啊"
+            android:maxLength="10"
+            android:maxLines="1"
+            android:layout_height="wrap_content" />
+
+    </LinearLayout>
+    <LinearLayout
+        android:layout_marginLeft="9.6dp"
+        android:layout_marginRight="9.6dp"
+        android:layout_marginTop="11.6dp"
+        android:background="@color/white"
+        android:gravity="center_vertical"
+        android:layout_width="match_parent"
+        android:orientation="horizontal"
+        android:layout_height="57.6dp">
+
+        <ImageView
+            android:src="@mipmap/iv_information_idcard"
+            android:layout_marginLeft="11.8dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+        <TextView
+            android:text="@string/personal_data_idnum"
+            android:layout_marginLeft="10dp"
+            android:textSize="15.3sp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+        <EditText
+            android:id="@+id/registicl_et_code"
+            android:background="@null"
+            android:textSize="15.3sp"
+            android:layout_marginLeft="20dp"
+            android:hint="@string/personal_data_idnum_hint"
+            android:layout_weight="1"
+            android:layout_width="0dp"
+            android:maxLength="20"
+            android:text="110222183716297736"
+            android:maxLines="1"
+            android:layout_height="wrap_content" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_marginLeft="9.6dp"
+        android:layout_marginRight="9.6dp"
+        android:layout_marginTop="11.6dp"
+        android:background="@color/white"
+        android:gravity="center_vertical"
+        android:layout_width="match_parent"
+        android:orientation="horizontal"
+        android:layout_height="57.6dp">
+
+        <ImageView
+            android:src="@mipmap/iv_phone_icon"
+            android:layout_marginLeft="11.8dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+        <TextView
+            android:text="@string/login_phone"
+            android:layout_marginLeft="10dp"
+            android:textSize="15.3sp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+
+            <EditText
+                android:id="@+id/registicl_et_phone"
+                android:background="@null"
+                android:textSize="15.3sp"
+                android:layout_marginLeft="35dp"
+                android:hint="@string/login_phone_hint"
+                android:layout_weight="1"
+                android:layout_width="0dp"
+                android:inputType="phone"
+                android:text="138776678943"
+                android:maxLength="11"
+                android:maxLines="1"
+                android:layout_height="wrap_content" />
+
+    </LinearLayout>
+
+
+    <LinearLayout
+        android:layout_marginLeft="9.6dp"
+        android:layout_marginRight="9.6dp"
+        android:layout_marginTop="11.6dp"
+        android:background="@color/white"
+        android:gravity="center_vertical"
+        android:layout_width="match_parent"
+        android:orientation="horizontal"
+        android:layout_height="57.6dp">
+
+        <ImageView
+            android:src="@mipmap/iv_information_email"
+            android:layout_marginLeft="11.8dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+        <TextView
+            android:text="@string/personal_data_email"
+            android:layout_marginLeft="10dp"
+            android:textSize="15.3sp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+        <EditText
+            android:id="@+id/registicl_et_email"
+            android:background="@null"
+            android:textSize="15.3sp"
+            android:layout_marginLeft="51.5dp"
+            android:hint="@string/personal_data_email_hint"
+            android:layout_weight="1"
+            android:layout_width="0dp"
+            android:maxLength="25"
+            android:text="728657778@qq.com"
+            android:maxLines="1"
+            android:layout_height="wrap_content" />
+
+    </LinearLayout>
+    <Button
+        android:id="@+id/registicl_btn_submitted"
+        android:layout_width="282dp"
+        android:layout_height="48dp"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginTop="38.5dp"
+        android:background="@drawable/selector_button"
+        android:text="@string/inoculation_submitted"
+        android:textColor="@color/white"
+        android:textSize="15.3sp" />
+
+
+</LinearLayout>

+ 803 - 0
.svn/pristine/04/04c9aa5cd042453fa2841c5f6c8a40a086350294.svn-base

@@ -0,0 +1,803 @@
+package eVVM.apk.ui.vaccination;
+
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.annotation.SuppressLint;
+import android.app.Dialog;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Message;
+import android.support.annotation.RequiresApi;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.util.Log;
+import android.view.View;
+import android.view.animation.Animation;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.hjq.base.BaseDialog;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+
+import java.lang.ref.WeakReference;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.MyClickListener;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.helper.SoundPoolHelper;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.bean.ModelListBean;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+import eVVM.apk.ui.bean.VnDetailBean;
+import eVVM.apk.ui.home.HomeActivity;
+import eVVM.apk.ui.report.vndetail.VnDetailContract;
+import eVVM.apk.ui.report.vndetail.VnDetailPresenter;
+import eVVM.apk.ui.webview.WebActivity;
+import eVVM.apk.widget.EvvmMsgDiago;
+import eVVM.apk.widget.ZoomView;
+
+public class VnReportDetailForDoctorActivity extends MvpActivity<VnDetailPresenter> implements VnDetailContract.View, MyClickListener.MyClickCallBack {
+
+
+    @BindView(R.id.vndetail_tv_vnname)
+    TextView vndetailTvVnname;
+    @BindView(R.id.vndetail_tv_vnsc)
+    TextView vndetailTvVnsc;
+    @BindView(R.id.vndetail_tv_vncreatdate)
+    TextView vndetailTvVncreatdate;
+    @BindView(R.id.vndetail_tv_vnvalid)
+    TextView vndetailTvVnvalid;
+    @BindView(R.id.renyuan_type)
+    TextView renyuanType;
+    @BindView(R.id.vndetail_tv_szname)
+    TextView vndetailTvSzname;
+    @BindView(R.id.vndetail_tv_szsex)
+    TextView vndetailTvSzsex;
+    @BindView(R.id.vndetail_tv_szbirthday)
+    TextView vndetailTvSzbirthday;
+    @BindView(R.id.vndetail_tv_szid)
+    TextView vndetailTvSzid;
+    @BindView(R.id.vndetail_tv_szguardian)
+    TextView vndetailTvSzguardian;
+    @BindView(R.id.shouzhongrenyuan)
+    LinearLayout shouzhongrenyuan;
+    @BindView(R.id.jiezhognrenyuan)
+    LinearLayout jiezhognrenyuan;
+    @BindView(R.id.vndetail_tv_szTelephone)
+    TextView vndetailTvSzTelephone;
+    private boolean isWarning = true;
+    private VnDetailBean.DataBean chipModel = null;
+    private SoundPoolHelper soundPoolHelper;
+
+    @BindView(R.id.vndetail_tv_typemsg)
+    TextView vndetailTvTypemsg;
+    @BindView(R.id.vndetail_tv_vncode)
+    TextView vndetailTvVncode;
+    @BindView(R.id.vndetail_tv_vndate)
+    TextView vndetailTvVndate;
+    @BindView(R.id.vndetail_tv_factoryName)
+    TextView vndetailTvFactoryName;
+    @BindView(R.id.vndetail_tv_gmpName)
+    TextView vndetailTvGmpName;
+    @BindView(R.id.vndetail_tv_gmpPath)
+    TextView vndetailTvGmpPath;
+    @BindView(R.id.vndetail_tv_hospitalName)
+    TextView vndetailTvHospitalName;
+    @BindView(R.id.vndetail_tv_doctorName)
+    TextView vndetailTvDoctorName;
+    @BindView(R.id.vndetail_tv_doctorTelephone)
+    TextView vndetailTvDoctorTelephone;
+    @BindView(R.id.vndetail_tv_chatImage)
+    ImageView vndetailTvChatImage;
+    @BindView(R.id.vndetail_tv_othervn1)
+    TextView vndetailTvOthervn1;
+    @BindView(R.id.vndetail_tv_othervn2)
+    TextView vndetailTvOthervn2;
+    @BindView(R.id.vndetail_tv_othervn3)
+    TextView vndetailTvOthervn3;
+    @BindView(R.id.vndetail_iv_tipsimg)
+    ImageView vndetailIvTipsimg;
+    @BindView(R.id.vndetail_tv_tips)
+    TextView vndetailTvTips;
+    @BindView(R.id.vndetail_tv_disclaimer)
+    TextView vndetailTvDisclaimer;
+    @BindView(R.id.zv_report)
+    ZoomView myzoomview;
+    @BindView(R.id.vndetail_tv_chatImage_title)
+    TextView vndetail_tv_chatImage_title;
+    @BindView(R.id.coverview)
+    TextView coverview;
+    @BindView(R.id.vndetail_tv_tt)
+    TextView vndetailTvTitle;
+    private int status;
+
+    private List<TextView> textViews;
+    private List<TextView> yujingList;
+    private List<TextView> vntextviewList;
+    private List<TextView> zcList;
+
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_vn_report_detail_for_doctor;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.tb_vndetail_title;
+    }
+
+    @Override
+    protected void initView() {
+        myzoomview.setOnTouchListener(new MyClickListener(this));
+        soundPoolHelper = new SoundPoolHelper(4, SoundPoolHelper.TYPE_MUSIC)
+                .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC)
+                .loadDefault(VnReportDetailForDoctorActivity.this)
+                .load(VnReportDetailForDoctorActivity.this, "rewarning", R.raw.rewarning)
+                .load(VnReportDetailForDoctorActivity.this, "renormal", R.raw.renormal);
+
+        textViews = new ArrayList<>();
+
+        //左边的
+        vntextviewList = new ArrayList<>();
+        vntextviewList.add(vndetailTvVnname);
+        vntextviewList.add(vndetailTvVnsc);
+        vntextviewList.add(vndetailTvFactoryName);
+        vntextviewList.add(vndetailTvGmpName);
+        vntextviewList.add(vndetailTvGmpPath);
+        vntextviewList.add(vndetailTvVncreatdate);
+        vntextviewList.add(vndetailTvVnvalid);
+
+        //不正常
+        yujingList = new ArrayList<>();
+        yujingList.add(vndetailTvHospitalName);
+        yujingList.add(vndetailTvDoctorName);
+        yujingList.add(vndetailTvDoctorTelephone);
+
+        //正常
+        zcList = new ArrayList<>();
+        zcList.add(vndetailTvSzname);
+        zcList.add(vndetailTvSzsex);
+        zcList.add(vndetailTvSzbirthday);
+        zcList.add(vndetailTvSzid);
+        zcList.add(vndetailTvSzguardian);
+        zcList.add(vndetailTvSzTelephone);
+    }
+
+    @Override
+    public void onLeftClick(View v) {
+        super.onLeftClick(v);
+        if (isWarning) {
+            if (status == 6 || status == 7 || status == 8) {
+
+            } else {
+                startActivityFinish(ReadingActivity.class);
+            }
+        }
+    }
+
+    @OnClick({R.id.next_btn_report, R.id.vndetail_bt_magnifier})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.next_btn_report:
+
+                if (status == 4 || status == 8) {
+                    startActivityFinish(ReadingActivity.class);
+                } else {
+                    if (status == 6 || status == 7) {
+                        startActivityFinish(HomeActivity.class);
+                    }
+                }
+
+                break;
+            case R.id.vndetail_bt_magnifier:
+                //放大
+                myzoomview.magnifier();
+                break;
+        }
+    }
+
+
+    private static class WarningHandler extends Handler {
+        private WeakReference<VnReportDetailForDoctorActivity> wactivity;
+
+        public WarningHandler(VnReportDetailForDoctorActivity activity) {
+            wactivity = new WeakReference<VnReportDetailForDoctorActivity>(activity);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+        }
+    }
+
+    private WarningHandler warninghandler = new WarningHandler(this);
+
+    private static class NormalHandler extends Handler {
+        private WeakReference<VnReportDetailForDoctorActivity> wactivity;
+
+        public NormalHandler(VnReportDetailForDoctorActivity activity) {
+            wactivity = new WeakReference<VnReportDetailForDoctorActivity>(activity);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+        }
+    }
+
+    private NormalHandler normalhandler = new NormalHandler(this);
+
+    private Runnable warningRunnable = new Runnable() {
+        @Override
+        public void run() {
+            //用户2秒没操作了
+            Log.e("DoctorVnReportActivity", "两秒未操作");
+            startActivityFinish(ReadingActivity.class);
+        }
+    };
+    private Runnable normalRunnable = new Runnable() {
+        @Override
+        public void run() {
+            //用户2秒没操作了
+            Log.e("DoctorVnReportActivity", "两秒未操作");
+            finish();
+        }
+    };
+
+    private int checki = 1;
+
+    @SuppressLint("WrongConstant")
+    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+    @Override
+    protected void initData() {
+        Intent in = getIntent();
+        chipModel = (VnDetailBean.DataBean) in.getSerializableExtra("dataBean");
+        //给页面赋值
+        setViewData(chipModel);
+        isWarning = in.getBooleanExtra("isWarning", true);
+
+        status = in.getIntExtra("status", 0);
+        textViews.clear();
+        if (status == 4) {
+            renyuanType.setText("接种人员");
+            shouzhongrenyuan.setVisibility(View.GONE);
+            jiezhognrenyuan.setVisibility(View.VISIBLE);
+            textViews.addAll(vntextviewList);
+            textViews.addAll(yujingList);
+        } else {
+            if (status == 6 || status == 7) {
+                renyuanType.setText("受种人员");
+                shouzhongrenyuan.setVisibility(View.VISIBLE);
+                jiezhognrenyuan.setVisibility(View.GONE);
+                textViews.addAll(vntextviewList);
+                textViews.addAll(zcList);
+            } else if (status == 8) {
+                renyuanType.setText("接种人员");
+                shouzhongrenyuan.setVisibility(View.GONE);
+                jiezhognrenyuan.setVisibility(View.VISIBLE);
+                textViews.addAll(vntextviewList);
+                textViews.addAll(yujingList);
+            }
+        }
+
+        textJump(textViews); //开始字符跳动
+
+        //设置验证信息
+        vndetailTvChatImage.setImageResource(R.mipmap.report_check_ico);
+        vndetailTvTypemsg.setText("疫苗企业验证通过");
+        //透明动画
+        ObjectAnimator animator = ObjectAnimator.ofFloat(vndetailTvChatImage, "alpha", 0.1f, 1f);
+        animator.setDuration(300); //一秒闪一次
+        animator.setRepeatCount(10); //总共闪十次
+        animator.setRepeatMode(Animation.REVERSE);
+        //为动画设置监听
+        animator.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                //动画结束
+                animation.resume();
+                /*AlphaAnimation alpha = new AlphaAnimation(0.1F, 1F);
+                alpha.setDuration(0);
+                alpha.setFillAfter(true);
+                vndetailTvChatImage.startAnimation(alpha);*/
+                setPageView(); //设置扫描到的信息
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+                //动画重复时  下方进行验证提示
+                //Log.e("onAnimationRepeat","onAnimationRepeat");
+                checki++;
+                setCheckText(checki);
+            }
+        });
+        animator.start();
+
+    }
+
+    private void setCheckText(int checki) {
+        switch (checki) {
+            case 1:
+                vndetailTvTypemsg.setText("疫苗企业验证通过");
+                break;
+            case 2:
+                vndetailTvTypemsg.setText("疫苗品种验证通过");
+                break;
+            case 3:
+                vndetailTvTypemsg.setText("疫苗规格验证通过");
+                break;
+            case 4:
+                vndetailTvTypemsg.setText("疫苗id验证通过");
+                break;
+            case 5:
+                vndetailTvTypemsg.setText("疫苗冷链验证通过");
+                break;
+            case 6:
+                vndetailTvTypemsg.setText("接种点验证通过");
+                break;
+            case 7:
+                vndetailTvTypemsg.setText("医生验证通过");
+                break;
+            case 8:
+                vndetailTvTypemsg.setText("受种者姓名验证通过");
+                break;
+            case 9:
+                vndetailTvTypemsg.setText("受种者年龄验证通过");
+                break;
+            case 10:
+                vndetailTvTypemsg.setText("受种者性别验证通过");
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void setPageView() {
+        if (status == 4 || status == 8) {
+            findViewById(R.id.btn_ll).setVisibility(View.VISIBLE);
+            vndetailTvTypemsg.setText("此疫苗需要进一步验证,请等待厂家复核");
+            //vndetailTvTypemsg.setTextColor(Color.RED);
+            vndetailTvChatImage.setImageResource(R.mipmap.report_warning_ico);
+            coverview.setText("提示:温度追溯结果显示,该疫苗冷链可能有超温现象,厂家已收到相关信息。请立即停止使用该疫苗,等待复核结果。");
+            //播放提示语
+            postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    soundPoolHelper.play("rewarning", false);
+                }
+            }, 500);
+
+            getWarningOper();
+        } else {
+            if (status == 6 || status == 7) {
+                findViewById(R.id.btn_ll).setVisibility(View.VISIBLE);
+                vndetailTvTypemsg.setText(
+                        "疫苗信息已验证通过,冷链信息未发现异常,请核对疫苗内外包装与本报告所载数据是否一致,并按\"三查七对\"的规定使用");
+                //vndetailTvTypemsg.setTextColor(Color.GREEN);
+                vndetailTvChatImage.setImageResource(R.mipmap.report_normal_ico);
+                /*vndetailTvChatImage.setVisibility(View.GONE);
+                vndetail_tv_chatImage_title.setVisibility(View.GONE);*/
+                coverview.setText("提示:注射疫苗后,请用注射专用创口贴或消毒棉球轻压针眼几分钟,至不出血。请勿揉搓接种部位。接种疫苗后休息30分钟再离开。");
+                postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        getnormalOper();
+                    }
+                }, 20000);
+
+
+                normalhandler.postDelayed(normalRunnable, 1000 * 60);
+            }/* else if (status == 8) {
+                vndetailTvTypemsg.setText("此疫苗需要进一步验证,请等待厂家复核");
+                vndetailTvTypemsg.setTextColor(Color.RED);
+                vndetailTvChatImage.setImageResource(R.mipmap.report_warning_ico);
+                coverview.setText("提示:温度追溯结果显示,该疫苗冷链可能有超温现象,厂家已收到相关信息。请立即停止使用该疫苗,等待复核结果。");
+                postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        soundPoolHelper.play("rewarning", false);
+                    }
+                }, 500);
+                normalhandler.postDelayed(normalRunnable, 1000 * 60);
+            }*/
+        }
+    }
+
+    private void getnormalOper() {
+        postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                soundPoolHelper.play("renormal", false);
+            }
+        }, 500);
+        final BaseDialog normalDiago = new EvvmMsgDiago.Builder(this)
+                .setTitle("pdf报告已自动保存到你指定的路径,医生已做好“三查七对”,并按规定完成接种,是否推送给受种者(监护人)?") // 标题可以不用填写
+                .setConfirm("发送给家长")
+                .setCancel("取消") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .setListener(new EvvmMsgDiago.OnListener() {
+
+                    @Override
+                    public void onConfirm(Dialog dialog) {
+                        String emailsOfInoculator = "";
+                        try {
+                            String str = (String) SPUtils.get("INOCULATOR_LIST", "");
+                            if (!str.equals("")) {
+                                JSONArray jsonArr = new JSONArray(str);
+                                for (int i = 0; i < jsonArr.length(); i++) {
+                                    String arr[] = jsonArr.getString(i).split("▇");
+                                    if (!arr[3].trim().equals("")) {
+                                        emailsOfInoculator += arr[3] + ",";
+                                    }
+                                }
+                                if (emailsOfInoculator.lastIndexOf(",") == emailsOfInoculator.length() - 1) {
+                                    emailsOfInoculator = emailsOfInoculator.substring(0, emailsOfInoculator.length() - 1);
+                                }
+                            }
+                        } catch (JSONException e) {
+                            e.printStackTrace();
+                        }
+
+                        getPresenter().sendMailToInoculator(chipModel.getChipNumber(), emailsOfInoculator);
+                    }
+
+                    @Override
+                    public void onCancel(Dialog dialog) {
+                        //toast("取消了");
+                    }
+                })
+                .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                    @Override
+                    public void onDismiss(BaseDialog dialog) {
+                        //toast("asfad");
+
+                    }
+                })
+                .show();
+
+        postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                if (normalDiago.isShowing()) {
+                    normalDiago.dismiss();
+                }
+            }
+        }, 30000);
+    }
+
+    private void getWarningOper() {
+        final BaseDialog warningDiago = new EvvmMsgDiago.Builder(this)
+                .setTitle("此疫苗需复核,请换支疫苗") // 标题可以不用填写
+                .setConfirm("")
+                .setCancel("") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                    @Override
+                    public void onDismiss(BaseDialog dialog) {
+                        //toast("asfad");
+                        //warninghandler.postDelayed(warningRunnable, 1000 * 10);
+                    }
+                })
+                .show();
+        postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                if (warningDiago.isShowing()) {
+                    warningDiago.dismiss();
+                }
+            }
+        }, 5000);
+    }
+
+    private void setViewData(final VnDetailBean.DataBean dataBean) {
+        vndetailTvTitle.setText(dataBean.getVaccineName() + "" + dataBean.getBatch());
+        vndetailTvSzname.setText(TextUtils.isEmpty(dataBean.getInoculatroUserName()) ? "N/A" : "" + dataBean.getInoculatroUserName());
+        vndetailTvSzsex.setText(TextUtils.isEmpty(dataBean.getInoculatroSex()) ? "N/A" : "" + dataBean.getInoculatroSex());
+        vndetailTvSzbirthday.setText(TextUtils.isEmpty(dataBean.getInoculatroBirthdate()) ? "N/A" : "" + dataBean.getInoculatroBirthdate());
+        vndetailTvSzid.setText(addZero(dataBean.getInoculatroId()));
+        vndetailTvSzguardian.setText("N/A");
+        vndetailTvSzTelephone.setText(TextUtils.isEmpty(dataBean.getInoculatroTelePhone()) ? "N/A" : "" + dataBean.getInoculatroTelePhone());
+
+        vndetailTvVnname.setText(TextUtils.isEmpty(dataBean.getVaccineName()) ? "N/A" : dataBean.getVaccineName() + "");
+        vndetailTvVnsc.setText(TextUtils.isEmpty(dataBean.getVaccineCategory()) ? "N/A" : dataBean.getVaccineCategory() + "");
+        vndetailTvVncreatdate.setText(TextUtils.isEmpty(dataBean.getBeginDate()) ? "N/A" : dataBean.getBeginDate() + "");
+        vndetailTvVnvalid.setText(TextUtils.isEmpty(dataBean.getVaccineExpiryDate()) ? "N/A" : dataBean.getVaccineExpiryDate());
+
+
+        //vndetailTvVncode.setText("evvm Code " + dataBean.getCode());
+     /*   String codeStr = "";
+        for (int i = 0; i < dataBean.getCodeX().length(); i++) {
+            codeStr = codeStr + "*";
+        }*/
+       /* SpannableString spancode = new SpannableString("报告编号 " + dataBean.getCodeX());
+        spancode.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                *//*if (dataBean.getCodeX() == null || TextUtils.isEmpty(dataBean.getCodeX())) {
+                    toast("你没有授权,请进行注册");
+                } else {
+                    gotoWebActivity(dataBean.getCodeX());
+                }*//*
+            }
+        }, 5, 5 + dataBean.getCodeX().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);*/
+        vndetailTvVncode.setText("报告编号 " + dataBean.getCodeX());
+        //vndetailTvVncode.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+        vndetailTvVndate.setText(format1.format(new Date()));
+        vndetailTvFactoryName.setText("" + dataBean.getFactoryName());
+        vndetailTvHospitalName.setText("" + dataBean.getHospitalName());
+        vndetailTvDoctorName.setText("" + dataBean.getDoctorName());
+        vndetailTvDoctorTelephone.setText("" + dataBean.getDoctorTelephone());
+        vndetailTvChatImage.setScaleType(ImageView.ScaleType.CENTER);
+
+       /* SpannableString spanGmpPath = new SpannableString(TextUtils.isEmpty(dataBean.getGmpName()) ? "N/A" : dataBean.getGmpName());
+        spanGmpPath.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getGmpPath() == null || TextUtils.isEmpty(dataBean.getGmpPath())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getGmpPath());
+
+                }
+            }
+        }, 0, spanGmpPath.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);*/
+        vndetailTvGmpName.setText(TextUtils.isEmpty(dataBean.getGmpName()) ? "N/A" : dataBean.getGmpName());
+        //vndetailTvGmpName.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn0 = new SpannableString("点击查看");
+        spanvndetailTvOthervn0.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getBatchCertificate() == null || TextUtils.isEmpty(dataBean.getBatchCertificate())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getBatchCertificate());
+                }
+            }
+        }, 0, spanvndetailTvOthervn0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvGmpPath.setText(spanvndetailTvOthervn0);
+        vndetailTvGmpPath.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn1 = new SpannableString("点击查询");
+        spanvndetailTvOthervn1.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameBatchOtherColdChain() == null || TextUtils.isEmpty(dataBean.getSameBatchOtherColdChain())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getSameBatchOtherColdChain());
+                }
+            }
+        }, 0, spanvndetailTvOthervn1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn1.setText(spanvndetailTvOthervn1);
+        vndetailTvOthervn1.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+
+        SpannableString spanvndetailTvOthervn2 = new SpannableString("点击查询");
+        spanvndetailTvOthervn2.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameBatchOtherFlow() == null || TextUtils.isEmpty(dataBean.getSameBatchOtherFlow())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getSameBatchOtherFlow());
+                }
+            }
+        }, 0, spanvndetailTvOthervn2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn2.setText(spanvndetailTvOthervn2);
+        vndetailTvOthervn2.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn3 = new SpannableString("点击查询");
+        spanvndetailTvOthervn3.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameFactoryOtherVaccines() == null || TextUtils.isEmpty(dataBean.getSameFactoryOtherVaccines())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getSameFactoryOtherVaccines());
+
+                }
+            }
+        }, 0, spanvndetailTvOthervn3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn3.setText(spanvndetailTvOthervn3);
+        vndetailTvOthervn3.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+    }
+
+    private void gotoWebActivity(String path) {
+        if (isWarning) {
+            warninghandler.removeCallbacks(warningRunnable);
+        } else {
+            normalhandler.removeCallbacks(normalRunnable);
+        }
+        Intent in = new Intent(VnReportDetailForDoctorActivity.this, WebActivity.class);
+        in.putExtra("WebViewUrl", "" + path + "");
+        startActivity(in);
+    }
+
+
+    @Override
+    protected VnDetailPresenter createPresenter() {
+        return new VnDetailPresenter();
+    }
+
+    @Override
+    public void getSendMailSuccess(VnDetailBean data) {
+        toast("邮件已发送");
+        //finish();
+    }
+
+    @Override
+    public void getmlistError(String msg) {
+        toast("邮件发送失败");
+    }
+
+    @Override
+    public void getmlistSuccess(ModelListBean data) {
+
+    }
+
+    @Override
+    public void getToReviewError(String msg) {
+
+    }
+
+    @Override
+    public void getToReviewSuccess(VerificationCodeBean data) {
+
+    }
+
+    @Override
+    public void getDetailError(String msg) {
+
+    }
+
+    @Override
+    public void getDetailSuccess(VnDetailBean data) {
+
+    }
+
+    @Override
+    public void getSendMailError(String msg) {
+        toast(msg);
+    }
+
+
+    public String addZero(String msg) {
+        //Log.e("addZero1",""+msg + "  "+msg.length());
+        if (TextUtils.isEmpty(msg)) {
+            return "N/A";
+        }
+        if (msg.length() >= 11) {
+            return msg;
+        } else {
+            String remsg = msg;
+            for (int i = 0; i < 11 - msg.length(); i++) {
+                remsg = "0" + remsg;
+            }
+            // Log.e("addZero",""+remsg + "  "+remsg.length());
+            return remsg;
+        }
+    }
+
+    public static void i(String tag, String msg) {  //信息太长,分段打印
+        //因为String的length是字符数量不是字节数量所以为了防止中文字符过多,
+        //  把4*1024的MAX字节打印长度改为2001字符数
+        int max_str_length = 2001 - tag.length();
+        //大于4000时
+        while (msg.length() > max_str_length) {
+            Log.i(tag, msg.substring(0, max_str_length));
+            msg = msg.substring(max_str_length);
+        }
+        //剩余部分
+        Log.i(tag, msg);
+
+    }
+
+    @Override
+    protected void onDestroy() {
+        if (status == 6 || status == 7 || status == 8) {
+            SPUtils.remove("INOCULATOR_LIST");
+        }
+        // soundPoolHelper.release();
+        if (normalhandler != null) {
+            normalhandler.removeCallbacksAndMessages(null);
+        }
+        if (warninghandler != null) {
+            warninghandler.removeCallbacksAndMessages(null);
+        }
+        super.onDestroy();
+    }
+
+    @Override
+    public void onDown() {
+        Log.e("DoctorVnReportActivity", "down");
+        if (isWarning) {
+            if (warninghandler != null) {
+                warninghandler.removeCallbacks(warningRunnable);
+            }
+        } else {
+            if (normalhandler != null) {
+                normalhandler.removeCallbacks(normalRunnable);
+            }
+        }
+    }
+
+    @Override
+    public void onUp() {
+        Log.e("DoctorVnReportActivity", "up");
+        if (isWarning) {
+            warninghandler.postDelayed(warningRunnable, 1000 * 60);
+        } else {
+            normalhandler.postDelayed(normalRunnable, 1000 * 60);
+        }
+    }
+
+    @Override
+    public void oneClick() {
+
+    }
+
+    @Override
+    public void doubleClick() {
+
+    }
+
+
+    public void textJump(final List<TextView> tvList) {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                for (int i = 0; i < tvList.size(); i++) {
+                    try {
+                        Thread.sleep(3000 / tvList.size());
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                    final int finalI = i;
+                    if (getActivity() != null) {
+                        runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                tvList.get(finalI).setVisibility(View.VISIBLE);
+                            }
+                        });
+                    }
+                }
+            }
+        }).start();
+    }
+}

+ 20 - 0
.svn/pristine/04/04cc9e8f808bfecad2a893139c10d53c393dbdb6.svn-base

@@ -0,0 +1,20 @@
+apply plugin: 'com.android.library'
+
+android {
+    compileSdkVersion rootProject.ext.compileSdkVersion
+    buildToolsVersion rootProject.ext.buildToolsVersion
+
+    resourcePrefix "dialog_"
+
+    defaultConfig {
+        minSdkVersion 15
+        targetSdkVersion rootProject.ext.targetSdkVersion
+    }
+}
+
+dependencies {
+    implementation "com.android.support:appcompat-v7:$rootProject.ext.supportLibraryVersion"
+    implementation "com.android.support:design:$rootProject.ext.supportLibraryVersion"
+    // 基础库(不包任何第三方框架)
+    implementation project(':base')
+}

+ 10 - 0
.svn/pristine/05/0506cf2adaa4a6bb9fa5c09b65e28804e0938a91.svn-base

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- 按压状态 -->
+    <item android:drawable="@mipmap/tab_ico_message_off" android:state_checked="true" />
+
+    <!-- 默认状态 -->
+    <item android:drawable="@mipmap/tab_ico_message" />
+
+</selector>

+ 192 - 0
.svn/pristine/05/050a43b5720a15804addcf9525a0970a729e506a.svn-base

@@ -0,0 +1,192 @@
+apply plugin: 'com.android.application'
+apply plugin: 'org.greenrobot.greendao' // apply plugin
+
+android {
+    compileSdkVersion rootProject.ext.compileSdkVersion
+    buildToolsVersion rootProject.ext.buildToolsVersion
+    defaultConfig {
+        applicationId "eVVM.apk"
+        minSdkVersion 15
+        targetSdkVersion rootProject.ext.targetSdkVersion
+        versionCode 103
+        versionName "1.0.3"
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
+        multiDexEnabled true
+
+        javaCompileOptions {
+            annotationProcessorOptions {
+                // EventBus Apt 索引类生成位置
+                arguments = [eventBusIndex: applicationId + '.MyEventBusIndex']
+            }
+        }
+
+        ndk {
+            //选择要添加的对应 cpu 类型的 .so 库。
+            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
+            // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
+        }
+
+        manifestPlaceholders = [
+                JPUSH_PKGNAME: applicationId,
+                JPUSH_APPKEY : "a34cef708ddaa15e2d8367f0", //JPush 上注册的包名对应的 Appkey.
+                JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
+        ]
+    }
+
+    packagingOptions {
+        doNotStrip '*/mips/*.so'
+        doNotStrip '*/mips64/*.so'
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+
+    // JNI 目录
+    sourceSets {
+        main {
+            jniLibs.srcDirs = ['libs']
+        }
+    }
+
+}
+
+
+greendao {
+    /**
+     * 数据库版本
+     */
+    schemaVersion 1
+    /**
+     * greenDao输出到Dao数据库实体操作类文件目录
+     */
+    daoPackage 'greendao'
+    /**
+     * GreenDao实体类dao文件目录
+     */
+    targetGenDir 'src/main/java'
+}
+
+
+dependencies {
+    // 依赖 libs 目录下所有 jar 包
+    implementation fileTree(include: ['*.jar'], dir: 'libs')
+    // 依赖 libs 目录下所有 aar 包
+    implementation fileTree(include: ['*.aar'], dir: 'libs')
+
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+    // 基础库(不包任何第三方框架)
+    implementation project(':base')
+    // 自定义 View
+    implementation project(':widget')
+    // Dialog 封装
+    implementation project(':dialog')
+    // Glide 隔离
+    implementation project(':image')
+
+    implementation 'com.android.support:appcompat-v7:28.0.0'
+    implementation 'com.android.support:support-v4:28.0.0'
+    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+
+    implementation 'com.android.support:appcompat-v7:28.0.0'
+    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+    implementation "com.android.support:design:$rootProject.ext.supportLibraryVersion"
+
+    implementation 'com.alibaba:fastjson:1.1.71.android'
+
+    // Dex分包,解决 64k 问题
+    implementation 'com.android.support:multidex:1.0.3'
+
+    // ButterKnife 注解库:https://github.com/JakeWharton/butterknife
+    implementation 'com.jakewharton:butterknife:9.0.0-rc1'
+    annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'
+
+    // EventBus 事件总线
+    implementation "org.greenrobot:eventbus:3.1.1"
+    annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
+
+    //recyclerview
+    implementation 'com.android.support:appcompat-v7:28.0.0-alpha1'
+    implementation 'com.android.support:recyclerview-v7:28.0.0-alpha1'
+
+    // 状态栏沉浸:https://github.com/gyf-dev/ImmersionBar
+    implementation 'com.gyf.immersionbar:immersionbar:2.3.3'
+    // 侧滑功能:https://github.com/bingoogolapple/BGASwipeBackLayout-Android
+    implementation 'cn.bingoogolapple:bga-swipebacklayout:1.2.0'
+
+    // 权限请求框架:https://github.com/getActivity/XXPermissions
+    implementation 'com.hjq:xxpermissions:5.5'
+    // 标题栏:https://github.com/getActivity/TitleBar
+    implementation 'com.hjq:titlebar:5.0'
+    // 吐司工具类:https://github.com/getActivity/ToastUtils
+    implementation 'com.hjq:toast:6.0'
+
+    // viewhelper
+    implementation 'com.nineoldandroids:library:2.4.0'
+
+    // 圆形的ImageView:https://github.com/hdodenhof/CircleImageView
+    implementation 'de.hdodenhof:circleimageview:2.2.0'
+
+    // 支持放大缩放的ImageView:https://github.com/chrisbanes/PhotoView 出问题了看看 https://www.jianshu.com/p/f7a7a8765294
+    implementation 'com.github.chrisbanes:PhotoView:2.0.0'
+
+    //AutoSize 今日头条屏幕适配方案终极版
+    implementation 'me.jessyan:autosize:1.1.2'
+
+    //BGAQRCode-Android 二维码  + Android 图片选择、预览、九宫格图片控件、拖拽排序九宫格图片控件
+    //https://github.com/bingoogolapple/BGAQRCode-Android + https://github.com/bingoogolapple/BGAPhotoPicker-Android
+    implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.3.6'
+    implementation 'cn.bingoogolapple:bga-photopicker:1.2.8'
+    implementation 'cn.bingoogolapple:bga-baseadapter:1.2.7'
+    implementation 'cn.bingoogolapple:bga-banner:2.2.6@aar'
+
+    //recyclerview适配器 https://github.com/CymChad/BaseRecyclerViewAdapterHelper
+    implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46'
+
+    //网络请求框架   https://github.com/lygttpod/RxHttpUtils
+    implementation 'com.github.lygttpod:RxHttpUtils:2.3.3'
+
+    //极光推送   官方文档 : https://docs.jiguang.cn/jpush/client/Android/android_api/
+    implementation 'cn.jiguang.sdk:jpush:3.3.2'
+    implementation 'cn.jiguang.sdk:jcore:2.0.1'
+
+    //netcheck
+    implementation 'com.github.tianma8023:NetDetector:v0.2.0'
+
+    //上拉刷新下拉加载  https://github.com/anzaizai/EasyRefreshLayout  可结合BaseRecyclerViewAdapterHelper
+    implementation 'com.github.anzaizai:EasyRefreshLayout:1.3.1'
+
+    //pdfview   https://github.com/barteksc/AndroidPdfViewer
+    implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'
+
+    //安卓数据库
+    implementation 'org.greenrobot:greendao:3.2.2' // add library
+    implementation 'org.greenrobot:greendao-generator:3.2.2'
+
+    // 布局优化:https://github.com/getActivity/Layouts
+    // 分割线:https://github.com/getActivity/RecyclerItemDecoration
+    // 国际化:https://github.com/getActivity/MultiLanguages
+    // 悬浮窗:https://github.com/getActivity/XToast
+    // 网络请求:https://github.com/zhou-you/RxEasyHttp
+    // RxJava: https://github.com/ReactiveX/RxAndroid
+    // RecyclerView:https://github.com/CymChad/BaseRecyclerViewAdapterHelper
+    // 上拉刷新下拉加载:https://github.com/scwang90/SmartRefreshLayout
+    // 工具类:https://github.com/Blankj/AndroidUtilCode
+    // 图片选择:https://github.com/zhihu/Matisse
+    // 轮播图:https://github.com/bingoogolapple/BGABanner-Android
+    // 二维码:https://github.com/bingoogolapple/BGAQRCode-Android
+    // 第三方支付:https://github.com/getActivity/RxPay
+    // Log 打印:https://github.com/JakeWharton/timber
+    // 重要数据存储:https://github.com/Tencent/MMKV
+}

+ 1 - 0
.svn/pristine/05/051b18d658934ebfc19458bac034fed7363b1c7a.svn-base

@@ -0,0 +1 @@
+[{"outputType":{"type":"AAPT_FRIENDLY_MERGED_MANIFESTS"},"apkData":{"type":"MAIN","splits":[],"versionCode":-1,"enabled":true,"outputFile":"dialog-debug.aar","fullName":"debug","baseName":"debug"},"path":"AndroidManifest.xml","properties":{"packageId":"com.hjq.dialog","split":""}}]

+ 354 - 0
.svn/pristine/05/0556c9ddf1c67f4d48124f198bce12ff3a38a99c.svn-base

@@ -0,0 +1,354 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout 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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical" >
+
+
+    <com.hjq.bar.TitleBar
+        android:id="@+id/tb_vndetail_title"
+        android:layout_width="match_parent"
+        android:visibility="gone"
+        android:layout_height="wrap_content" />
+
+    <ScrollView
+        android:layout_marginTop="10dp"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@color/white"
+            android:paddingBottom="80dp"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:layout_marginRight="10dp"
+                android:orientation="vertical">
+
+                <ImageView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:src="@mipmap/iv_report_top" />
+
+                <TextView
+                    android:id="@+id/vndetail_tv_vncode"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dp"
+                    android:textSize="12sp" />
+
+                <TextView
+                    android:id="@+id/vndetail_tv_vndate"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dp"
+                    android:textColor="@color/gray"
+                    android:textSize="12sp" />
+
+
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginTop="25dp"
+                    android:background="@color/black10" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="15dp"
+                    android:text="疫苗详情"
+                    android:textSize="17dp"
+                    android:textStyle="bold" />
+
+                <LinearLayout
+                    android:orientation="horizontal"
+                    android:layout_marginTop="18dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginRight="50dp"
+                        android:text="生产企业" />
+                    <TextView
+                        android:id="@+id/vndetail_tv_factoryName"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"/>
+                </LinearLayout>
+                <LinearLayout
+                    android:orientation="horizontal"
+                    android:layout_marginTop="8dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginRight="50dp"
+                        android:text="GMP证书" />
+                    <TextView
+                        android:id="@+id/vndetail_tv_gmpName"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"/>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:orientation="horizontal"
+                    android:layout_marginTop="8dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginRight="36dp"
+                        android:text="批签发证书" />
+                    <TextView
+                        android:textColor="@color/blue"
+                        android:id="@+id/vndetail_tv_gmpPath"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:autoLink="all"
+                        android:text="点击查看" />
+                </LinearLayout>
+
+
+
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginTop="15dp"
+                    android:background="@color/black10" />
+
+
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="15dp"
+                    android:text="接种人员"
+                    android:textSize="17dp"
+                    android:textStyle="bold" />
+
+                <LinearLayout
+                    android:orientation="horizontal"
+                    android:layout_marginTop="18dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginRight="50dp"
+                        android:text="接种单位" />
+                    <TextView
+                        android:id="@+id/vndetail_tv_hospitalName"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"/>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:orientation="horizontal"
+                    android:layout_marginTop="10dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginRight="50dp"
+                        android:text="医生姓名" />
+                    <TextView
+                        android:id="@+id/vndetail_tv_doctorName"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"/>
+                </LinearLayout>
+
+
+                <LinearLayout
+                    android:orientation="horizontal"
+                    android:layout_marginTop="10dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginRight="50dp"
+                        android:text="联系方式" />
+                    <TextView
+                        android:id="@+id/vndetail_tv_doctorTelephone"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"/>
+                </LinearLayout>
+
+
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginTop="13dp"
+                    android:background="@color/black10" />
+
+
+                <ImageView
+                    android:id="@+id/vndetail_tv_chatImage"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="25dp" />
+
+
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginTop="20dp"
+                    android:background="@color/black10" />
+
+                <LinearLayout
+                    android:orientation="horizontal"
+                    android:layout_marginTop="30dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <TextView
+                        android:id="@+id/vndetail_tv_othervn1"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginRight="40dp"
+                        android:text="点击查询" />
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="同批次其他疫苗冷链" />
+                </LinearLayout>
+
+                <LinearLayout
+                    android:orientation="horizontal"
+                    android:layout_marginTop="10dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <TextView
+                        android:id="@+id/vndetail_tv_othervn2"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginRight="40dp"
+                        android:text="点击查询" />
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="同批次其他疫苗流向" />
+                </LinearLayout>
+
+                <LinearLayout
+                    android:orientation="horizontal"
+                    android:layout_marginTop="10dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <TextView
+                        android:id="@+id/vndetail_tv_othervn3"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginRight="40dp"
+                        android:text="点击查询" />
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="同企业其他疫苗" />
+                </LinearLayout>
+
+
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="25dp"
+                    android:orientation="horizontal">
+
+                    <ImageView
+                        android:id="@+id/vndetail_iv_tipsimg"
+                        android:layout_width="60dp"
+                        android:layout_height="60dp"
+                        android:src="@mipmap/ic_launcher" />
+
+                    <TextView
+                        android:id="@+id/vndetail_tv_tips"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="30dp"
+                        android:text="@string/vndeatil_tips"
+                        android:textColor="@color/gray"
+                        android:textSize="12sp" />
+                </LinearLayout>
+
+            </LinearLayout>
+
+
+            <LinearLayout
+                android:layout_marginTop="30dp"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingLeft="10dp"
+                android:paddingRight="10dp"
+                android:background="#F0F5FF"
+                android:orientation="vertical">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="30dp"
+                    android:text="免责声明:"
+                    android:textSize="15sp"
+                    android:textStyle="bold" />
+
+                <TextView
+                    android:id="@+id/vndetail_tv_disclaimer"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="10dp"
+                    android:layout_marginBottom="20dp"
+                    android:text="@string/vndeatil_disclaimer"
+                    android:textColor="@color/gray"
+                    android:textSize="12sp" />
+            </LinearLayout>
+
+        </LinearLayout>
+
+    </ScrollView>
+
+    <RelativeLayout
+        android:layout_centerHorizontal="true"
+        android:layout_alignParentBottom="true"
+        android:orientation="horizontal"
+        android:paddingBottom="10dp"
+        android:background="@color/white"
+        android:paddingTop="10dp"
+        android:gravity="center_horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+        <Button
+            android:id="@+id/send_btn_report"
+            android:layout_width="140dp"
+            android:layout_height="35dp"
+            android:background="@drawable/small_btn"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:layout_marginRight="30dp"
+            android:text="@string/report_send"
+            android:textColor="@color/white"
+            android:textSize="15.3sp" />
+
+        <Button
+            android:id="@+id/next_btn_report"
+            android:layout_toRightOf="@+id/send_btn_report"
+            android:layout_width="140dp"
+            android:layout_height="35dp"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:background="@drawable/small_btn"
+            android:text="@string/report_next"
+            android:textColor="@color/white"
+            android:textSize="15.3sp" />
+    </RelativeLayout>
+
+
+</RelativeLayout>

BIN
.svn/pristine/05/0558706e9b6777582154571addd15b8606681551.svn-base


+ 184 - 0
.svn/pristine/05/05619cad7fa07b055dd27f65a13aa1aeb2b2f504.svn-base

@@ -0,0 +1,184 @@
+package eVVM.apk.ui.riskwaring;
+
+import android.content.Intent;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+import com.ajguan.library.EasyRefreshLayout;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import eVVM.apk.R;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.mvp.MvpLazyFragment;
+import eVVM.apk.ui.alarmwaring.AlarmContract;
+import eVVM.apk.ui.alarmwaring.AlarmPresenter;
+import eVVM.apk.ui.event.ReviewEvent;
+import eVVM.apk.ui.toreview.VnToreViewActivity;
+import eVVM.apk.ui.toreview.adapter.NoToreAdapter;
+import eVVM.apk.ui.toreview.bean.ToreviewBean;
+
+/**
+ * Created by Android Studio.
+ * User:  zbb
+ * Date: 2019/6/5
+ * Describe: RiskWaringFragment
+ */
+public class RiskWaringFragment extends MvpLazyFragment<AlarmPresenter> implements AlarmContract.View {
+
+    @BindView(R.id.risk_rv)
+    RecyclerView riskRv;
+    @BindView(R.id.risk_easylayout)
+    EasyRefreshLayout riskEasylayout;
+
+
+    private int page = 1;
+    private int size = 10;
+    private String user_factory_id;
+    private String user_roleId;
+    private NoToreAdapter noToreAdapter;
+    private List<ToreviewBean.DataBean> rvDataList = new ArrayList<>();
+
+    public static RiskWaringFragment newInstance() {
+        return new RiskWaringFragment();
+    }
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.risk_fragment;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.tb_risk_title;
+    }
+
+    @Override
+    protected void initView() {
+
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+
+    }
+
+    @Override
+    protected void initData() {
+
+        user_factory_id = (String) SPUtils.get("USER_FACTORY_ID", "");
+        user_roleId = (String) SPUtils.get("USER_ROLEID", "");
+        getPresenter().AlarmList(page, size, user_roleId, user_factory_id, 0);  //type   0 风险    1 报警
+
+        noToreAdapter = new NoToreAdapter(R.layout.notoreviewlist, rvDataList);
+        riskRv.setAdapter(noToreAdapter);
+        riskRv.setLayoutManager(new LinearLayoutManager(getBindingActivity()));
+        noToreAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
+            @Override
+            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
+                Intent in = new Intent(getBindingActivity(), VnToreViewActivity.class);
+                in.putExtra("VnchipNumber", "" + rvDataList.get(position).getChipNumber());
+                in.putExtra("toreviewid", rvDataList.get(position).getId() + "");
+                in.putExtra("rsReviewType", 2);
+                startActivity(in);
+            }
+        });
+
+
+        riskEasylayout.addEasyEvent(new EasyRefreshLayout.EasyEvent() {
+            @Override
+            public void onLoadMore() {
+
+                page += 1;
+                getPresenter().AlarmList(page, size, user_roleId, user_factory_id, 0);
+            }
+
+            @Override
+            public void onRefreshing() {
+
+                page = 1;
+                getPresenter().AlarmList(page, size, user_roleId, user_factory_id, 0);
+            }
+        });
+    }
+
+
+    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
+    public void onEvent(ReviewEvent event) {
+        if (event.type == 2) {
+            page = 1;
+            getPresenter().AlarmList(page, size, user_roleId, user_factory_id, 0);
+        }
+    }
+
+
+    @Override
+    protected AlarmPresenter createPresenter() {
+        return new AlarmPresenter();
+    }
+
+    @Override
+    public void AlarmError(String msg) {
+        toast(msg);
+    }
+
+    @Override
+    public void AlarmSuccess(List<ToreviewBean.DataBean> list) {
+        //toast("成功");
+        if (page == 1 && list.size() == 0) {
+            toast("暂无不正常复核信息");
+            rvDataList.clear();
+            rvDataList.addAll(list);
+            noToreAdapter.setNewData(list);
+            noToreAdapter.notifyDataSetChanged();
+            riskEasylayout.refreshComplete();
+            return;
+        }
+
+        if (page == 1) {
+            rvDataList.clear();
+            rvDataList.addAll(list);
+            noToreAdapter.setNewData(list);
+            noToreAdapter.notifyDataSetChanged();
+            riskEasylayout.refreshComplete();
+        } else {
+            if (list.size() == 0) {
+                toast("没有更多啦");
+            }
+            rvDataList.addAll(list);
+            noToreAdapter.getData().addAll(list);
+            noToreAdapter.notifyDataSetChanged();
+            riskEasylayout.loadMoreComplete();
+        }
+    }
+
+    @Override
+    public void onLoading() {
+
+    }
+
+    @Override
+    public void onComplete() {
+
+    }
+
+    @Override
+    public void onEmpty() {
+
+    }
+
+    @Override
+    public void onError() {
+
+    }
+
+
+}

+ 14 - 0
.svn/pristine/05/058e690eb60107ce71a4d62234f7b2f9ea54e7d2.svn-base

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+
+    <TextView
+        android:layout_marginTop="50dp"
+        android:layout_width="match_parent"
+        android:text="疫苗报告"
+        android:layout_height="match_parent" />
+
+</LinearLayout>

+ 728 - 0
.svn/pristine/05/059c39e707511043533b0e043f174afb42e21bfd.svn-base

@@ -0,0 +1,728 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/white">
+
+
+    <com.hjq.bar.TitleBar
+        android:id="@+id/tb_vndetail_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:visibility="visible"
+        app:lineColor="@color/black"
+        app:title="@string/report_zhuishu" />
+
+    <eVVM.apk.widget.ZoomView
+        android:id="@+id/zv_report"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@+id/tb_vndetail_title">
+
+        <LinearLayout
+            android:id="@+id/tobigll"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:paddingLeft="10dp"
+            android:paddingRight="10dp"
+            android:paddingBottom="40dp">
+
+            <RelativeLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:layout_marginTop="2dp"
+                android:layout_marginRight="10dp">
+
+                <ImageView
+                    android:id="@+id/iv_report_top"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:src="@mipmap/iv_report_top" />
+
+                <TextView
+                    android:id="@+id/vndetail_tv_tt"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentRight="true"
+                    android:layout_marginLeft="25dp"
+                    android:layout_marginBottom="2dp"
+                    android:layout_toRightOf="@id/iv_report_top"
+                    android:gravity="center"
+                    android:text="产品追溯报告"
+                    android:textSize="10sp"
+                    android:visibility="gone" />
+
+
+                <TextView
+                    android:id="@+id/vndetail_tv_line"
+                    android:layout_width="match_parent"
+                    android:layout_height="10dp"
+                    android:layout_below="@id/vndetail_tv_tt"
+                    android:layout_alignParentRight="true"
+                    android:layout_marginLeft="25dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_toRightOf="@id/iv_report_top"
+                    android:background="#a8996e"
+                    android:text="" />
+
+                <TextView
+                    android:id="@+id/vndetail_tv_title"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@id/vndetail_tv_tt"
+                    android:layout_alignLeft="@+id/vndetail_tv_line"
+                    android:layout_alignParentRight="true"
+                    android:layout_marginRight="10dp"
+                    android:background="#a8996e"
+                    android:text=" CARGO TRACK REPORT"
+                    android:textColor="#ffffff"
+                    android:textSize="11sp"
+                    android:textStyle="bold" />
+
+                <TextView
+                    android:id="@+id/vndetail_tv_vncode"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@+id/vndetail_tv_title"
+                    android:layout_alignLeft="@+id/vndetail_tv_title"
+                    android:layout_marginTop="5dp"
+                    android:layout_marginRight="10dp"
+                    android:text=""
+                    android:textColor="@color/gray"
+                    android:textSize="8sp" />
+
+                <TextView
+                    android:id="@+id/vndetail_tv_vndate"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@+id/vndetail_tv_vncode"
+                    android:layout_alignLeft="@+id/vndetail_tv_title"
+                    android:layout_marginTop="2dp"
+                    android:text=""
+                    android:textColor="@color/gray"
+                    android:textSize="8sp" />
+            </RelativeLayout>
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="6"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/vntype"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="3dp"
+                        android:text="受种人员"
+                        android:textSize="8sp"
+                        android:textStyle="bold" />
+
+                    <LinearLayout
+                        android:id="@+id/ll_shouzhongrenyuan"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="4dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="受种者姓名........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnname"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="性别..............."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnsex"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="出生日期........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnbirthday"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="二维码编号........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vncodeid"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="受种者监护人......"
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnjianhuren"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="联系方式........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnphone"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                    </LinearLayout>
+
+
+                    <LinearLayout
+                        android:id="@+id/ll_yumiaoxiangqing"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone">
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="3dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="疫苗名称........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_ymname"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="疫苗规格........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnsc"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="生产企业........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_factoryName"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="GMP 编号........"
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_gmpName"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8sp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="批签发证书....."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_gmpPath"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:autoLink="all"
+                                android:text="点击查看"
+                                android:textColor="@color/blue"
+                                android:textSize="8sp" />
+                        </LinearLayout>
+
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="生产日期........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vncreatdate"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="有效期 .............."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnvalid"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+                    </LinearLayout>
+
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="5"
+                    android:orientation="vertical">
+
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="3dp"
+                        android:text="接种人员"
+                        android:textSize="8sp"
+                        android:textStyle="bold" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="4dp"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="接种单位........"
+                            android:textSize="8sp" />
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_hospitalName"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:textSize="8sp" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="4dp"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="医生姓名........"
+                            android:textSize="8sp" />
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_doctorName"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:textSize="8sp" />
+                    </LinearLayout>
+
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="4dp"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="联系方式............"
+                            android:textSize="8sp" />
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_doctorTelephone"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:textSize="8sp" />
+                    </LinearLayout>
+
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="2dp"
+                android:text="追溯结果:"
+                android:textSize="8sp"
+                android:textStyle="bold" />
+
+            <RelativeLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="1dp"
+                android:background="@drawable/llborder">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:background="@drawable/llborder2"
+                    android:orientation="vertical"
+                    android:paddingLeft="15dp"
+                    android:paddingTop="9dp"
+                    android:paddingRight="15dp"
+                    android:paddingBottom="2dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:text="冷链温度"
+                        android:textColor="#a8996e"
+                        android:textSize="10sp" />
+
+                    <ImageView
+                        android:id="@+id/vndetail_tv_chatImage"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:layout_marginTop="5dp" />
+                </LinearLayout>
+            </RelativeLayout>
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="1dp"
+                android:orientation="horizontal"
+                >
+
+                <TextView
+                    android:id="@+id/vn_type"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="5"
+                    android:textSize="7sp"
+                    android:textStyle="bold" />
+
+                <TextView
+                    android:id="@+id/vn_tips"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="10.5"
+                    android:textSize="7sp" />
+            </LinearLayout>
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="3dp"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="5"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:paddingTop="1dp"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="可追溯:"
+
+                        android:textSize="7sp" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_othervn1"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="点击查询......"
+                            android:textSize="7sp" />
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="同批次其他疫苗冷链"
+                            android:textSize="7sp" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="4dp"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_othervn2"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="点击查询......"
+                            android:textSize="7sp" />
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="同批次其他疫苗流向"
+                            android:textSize="7sp" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="4dp"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_othervn3"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="点击查询......"
+                            android:textSize="7sp" />
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="同企业其他疫苗"
+                            android:textSize="7sp" />
+                    </LinearLayout>
+                </LinearLayout>
+
+                <RelativeLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="10.5"
+                    android:orientation="horizontal">
+
+                    <ScrollView
+
+                        android:layout_width="wrap_content"
+                        android:layout_height="55dp"
+                        android:layout_toLeftOf="@+id/vndetail_iv_tipsimg">
+
+                        <TextView
+                            android:paddingTop="3dp"
+                            android:id="@+id/vndetail_tv_tips"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/vndeatil_tips"
+                            android:textColor="@color/gray"
+                            android:textSize="4.3sp" />
+                    </ScrollView>
+
+
+                    <ImageView
+                        android:id="@+id/vndetail_iv_tipsimg"
+                        android:layout_width="55dp"
+                        android:layout_height="55dp"
+                        android:layout_alignParentRight="true"
+
+                        android:src="@mipmap/qrcode" />
+                </RelativeLayout>
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="3dp"
+                android:orientation="horizontal">
+
+                <RelativeLayout
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_marginRight="-2dp"
+                    android:layout_weight="1"
+                    android:background="@drawable/border_report"
+                    android:orientation="vertical"
+                    android:padding="10dp">
+
+                    <ImageView
+                        android:layout_width="20dp"
+                        android:layout_height="wrap_content"
+                        android:layout_centerInParent="true"
+                        android:src="@mipmap/dun" />
+                </RelativeLayout>
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="6"
+                    android:background="@drawable/border_report"
+                    android:orientation="vertical"
+                    android:padding="5dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="免责声明:"
+                        android:textColor="#97885c"
+                        android:textSize="8sp"
+                        android:textStyle="bold" />
+
+                    <ScrollView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content">
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_disclaimer"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/vndeatil_disclaimer"
+                            android:textColor="#97885c"
+                            android:textSize="5sp" />
+                    </ScrollView>
+
+                </LinearLayout>
+            </LinearLayout>
+
+
+        </LinearLayout>
+
+    </eVVM.apk.widget.ZoomView>
+
+    <ImageButton
+        android:id="@+id/vndetail_bt_magnifier"
+        android:layout_width="30dp"
+        android:layout_height="30dp"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginRight="10dp"
+        android:layout_marginBottom="5dp"
+        android:background="@color/transparent"
+        android:src="@mipmap/magnifier" />
+
+</RelativeLayout>

+ 45 - 0
.svn/pristine/05/05be5769e02309ac174a5fea2524dfaef6cb0ca2.svn-base

@@ -0,0 +1,45 @@
+package eVVM.apk.common;
+
+import java.util.List;
+
+import eVVM.apk.ui.toreview.bean.ToreviewBean;
+
+/**
+ * Created by Android Studio.
+ * User:  zbb
+ * Date: 2019/6/10
+ * Describe: BaseDataBean
+ */
+public class BaseDataBean {
+
+    /**
+     * 错误码
+     */
+    private int code;
+    /**
+     * 错误描述
+     */
+    private String msg;
+
+
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+
+
+
+}

+ 36 - 0
.svn/pristine/06/0629c6ffc031c894953741a9dc2c4ef81ffb66c8.svn-base

@@ -0,0 +1,36 @@
+package eVVM.apk.ui.toreview.adapter;
+
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+
+import java.util.List;
+
+import eVVM.apk.R;
+import eVVM.apk.ui.toreview.bean.ToreviewBean;
+
+public class NoToreAdapter extends BaseQuickAdapter<ToreviewBean.DataBean, BaseViewHolder> {
+
+
+    public NoToreAdapter(int layoutResId, @Nullable List<ToreviewBean.DataBean> data) {
+        super(layoutResId, data);
+    }
+
+    @Override
+    protected void convert(BaseViewHolder helper, ToreviewBean.DataBean item) {
+        helper.setText(R.id.notorelist_tvname,item.getChipNumber());
+        //helper.setText(R.id.notorelist_tvnum,item.getNum());
+        helper.setText(R.id.notorelist_tvtime,item.getSendTime());
+
+        if (TextUtils.isEmpty(item.getMessageModelContent())){
+            helper.setGone(R.id.notorelist_tvline,false);
+            helper.setGone(R.id.notorelist_tvanswer,false);
+        }else {
+            helper.setGone(R.id.notorelist_tvline,true);
+            helper.setGone(R.id.notorelist_tvanswer,true);
+            helper.setText(R.id.notorelist_tvanswer,item.getMessageModelContent());
+        }
+    }
+}

+ 529 - 0
.svn/pristine/06/0634c67b4cb597d86b2d5374b570d7d8ea603efa.svn-base

@@ -0,0 +1,529 @@
+package eVVM.apk.ui.vaccination;
+
+
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.app.Dialog;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+import android.nfc.NfcAdapter;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Parcelable;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.View;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.CycleInterpolator;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.LinearInterpolator;
+import android.view.animation.RotateAnimation;
+import android.widget.ImageView;
+import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
+
+import com.hjq.base.BaseDialog;
+import com.hjq.base.BaseDialogFragment;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.ConversionUtil;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.helper.SoundPoolHelper;
+import eVVM.apk.ui.bean.VnDetailBean;
+import eVVM.apk.ui.home.BaseNfcActivity;
+import eVVM.apk.ui.home.uploadChip.UploadChipContract;
+import eVVM.apk.ui.vaccination.save.ChipModel;
+import eVVM.apk.widget.EvvmMsgDiago;
+
+
+public class ReadingActivity extends BaseNfcActivity implements UploadChipContract.View {
+
+    private boolean isWarning = false;
+    private ChipModel chipModel;
+    private SoundPoolHelper soundPoolHelper;
+    private String textRecord = "";
+    private String chipNumber = "";
+
+
+    @BindView(R.id.reading__line)
+    ImageView imgreadline;
+
+    @BindView(R.id.reading_progress)
+    ProgressBar readingProgress;
+
+    @BindView(R.id.fly_phonerl)
+    RelativeLayout flyphonerl;
+    private Animation animation;
+    private AlphaAnimation alp;
+    private AnimatorSet animatorSetsuofang;
+    private AnimatorSet animatorSetsuofang2;
+    private BaseDialog loadDiago;
+    private ProgressBar readpb;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_reading;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.reading_title;
+    }
+
+    @Override
+    protected void initView() {
+        getAnimationSao(); //进行雷达扫描动画
+        soundPoolHelper = new SoundPoolHelper(5, SoundPoolHelper.TYPE_MUSIC)
+                .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC)
+                .loadDefault(ReadingActivity.this)
+                .load(ReadingActivity.this, "factory_operator_success", R.raw.factory_operator_success)
+                .load(ReadingActivity.this, "factory_operator_error", R.raw.factory_operator_error)
+                .load(ReadingActivity.this, "xufuhe", R.raw.xufuhe)
+                .load(ReadingActivity.this, "zhengchang", R.raw.zhengchang)
+                .load(ReadingActivity.this, "nuliduquzhong", R.raw.nuliduquzhong);
+
+
+        //第一次加载才会做飞出动画
+        int flyPhoneType = (int) SPUtils.get("FlyPhoneType", 0);
+        if (flyPhoneType == 0) {
+            getFlyPhone();
+            SPUtils.put("FlyPhoneType", 1);
+        } else {
+            flyphonerl.setVisibility(View.GONE);
+        }
+    }
+
+    private void getFlyPhone() {
+        Resources resources = this.getResources();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+        int height3 = dm.heightPixels;
+
+        //组合动画
+        animatorSetsuofang = new AnimatorSet();
+        // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f);
+        ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", height3, flyphonerl.getY());
+
+        animatorSetsuofang.setDuration(650);
+        animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
+        animatorSetsuofang.play(scaleY);
+        animatorSetsuofang.start();
+        animatorSetsuofang.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        //flyphonerl.setVisibility(View.GONE);
+
+                        animatorSetsuofang.cancel();
+                        getFlyGoBack();
+                    }
+                }, 5000);
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+
+            }
+        });
+
+    }
+
+    private void getFlyGoBack() {
+        Resources resources = this.getResources();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+        int height3 = dm.heightPixels;
+
+        //组合动画
+        animatorSetsuofang2 = new AnimatorSet();
+        // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f);
+        ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", 0, height3);
+
+        animatorSetsuofang2.setDuration(1500);
+        animatorSetsuofang2.setInterpolator(new DecelerateInterpolator());
+        animatorSetsuofang2.play(scaleY);
+        animatorSetsuofang2.start();
+        animatorSetsuofang2.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+
+                flyphonerl.setVisibility(View.GONE);
+                animatorSetsuofang2.cancel();
+
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+
+            }
+        });
+    }
+
+    private void getAnimationSao() {
+        animation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
+        animation.setFillAfter(true);
+        animation.setDuration(2000);  //两秒转一圈
+        animation.setInterpolator(new LinearInterpolator());
+        animation.setRepeatCount(Animation.INFINITE);   //循环执行
+        imgreadline.startAnimation(animation);
+
+        int[] antenna = new int[]{R.id.reading_antenna1, R.id.reading_antenna2, R.id.reading_antenna3, R.id.reading_antenna4, R.id.reading_antenna5, R.id.reading_antenna6,
+                R.id.reading_antenna7, R.id.reading_antenna8, R.id.reading_antenna9};
+        int nfcWireIndex = 2;
+        try {
+            nfcWireIndex = Integer.parseInt(String.valueOf(SPUtils.get("PHONE_MODEL", "2")));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        alp = new AlphaAnimation(1, 0.2f);
+        alp.setStartOffset(500);
+        alp.setDuration(1000);
+        alp.setFillAfter(false);
+        alp.setInterpolator(new CycleInterpolator(2));
+        alp.setRepeatCount(Animation.INFINITE);
+        findViewById(antenna[nfcWireIndex - 1]).setAnimation(alp);
+        alp.start();
+    }
+
+    @OnClick({R.id.again_bt})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.again_bt:
+                startActivityFinish(QrCodeActivity.class);
+                break;
+        }
+    }
+
+    @Override
+    protected void initData() {
+        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
+    }
+
+
+    /**
+     * 读取NFC标签文本数据
+     */
+    private String readNfcTag(Intent intent) {
+        readingProgress.setProgress(0);
+        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
+            Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
+            NdefMessage msgs[] = null;
+            if (rawMsgs != null) {
+                msgs = new NdefMessage[rawMsgs.length];
+                for (int i = 0; i < rawMsgs.length; i++) {
+                    msgs[i] = (NdefMessage) rawMsgs[i];
+                }
+            }
+            try {
+                if (msgs != null) {
+                    NdefRecord record = msgs[0].getRecords()[0];
+                    return parseTextRecord(record);
+                }
+            } catch (Exception e) {
+            }
+        }
+        return null;
+    }
+
+    public String parseTextRecord(NdefRecord ndefRecord) {
+        if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
+            return null;
+        }
+        if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
+            return null;
+        }
+        try {
+            byte[] bArray = ndefRecord.getPayload();
+            StringBuffer sb = new StringBuffer(bArray.length);
+            String sTemp;
+            for (int i = 0; i < bArray.length; i++) {
+                sTemp = Integer.toHexString(0xFF & bArray[i]);
+                if (sTemp.length() < 2)
+                    sb.append(0);
+                sb.append(sTemp.toUpperCase());
+            }
+            return sb.toString();
+        } catch (Exception e) {
+            throw new IllegalArgumentException();
+        }
+    }
+
+    //记录ProgressBar的完成进度
+    private int status = 0;
+    private int hasDate = 0;
+    //创建一个负责更新进度的Handler
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            //表明消息是由该程序发送的
+            if (msg.what == 0x111) {
+                readpb.setProgress(status);
+                if (status == 100) {
+                    loadDiago.dismiss();
+                }
+            }
+        }
+    };
+
+    private boolean issao;  //设置一个flag 判断是否正在读取
+
+    @Override
+    public void onNewIntent(Intent intent) {
+        textRecord = readNfcTag(intent);
+        if (textRecord == null || textRecord.length() < chipNumberEndIndex) {
+            toast("读取失败");
+            return;
+        } else {
+            if (issao) {
+                //正在进行读取中  直接return 不做处理
+                return;
+            } else {
+                issao = true;  //开始读取
+
+                hasDate = 0;
+                status = 0;
+                soundPoolHelper.play("nuliduquzhong", false);
+
+                loadDiago = new BaseDialogFragment.Builder(this)
+                        .setContentView(R.layout.progressreader)
+                        .setAnimStyle(BaseDialog.AnimStyle.SCALE)
+                        //.setText(id, "我是预设置的文本")
+                        .addOnShowListener(new BaseDialog.OnShowListener() {
+                            @Override
+                            public void onShow(BaseDialog dialog) {
+                                //toast("Dialog  显示了");
+                            }
+                        })
+                        .addOnCancelListener(new BaseDialog.OnCancelListener() {
+                            @Override
+                            public void onCancel(BaseDialog dialog) {
+                                //toast("Dialog 取消了");
+                            }
+                        })
+                        .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                            @Override
+                            public void onDismiss(BaseDialog dialog) {
+                                //进度条走完 进行加载
+                                isWarning = false;
+                                chipNumber = textRecord.substring(6, chipNumberEndIndex);
+
+                                uploadChip(false);
+                                alarmDetection();
+                            }
+                        })
+                        .show();
+
+                readpb = loadDiago.findViewById(R.id.read_progress);
+                //启动线程来执行任务
+                new Thread() {
+                    @Override
+                    public void run() {
+                        super.run();
+                        while (status < 100) {
+                            //获取耗时操作的完成百分比
+                            status = doWork();
+                            //发送消息
+                            mHandler.sendEmptyMessage(0x111);
+                        }
+                    }
+                }.start();
+            }
+        }
+    }
+
+    //进行进度条加载
+    private int doWork() {
+        //为元素赋值
+        hasDate += 10;
+        try {
+            Thread.sleep(200);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return hasDate;
+    }
+
+    //判断是否报警
+    public void alarmDetection() {
+        try {
+            String binaryStr = ConversionUtil.hexToBins(textRecord.substring((3 + 40 + 1 + 4 + 8) * 2));
+            binaryStr = binaryStr.substring(4, binaryStr.length() - 8); //减去启用后的一小时和注射前的两小时
+            Log.e("温度二进制", binaryStr);
+            String binaryArr[] = new String[binaryStr.length() / 2];
+
+            for (int i = 0; i < binaryArr.length; i++) {
+                binaryArr[i] = String.valueOf(binaryStr.charAt(i * 2)) + binaryStr.charAt(i * 2 + 1);
+            }
+
+            LinkedList<Integer> exceedingIndexs = new LinkedList<Integer>();
+            exceedingIndexs.add(-1);
+            for (int i = 0; i < binaryArr.length; i++) {
+                if (!binaryArr[i].equals("01")) {
+                    if (i != 0 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i)) {
+                        exceedingIndexs.add(i);
+                    }
+                    if (i != binaryArr.length - 1 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i + 1)) {
+                        exceedingIndexs.add(i + 1);
+                    }
+                }
+            }
+            String type = chipNumber.substring(1, 2);
+            int category = Integer.parseInt(SPUtils.get("CATEGORY_TIMES_" + type, 48).toString());
+
+            if ((exceedingIndexs.size() - 1) / 2.f > category) {
+//                toast("报警");
+                isWarning = true;
+                //soundPoolHelper.play("xufuhe", false);
+                //warning();
+            } else {
+                isWarning = false;
+                //soundPoolHelper.play("zhengchang", false);
+            }
+            readingProgress.setProgress(100);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void uploadChip(boolean agin) {
+
+        if (textRecord != null && textRecord.length() > chipNumberEndIndex) {
+            if (SPUtils.contains("LOCATION")) {
+                Log.e("LOCATION", SPUtils.get("LOCATION", "").toString());
+                String location[] = SPUtils.get("LOCATION", "").toString().split(",");
+                if (location.length > 1) {
+                    Double latitude = Double.parseDouble(location[0]);
+                    Double longitude = Double.parseDouble(location[1]);
+                    String inoculators = (String) SPUtils.get("INOCULATOR_LIST", "");
+                    Log.e("chipNumber", chipNumber);
+                    Log.e("textRecord", textRecord);
+                    getPresenter().forDoctor(chipNumber, textRecord, inoculators, longitude, latitude, agin);
+                    chipModel = new ChipModel(chipNumber, textRecord, inoculators, longitude, latitude);
+                } else {
+                    toast("位置信息错误");
+                }
+            } else {
+                toast("位置信息获取失败");
+            }
+        } else {
+            toast("芯片识别错误");
+        }
+
+        issao = false;  //读取结束
+    }
+
+    @Override
+    public void uploadChipError(String msg) {
+        soundPoolHelper.play("factory_operator_error",false);
+        if (msg.equals("芯片不存在")) {
+
+        }
+        //保存未提交信息
+        if (msg.indexOf("请检查您的网络状态") != -1) {
+            String user_id = (String) SPUtils.get("USER_ID", "");
+            if (!user_id.equals("")) {
+                ArrayList<ChipModel> chipModelList = (ArrayList<ChipModel>) SPUtils.get("CHIP_MODEL_LIST_" + user_id, new ArrayList<ChipModel>());
+                chipModelList.add(chipModel);
+                SPUtils.put("CHIP_MODEL_LIST_" + user_id, chipModelList);
+                SPUtils.remove("INOCULATOR_LIST");
+                finish();
+            }
+        }
+        toast(msg);
+    }
+
+    @Override
+    public void uploadChipSuccess(VnDetailBean data) {
+        VnDetailBean.DataBean dataBean = data.getData();
+        if (dataBean.getReviewed() == null || !dataBean.getReviewed()) {
+            Intent in = new Intent(ReadingActivity.this, VnReportDetailForDoctorActivity.class);
+            in.putExtra("dataBean", dataBean);
+            in.putExtra("isWarning", isWarning);
+            in.putExtra("status", dataBean.getStatus());
+            startActivityFinish(in);
+        } else { //复核后再次使用
+            warning();
+        }
+    }
+
+
+    private void warning() {
+        new EvvmMsgDiago.Builder(this)
+                .setTitle("此疫苗已有超温记录,是否继续使用?") // 标题可以不用填写
+                .setConfirm("确定")
+                .setCancel("取消") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .setListener(new EvvmMsgDiago.OnListener() {
+                    @Override
+                    public void onConfirm(Dialog dialog) {
+                        uploadChip(true);
+                    }
+
+                    @Override
+                    public void onCancel(Dialog dialog) {
+                    }
+                })
+                .show();
+    }
+
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+    }
+
+    @Override
+    protected void onDestroy() {
+        animation.cancel();
+        alp.cancel();
+        mHandler.removeCallbacksAndMessages(null);
+        //  soundPoolHelper.release();
+        super.onDestroy();
+    }
+
+
+    @Override
+    public boolean isSupportSwipeBack() {
+        // 不使用侧滑功能
+        return false;
+    }
+
+}
+
+

+ 94 - 0
.svn/pristine/06/064e49165bf30f7b4b284495d4490b7dc76eb379.svn-base

@@ -0,0 +1,94 @@
+package com.hjq.widget;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.os.Build;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+/**
+ *    desc   : 验证码倒计时
+ */
+@SuppressLint("AppCompatCustomView")
+public final class CountdownView extends TextView implements Runnable {
+
+    private int mTotalTime = 60; // 倒计时秒数
+    private static final String TIME_UNIT = "S"; // 秒数单位文本
+
+    private int mCurrentTime; // 当前秒数
+    private CharSequence mRecordText; // 记录原有的文本
+    private boolean mFlag; // 标记是否重置了倒计控件
+
+    public CountdownView(Context context) {
+        super(context);
+    }
+
+    public CountdownView(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public CountdownView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+    public CountdownView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    /**
+     * 设置倒计时总秒数
+     */
+    public void setTotalTime(int totalTime) {
+        this.mTotalTime = totalTime;
+    }
+
+    /**
+     * 重置倒计时控件
+     */
+    public void resetState() {
+        mFlag = true;
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        //设置点击的属性
+        setClickable(true);
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        // 移除延迟任务,避免内存泄露
+        removeCallbacks(this);
+        super.onDetachedFromWindow();
+    }
+
+    @Override
+    public boolean performClick() {
+        boolean click = super.performClick();
+        mRecordText = getText();
+        setEnabled(false);
+        mCurrentTime = mTotalTime;
+        post(this);
+        return click;
+    }
+
+    /**
+     * {@link Runnable}
+     */
+    @Override
+    public void run() {
+        if (mCurrentTime == 0 || mFlag) {
+            setText(mRecordText);
+            setEnabled(true);
+            mFlag = false;
+        } else {
+            mCurrentTime--;
+            setText(mCurrentTime + "\t" + TIME_UNIT);
+            postDelayed(this, 1000);
+        }
+    }
+}

+ 37 - 0
.svn/pristine/06/0676823e6ce781c31c82a542b3d61891cd80e911.svn-base

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 默认圆角按钮样式 -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- 禁用状态 -->
+    <item android:state_enabled="false">
+        <shape android:shape="rectangle">
+            <corners android:radius="0dp" />
+            <solid android:color="@color/colorButtonDisable" />
+        </shape>
+    </item>
+
+    <!-- 按压状态 -->
+    <item android:state_pressed="true">
+        <shape android:shape="rectangle">
+            <corners android:radius="0dp" />
+            <solid android:color="#5680FA" />
+        </shape>
+    </item>
+
+    <!-- 焦点状态 -->
+    <item android:state_focused="true">
+        <shape android:shape="rectangle">
+            <corners android:radius="0dp" />
+            <solid android:color="#5680FA" />
+        </shape>
+    </item>
+
+    <!-- 默认状态 -->
+    <item>
+        <shape android:shape="rectangle">
+            <corners android:radius="0dp" />
+            <solid android:color="#5680FA" />
+        </shape>
+    </item>
+
+</selector>

+ 173 - 0
.svn/pristine/06/069b380b5ebb4fecacccd1245692018ba9e428fe.svn-base

@@ -0,0 +1,173 @@
+package eVVM.apk.ui.launcher;
+
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import cn.bingoogolapple.photopicker.activity.BGAPhotoPickerActivity;
+import eVVM.apk.R;
+import eVVM.apk.common.MyActivity;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.bean.LikeBean;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+import eVVM.apk.ui.home.HomeActivity;
+import eVVM.apk.ui.launcher.like.LikeContract;
+import eVVM.apk.ui.launcher.like.LikePresenter;
+import eVVM.apk.ui.login.LoginActivity;
+import eVVM.apk.widget.LineBreakLayout;
+import eVVM.apk.widget.RoundRectLayout;
+
+public class LikeActivity extends MvpActivity<LikePresenter> implements LikeContract.View {
+
+
+    @BindView(R.id.likes_tv_genju)
+    TextView likesTvGenju;
+    @BindView(R.id.likes_tv_tuijian)
+    TextView likesTvTuijian;
+    @BindView(R.id.like_lineBreakLayout)
+    LineBreakLayout likeLineBreakLayout;
+    @BindView(R.id.likesbg)
+    RoundRectLayout likesbg;
+    @BindView(R.id.like_btn_true)
+    Button likeBtnTrue;
+
+
+    private String likeUserId;
+    private List<String> selectedLablesid;
+    private List<String> selectedLables;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_like;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.like_title;
+    }
+
+   /* @Override
+    public void onLeftClick(View v) {
+        super.onLeftClick(v);
+       // startActivity(LoginActivity.class);
+        finish();
+    }*/
+
+    @Override
+    public void onRightClick(View v) {
+        // SPUtils.put("LIKESDATA",2);
+        //startActivityFinish(LoginActivity.class);
+        finish();
+    }
+
+    @Override
+    protected void initView() {
+
+
+        Intent intent = getIntent();
+        likeUserId = intent.getStringExtra("LikeUserId");
+        String likeRoleId = intent.getStringExtra("LikeRoleId");
+        getPresenter().getLikeList(likeRoleId);
+
+
+    }
+
+    private void initLael(List<LikeBean.DataBean> list) {
+        List<String> lable = new ArrayList<>();
+        List<String> lableids = new ArrayList<>();
+        for (int i = 0; i < list.size(); i++) {
+            lable.add(list.get(i).getName());
+        }
+
+        for (int i = 0; i < list.size(); i++) {
+            lableids.add(list.get(i).getId() + "");
+        }
+
+        //设置标签
+        likeLineBreakLayout.setLables(lable, true, lableids);
+        //likeLineBreakLayout.setLablesid(lableids,true);
+        //获取选中的标签
+        selectedLables = likeLineBreakLayout.getSelectedLables();
+
+        selectedLablesid = likeLineBreakLayout.getSelectedLablesid();
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+
+    @OnClick(R.id.like_btn_true)
+    public void onViewClicked() {
+        //toast("选中的标签为:"+selectedLables.toString());
+
+        if (selectedLables.size() < 1) {
+            toast("请选择个人喜好");
+        } else {
+            //1选了  2点击跳过了
+            // SPUtils.put("LIKESDATA",1);
+            //startActivityFinish(LoginActivity.class);
+            getPresenter().savaLikes(likeUserId, listToString(selectedLablesid));
+        }
+
+    }
+
+    @Override
+    protected LikePresenter createPresenter() {
+        return new LikePresenter();
+    }
+
+    @Override
+    public void getLikeListError(String msg) {
+        toast(msg);
+    }
+
+    @Override
+    public void getLikeListSuccess(List<LikeBean.DataBean> data) {
+        if (data.size() == 0) {
+            toast("暂无喜好信息");
+            return;
+        }
+        //toast(data.get(0).getName());
+        initLael(data);
+    }
+
+    @Override
+    public void savaLikesError(String msg) {
+        toast(msg);
+    }
+
+    @Override
+    public void savaLikesSuccess(VerificationCodeBean data) {
+        toast("喜好已设置,请进行登录");
+        finish();
+    }
+
+    public String listToString(List<String> stringList) {
+        if (stringList == null) {
+            return null;
+        }
+        StringBuilder result = new StringBuilder();
+        boolean flag = false;
+        for (String string : stringList) {
+            if (flag) {
+                result.append(","); // 分隔符
+            } else {
+                flag = true;
+            }
+            result.append(string);
+        }
+        return result.toString();
+    }
+}

+ 229 - 0
.svn/pristine/06/06a2ea569573c658d5f41b9cdf10018c309e5cdd.svn-base

@@ -0,0 +1,229 @@
+package eVVM.apk.ui.vaccination;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+
+import com.hjq.permissions.OnPermission;
+import com.hjq.permissions.Permission;
+import com.hjq.permissions.XXPermissions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.GPS.LocationUtils;
+import eVVM.apk.helper.NfcUtil;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.mvp.MvpLazyFragment;
+import eVVM.apk.ui.bean.CategoryTimesBean;
+import eVVM.apk.ui.vaccination.categoryTimes.CategoryTimesContract;
+import eVVM.apk.ui.vaccination.categoryTimes.CategoryTimesPresenter;
+import eVVM.apk.ui.vaccination.save.ChipModel;
+
+
+public class FirstFragment extends MvpLazyFragment<CategoryTimesPresenter> implements CategoryTimesContract.View {
+
+    @BindView(R.id.first_iv_scanning)
+    ImageView firstIvScanning;
+    @BindView(R.id.img_luotuo)
+    ImageView imgLuotuo;
+    private AlphaAnimation alphaAnimation;
+
+
+    public static FirstFragment newInstance() {
+        return new FirstFragment();
+    }
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.first_fragment;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return 0;
+    }
+
+    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+    @Override
+    protected void initView() {
+
+        //闪烁  
+        alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
+        alphaAnimation.setDuration(1000);
+        alphaAnimation.setRepeatCount(Animation.INFINITE);
+        alphaAnimation.setRepeatMode(Animation.REVERSE);
+        imgLuotuo.setAnimation(alphaAnimation);
+        alphaAnimation.start();
+    }
+
+    @Override
+    public void setUserVisibleHint(boolean isVisibleToUser) {
+        super.setUserVisibleHint(isVisibleToUser);
+        if (isVisibleToUser) {
+            //相当于Fragment的onResume,为true时,Fragment已经可见
+            SPUtils.remove("INOCULATOR_LIST");
+        } else {
+            //相当于Fragment的onPause,为false时,Fragment不可见
+        }
+    }
+
+    //提交未上传的数据
+    private void uploadChip() {
+
+        String user_id = (String) SPUtils.get("USER_ID", "");
+        if (!user_id.equals("")) {
+            ArrayList<ChipModel> chipModelList = (ArrayList<ChipModel>) SPUtils.get("CHIP_MODEL_LIST_" + user_id, new ArrayList<ChipModel>());
+            for (ChipModel chipModel : chipModelList) {
+//               getPresenter().forDoctor(chipModel.getChipNumber(),chipModel.getTextRecord(),chipModel.getInoculatorIds(),chipModel.getLongitude(),chipModel.getLatitude());
+
+            }
+        }
+    }
+
+    @Override
+    protected void initData() {
+        getPresenter().categoryTimesList();
+
+        //获取屏幕宽高
+        WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
+        int height = wm.getDefaultDisplay().getHeight();
+
+        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.doctor_index_btn); //获取imageview的高度
+
+        RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.hjfgrl);
+
+        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+
+        //设置上边距为 (屏幕的上黄金分割面积 + imageview的高/2)  达到imageview中间点处于黄金分割线的效果
+        layoutParams.topMargin = (int) (height * 0.425) - (bitmap.getHeight() / 2);
+
+        //这个api设置相对布局,位置的
+        // params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
+
+        relativeLayout.setLayoutParams(layoutParams);
+        // Log.e("WindowManager", "" + height + "   --" + bitmap.getHeight());
+    }
+
+
+    @Override
+    public void categoryTimesListError(String msg) {
+
+    }
+
+    @Override
+    public void categoryTimesListSuccess(List<CategoryTimesBean.DataBean> data) {
+        for (CategoryTimesBean.DataBean bean : data) {
+            SPUtils.put("CATEGORY_TIMES_" + bean.getCode2(), bean.getOvertimes());
+        }
+    }
+
+    @Override
+    public boolean isStatusBarEnabled() {
+        // 使用沉浸式状态栏
+        return !super.isStatusBarEnabled();
+    }
+
+    @OnClick(R.id.first_iv_scanning)
+    public void onViewClicked() {
+
+        getCameraPermission();
+    }
+
+    private void getCameraPermission() {
+        XXPermissions.with(getBindingActivity())
+                //.constantRequest() //可设置被拒绝后继续申请,直到用户授权或者永久拒绝
+                //.permission(Permission.SYSTEM_ALERT_WINDOW, Permission.REQUEST_INSTALL_PACKAGES) //支持请求6.0悬浮窗权限8.0请求安装权限
+                .permission(Permission.CAMERA) //不指定权限则自动获取清单中的危险权限
+                .request(new OnPermission() {
+
+                    @Override
+                    public void hasPermission(List<String> granted, boolean isAll) {
+                        if (isAll) {
+                            //toast("获取权限成功");
+                            if (!checkGpsAndNfc()) {
+                                return;
+                            }
+                            startActivity(QrCodeActivity.class);
+                        } else {
+                            toast("获取权限成功,部分权限未正常授予");
+                        }
+                    }
+
+                    @Override
+                    public void noPermission(List<String> denied, boolean quick) {
+                        if (quick) {
+                            toast("未获取到照相机权限,请手动授予");
+                            //如果是被永久拒绝就跳转到应用权限系统设置页面
+                            XXPermissions.gotoPermissionSettings(getBindingActivity());
+                        } else {
+                            toast("获取照相机权限失败,无法使用扫一扫");
+                        }
+
+                    }
+                });
+    }
+
+
+    @Override
+    public void onLoading() {
+
+    }
+
+    @Override
+    public void onComplete() {
+
+    }
+
+    @Override
+    public void onEmpty() {
+
+    }
+
+    @Override
+    public void onError() {
+
+    }
+
+    @Override
+    public void onDestroy() {
+        alphaAnimation.cancel();
+        super.onDestroy();
+    }
+
+    @Override
+    protected CategoryTimesPresenter createPresenter() {
+        return new CategoryTimesPresenter();
+    }
+
+    /**
+     * 判断是否支持GPS和NFC功能
+     */
+    protected boolean checkGpsAndNfc() {
+        switch (NfcUtil.isOPen(getActivity())) {
+            case 0:
+                toast("您的手机没有NFC功能, 不能使用");
+                return false;
+            case 1:
+                toast("NFC功能未开启");
+                return false;
+        }
+
+        if (!LocationUtils.isOPen(getActivity())) {
+            toast("GPS功能未开启");
+            return false;
+        }
+        return true;
+    }
+}

+ 9 - 0
.svn/pristine/06/06a7130de24f41b672206b854fe475416200cbe6.svn-base

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.hjq.dialog" >
+
+    <uses-sdk
+        android:minSdkVersion="15"
+        android:targetSdkVersion="28" />
+
+</manifest>

+ 598 - 0
.svn/pristine/06/06f1cad05ca5866e1c861a35ef737e3ae417d30c.svn-base

@@ -0,0 +1,598 @@
+package eVVM.apk.ui.vaccination;
+
+
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.app.Dialog;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+import android.nfc.NfcAdapter;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Parcelable;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.View;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.CycleInterpolator;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.LinearInterpolator;
+import android.view.animation.RotateAnimation;
+import android.widget.ImageView;
+import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
+
+import com.hjq.base.BaseDialog;
+import com.hjq.base.BaseDialogFragment;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.ConversionUtil;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.helper.SoundPoolHelper;
+import eVVM.apk.ui.bean.VnDetailBean;
+import eVVM.apk.ui.event.ReadingErrorEvent;
+import eVVM.apk.ui.home.BaseNfcActivity;
+import eVVM.apk.ui.home.uploadChip.UploadChipContract;
+import eVVM.apk.ui.vaccination.save.ChipModel;
+import eVVM.apk.widget.EvvmMsgDiago;
+
+
+public class ReadingActivity extends BaseNfcActivity implements UploadChipContract.View {
+
+    private boolean isWarning = false;
+    private ChipModel chipModel;
+    private SoundPoolHelper soundPoolHelper;
+    private String textRecord = "";
+    private String chipNumber = "";
+
+
+    @BindView(R.id.reading__line)
+    ImageView imgreadline;
+
+    @BindView(R.id.reading_progress)
+    ProgressBar readingProgress;
+
+    @BindView(R.id.fly_phonerl)
+    RelativeLayout flyphonerl;
+    private Animation animation;
+    private AlphaAnimation alp;
+    private AnimatorSet animatorSetsuofang;
+    private AnimatorSet animatorSetsuofang2;
+    private BaseDialog loadDiago;
+    private ProgressBar readpb;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_reading;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.reading_title;
+    }
+
+    @Override
+    protected void initView() {
+        getAnimationSao(); //进行雷达扫描动画
+        soundPoolHelper = new SoundPoolHelper(6, SoundPoolHelper.TYPE_MUSIC)
+                .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC)
+                .loadDefault(ReadingActivity.this)
+                .load(ReadingActivity.this, "factory_operator_success", R.raw.factory_operator_success)
+                .load(ReadingActivity.this, "factory_operator_error", R.raw.factory_operator_error)
+                .load(ReadingActivity.this, "xufuhe", R.raw.xufuhe)
+                .load(ReadingActivity.this, "zhengchang", R.raw.zhengchang)
+                .load(ReadingActivity.this, "nuliduquzhong", R.raw.nuliduquzhong)
+                .load(ReadingActivity.this, "yiduquwanbi", R.raw.yiduquwanbi);
+
+
+        //第一次加载才会做飞出动画
+        int flyPhoneType = (int) SPUtils.get("FlyPhoneType", 0);
+        if (flyPhoneType == 0) {
+            getFlyPhone();
+            SPUtils.put("FlyPhoneType", 1);
+        } else {
+            flyphonerl.setVisibility(View.GONE);
+        }
+    }
+
+    private void getFlyPhone() {
+        Resources resources = this.getResources();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+        int height3 = dm.heightPixels;
+
+        //组合动画
+        animatorSetsuofang = new AnimatorSet();
+        // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f);
+        ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", height3, flyphonerl.getY());
+
+        animatorSetsuofang.setDuration(650);
+        animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
+        animatorSetsuofang.play(scaleY);
+        animatorSetsuofang.start();
+        animatorSetsuofang.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        //flyphonerl.setVisibility(View.GONE);
+
+                        animatorSetsuofang.cancel();
+                        getFlyGoBack();
+                    }
+                }, 5000);
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+
+            }
+        });
+
+    }
+
+    private void getFlyGoBack() {
+        Resources resources = this.getResources();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+        int height3 = dm.heightPixels;
+
+        //组合动画
+        animatorSetsuofang2 = new AnimatorSet();
+        // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f);
+        ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", 0, height3);
+
+        animatorSetsuofang2.setDuration(1500);
+        animatorSetsuofang2.setInterpolator(new DecelerateInterpolator());
+        animatorSetsuofang2.play(scaleY);
+        animatorSetsuofang2.start();
+        animatorSetsuofang2.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+
+                flyphonerl.setVisibility(View.GONE);
+                animatorSetsuofang2.cancel();
+
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+
+            }
+        });
+    }
+
+    private void getAnimationSao() {
+        animation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
+        animation.setFillAfter(true);
+        animation.setDuration(2000);  //两秒转一圈
+        animation.setInterpolator(new LinearInterpolator());
+        animation.setRepeatCount(Animation.INFINITE);   //循环执行
+        imgreadline.startAnimation(animation);
+
+        int[] antenna = new int[]{R.id.reading_antenna1, R.id.reading_antenna2, R.id.reading_antenna3, R.id.reading_antenna4, R.id.reading_antenna5, R.id.reading_antenna6,
+                R.id.reading_antenna7, R.id.reading_antenna8, R.id.reading_antenna9};
+        int nfcWireIndex = 2;
+        try {
+            nfcWireIndex = Integer.parseInt(String.valueOf(SPUtils.get("PHONE_MODEL", "2")));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        alp = new AlphaAnimation(1, 0.2f);
+        alp.setStartOffset(500);
+        alp.setDuration(1000);
+        alp.setFillAfter(false);
+        alp.setInterpolator(new CycleInterpolator(2));
+        alp.setRepeatCount(Animation.INFINITE);
+        findViewById(antenna[nfcWireIndex - 1]).setAnimation(alp);
+        alp.start();
+    }
+
+    @OnClick({R.id.again_bt})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.again_bt:
+                startActivityFinish(QrCodeActivity.class);
+                break;
+        }
+    }
+
+    @Override
+    protected void initData() {
+        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
+
+       // waithandler.postDelayed(waitRunnable, 500);
+    }
+
+    private static class MyHandler extends Handler {
+        private WeakReference<ReadingActivity> wactivity;
+
+        public MyHandler(ReadingActivity activity) {
+            wactivity = new WeakReference<ReadingActivity>(activity);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+        }
+    }
+
+    private MyHandler waithandler = new MyHandler(this);
+
+    private Runnable waitRunnable = new Runnable() {
+        @Override
+        public void run() {
+            //5秒没读取到数据
+            soundPoolHelper.play("nuliduquzhong", false);
+        }
+    };
+
+    /**
+     * 读取NFC标签文本数据
+     */
+    private String readNfcTag(Intent intent) {
+        readingProgress.setProgress(0);
+        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
+            Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
+            NdefMessage msgs[] = null;
+            if (rawMsgs != null) {
+                msgs = new NdefMessage[rawMsgs.length];
+                for (int i = 0; i < rawMsgs.length; i++) {
+                    msgs[i] = (NdefMessage) rawMsgs[i];
+                }
+            }
+            try {
+                if (msgs != null) {
+                    NdefRecord record = msgs[0].getRecords()[0];
+                    return parseTextRecord(record);
+                }
+            } catch (Exception e) {
+            }
+        }
+        return null;
+    }
+
+    public String parseTextRecord(NdefRecord ndefRecord) {
+        if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
+            return null;
+        }
+        if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
+            return null;
+        }
+        try {
+            byte[] bArray = ndefRecord.getPayload();
+            StringBuffer sb = new StringBuffer(bArray.length);
+            String sTemp;
+            for (int i = 0; i < bArray.length; i++) {
+                sTemp = Integer.toHexString(0xFF & bArray[i]);
+                if (sTemp.length() < 2)
+                    sb.append(0);
+                sb.append(sTemp.toUpperCase());
+            }
+            return sb.toString();
+        } catch (Exception e) {
+            throw new IllegalArgumentException();
+        }
+    }
+
+    //记录ProgressBar的完成进度
+    private int status = 0;
+    private int hasDate = 0;
+
+    public int getStatus() {
+        return status;
+    }
+
+
+    public BaseDialog getLoadDiago() {
+        return loadDiago;
+    }
+
+    public ProgressBar getReadpb() {
+        return readpb;
+    }
+
+    //创建一个负责更新进度的Handler
+    final private ProgressHandler mHandler = new ProgressHandler(this);
+
+    private static class ProgressHandler extends Handler {
+        private final WeakReference<ReadingActivity> readingwrActivity;
+
+        public ProgressHandler(ReadingActivity activity) {
+            readingwrActivity = new WeakReference<ReadingActivity>(activity);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            ReadingActivity readingActivity = readingwrActivity.get();
+            if (readingActivity != null) {
+                //表明消息是由该程序发送的
+                if (msg.what == 0x111) {
+                    readingActivity.getReadpb().setProgress(readingActivity.getStatus());
+                    if (readingActivity.getStatus() == 100) {
+                        readingActivity.getLoadDiago().dismiss();
+                    }
+                }
+            }
+
+        }
+    }
+
+    private boolean issao;  //设置一个flag 判断是否正在读取
+
+    @Override
+    public void onNewIntent(Intent intent) {
+        if (waithandler != null) {
+            waithandler.removeCallbacks(waitRunnable);
+        }
+        textRecord = readNfcTag(intent);
+        if (textRecord == null || textRecord.length() < chipNumberEndIndex) {
+            toast("读取失败");
+            return;
+        } else {
+            if (issao) {
+                //正在进行读取中  直接return 不做处理
+                return;
+            } else {
+                issao = true;  //开始读取
+
+                hasDate = 0;
+                status = 0;
+                //soundPoolHelper.play("yiduquwanbi", false);
+                soundPoolHelper.play("nuliduquzhong", false);
+                loadDiago = new BaseDialogFragment.Builder(this)
+                        .setContentView(R.layout.progressreader)
+                        .setAnimStyle(BaseDialog.AnimStyle.SCALE)
+                        //.setText(id, "我是预设置的文本")
+                        .addOnShowListener(new BaseDialog.OnShowListener() {
+                            @Override
+                            public void onShow(BaseDialog dialog) {
+                                //toast("Dialog  显示了");
+                            }
+                        })
+                        .addOnCancelListener(new BaseDialog.OnCancelListener() {
+                            @Override
+                            public void onCancel(BaseDialog dialog) {
+                                //toast("Dialog 取消了");
+                            }
+                        })
+                        .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                            @Override
+                            public void onDismiss(BaseDialog dialog) {
+                                //进度条走完 进行加载
+                                isWarning = false;
+                                chipNumber = textRecord.substring(6, chipNumberEndIndex);
+                                alarmDetection();
+                                uploadChip(false);
+                            }
+                        })
+                        .show();
+
+                readpb = loadDiago.findViewById(R.id.read_progress);
+                //启动线程来执行任务
+                new Thread() {
+                    @Override
+                    public void run() {
+                        super.run();
+                        while (status < 100) {
+                            //获取耗时操作的完成百分比
+                            status = doWork();
+                            //发送消息
+                            mHandler.sendEmptyMessage(0x111);
+                        }
+                    }
+                }.start();
+            }
+        }
+    }
+
+    //进行进度条加载
+    private int doWork() {
+        //为元素赋值
+        hasDate += 10;
+        try {
+            Thread.sleep(200);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return hasDate;
+    }
+
+    //判断是否报警
+    public void alarmDetection() {
+        try {
+            String binaryStr = ConversionUtil.hexToBins(textRecord.substring((3 + 40 + 1 + 4 + 8) * 2));
+            binaryStr = binaryStr.substring(4, binaryStr.length() - 8); //减去启用后的一小时和注射前的两小时
+            Log.e("温度二进制", binaryStr);
+            String binaryArr[] = new String[binaryStr.length() / 2];
+
+            for (int i = 0; i < binaryArr.length; i++) {
+                binaryArr[i] = String.valueOf(binaryStr.charAt(i * 2)) + binaryStr.charAt(i * 2 + 1);
+            }
+
+            LinkedList<Integer> exceedingIndexs = new LinkedList<Integer>();
+            exceedingIndexs.add(-1);
+            for (int i = 0; i < binaryArr.length; i++) {
+                if (!binaryArr[i].equals("01")) {
+                    if (i != 0 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i)) {
+                        exceedingIndexs.add(i);
+                    }
+                    if (i != binaryArr.length - 1 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i + 1)) {
+                        exceedingIndexs.add(i + 1);
+                    }
+                }
+            }
+            String type = chipNumber.substring(1, 2);
+            int category = Integer.parseInt(SPUtils.get("CATEGORY_TIMES_" + type, 48).toString());
+
+            if ((exceedingIndexs.size() - 1) / 2.f > category) {
+//                toast("报警");
+                isWarning = true;
+                //soundPoolHelper.play("xufuhe", false);
+                //warning();
+            } else {
+                isWarning = false;
+                //soundPoolHelper.play("zhengchang", false);
+            }
+            readingProgress.setProgress(100);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void uploadChip(boolean agin) {
+
+        if (textRecord != null && textRecord.length() > chipNumberEndIndex) {
+            if (SPUtils.contains("LOCATION")) {
+                Log.e("LOCATION", SPUtils.get("LOCATION", "").toString());
+                String location[] = SPUtils.get("LOCATION", "").toString().split(",");
+                if (location.length > 1) {
+                    Double latitude = Double.parseDouble(location[0]);
+                    Double longitude = Double.parseDouble(location[1]);
+                    String inoculators = (String) SPUtils.get("INOCULATOR_LIST", "");
+                    Log.e("chipNumber", chipNumber);
+                    Log.e("textRecord", textRecord);
+                    getPresenter().forDoctor(chipNumber, textRecord, inoculators, longitude, latitude, agin, isWarning);
+                    chipModel = new ChipModel(chipNumber, textRecord, inoculators, longitude, latitude);
+                } else {
+                    toast("位置信息错误");
+                }
+            } else {
+                toast("位置信息获取失败");
+            }
+        } else {
+            toast("芯片识别错误");
+        }
+
+        issao = false;  //读取结束
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN, sticky = false)
+    public void onEvent(ReadingErrorEvent event) {
+        if (event.getMsg().equals("芯片不存在")) {
+            soundPoolHelper.play("factory_operator_error", false);
+        }
+        //保存未提交信息
+        if (event.getMsg().indexOf("请检查您的网络状态") != -1) {
+            String user_id = (String) SPUtils.get("USER_ID", "");
+            if (!user_id.equals("")) {
+                ArrayList<ChipModel> chipModelList = (ArrayList<ChipModel>) SPUtils.get("CHIP_MODEL_LIST_" + user_id, new ArrayList<ChipModel>());
+                chipModelList.add(chipModel);
+                SPUtils.put("CHIP_MODEL_LIST_" + user_id, chipModelList);
+                SPUtils.remove("INOCULATOR_LIST");
+                finish();
+            }
+        }
+    }
+
+    @Override
+    public void uploadChipError(String msg) {
+        EventBus.getDefault().post(new ReadingErrorEvent(msg));
+        toast(msg);
+    }
+
+    @Override
+    public void uploadChipSuccess(VnDetailBean data) {
+        VnDetailBean.DataBean dataBean = data.getData();
+        if (!dataBean.isReviewed()) {
+            Intent in = new Intent(ReadingActivity.this, VnReportDetailForDoctorActivity.class);
+            in.putExtra("dataBean", dataBean);
+            in.putExtra("isWarning", isWarning);
+            in.putExtra("status", dataBean.getStatus());
+            startActivityFinish(in);
+        } else { //复核后再次使用
+            warning();
+        }
+    }
+
+
+    private void warning() {
+        new EvvmMsgDiago.Builder(this)
+                .setTitle("此疫苗已有超温记录,是否继续使用?") // 标题可以不用填写
+                .setConfirm("确定")
+                .setCancel("取消") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .setListener(new EvvmMsgDiago.OnListener() {
+                    @Override
+                    public void onConfirm(Dialog dialog) {
+                        uploadChip(true);
+                    }
+
+                    @Override
+                    public void onCancel(Dialog dialog) {
+                    }
+                })
+                .show();
+    }
+
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+    }
+
+    @Override
+    protected void onDestroy() {
+        animation.cancel();
+        alp.cancel();
+        if (mHandler != null) {
+            mHandler.removeCallbacksAndMessages(null);
+        }
+
+        if (waithandler != null) {
+            waithandler.removeCallbacksAndMessages(null);
+        }
+        //  soundPoolHelper.release();
+        super.onDestroy();
+    }
+
+
+    @Override
+    public boolean isSupportSwipeBack() {
+        // 不使用侧滑功能
+        return false;
+    }
+
+}
+
+

+ 450 - 0
.svn/pristine/06/06fb3396a1c058a951952a631b193634e1038105.svn-base

@@ -0,0 +1,450 @@
+package eVVM.apk.ui.login;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.allen.library.RxHttpUtils;
+import com.allen.library.download.DownloadObserver;
+import com.hjq.dialog.MessageDialog;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import cn.bingoogolapple.photopicker.activity.BGAPhotoPickerActivity;
+import cn.bingoogolapple.photopicker.imageloader.BGAImage;
+import eVVM.apk.R;
+import eVVM.apk.helper.InputTextHelper;
+import eVVM.apk.helper.basepicker.DataPickerDialog;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+import eVVM.apk.ui.launcher.LikeActivity;
+import eVVM.apk.ui.login.authentication.AttctContract;
+import eVVM.apk.ui.login.authentication.AttctPresenter;
+import me.jessyan.autosize.utils.AutoSizeUtils;
+
+/**
+ * 实名认证页
+ */
+public class AuthenticationActivity extends MvpActivity<AttctPresenter> implements AttctContract.View {
+
+
+    @BindView(R.id.attc_et_phone)
+    EditText attcEtPhone;
+    @BindView(R.id.attc_et_name)
+    EditText attcEtName;
+    @BindView(R.id.attc_et_code)
+    EditText attcEtCode;
+    @BindView(R.id.attc_et_email)
+    EditText attcEtEmail;
+
+    @BindView(R.id.attc_et_license)
+    ImageView attcEtLicense;
+    @BindView(R.id.attc_et_prove)
+    ImageView attcEtProve;
+    @BindView(R.id.attc_btn_register)
+    Button attcBtnRegister;
+    @BindView(R.id.tv_information_hospital)
+    TextView tvInformationHospital;
+    @BindView(R.id.tv_information_factory)
+    TextView tvInformationFactory;
+    @BindView(R.id.attc_ll_license)
+    LinearLayout attcLlLicense;
+    @BindView(R.id.attc_ll_prove)
+    LinearLayout attcLlProve;
+    @BindView(R.id.attc_et_imgcount)
+    TextView attcEtImgcount;
+    @BindView(R.id.btn_prove_download)
+    Button btnProveDownload;
+
+    private File takePhotoDir = new File(Environment.getExternalStorageDirectory(), "eVVM");
+    private static final int REQUEST_LICENSE_CHOOSE_FROM_GALLERY = 1325;
+    private static final int REQUEST_PROVE_CHOOSE_FROM_GALLERY = 1326;
+    private String registerUserId;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_authentication;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.attc_title;
+    }
+
+
+    @Override
+    public void onLeftClick(View v) {
+        new MessageDialog.Builder(this)
+                .setTitle("") // 标题可以不用填写
+                .setMessage("您未完成实名认证,是否退出")
+                .setConfirm("确定")
+                .setCancel("取消") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .setListener(new MessageDialog.OnListener() {
+
+                    @Override
+                    public void onConfirm(Dialog dialog) {
+                        finish();
+                    }
+
+                    @Override
+                    public void onCancel(Dialog dialog) {
+                        //toast("取消了");
+                    }
+                })
+                .show();
+
+
+    }
+
+    @Override
+    protected void initView() {
+        new InputTextHelper.Builder(this)
+                .setMain(attcBtnRegister)
+                .addView(attcEtPhone)
+                .addView(attcEtName)
+                .addView(attcEtCode)
+                .addView(attcEtEmail)
+                .addView(tvInformationHospital)
+                .addView(tvInformationFactory)
+                .build();
+        Intent in = getIntent();
+        registerUserId = in.getStringExtra("registerUserId");
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+    @OnClick({R.id.attc_et_license, R.id.attc_et_prove, R.id.attc_btn_register, R.id.tv_information_hospital, R.id.tv_information_factory, R.id.btn_prove_download})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.attc_et_license:
+                //上传营业执照
+
+                /*
+                从相册选取二维码图片,这里为了方便演示,使用的是
+                https://github.com/bingoogolapple/BGAPhotoPicker-Android
+                这个库来从图库中选择二维码图片,这个库不是必须的,你也可以通过自己的方式从图库中选择图片
+                 */
+                Intent licensePhotoPickerIntent = new BGAPhotoPickerActivity.IntentBuilder(this)
+                        .cameraFileDir(takePhotoDir)
+                        .maxChooseCount(3)
+                        .selectedPhotos(null)
+                        .pauseOnScroll(false)
+                        .build();
+                startActivityForResult(licensePhotoPickerIntent, REQUEST_LICENSE_CHOOSE_FROM_GALLERY);
+
+                break;
+            case R.id.attc_et_prove:
+                //上传授权证明
+
+                if (uploadimgpaths1.size() == 0) {
+                    toast("请先选择营业执照");
+                } else {
+                    Intent provePhotoPickerIntent = new BGAPhotoPickerActivity.IntentBuilder(this)
+                            .cameraFileDir(takePhotoDir)
+                            .maxChooseCount(1)
+                            .selectedPhotos(null)
+                            .pauseOnScroll(false)
+                            .build();
+                    startActivityForResult(provePhotoPickerIntent, REQUEST_PROVE_CHOOSE_FROM_GALLERY);
+                }
+
+                break;
+            case R.id.attc_btn_register:
+                //进行实名认证
+                List<String> uploadimgpaths3 = new ArrayList<>();
+                if ("预防接种机构".equals(tvInformationHospital.getText().toString())) {
+                    if (uploadimgpaths1.size() == 0 || uploadimgpaths2.size() == 0) {
+                        toast("请选择营业执照及授权证明");
+                    } else {
+                        uploadimgpaths3.clear();
+                        uploadimgpaths3.addAll(uploadimgpaths1);
+                        uploadimgpaths3.addAll(uploadimgpaths2);
+                        //String user_id = (String) SPUtils.get("USER_ID", "");
+                        if (TextUtils.isEmpty(registerUserId)) {
+                            Log.e("getPresenterattct", "" + uploadimgpaths3.toString());
+                        } else {
+                            getPresenter().attct(Integer.parseInt(registerUserId), attcEtPhone.getText().toString()
+                                    , attcEtName.getText().toString(), attcEtCode.getText().toString(),
+                                    attcEtEmail.getText().toString(), getRoleId(tvInformationFactory.getText().toString()) + "",
+                                    0, Build.BRAND + " " + Build.MODEL, uploadimgpaths3);
+                        }
+                    }
+                } else {
+                    if (TextUtils.isEmpty(registerUserId)) {
+
+                    } else {
+                        getPresenter().attct(Integer.parseInt(registerUserId), attcEtPhone.getText().toString()
+                                , attcEtName.getText().toString(), attcEtCode.getText().toString(),
+                                attcEtEmail.getText().toString(), getRoleId(tvInformationFactory.getText().toString()) + "",
+                                0, Build.BRAND + " " + Build.MODEL, uploadimgpaths3);
+                    }
+                }
+                break;
+            case R.id.tv_information_hospital:
+                DataPickerDialog.Builder builder = new DataPickerDialog.Builder(this);
+                List<String> data = Arrays.asList(new String[]{"医药企业", "预防接种机构", "预防接受种者", "物流公司"});
+                /*List<RoleTypeBean.RoleParen> parentlist = new ArrayList<>();
+                parentlist.add(new RoleTypeBean.RoleParen(6,"","医药企业"));
+                parentlist.add(new RoleTypeBean.RoleParen(7,"","预防接种机构"));
+                parentlist.add(new RoleTypeBean.RoleParen(8,"","预防接受种者"));
+                parentlist.add(new RoleTypeBean.RoleParen(9,"","物流公司"));*/
+                DataPickerDialog dialog = builder.setData(data).setSelection(0).setTitle("标题")
+                        .setOnDataSelectedListener(new DataPickerDialog.OnDataSelectedListener() {
+                            @Override
+                            public void onDataSelected(String itemValue) {
+                                if (!TextUtils.isEmpty(tvInformationHospital.getText().toString())) {
+                                    tvInformationFactory.setText("");
+                                }
+                                tvInformationHospital.setText(itemValue + "");
+                                if ("预防接种机构".equals(itemValue)) {
+                                    attcLlLicense.setVisibility(View.VISIBLE);
+                                    attcLlProve.setVisibility(View.VISIBLE);
+                                } else {
+                                    attcLlLicense.setVisibility(View.GONE);
+                                    attcLlProve.setVisibility(View.GONE);
+                                }
+                            }
+                        }).create();
+
+                dialog.show();
+                break;
+            case R.id.tv_information_factory:
+                if (TextUtils.isEmpty(tvInformationHospital.getText().toString())) {
+                    toast("请先选择所属类型");
+                    return;
+                } else {
+                    int roleParentId = getRoleParentId(tvInformationHospital.getText().toString());
+                    List<String> roleType = getRoleType(roleParentId);
+                    DataPickerDialog.Builder builder2 = new DataPickerDialog.Builder(this);
+                /*List<String> data2 = Arrays.asList(new String[]{"品控人员", "生产人员", "物流人员", "管理人员", "护士", "受种者家属",
+                        "管理人员", "操作人员","后台管理者"});*/
+
+                    DataPickerDialog dialog2 = builder2.setData(roleType).setSelection(0).setTitle("职务")
+                            .setOnDataSelectedListener(new DataPickerDialog.OnDataSelectedListener() {
+                                @Override
+                                public void onDataSelected(String itemValue) {
+                                    tvInformationFactory.setText(itemValue + "");
+                                    //Toast.makeText(getApplicationContext(), itemValue, Toast.LENGTH_SHORT).show();
+                                }
+
+                            }).create();
+
+                    dialog2.show();
+                }
+                break;
+            case R.id.btn_prove_download:
+                //toast("下载");
+                //下载的图片路径
+                String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560345333671&di=3642b27a83162af116af51289ec4d11f&imgtype=jpg&src=http%3A%2F%2Fimg1.imgtn.bdimg.com%2Fit%2Fu%3D2191520521%2C2689315141%26fm%3D214%26gp%3D0.jpg";
+                final String fileName = "evvmproveimg.jpg";  //文件名 注意结尾要加后缀
+
+                RxHttpUtils
+                        .downloadFile(url)
+                        //.subscribe(new DownloadObserver(fileName,destFileDir) 其中 destFileDir是自定义下载存储路径
+                        .subscribe(new DownloadObserver(fileName, Environment.getExternalStorageDirectory().getPath()) {
+                            //可以通过配置tag用于取消下载请求
+                            @Override
+                            protected String setTag() {
+                                return "download";
+                            }
+
+                            @Override
+                            protected void onError(String errorMsg) {
+                                toast(errorMsg);
+                            }
+
+                            @Override
+                            protected void onSuccess(long bytesRead, long contentLength, float progress, boolean done, String filePath) {
+                                btnProveDownload.setText("" + progress + "%");
+                                if (done) {
+                                    btnProveDownload.setText("下载\n完成");
+                                    toast("下载完成,请上传");
+                                }
+
+                            }
+                        });
+
+                break;
+        }
+    }
+
+    //根据parent名字返回id
+    private int getRoleParentId(String name) {
+
+        if ("医药企业".equals(name))
+            return 6;
+        if ("预防接种机构".equals(name))
+            return 7;
+        if ("预防接受种者".equals(name))
+            return 8;
+        if ("物流公司".equals(name))
+            return 9;
+
+        return 0;
+    }
+
+    //根据id返回字列表
+    private List<String> getRoleType(int parentId) {
+
+        List<String> list = new ArrayList<>();
+        switch (parentId) {
+            case 6:
+                list.clear();
+                list.add("管理员");
+                list.add("操作员");
+                list.add("品控人员");
+                list.add("生产人员");
+                list.add("物流人员");
+                list.add("后台管理员");
+                return list;
+
+            case 7:
+                list.clear();
+                list.add("医生");
+                list.add("管理人员");
+                list.add("护士");
+                return list;
+
+            case 8:
+                list.clear();
+                list.add("受种者本人");
+                list.add("受种者家属");
+                return list;
+
+            case 9:
+                list.clear();
+                list.add("管理人员");
+                list.add("操作人员");
+                return list;
+            default:
+                return null;
+        }
+
+
+    }
+
+
+    //根据名字返回id
+    private int getRoleId(String name) {
+        if ("超级管理员".equals(name))
+            return 1;
+        if ("医生".equals(name))
+            return 2;
+        if ("管理员".equals(name))
+            return 3;
+        if ("操作员".equals(name))
+            return 4;
+        if ("受种着本人".equals(name))
+            return 5;
+        if ("医药企业".equals(name))
+            return 6;
+        if ("预防接种机构".equals(name))
+            return 7;
+        if ("预防接种者".equals(name))
+            return 8;
+        if ("物流公司".equals(name))
+            return 9;
+        if ("其他".equals(name))
+            return 10;
+        if ("品控人员".equals(name))
+            return 11;
+        if ("生产人员".equals(name))
+            return 12;
+        if ("物流人员".equals(name))
+            return 13;
+        if ("管理人员".equals(name) && "预防接种机构".equals(tvInformationHospital.getText().toString()))
+            return 14;
+        if ("护士".equals(name))
+            return 15;
+        if ("受种者家属".equals(name))
+            return 16;
+        if ("管理人员".equals(name) && "物流公司".equals(tvInformationHospital.getText().toString()))
+            return 17;
+        if ("操作人员".equals(name))
+            return 18;
+        if ("后台管理者".equals(name))
+            return 19;
+
+        return 0;
+    }
+
+
+    @Override
+    protected AttctPresenter createPresenter() {
+        return new AttctPresenter();
+    }
+
+    @Override
+    public void attctError(String msg) {
+        toast(msg);
+    }
+
+    @Override
+    public void attctSuccess(VerificationCodeBean data) {
+
+        // Log.e("attctSuccessVN",data.getData().toString()+data.getMsg());
+        toast("注册成功");
+        Intent in = new Intent(this, LikeActivity.class);
+        in.putExtra("LikeUserId", "" + Double.valueOf(String.valueOf(data.getData())).intValue());
+        in.putExtra("LikeRoleId", getRoleId(tvInformationFactory.getText().toString()) + "");
+        startActivityFinish(in);
+    }
+
+    private List<String> uploadimgpaths1 = new ArrayList<>();
+    private List<String> uploadimgpaths2 = new ArrayList<>();
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+
+        if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_LICENSE_CHOOSE_FROM_GALLERY) {
+            //营业执照回调
+            List<String> selectedPhotos = BGAPhotoPickerActivity.getSelectedPhotos(data);
+
+            uploadimgpaths1.clear();
+
+            uploadimgpaths1.addAll(selectedPhotos);
+
+            attcEtImgcount.setText("照片数量:" + uploadimgpaths1.size() + "张");
+
+            BGAImage.display(attcEtLicense, R.mipmap.iv_upload_icon, selectedPhotos.get(0), AutoSizeUtils.dp2px(this, 77), AutoSizeUtils.dp2px(this, 43));
+
+
+            Log.e("uploadimgpaths1", "" + uploadimgpaths1.toString());
+
+        } else if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_PROVE_CHOOSE_FROM_GALLERY) {
+
+            //授权证明回调
+            String picturePath = BGAPhotoPickerActivity.getSelectedPhotos(data).get(0);
+            uploadimgpaths2.clear();
+            uploadimgpaths2.add(picturePath);
+            BGAImage.display(attcEtProve, R.mipmap.iv_upload_icon, picturePath, AutoSizeUtils.dp2px(this, 77), AutoSizeUtils.dp2px(this, 43));
+
+            Log.e("uploadimgpaths2", "" + uploadimgpaths2.toString());
+        }
+    }
+
+
+}

BIN
.svn/pristine/06/06fda20f90e3b6885e36f02a0036368808a645d9.svn-base


+ 429 - 0
.svn/pristine/07/0721f8c9e41380f22377e5bd9a58023fed378d48.svn-base

@@ -0,0 +1,429 @@
+package eVVM.apk.ui.login;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.IBinder;
+import android.text.Html;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.TextPaint;
+import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import com.hjq.base.BaseDialog;
+import com.hjq.base.BaseDialogFragment;
+import com.hjq.permissions.OnPermission;
+import com.hjq.permissions.Permission;
+import com.hjq.permissions.XXPermissions;
+import com.hjq.widget.ClearEditText;
+import com.tianma.netdetector.lib.NetworkType;
+
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.InputTextHelper;
+import eVVM.apk.helper.MD5;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.helper.SoftKeyBoardListener;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.My.ExamineActivity;
+import eVVM.apk.ui.bean.LoginBean;
+import eVVM.apk.ui.home.FactorAdminActivity;
+import eVVM.apk.ui.home.FactoryOperatorActivity;
+import eVVM.apk.ui.home.HomeActivity;
+import eVVM.apk.ui.login.login.LoginContract;
+import eVVM.apk.ui.login.login.LoginPresenter;
+
+public class LoginActivity extends MvpActivity<LoginPresenter> implements LoginContract.View {
+
+    @BindView(R.id.login_et_phone)
+    ClearEditText loginEtPhone;
+    @BindView(R.id.login_et_pwd)
+    ClearEditText loginEtPwd;  //密码输入框
+    @BindView(R.id.login_tv_forgetpwd)
+    TextView loginTvForgetpwd;  //忘记密码
+    @BindView(R.id.login_btn_login)
+    Button loginBtnLogin;     //登录
+    @BindView(R.id.login_tv_goregist)
+    TextView loginTvGoregist;  //去注册
+    @BindView(R.id.login_scrollview)
+    ScrollView loginScrollview;
+    @BindView(R.id.examine_cb_agree)
+    CheckBox examineCbAgree;
+    @BindView(R.id.examine_tv_protocol)
+    TextView examineTvProtocol;
+
+    private String getMD5Pwd;
+    private String userPhone;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_login;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return 0;
+    }
+
+    @Override
+    protected void initView() {
+        new InputTextHelper.Builder(this)
+                .setMain(loginBtnLogin)
+                .addView(loginEtPhone)
+                .addView(loginEtPwd)
+                .build();
+        loginScrollview.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View arg0, MotionEvent arg1) {
+                View v = getCurrentFocus();
+                if (isShouldHideKeyboard(v, arg1)) {
+                    hideKeyboard(v.getWindowToken());
+                }
+                //不能滑动
+                return true;
+                //可以滑动
+                //return false;
+            }
+        });
+        SoftKeyBoardListener.setListener(getActivity(), new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
+            @Override
+            public void keyBoardShow(int height) {
+                loginScrollview.smoothScrollTo(0, height / 2);
+            }
+
+            @Override
+            public void keyBoardHide(int height) {
+                loginScrollview.smoothScrollTo(0, 0);
+            }
+        });
+
+        getBtnStact();
+        toProtocol();
+    }
+
+    @Override
+    protected void initData() {
+        getPermissions();
+        String user_phone = (String) SPUtils.get("USER_PHONE", "");
+        String user_pwd = (String) SPUtils.get("USER_PWD", "");
+        if (TextUtils.isEmpty(user_phone) && TextUtils.isEmpty(user_pwd)) {
+            //用户没有登录过
+        } else {
+            showLoading();
+            //登陆过 进行自动登录
+            userPhone = user_phone;
+            getMD5Pwd = user_pwd;
+            getPresenter().login(user_phone, user_pwd);
+        }
+    }
+
+    private void getPermissions() {
+        // 联系人
+        String[] CONTACTS = new String[]{
+                Permission.CAMERA,
+                Permission.RECEIVE_SMS,
+                Permission.READ_SMS,
+                Permission.READ_EXTERNAL_STORAGE,
+                Permission.WRITE_EXTERNAL_STORAGE,
+                Permission.ACCESS_FINE_LOCATION,
+                Permission.ACCESS_COARSE_LOCATION,
+                Permission.REQUEST_INSTALL_PACKAGES};
+
+        XXPermissions.with(LoginActivity.this)
+                //.constantRequest() //可设置被拒绝后继续申请,直到用户授权或者永久拒绝
+                //.permission(Permission.SYSTEM_ALERT_WINDOW, Permission.REQUEST_INSTALL_PACKAGES) //支持请求6.0悬浮窗权限8.0请求安装权限
+                .permission(CONTACTS) //不指定权限则自动获取清单中的危险权限
+                .request(new OnPermission() {
+
+                    @Override
+                    public void hasPermission(List<String> granted, boolean isAll) {
+                        /*if (isAll) {
+                            toast("获取权限成功");
+                        }else {
+                            toast("获取权限成功,部分权限未正常授予");
+                        }*/
+                    }
+
+                    @Override
+                    public void noPermission(List<String> denied, boolean quick) {
+                        /*if(quick) {
+                            toast("被永久拒绝授权,请手动授予权限");
+                            //如果是被永久拒绝就跳转到应用权限系统设置页面
+                            XXPermissions.gotoPermissionSettings(LoginActivity.this);
+                        }else {
+                            //toast("获取权限失败,部分功能可能无法使用");
+                        }*/
+                    }
+                });
+    }
+
+    @OnClick({R.id.login_tv_forgetpwd, R.id.login_btn_login, R.id.login_tv_goregist})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.login_tv_forgetpwd:
+                startActivity(PasswordForgetActivity.class);
+                break;
+            case R.id.login_btn_login:
+                if (examineCbAgree.isChecked()) {
+                    if (loginEtPhone.getText().toString().length() != 11) {
+                        toast(getString(R.string.common_phone_input_error));
+                    } else {
+                        //登录 密码进行md5加密
+                        getMD5Pwd = MD5.GetMD5Code(loginEtPwd.getText().toString().trim());
+                        userPhone = loginEtPhone.getText().toString().trim();
+                        getPresenter().login(userPhone, getMD5Pwd);
+                        showLoading();
+                    }
+                } else {
+                    toast("请勾选用户协议");
+                }
+
+                break;
+            case R.id.login_tv_goregist:
+                startActivity(RegisterActivity.class);
+                break;
+        }
+    }
+
+    @Override
+    protected LoginPresenter createPresenter() {
+        return new LoginPresenter();
+    }
+
+    @Override
+    public void loginError(String msg) {
+        showComplete();
+        toast(msg);
+        if (msg.indexOf("请检查您的网络状态") != -1) {
+            String user_roleId = (String) SPUtils.get("USER_ROLEID", "");
+            if (!TextUtils.isEmpty(user_roleId)) {
+                switch (Integer.parseInt(user_roleId)) {
+                    case 2: //医生
+                        startActivityFinish(HomeActivity.class);
+                        break;
+                    case 3: //医药企业管理员
+                        startActivityFinish(FactorAdminActivity.class);
+                        break;
+                    case 4: //医药企业操作员
+                        if (!checkGpsAndNfc()) {
+                            return;
+                        }
+                        startActivityFinish(FactoryOperatorActivity.class);
+                        break;
+                    default:
+                        toast("当前版本不支持本角色登录");
+                        break;
+                }
+            }
+
+        }
+    }
+
+    @Override
+    public void loginSuccess(LoginBean data) {
+
+        // 处理登录
+        showComplete();
+        LoginBean.DataBean userData = data.getData();
+        SPUtils.put("USER_ID", userData.getId() + "");
+        SPUtils.put("USER_TOKEN", userData.getToken() + "");
+
+        if (userData.getStatus() == 1) {//状态(0禁用 1正常 2删除 3未审核 4审核未通过 5未完成注册 6未同意协议)
+
+            Log.e("userData", "" + userData.getPassword());
+            //保存用户数据
+            SPUtils.put("USER_PHONE", userPhone + "");
+            SPUtils.put("USER_PWD", getMD5Pwd + "");
+            SPUtils.put("USER_ROLEID", userData.getRoleId() + "");
+            SPUtils.put("USER_FACTORY_ID", userData.getFactoryId() + "");
+            SPUtils.put("USER_NAME", userData.getUserName() + "");
+            SPUtils.put("PHONE_MODEL", userData.getPhoneModel());
+            SPUtils.put("USER_EMAIL", userData.getEmail());
+            SPUtils.put("USER_CALLNUM", userData.getTelephone());
+
+            switch (userData.getRoleId()) {   //根据不同角色 跳转进入不同的页面 只有厂家管理员不需要判断nfc
+                case 2: //医生
+//                    if (!checkGpsAndNfc()) {
+//                        return;
+//                    }
+                    startActivityFinish(HomeActivity.class);
+                    break;
+                case 3: //医药企业管理员
+                    startActivityFinish(FactorAdminActivity.class);
+                    break;
+                case 4: //医药企业操作员
+                    if (!checkGpsAndNfc()) {
+                        return;
+                    }
+                    startActivityFinish(FactoryOperatorActivity.class);
+                    break;
+                default:
+                    toast("当前版本不支持本角色登录");
+                    break;
+            }
+        } else if (userData.getStatus() == 0) {
+            toast("当前账号已被禁用");
+        } else if (userData.getStatus() == 2) {
+            toast("当前账号已被删除");
+        } else if (userData.getStatus() == 3) {
+            Intent in = new Intent(this, ExamineActivity.class);
+            in.putExtra("LoginStatusCode", 3);
+            startActivity(in);
+            //toast("您的账号正在审核中,请耐心等待");
+        } else if (userData.getStatus() == 4) {
+            Intent in = new Intent(this, ExamineActivity.class);
+            in.putExtra("LoginStatusCode", 4);
+            startActivity(in);
+            //toast("审核未通过");
+        } else if (userData.getStatus() == 5) {
+//            toast("未完成注册");
+            Intent in = new Intent(this, AuthenticationActivity.class);
+            in.putExtra("registerUserId", data.getData().getId() + "");
+            startActivity(in);
+        } else if (userData.getStatus() == 6) {
+            Intent in = new Intent(this, ExamineActivity.class);
+            in.putExtra("LoginStatusCode", 6);
+            startActivity(in);
+        }
+    }
+
+    private void getBtnStact() {
+        examineCbAgree.setChecked(true);
+      /*  examineCbAgree.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+                if (b) {
+                    examineBtnTrue.setEnabled(true);
+                } else {
+                    //forgetBtnLogin.setClickable(false);
+                    examineBtnTrue.setEnabled(false);
+                }
+            }
+        });*/
+    }
+
+    private void toProtocol() {
+        ClickableSpan clickableSpan = new ClickableSpan() {
+            @Override
+            public void onClick(View widget) {
+                //startActivity(new Intent(SpecialLineCompanyListActivity.this, SpecialLineCreateCompanyActivity.class));//响应点击事件
+                // agreementView.setVisibility(View.VISIBLE);
+
+                new BaseDialogFragment.Builder(getActivity())
+                        .setContentView(R.layout.dialog_agree)
+                        .setAnimStyle(BaseDialog.AnimStyle.SCALE)
+                        .setText(R.id.agree_msg, Html.fromHtml(getString(R.string.agreement)))
+                        .setOnClickListener(R.id.agree_canale, new BaseDialog.OnClickListener<ImageView>() {
+
+                            @Override
+                            public void onClick(BaseDialog dialog, ImageView view) {
+                                dialog.dismiss();
+                            }
+                        })
+                        .addOnShowListener(new BaseDialog.OnShowListener() {
+                            @Override
+                            public void onShow(BaseDialog dialog) {
+                                //toast("Dialog  显示了");
+                            }
+                        })
+                        .addOnCancelListener(new BaseDialog.OnCancelListener() {
+                            @Override
+                            public void onCancel(BaseDialog dialog) {
+                                // toast("Dialog 取消了");
+                            }
+                        })
+                        .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                            @Override
+                            public void onDismiss(BaseDialog dialog) {
+                                //toast("Dialog 销毁了");
+                            }
+                        })
+                        .show();
+            }
+
+            @Override
+            public void updateDrawState(TextPaint ds) {
+                ds.setColor(Color.BLUE);//设置颜色
+                ds.setUnderlineText(false);//去掉下划线
+                ds.clearShadowLayer();
+            }
+        };
+        SpannableStringBuilder builder = new SpannableStringBuilder(examineTvProtocol.getText().toString());
+
+        builder.setSpan(clickableSpan, 8, 14, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        examineTvProtocol.setText(builder);
+        examineTvProtocol.setMovementMethod(LinkMovementMethod.getInstance());//必须设置才能响应点击事件
+    }
+
+
+    //点击空白 隐藏软键盘
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+
+        if (event.getAction() == MotionEvent.ACTION_DOWN) {
+            View v = getCurrentFocus();
+            if (isShouldHideKeyboard(v, event)) {
+                hideKeyboard(v.getWindowToken());
+            }
+        }
+        return super.onTouchEvent(event);
+    }
+
+    /**
+     * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏
+     *
+     * @param v
+     * @param event
+     * @return
+     */
+    private boolean isShouldHideKeyboard(View v, MotionEvent event) {
+        if (v != null && (v instanceof EditText)) { //判断是否是EditText
+            int[] l = {0, 0};
+            v.getLocationInWindow(l);
+            int left = l[0],
+                    top = l[1],
+                    bottom = top + v.getHeight(),
+                    right = left + v.getWidth();
+            if (event.getX() > left && event.getX() < right
+                    && event.getY() > top && event.getY() < bottom) {
+                // 点击EditText的事件,忽略它。
+                return false;
+            } else {
+                return true;
+            }
+        }
+        // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点
+        return false;
+    }
+
+    /**
+     * 获取InputMethodManager,隐藏软键盘
+     *
+     * @param token
+     */
+    private void hideKeyboard(IBinder token) {
+        if (token != null) {
+            InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+            im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
+        }
+    }
+
+    @Override
+    public void onNetConnected(NetworkType networkType) {
+    }
+}

+ 66 - 0
.svn/pristine/07/075fb993fd8d970ca15b4af9b5de8c38e9cb08db.svn-base

@@ -0,0 +1,66 @@
+package com.xy.basics.annex;
+
+public class Encrypt {
+
+    //密钥 加解密的密钥必须相同 可自定义  
+    private static final String secretKey ="6w3lacP9gmjbMgor";   
+      
+    /** 
+     * 字符串加密 
+     * @param plainText 要加密的字符串 
+     * @return 加密后的字符串 
+     */  
+    public static String encrypt(String plainText){  
+         String encryption = "";  
+         try {  
+             plainText =  new String(plainText.getBytes("UTF-8"),"iso-8859-1");  
+            } catch (Exception e) {  
+            }  
+         char[] cipher=new char[plainText.length()];  
+         for(int i=0,j=0;i<plainText.length();i++,j++){  
+             if(j==secretKey.length())  
+                 j=0;  
+             cipher[i]=(char) (plainText.charAt(i)^secretKey.charAt(j));  
+             String strCipher= Integer.toHexString(cipher[i]);  
+             if(strCipher.length() == 1){  
+                 encryption+="0"+strCipher;  
+             }else{  
+                 encryption+=strCipher;  
+             }  
+         }  
+         return encryption;  
+     }  
+  
+    /** 
+     * 解密字符串 
+     * @param encryption 要解密的字符串 
+     * @return 解密后的字符串 
+     */  
+    public static String decrypt(String encryption) {  
+         char[] decryption=new char[encryption.length()/2];  
+         for(int i=0,j=0;i<encryption.length()/2;i++,j++){  
+             if(j==secretKey.length())  
+                 j=0;  
+             char n=(char)(int)Integer.valueOf(encryption.substring(i*2,i*2+2),16);  
+             decryption[i]=(char)(n^secretKey.charAt(j));  
+         }  
+         String decoding="";  
+         try {  
+             decoding = new String(String.valueOf(decryption).getBytes("iso-8859-1"),"UTF-8");  
+                } catch (Exception e) {  
+            }  
+         return decoding;  
+     }  
+  
+    /** 
+     * @param args 
+     */  
+    public static void main(String[] args) {  
+        String name="13621372753";
+         String tem=Encrypt.encrypt(name);  
+         System.out.println(tem);  
+         System.out.println(Encrypt.decrypt(tem));  
+  
+    }  
+
+}

+ 318 - 0
.svn/pristine/08/08020a804970d96642bc9d9b1571cd6da62cdbad.svn-base

@@ -0,0 +1,318 @@
+package eVVM.apk.ui.report.vndetail;
+
+import android.content.Intent;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.hjq.image.ImageLoader;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.bean.ModelListBean;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+import eVVM.apk.ui.bean.VnDetailBean;
+import eVVM.apk.ui.webview.WebActivity;
+import eVVM.apk.widget.ZoomView;
+
+public class VnReportDetailActivity extends MvpActivity<VnDetailPresenter> implements VnDetailContract.View {
+
+    @BindView(R.id.vndetail_tv_vncode)
+    TextView vndetailTvVncode;
+    @BindView(R.id.vndetail_tv_vndate)
+    TextView vndetailTvVndate;
+    @BindView(R.id.vndetail_tv_factoryName)
+    TextView vndetailTvFactoryName;
+    @BindView(R.id.vndetail_tv_gmpName)
+    TextView vndetailTvGmpName;
+    @BindView(R.id.vndetail_tv_gmpPath)
+    TextView vndetailTvGmpPath;
+    @BindView(R.id.vndetail_tv_hospitalName)
+    TextView vndetailTvHospitalName;
+    @BindView(R.id.vndetail_tv_doctorName)
+    TextView vndetailTvDoctorName;
+    @BindView(R.id.vndetail_tv_doctorTelephone)
+    TextView vndetailTvDoctorTelephone;
+    @BindView(R.id.vndetail_tv_chatImage)
+    ImageView vndetailTvChatImage;
+    @BindView(R.id.vndetail_tv_othervn1)
+    TextView vndetailTvOthervn1;
+    @BindView(R.id.vndetail_tv_othervn2)
+    TextView vndetailTvOthervn2;
+    @BindView(R.id.vndetail_tv_othervn3)
+    TextView vndetailTvOthervn3;
+    @BindView(R.id.vndetail_iv_tipsimg)
+    ImageView vndetailIvTipsimg;
+    @BindView(R.id.vndetail_tv_tips)
+    TextView vndetailTvTips;
+    @BindView(R.id.vndetail_tv_disclaimer)
+    TextView vndetailTvDisclaimer;
+    @BindView(R.id.zv_report)
+    ZoomView myzoomview;
+    @BindView(R.id.vndetail_tv_vnname)
+    TextView vndetailTvVnname;
+    @BindView(R.id.vndetail_tv_vnsex)
+    TextView vndetailTvVnsex;
+    @BindView(R.id.vndetail_tv_vnbirthday)
+    TextView vndetailTvVnbirthday;
+    @BindView(R.id.vndetail_tv_vncodeid)
+    TextView vndetailTvVncodeid;
+    @BindView(R.id.vndetail_tv_vnjianhuren)
+    TextView vndetailTvVnjianhuren;
+    @BindView(R.id.vndetail_tv_vnphone)
+    TextView vndetailTvVnphone;
+    @BindView(R.id.vn_type)
+    TextView vnType;
+    @BindView(R.id.vn_tips)
+    TextView vnTips;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_vn_report_detail;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.tb_vndetail_title;
+    }
+
+    @Override
+    protected void initView() {
+
+
+    }
+
+    @Override
+    protected void initData() {
+        Intent in = getIntent();
+        showLoading();
+        String vnchipNumber = in.getStringExtra("VnchipNumber");
+        getPresenter().getDetail(vnchipNumber);
+
+
+    }
+
+    @Override
+    protected VnDetailPresenter createPresenter() {
+        return new VnDetailPresenter();
+    }
+
+    @Override
+    public void getDetailError(String msg) {
+        showComplete();
+        toast(msg);
+        finish();
+    }
+
+    @Override
+    public void getDetailSuccess(VnDetailBean data) {
+        showComplete();
+        VnDetailBean.DataBean dataBean = data.getData();
+        //给页面赋值
+        setViewData(dataBean);
+
+        // toast(data.getData().toString());
+        i("getDetailSuccess", data.getData().toString());
+    }
+
+
+    @OnClick({R.id.vndetail_bt_magnifier})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.vndetail_bt_magnifier:
+                //放大
+                myzoomview.magnifier();
+                break;
+        }
+    }
+
+    @Override
+    public void getSendMailError(String msg) {
+
+    }
+
+    @Override
+    public void getSendMailSuccess(VnDetailBean data) {
+
+    }
+
+    @Override
+    public void getmlistError(String msg) {
+
+    }
+
+    @Override
+    public void getmlistSuccess(ModelListBean data) {
+
+    }
+
+    @Override
+    public void getToReviewError(String msg) {
+
+    }
+
+    @Override
+    public void getToReviewSuccess(VerificationCodeBean data) {
+
+    }
+
+    private void setViewData(final VnDetailBean.DataBean dataBean) {
+        vndetailTvVnname.setText(TextUtils.isEmpty(dataBean.getInoculatroUserName()) ? "N/A" : "" + dataBean.getInoculatroUserName());
+        vndetailTvVnsex.setText(TextUtils.isEmpty(dataBean.getInoculatroSex()) ? "N/A" : "" + dataBean.getInoculatroSex());
+        vndetailTvVnbirthday.setText(TextUtils.isEmpty(dataBean.getInoculatroBirthdate()) ? "N/A" : "" + dataBean.getInoculatroBirthdate());
+        vndetailTvVncodeid.setText(TextUtils.isEmpty(dataBean.getInoculatroId()) ? "N/A" : "" + dataBean.getInoculatroId());
+        vndetailTvVnjianhuren.setText("N/A");
+        vndetailTvVnphone.setText(TextUtils.isEmpty(dataBean.getInoculatroTelePhone()) ? "N/A" : "" + dataBean.getInoculatroTelePhone());
+        vnTips.setText("提示:温度曲线位于绿色区域为正常;温度曲线位于黄色区域,需做风险评估;温度曲线位于红色区域,且时间累计超过指定时限,应立即停止使用该疫苗产品,启动复核程序。");
+        if (dataBean.getType() == 2) {
+            vnType.setText("可用性分析:预警");
+        } else if (dataBean.getType() == 3) {
+            vnType.setText("可用性分析:需复核");
+        } else {
+            vnType.setText("可用性分析:未见异常");
+        }
+        //vndetailTvVncode.setText("evvm Code " + dataBean.getCode());
+      /*  String codeStr = "";
+        for (int i = 0; i < dataBean.getCodeX().length(); i++) {
+            codeStr = codeStr + "*";
+        }*/
+        SpannableString spancode = new SpannableString("evvm 报告编号 " + dataBean.getCodeX());
+        spancode.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+              /*  if (dataBean.getCodeX() == null || TextUtils.isEmpty(dataBean.getCodeX())) {
+                    toast("你没有授权,请进行注册");
+                } else {
+                    Intent in = new Intent(VnReportDetailActivity.this, WebActivity.class);
+                    in.putExtra("WebViewUrl", "" + dataBean.getCodeX() + "");
+                    startActivity(in);
+                }*/
+            }
+        }, 10, 10 + dataBean.getCodeX().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvVncode.setText(spancode);
+        vndetailTvVncode.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+
+        if (dataBean.getDatetime() != null) {
+            vndetailTvVndate.setText(dataBean.getDatetime());
+        }
+        vndetailTvFactoryName.setText("" + dataBean.getFactoryName());
+        vndetailTvHospitalName.setText("" + dataBean.getHospitalName());
+        vndetailTvDoctorName.setText("" + dataBean.getDoctorName());
+        vndetailTvDoctorTelephone.setText("" + dataBean.getDoctorTelephone());
+        vndetailTvChatImage.setScaleType(ImageView.ScaleType.CENTER);
+        if (!TextUtils.isEmpty(dataBean.getChatImageUrl())) {
+            ImageLoader.loadImage(vndetailTvChatImage, dataBean.getChatImageUrl());
+        }
+
+        SpannableString spanGmpPath = new SpannableString(TextUtils.isEmpty(dataBean.getGmpName()) ? "N/A" : dataBean.getGmpName());
+        spanGmpPath.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getGmpPath() == null || TextUtils.isEmpty(dataBean.getGmpPath())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    Intent in = new Intent(VnReportDetailActivity.this, WebActivity.class);
+                    in.putExtra("WebViewUrl", "" + dataBean.getGmpPath() + "");
+                    startActivity(in);
+                }
+            }
+        }, 0, spanGmpPath.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvGmpName.setText(spanGmpPath);
+        vndetailTvGmpName.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn0 = new SpannableString("点击查看");
+        spanvndetailTvOthervn0.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getBatchCertificate() == null || TextUtils.isEmpty(dataBean.getBatchCertificate())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    Intent in = new Intent(VnReportDetailActivity.this, WebActivity.class);
+                    in.putExtra("WebViewUrl", "" + dataBean.getBatchCertificate() + "");
+                    startActivity(in);
+                }
+            }
+        }, 0, spanvndetailTvOthervn0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvGmpPath.setText(spanvndetailTvOthervn0);
+        vndetailTvGmpPath.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn1 = new SpannableString("点击查询");
+        spanvndetailTvOthervn1.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameBatchOtherColdChain() == null || TextUtils.isEmpty(dataBean.getSameBatchOtherColdChain())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    Intent in = new Intent(VnReportDetailActivity.this, WebActivity.class);
+                    in.putExtra("WebViewUrl", "" + dataBean.getSameBatchOtherColdChain() + "");
+                    startActivity(in);
+                }
+            }
+        }, 0, spanvndetailTvOthervn1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn1.setText(spanvndetailTvOthervn1);
+        vndetailTvOthervn1.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+
+        SpannableString spanvndetailTvOthervn2 = new SpannableString("点击查询");
+        spanvndetailTvOthervn2.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameBatchOtherFlow() == null || TextUtils.isEmpty(dataBean.getSameBatchOtherFlow())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    Intent in = new Intent(VnReportDetailActivity.this, WebActivity.class);
+                    in.putExtra("WebViewUrl", "" + dataBean.getSameBatchOtherFlow() + "");
+                    startActivity(in);
+                }
+            }
+        }, 0, spanvndetailTvOthervn2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn2.setText(spanvndetailTvOthervn2);
+        vndetailTvOthervn2.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn3 = new SpannableString("点击查询");
+        spanvndetailTvOthervn3.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameFactoryOtherVaccines() == null || TextUtils.isEmpty(dataBean.getSameFactoryOtherVaccines())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    Intent in = new Intent(VnReportDetailActivity.this, WebActivity.class);
+                    in.putExtra("WebViewUrl", "" + dataBean.getSameFactoryOtherVaccines() + "");
+                    startActivity(in);
+                }
+            }
+        }, 0, spanvndetailTvOthervn3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn3.setText(spanvndetailTvOthervn3);
+        vndetailTvOthervn3.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+    }
+
+
+    public static void i(String tag, String msg) {  //信息太长,分段打印
+        //因为String的length是字符数量不是字节数量所以为了防止中文字符过多,
+        //  把4*1024的MAX字节打印长度改为2001字符数
+        int max_str_length = 2001 - tag.length();
+        //大于4000时
+        while (msg.length() > max_str_length) {
+            Log.i(tag, msg.substring(0, max_str_length));
+            msg = msg.substring(max_str_length);
+        }
+        //剩余部分
+        Log.i(tag, msg);
+
+    }
+}

+ 84 - 0
.svn/pristine/08/08443de5427dd67950b34fa5aaf280d4de2980af.svn-base

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/dialog_rounded_corner_bg"
+    android:orientation="vertical">
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="10dp">
+
+        <ImageView
+            android:id="@+id/iv_dialog_pay_close"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:padding="10dp"
+            android:src="@mipmap/ic_dialog_close" />
+
+        <TextView
+            android:id="@+id/tv_dialog_pay_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:layout_marginLeft="40dp"
+            android:layout_marginRight="40dp"
+            android:gravity="center"
+            android:text="@string/dialog_pay_title"
+            android:textColor="#333333"
+            android:textSize="15sp" />
+    </FrameLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1px"
+        android:background="#ececec" />
+
+    <TextView
+        android:id="@+id/tv_dialog_pay_sub_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginTop="20dp"
+        android:textColor="#333333"
+        android:textSize="14sp"
+        android:visibility="gone"
+        tools:text="到账金额(元)" />
+
+    <TextView
+        android:id="@+id/tv_dialog_pay_money"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginTop="15dp"
+        android:textColor="#333333"
+        android:textSize="24sp"
+        android:visibility="gone"
+        tools:text="¥ 150.00" />
+
+    <com.hjq.dialog.widget.PasswordView
+        android:id="@+id/pw_dialog_pay_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginTop="20dp"
+        android:layout_marginBottom="20dp" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1px"
+        android:background="#ECECEC" />
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/rv_dialog_pay_list"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:overScrollMode="never"
+        tools:layoutManager="android.support.v7.widget.GridLayoutManager"
+        tools:listitem="@layout/item_dialog_pay_password"
+        tools:spanCount="3" />
+
+</LinearLayout>

+ 201 - 0
.svn/pristine/08/087ee1d97dcef534e7da4c8ba1624e2293e7405c.svn-base

@@ -0,0 +1,201 @@
+package eVVM.apk.ui.login;
+
+import android.os.Handler;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.hjq.permissions.OnPermission;
+import com.hjq.permissions.Permission;
+import com.hjq.permissions.XXPermissions;
+import com.hjq.widget.ClearEditText;
+
+
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.common.MyActivity;
+import eVVM.apk.helper.InputTextHelper;
+import eVVM.apk.helper.MD5;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.bean.LoginBean;
+import eVVM.apk.ui.home.FactoryOperatorActivity;
+import eVVM.apk.ui.home.HomeActivity;
+import eVVM.apk.ui.launcher.LikeActivity;
+import eVVM.apk.ui.login.login.LoginContract;
+import eVVM.apk.ui.login.login.LoginPresenter;
+
+public class LoginActivity extends MvpActivity<LoginPresenter> implements LoginContract.View {
+
+
+    @BindView(R.id.login_et_phone)
+    ClearEditText loginEtPhone;
+    @BindView(R.id.login_et_pwd)
+    ClearEditText loginEtPwd;  //密码输入框
+    @BindView(R.id.login_tv_forgetpwd)
+    TextView loginTvForgetpwd;  //忘记密码
+    @BindView(R.id.login_btn_login)
+    Button loginBtnLogin;     //登录
+    @BindView(R.id.login_tv_goregist)
+    TextView loginTvGoregist;  //去注册
+    private String getMD5Pwd;
+    private String userPhone;
+
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_login;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return 0;
+    }
+
+    @Override
+    protected void initView() {
+        new InputTextHelper.Builder(this)
+                .setMain(loginBtnLogin)
+                .addView(loginEtPhone)
+                .addView(loginEtPwd)
+                .build();
+    }
+
+    @Override
+    protected void initData() {
+
+        getPermissions();
+
+        String user_phone = (String) SPUtils.get( "USER_PHONE", "");
+        String user_pwd = (String) SPUtils.get("USER_PWD", "");
+
+        if (TextUtils.isEmpty(user_phone)&&TextUtils.isEmpty(user_pwd)){
+            //用户没有登录过
+        }else {
+            showLoading();
+            //登陆过 进行自动登录
+            userPhone = user_phone ;
+            getMD5Pwd = user_pwd;
+            getPresenter().login(user_phone,user_pwd);
+        }
+    }
+
+    private void getPermissions() {
+        // 联系人
+        String[] CONTACTS = new String[]{
+                Permission.CAMERA,
+                Permission.RECEIVE_SMS,
+                Permission.READ_SMS,
+                Permission.READ_EXTERNAL_STORAGE,
+                Permission.WRITE_EXTERNAL_STORAGE};
+
+        XXPermissions.with(LoginActivity.this)
+                //.constantRequest() //可设置被拒绝后继续申请,直到用户授权或者永久拒绝
+                //.permission(Permission.SYSTEM_ALERT_WINDOW, Permission.REQUEST_INSTALL_PACKAGES) //支持请求6.0悬浮窗权限8.0请求安装权限
+                .permission(CONTACTS) //不指定权限则自动获取清单中的危险权限
+                .request(new OnPermission() {
+
+                    @Override
+                    public void hasPermission(List<String> granted, boolean isAll) {
+                        /*if (isAll) {
+                            toast("获取权限成功");
+                        }else {
+                            toast("获取权限成功,部分权限未正常授予");
+                        }*/
+                    }
+
+                    @Override
+                    public void noPermission(List<String> denied, boolean quick) {
+                        /*if(quick) {
+                            toast("被永久拒绝授权,请手动授予权限");
+                            //如果是被永久拒绝就跳转到应用权限系统设置页面
+                            XXPermissions.gotoPermissionSettings(LoginActivity.this);
+                        }else {
+                            //toast("获取权限失败,部分功能可能无法使用");
+                        }*/
+
+                    }
+                });
+    }
+
+
+    @OnClick({R.id.login_tv_forgetpwd, R.id.login_btn_login, R.id.login_tv_goregist})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.login_tv_forgetpwd:
+                startActivity(PasswordForgetActivity.class);
+                break;
+            case R.id.login_btn_login:
+                if (loginEtPhone.getText().toString().length() != 11) {
+                    toast(getString(R.string.common_phone_input_error));
+                } else {
+                //登录 密码进行md5加密
+                    getMD5Pwd = MD5.GetMD5Code(loginEtPwd.getText().toString().trim());
+                    userPhone = loginEtPhone.getText().toString().trim();
+                    getPresenter().login(userPhone, getMD5Pwd);
+                    showLoading();
+                }
+                break;
+            case R.id.login_tv_goregist:
+                startActivity(RegisterActivity.class);
+                break;
+        }
+    }
+
+    @Override
+    protected LoginPresenter createPresenter() {
+        return new LoginPresenter();
+    }
+
+    @Override
+    public void loginError(String msg) {
+        showComplete();
+        toast(msg);
+    }
+
+    @Override
+    public void loginSuccess(LoginBean data) {
+
+        /*// 处理登录
+        Integer likesdata = (Integer) SPUtils.get(this, "LIKESDATA", 0);
+        if (likesdata == 0){
+            startActivityFinish(LikeActivity.class);
+        }else {*/
+
+        LoginBean.DataBean userData = data.getData();
+
+        Log.e("userData",""+userData.getPassword());
+        SPUtils.put("USER_PHONE",userPhone+"");
+        SPUtils.put("USER_PWD",getMD5Pwd+"");
+        SPUtils.put("USER_ID",userData.getId()+"");
+        SPUtils.put("USER_TOKEN",userData.getToken()+"");
+
+
+
+        SPUtils.put("USER_ROLEID",userData.getRoleId()+"");
+
+       /* showLoading();
+        new Handler().postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                initSocketContent();
+            }
+        }, 500);*/
+        showComplete();
+        startActivityFinish(HomeActivity.class);
+        /*if (userData.getRoleId() == 2){
+            startActivityFinish(HomeActivity.class);
+        }else {
+            startActivityFinish(FactoryOperatorActivity.class);
+        }*/
+
+
+
+        //}
+    }
+}

+ 537 - 0
.svn/pristine/08/0887eb695056fb87e5b6c80423d4219b8e8423a5.svn-base

@@ -0,0 +1,537 @@
+package eVVM.apk.ui.vaccination;
+
+
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.app.Dialog;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+import android.nfc.NfcAdapter;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Parcelable;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.View;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.CycleInterpolator;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.LinearInterpolator;
+import android.view.animation.RotateAnimation;
+import android.widget.ImageView;
+import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
+
+import com.hjq.base.BaseDialog;
+import com.hjq.base.BaseDialogFragment;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.ConversionUtil;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.helper.SoundPoolHelper;
+import eVVM.apk.ui.bean.VnDetailBean;
+import eVVM.apk.ui.event.ReadingErrorEvent;
+import eVVM.apk.ui.home.BaseNfcActivity;
+import eVVM.apk.ui.home.uploadChip.UploadChipContract;
+import eVVM.apk.ui.vaccination.save.ChipModel;
+import eVVM.apk.widget.EvvmMsgDiago;
+
+
+public class ReadingActivity extends BaseNfcActivity implements UploadChipContract.View {
+
+    private boolean isWarning = false;
+    private ChipModel chipModel;
+    private SoundPoolHelper soundPoolHelper;
+    private String textRecord = "";
+    private String chipNumber = "";
+
+
+    @BindView(R.id.reading__line)
+    ImageView imgreadline;
+
+    @BindView(R.id.reading_progress)
+    ProgressBar readingProgress;
+
+    @BindView(R.id.fly_phonerl)
+    RelativeLayout flyphonerl;
+    private Animation animation;
+    private AlphaAnimation alp;
+    private AnimatorSet animatorSetsuofang;
+    private AnimatorSet animatorSetsuofang2;
+    private BaseDialog loadDiago;
+    private ProgressBar readpb;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_reading;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.reading_title;
+    }
+
+    @Override
+    protected void initView() {
+        getAnimationSao(); //进行雷达扫描动画
+        soundPoolHelper = new SoundPoolHelper(5, SoundPoolHelper.TYPE_MUSIC)
+                .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC)
+                .loadDefault(ReadingActivity.this)
+                .load(ReadingActivity.this, "factory_operator_success", R.raw.factory_operator_success)
+                .load(ReadingActivity.this, "factory_operator_error", R.raw.factory_operator_error)
+                .load(ReadingActivity.this, "xufuhe", R.raw.xufuhe)
+                .load(ReadingActivity.this, "zhengchang", R.raw.zhengchang)
+                .load(ReadingActivity.this, "nuliduquzhong", R.raw.nuliduquzhong);
+
+
+        //第一次加载才会做飞出动画
+        int flyPhoneType = (int) SPUtils.get("FlyPhoneType", 0);
+        if (flyPhoneType == 0) {
+            getFlyPhone();
+            SPUtils.put("FlyPhoneType", 1);
+        } else {
+            flyphonerl.setVisibility(View.GONE);
+        }
+    }
+
+    private void getFlyPhone() {
+        Resources resources = this.getResources();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+        int height3 = dm.heightPixels;
+
+        //组合动画
+        animatorSetsuofang = new AnimatorSet();
+        // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f);
+        ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", height3, flyphonerl.getY());
+
+        animatorSetsuofang.setDuration(650);
+        animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
+        animatorSetsuofang.play(scaleY);
+        animatorSetsuofang.start();
+        animatorSetsuofang.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        //flyphonerl.setVisibility(View.GONE);
+
+                        animatorSetsuofang.cancel();
+                        getFlyGoBack();
+                    }
+                }, 5000);
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+
+            }
+        });
+
+    }
+
+    private void getFlyGoBack() {
+        Resources resources = this.getResources();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+        int height3 = dm.heightPixels;
+
+        //组合动画
+        animatorSetsuofang2 = new AnimatorSet();
+        // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f);
+        ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", 0, height3);
+
+        animatorSetsuofang2.setDuration(1500);
+        animatorSetsuofang2.setInterpolator(new DecelerateInterpolator());
+        animatorSetsuofang2.play(scaleY);
+        animatorSetsuofang2.start();
+        animatorSetsuofang2.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+
+                flyphonerl.setVisibility(View.GONE);
+                animatorSetsuofang2.cancel();
+
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+
+            }
+        });
+    }
+
+    private void getAnimationSao() {
+        animation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
+        animation.setFillAfter(true);
+        animation.setDuration(2000);  //两秒转一圈
+        animation.setInterpolator(new LinearInterpolator());
+        animation.setRepeatCount(Animation.INFINITE);   //循环执行
+        imgreadline.startAnimation(animation);
+
+        int[] antenna = new int[]{R.id.reading_antenna1, R.id.reading_antenna2, R.id.reading_antenna3, R.id.reading_antenna4, R.id.reading_antenna5, R.id.reading_antenna6,
+                R.id.reading_antenna7, R.id.reading_antenna8, R.id.reading_antenna9};
+        int nfcWireIndex = 2;
+        try {
+            nfcWireIndex = Integer.parseInt(String.valueOf(SPUtils.get("PHONE_MODEL", "2")));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        alp = new AlphaAnimation(1, 0.2f);
+        alp.setStartOffset(500);
+        alp.setDuration(1000);
+        alp.setFillAfter(false);
+        alp.setInterpolator(new CycleInterpolator(2));
+        alp.setRepeatCount(Animation.INFINITE);
+        findViewById(antenna[nfcWireIndex - 1]).setAnimation(alp);
+        alp.start();
+    }
+
+    @OnClick({R.id.again_bt})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.again_bt:
+                startActivityFinish(QrCodeActivity.class);
+                break;
+        }
+    }
+
+    @Override
+    protected void initData() {
+        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
+    }
+
+    /**
+     * 读取NFC标签文本数据
+     */
+    private String readNfcTag(Intent intent) {
+        readingProgress.setProgress(0);
+        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
+            Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
+            NdefMessage msgs[] = null;
+            if (rawMsgs != null) {
+                msgs = new NdefMessage[rawMsgs.length];
+                for (int i = 0; i < rawMsgs.length; i++) {
+                    msgs[i] = (NdefMessage) rawMsgs[i];
+                }
+            }
+            try {
+                if (msgs != null) {
+                    NdefRecord record = msgs[0].getRecords()[0];
+                    return parseTextRecord(record);
+                }
+            } catch (Exception e) {
+            }
+        }
+        return null;
+    }
+
+    public String parseTextRecord(NdefRecord ndefRecord) {
+        if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
+            return null;
+        }
+        if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
+            return null;
+        }
+        try {
+            byte[] bArray = ndefRecord.getPayload();
+            StringBuffer sb = new StringBuffer(bArray.length);
+            String sTemp;
+            for (int i = 0; i < bArray.length; i++) {
+                sTemp = Integer.toHexString(0xFF & bArray[i]);
+                if (sTemp.length() < 2)
+                    sb.append(0);
+                sb.append(sTemp.toUpperCase());
+            }
+            return sb.toString();
+        } catch (Exception e) {
+            throw new IllegalArgumentException();
+        }
+    }
+
+    //记录ProgressBar的完成进度
+    private int status = 0;
+    private int hasDate = 0;
+    //创建一个负责更新进度的Handler
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            //表明消息是由该程序发送的
+            if (msg.what == 0x111) {
+                readpb.setProgress(status);
+                if (status == 100) {
+                    loadDiago.dismiss();
+                }
+            }
+        }
+    };
+
+    private boolean issao;  //设置一个flag 判断是否正在读取
+
+    @Override
+    public void onNewIntent(Intent intent) {
+        textRecord = readNfcTag(intent);
+        if (textRecord == null || textRecord.length() < chipNumberEndIndex) {
+            toast("读取失败");
+            return;
+        } else {
+            if (issao) {
+                //正在进行读取中  直接return 不做处理
+                return;
+            } else {
+                issao = true;  //开始读取
+
+                hasDate = 0;
+                status = 0;
+                soundPoolHelper.play("nuliduquzhong", false);
+
+                loadDiago = new BaseDialogFragment.Builder(this)
+                        .setContentView(R.layout.progressreader)
+                        .setAnimStyle(BaseDialog.AnimStyle.SCALE)
+                        //.setText(id, "我是预设置的文本")
+                        .addOnShowListener(new BaseDialog.OnShowListener() {
+                            @Override
+                            public void onShow(BaseDialog dialog) {
+                                //toast("Dialog  显示了");
+                            }
+                        })
+                        .addOnCancelListener(new BaseDialog.OnCancelListener() {
+                            @Override
+                            public void onCancel(BaseDialog dialog) {
+                                //toast("Dialog 取消了");
+                            }
+                        })
+                        .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                            @Override
+                            public void onDismiss(BaseDialog dialog) {
+                                //进度条走完 进行加载
+                                isWarning = false;
+                                chipNumber = textRecord.substring(6, chipNumberEndIndex);
+                                alarmDetection();
+                                uploadChip(false);
+                            }
+                        })
+                        .show();
+
+                readpb = loadDiago.findViewById(R.id.read_progress);
+                //启动线程来执行任务
+                new Thread() {
+                    @Override
+                    public void run() {
+                        super.run();
+                        while (status < 100) {
+                            //获取耗时操作的完成百分比
+                            status = doWork();
+                            //发送消息
+                            mHandler.sendEmptyMessage(0x111);
+                        }
+                    }
+                }.start();
+            }
+        }
+    }
+
+    //进行进度条加载
+    private int doWork() {
+        //为元素赋值
+        hasDate += 10;
+        try {
+            Thread.sleep(200);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return hasDate;
+    }
+
+    //判断是否报警
+    public void alarmDetection() {
+        try {
+            String binaryStr = ConversionUtil.hexToBins(textRecord.substring((3 + 40 + 1 + 4 + 8) * 2));
+            binaryStr = binaryStr.substring(4, binaryStr.length() - 8); //减去启用后的一小时和注射前的两小时
+            Log.e("温度二进制", binaryStr);
+            String binaryArr[] = new String[binaryStr.length() / 2];
+
+            for (int i = 0; i < binaryArr.length; i++) {
+                binaryArr[i] = String.valueOf(binaryStr.charAt(i * 2)) + binaryStr.charAt(i * 2 + 1);
+            }
+
+            LinkedList<Integer> exceedingIndexs = new LinkedList<Integer>();
+            exceedingIndexs.add(-1);
+            for (int i = 0; i < binaryArr.length; i++) {
+                if (!binaryArr[i].equals("01")) {
+                    if (i != 0 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i)) {
+                        exceedingIndexs.add(i);
+                    }
+                    if (i != binaryArr.length - 1 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i + 1)) {
+                        exceedingIndexs.add(i + 1);
+                    }
+                }
+            }
+            String type = chipNumber.substring(1, 2);
+            int category = Integer.parseInt(SPUtils.get("CATEGORY_TIMES_" + type, 48).toString());
+
+            if ((exceedingIndexs.size() - 1) / 2.f > category) {
+//                toast("报警");
+                isWarning = true;
+                //soundPoolHelper.play("xufuhe", false);
+                //warning();
+            } else {
+                isWarning = false;
+                //soundPoolHelper.play("zhengchang", false);
+            }
+            readingProgress.setProgress(100);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void uploadChip(boolean agin) {
+
+        if (textRecord != null && textRecord.length() > chipNumberEndIndex) {
+            if (SPUtils.contains("LOCATION")) {
+                Log.e("LOCATION", SPUtils.get("LOCATION", "").toString());
+                String location[] = SPUtils.get("LOCATION", "").toString().split(",");
+                if (location.length > 1) {
+                    Double latitude = Double.parseDouble(location[0]);
+                    Double longitude = Double.parseDouble(location[1]);
+                    String inoculators = (String) SPUtils.get("INOCULATOR_LIST", "");
+                    Log.e("chipNumber", chipNumber);
+                    Log.e("textRecord", textRecord);
+                    getPresenter().forDoctor(chipNumber, textRecord, inoculators, longitude, latitude, agin,isWarning);
+                    chipModel = new ChipModel(chipNumber, textRecord, inoculators, longitude, latitude);
+                } else {
+                    toast("位置信息错误");
+                }
+            } else {
+                toast("位置信息获取失败");
+            }
+        } else {
+            toast("芯片识别错误");
+        }
+
+        issao = false;  //读取结束
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN, sticky = false)
+    public void onEvent(ReadingErrorEvent event) {
+        if (event.getMsg().equals("芯片不存在")) {
+            soundPoolHelper.play("factory_operator_error", false);
+
+        }
+        //保存未提交信息
+        if (event.getMsg().indexOf("请检查您的网络状态") != -1) {
+            String user_id = (String) SPUtils.get("USER_ID", "");
+            if (!user_id.equals("")) {
+                ArrayList<ChipModel> chipModelList = (ArrayList<ChipModel>) SPUtils.get("CHIP_MODEL_LIST_" + user_id, new ArrayList<ChipModel>());
+                chipModelList.add(chipModel);
+                SPUtils.put("CHIP_MODEL_LIST_" + user_id, chipModelList);
+                SPUtils.remove("INOCULATOR_LIST");
+                finish();
+            }
+        }
+    }
+
+    @Override
+    public void uploadChipError(String msg) {
+        EventBus.getDefault().post(new ReadingErrorEvent(msg));
+        toast(msg);
+    }
+
+    @Override
+    public void uploadChipSuccess(VnDetailBean data) {
+        VnDetailBean.DataBean dataBean = data.getData();
+        if (!dataBean.isReviewed()) {
+            Intent in = new Intent(ReadingActivity.this, VnReportDetailForDoctorActivity.class);
+            in.putExtra("dataBean", dataBean);
+            in.putExtra("isWarning", isWarning);
+            in.putExtra("status", dataBean.getStatus());
+            startActivityFinish(in);
+        } else { //复核后再次使用
+            warning();
+        }
+    }
+
+
+    private void warning() {
+        new EvvmMsgDiago.Builder(this)
+                .setTitle("此疫苗已有超温记录,是否继续使用?") // 标题可以不用填写
+                .setConfirm("确定")
+                .setCancel("取消") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .setListener(new EvvmMsgDiago.OnListener() {
+                    @Override
+                    public void onConfirm(Dialog dialog) {
+                        uploadChip(true);
+                    }
+
+                    @Override
+                    public void onCancel(Dialog dialog) {
+                    }
+                })
+                .show();
+    }
+
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+    }
+
+    @Override
+    protected void onDestroy() {
+        animation.cancel();
+        alp.cancel();
+        mHandler.removeCallbacksAndMessages(null);
+        //  soundPoolHelper.release();
+        super.onDestroy();
+    }
+
+
+    @Override
+    public boolean isSupportSwipeBack() {
+        // 不使用侧滑功能
+        return false;
+    }
+
+}
+
+

+ 163 - 0
.svn/pristine/08/08993dcf3996f7c412aca4a6578bb47bb17b7418.svn-base

@@ -0,0 +1,163 @@
+<resources>
+    <string name="app_name">eVVM</string>
+
+    <!-- 提示 -->
+    <string name="hint_layout_no_data">亲,暂无数据</string>
+    <string name="hint_layout_error_request">亲,请求出错了</string>
+    <string name="hint_layout_error_network">亲,没有网络了</string>
+
+    <!-- 主页 -->
+    <string name="home_exit_hint">再按一次退出</string>
+    <string name="home_nav_index">首页</string>
+    <string name="home_nav_found">发现</string>
+    <string name="home_nav_message">消息</string>
+    <string name="home_nav_toreview">需复核</string>
+    <string name="home_nav_me">我的</string>
+
+    <!-- 登录 -->
+    <string name="login_register">注册账号</string>
+    <string name="login_phone_hint">请输入手机号</string>
+    <string name="login_password_hint">请输入密码</string>
+    <string name="login_forget">忘记密码</string>
+    <string name="login_text">登录</string>
+    <string name="login_phone">手机号</string>
+    <string name="login_pwd">密码</string>
+    <string name="login_other">其他登录方式</string>
+    <string name="login_code">验证码</string>
+    <!-- 注册 -->
+    <string name="register_next">下一步</string>
+    <string name="register_title">注册</string>
+    <string name="register_hint">手机号仅用于登录和保护账号安全</string>
+    <string name="register_login">登录</string>
+    <string name="login_password2">确认密码</string>
+    <string name="register_password_hint1">设置密码</string>
+    <string name="register_password_hint2">再次输入密码</string>
+    <string name="register_password_input_error">两次密码输入不一致,请重新输入</string>
+    <string name="tv_protocol">用户注册即代表同意《用户协议》</string>
+    <string name="tv_examine_protocol">已阅读并同意遵守《合作服务协议》</string>
+    <string name="login_dowload">下 载\n模 板</string>
+    <!-- 设置 -->
+    <string name="setting_title">设置</string>
+    <string name="setting_explain">使用说明</string>
+    <string name="setting_information">个人信息</string>
+    <string name="setting_language">语言切换</string>
+    <string name="setting_language_simple">简体中文</string>
+    <string name="setting_language_complex">繁体中文</string>
+
+    <string name="setting_update">检查更新</string>
+    <string name="setting_cache">清空缓存</string>
+    <string name="setting_auto">自动登录</string>
+    <string name="setting_agreement">隐私协议</string>
+    <string name="setting_aboutours">关于我们</string>
+    <string name="setting_about">关于</string>
+    <string name="setting_exitLogin">退出登录</string>
+    <string name="setting_exit">退出</string>
+    <!-- 关于 -->
+    <string name="about_title">关于我们</string>
+    <string name="about_copyright">Copyright © 2019</string>
+
+    <!-- 忘记密码 -->
+    <string name="password_forget_title">找回密码</string>
+
+    <!-- 重置密码 -->
+    <string name="password_reset_title">设置登录密码</string>
+    <string name="password_reset_phone_hint1">设置6&#8211;18位登录密码</string>
+    <string name="password_reset_phone_hint2">重新输入一次密码</string>
+    <string name="password_reset_input_error">两次密码输入不一致,请重新输入</string>
+
+    <!-- 接种者信息 -->
+    <string name="inoculation_title">受种者信息</string>
+    <string name="inoculation_submitted">提交</string>
+    <string name="inoculation_regist_title">受种者信息注册</string>
+
+    <!-- 实名认证 -->
+    <string name="authentication_title">实名认证</string>
+    <string name="authentication_company">单位名称</string>
+    <string name="authentication_company_hint">请选择单位</string>
+    <string name="authentication__post">职务/职称</string>
+    <string name="authentication__post_hint">请输入职务/职称</string>
+    <string name="authentication__license">执业证照</string>
+    <string name="authentication__prove">授权证明</string>
+    <string name="authentication__register">完成注册</string>
+
+    <!-- 个人喜好 -->
+    <string name="like_title">个人喜好</string>
+    <string name="like_title_genju">根据您的注册信息</string>
+    <string name="like_title_tuijian">我们推荐您使用以下功能(可多选)</string>
+
+    <!-- 升级对话框 -->
+    <string name="dialog_update_button">升级</string>
+
+    <string name="dialog_update_download_fail">启动下载失败</string>
+    <string name="dialog_update_permission_hint">必须先要授予权限才能正常下载更新哦</string>
+
+    <string name="dialog_update_status_running">下载中</string>
+    <string name="dialog_update_status_successful">立即安装</string>
+    <string name="dialog_update_status_failed">下载失败</string>
+    <string name="dialog_update_status_paused">暂停中</string>
+    <string name="dialog_update_status_pending">等待下载</string>
+
+    <!-- 分享对话框 -->
+    <string name="dialog_share_platform_wx">微信</string>
+    <string name="dialog_share_platform_wx_pyq">朋友圈</string>
+    <string name="dialog_share_platform_qq">QQ</string>
+    <string name="dialog_share_platform_qq_kj">QQ空间</string>
+
+    <!-- 校验手机号 -->
+    <string name="phone_verify_title">手机号验证</string>
+    <string name="phone_verify_current_phone">当前手机号:%s</string>
+
+    <!-- 修改手机号 -->
+    <string name="phone_reset_title">修改手机号</string>
+    <string name="phone_reset_change_hint">下次登录请使用更换后的新手机号登录</string>
+    <string name="phone_reset_commit">立即绑定</string>
+
+    <string name="phone_reset_commit_succeed">绑定成功,下次登录请使用新手机号登录</string>
+
+    <!-- 个人资料 -->
+    <string name="personal_data_title">个人资料</string>
+    <string name="personal_data_head">头像</string>
+
+    <string name="personal_data_id">用户ID</string>
+    <string name="personal_data_name">姓名</string>
+    <string name="personal_data_email">邮箱</string>
+    <string name="personal_data_name_hint">设置昵称</string>
+    <string name="personal_data_email_hint">设置邮箱</string>
+
+    <string name="personal_data_address">地区</string>
+    <string name="personal_data_address_hint">请选择</string>
+    <string name="personal_data_idnum">身份证号</string>
+    <string name="personal_data_idnum_hint">请输入身份证号</string>
+    <string name="personal_data_phone">手机号码</string>
+    <string name="personal_data_phone_hint">立即绑定</string>
+    <string name="personal_data_reset">修改</string>
+    <!-- 浏览器 -->
+    <string name="web_title">加载中&#8230;</string>
+
+    <!-- 医生端报告 -->
+    <string name="report_send">发送给家长</string>
+    <string name="report_next">下一个</string>
+    <string name="report_confirm">确认</string>
+    <string name="report_sendv">发送</string>
+    <string name="report_cancel">取消</string>
+    <string name="report_zhuishu">产品追溯报告</string>
+
+    <!-- 厂家管理员报告 -->
+    <string name="report_fuhe">复核</string>
+
+
+    <!--疫苗详情提示-->
+    <string name="vndeatil_tips">疫苗的运输、保存及使用过程均有严格的要求,
+        如果出现偏差将导致免疫失败,使疫苗不能发挥其应有的作用。
+        在整个运输、储存过程中,应有与经营规模和经营品种相适应的冷藏(冻)储存、运输设施及设备,
+        且应当在规定的时间内完成疫苗运输,并在有效期内使用,以保证疫苗的合理效价不受损害。
+        建议医生应当对所接种的疫苗进行严格的核查,确保疫苗质量安全后方可放心使用。</string>
+
+    <!--免责声明-->
+    <string name="vndeatil_disclaimer">本报告由中义(泰州)医药科技有限公司发布,
+        报告中所提供的信息仅供参考,不作为判定疫苗质量的依据。
+        本报告版权为中义(泰州)医药科技有限公司所有,未经书面许可,
+        任何机构和个人不得以任何形式翻版、复制和发布,且不得对本报告进行有悖原意的引用、删节和修改。
+        本公司将保留通过法律途径维护公司权益的一切权利。</string>
+
+</resources>

+ 136 - 0
.svn/pristine/08/08ae8e569ab2236b6c9e7d54c5fae34248c9b76b.svn-base

@@ -0,0 +1,136 @@
+package eVVM.apk.helper;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author leisurexi
+ * @Description 进制转换工具类
+ * @Date 2019/6/3 19:51
+ */
+public class ConversionUtil {
+
+    /**
+     * 十进制转换为二进制字符串
+     */
+    public static String decToBin(int number) {
+        return Integer.toBinaryString(number);
+    }
+
+    /**
+     * 二进制字符串转换为十进制数字
+     */
+    public static int binToDec(String number) {
+        return Integer.valueOf(number, 2);
+    }
+
+    /**
+     * 十进制转换为十六进制字符串
+     */
+    public static String decToHex(int number) {
+        return Integer.toHexString(number);
+    }
+
+    /**
+     * 十六进制字符串转十进制数字
+     */
+    public static int hexToDec(String number) {
+        return Integer.valueOf(number, 16);
+    }
+
+    /**
+     * 十六进字符串制转二进制字符串
+     * 这是单个转
+     */
+    public static String hexToBin(String number) {
+        Integer hex = Integer.valueOf(number, 16);
+        return Integer.toBinaryString(hex);
+    }
+
+    /**
+     * 16进制直接转换成为16进制的字符串(无需Unicode解码)
+     *
+     * @param hexStr 这是整个转
+     * @return
+     */
+    public static String hexStr2Str(String hexStr) {
+        hexStr = hexStr + " ";
+        hexStr = hexStr.replace("0x00 ", "");
+        hexStr = hexStr.substring(0, hexStr.length() - 1);
+
+        String str = "0123456789ABCDEF";
+        char[] hexs = hexStr.toCharArray();
+        byte[] bytes = new byte[hexStr.length() / 2];
+        int n;
+        for (int i = 0; i < bytes.length; i++) {
+            n = str.indexOf(hexs[2 * i]) * 16;
+            n += str.indexOf(hexs[2 * i + 1]);
+            bytes[i] = (byte) (n & 0xff);
+        }
+        return new String(bytes);
+    }
+
+
+    /**
+     * 十六进字符串制转二进制字符串
+     * 这是整个转
+     *
+     * @return 10100110000110000110000110000
+     */
+    public static String hexToBins(String hexStr) {
+        if (hexStr.length() < 1)
+            return null;
+        StringBuilder result = new StringBuilder();
+        for (int i = 0; i < hexStr.length() / 2; i++) {
+            String hex = String.valueOf(hexStr.charAt(i * 2)) + hexStr.charAt(i * 2 + 1);
+            String binStr = Integer.toBinaryString(Integer.valueOf(hex, 16));
+            String str = "";
+            int shao = 8 - binStr.length();
+            for (int k = 0; k < shao; k++) {
+                str = str + "0";
+            }
+            binStr = str + binStr;
+            result.append(binStr);
+//            Log.e("----",hex);
+//            Log.e("----",binStr);
+        }
+        return result.toString();
+    }
+
+    /**
+     * 16进制转ascii码
+     * 格式为 1430303030
+     */
+    public static String hexToAscii(String hex) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < hex.length() - 1; i += 2) {
+            String output = hex.substring(i, (i + 2));
+            int decimal = Integer.parseInt(output, 16);
+            char c = (char) decimal;
+            if (c < 48 || c > 57) {
+                continue;
+            }
+            sb.append(c);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 温度解密
+     */
+    public static List<String> temperatureDecry(String[] hexNumbers) {
+        String bins = "";
+//        for (int i = 0; i < hexNumbers.length; i++) {
+//            bins += hexToBin(hexNumbers[i]);
+//        }
+        List<String> result = new ArrayList<>(bins.length() / 2);
+        for (int i = 0; i < bins.length(); i++) {
+            if (i != 0 && i % 2 == 0) {
+                result.add(bins.substring(i - 1, i) + bins.substring(i, i + 1));
+            }
+        }
+        return result;
+    }
+
+} 

+ 162 - 0
.svn/pristine/09/09535e226ff509fbfe2f59cba85e3b64a2a32800.svn-base

@@ -0,0 +1,162 @@
+package eVVM.apk.app;
+
+import android.app.Application;
+import android.content.Context;
+import android.support.multidex.MultiDex;
+import android.util.Log;
+
+import com.allen.library.RxHttpUtils;
+import com.allen.library.config.OkHttpConfig;
+import com.allen.library.cookie.store.SPCookieStore;
+import com.allen.library.interfaces.BuildHeadersListener;
+import com.allen.rxhttputilslibrary.BuildConfig;
+import com.hjq.image.ImageLoader;
+import com.hjq.toast.ToastUtils;
+
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+
+import cn.bingoogolapple.swipebacklayout.BGASwipeBackHelper;
+import cn.jpush.android.api.JPushInterface;
+import eVVM.apk.api.ApiUrl;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.other.EventBusManager;
+import okhttp3.OkHttpClient;
+
+public class MyApplication extends Application {
+
+    private static Application app = null;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        app = this;
+        initSDK(this);
+    }
+
+
+    /**
+     * 初始化一些第三方框架
+     */
+    public static void initSDK(Application application) {
+
+
+        /**
+         * 必须在 Application 的 onCreate 方法中执行 BGASwipeBackHelper.init 来初始化滑动返回
+         * 第一个参数:应用程序上下文
+         * 第二个参数:如果发现滑动返回后立即触摸界面时应用崩溃,请把该界面里比较特殊的 View 的 class 添加到该集合中,目前在库中已经添加了 WebView 和 SurfaceView
+         */
+        BGASwipeBackHelper.init(application, null);
+
+        // 初始化吐司工具类
+        ToastUtils.init(application);
+
+        // 初始化图片加载器
+        ImageLoader.init(application);
+
+        SPUtils.getInstance().init(application);
+
+        // 初始化 EventBus
+        EventBusManager.init();
+
+        // 初始化友盟 SDK
+        // UmengClient.init(application);
+
+
+        //初始化网络请求框架 RxHttpUtils :rxjava2+retrofit+okhttp3组合封装
+
+
+
+        OkHttpClient okHttpClient = new OkHttpConfig
+                .Builder(application)
+                //全局的请求头信息
+                   .setHeaders(new BuildHeadersListener() {
+                       @Override
+                       public Map<String, String> buildHeaders() {
+                           String user_token = (String) SPUtils.get("USER_TOKEN", "");
+                           HashMap<String, String> hashMap = new HashMap<>();
+                           /*hashMap.put("appVersion", BuildConfig.VERSION_NAME);
+                           hashMap.put("client", "android");
+                           hashMap.put("channelId", "channelId");//渠道
+                           hashMap.put("networkType", "networkType");//网络类型
+                           hashMap.put("platform", "platform");//平台
+                           hashMap.put("sysVersion", "sysVersion");//系统版本号
+                           hashMap.put("device", "device");//设备信息
+                           hashMap.put("screen", "screen");//屏幕大小
+                           hashMap.put("uuid", "uuid");//设备唯一码
+                           hashMap.put("version", "version");//app版本
+                           hashMap.put("apiVersion", "apiVersion");//api版本*/
+                           hashMap.put("Authorization", "Bearer"+user_token);
+                           //hashMap.put("other_header", URLEncoder.encode("中文需要转码"));
+                           return hashMap;
+                       }
+                   })
+                //开启缓存策略(默认false)
+                //1、在有网络的时候,先去读缓存,缓存时间到了,再去访问网络获取数据;
+                //2、在没有网络的时候,去读缓存中的数据。
+                .setCache(true)
+                .setHasNetCacheTime(10)//默认有网络时候缓存60秒
+                .setNoNetCacheTime(3600)//默认有网络时候缓存3600秒
+                //全局持久话cookie,保存到内存(new MemoryCookieStore())或者保存到本地(new SPCookieStore(this))
+                //不设置的话,默认不对cookie做处理
+                .setCookieType(new SPCookieStore(application))
+                //可以添加自己的拦截器(比如使用自己熟悉三方的缓存库等等)
+                //.setAddInterceptor(null)
+                //全局ssl证书认证
+                //1、信任所有证书,不安全有风险(默认信任所有证书)
+                //.setSslSocketFactory()
+                //2、使用预埋证书,校验服务端证书(自签名证书)
+                //.setSslSocketFactory(cerInputStream)
+                //3、使用bks证书和密码管理客户端证书(双向认证),使用预埋证书,校验服务端证书(自签名证书)
+                //.setSslSocketFactory(bksInputStream,"123456",cerInputStream)
+                //全局超时配置
+                .setReadTimeout(10)
+                //全局超时配置
+                .setWriteTimeout(10)
+                //全局超时配置
+                .setConnectTimeout(10)
+                //全局是否打开请求log日志
+                .setDebug(true)
+                .build();
+
+       /* //一个项目多url的配置方法(这种写法的前提是事先已经知道所有的baseUrl了)
+        RxUrlManager.getInstance().setMultipleUrl(urlMap);
+        //如果是动态从服务器获取的baseUrl的话也可以添加进来
+       // key是对url做区分使用,value就是服务器下发的baseUrl(baseUrl必须以"xxx/"斜杠结尾,retrofit的要求)
+        RxUrlManager.getInstance().addUrl("urlKey", "urlValue");
+*/
+
+        RxHttpUtils
+                .getInstance()
+                .init(application)
+                .config()
+                //使用自定义factory的用法
+                //.setCallAdapterFactory(RxJava2CallAdapterFactory.create())
+                //.setConverterFactory(ScalarsConverterFactory.create(),GsonConverterFactory.create(GsonAdapter.buildGson()))
+                //配置全局baseUrl
+                .setBaseUrl(ApiUrl.BASE_URL)
+                //开启全局配置
+                .setOkClient(okHttpClient);
+
+
+        JPushInterface.setDebugMode(true);
+        JPushInterface.init(application);
+    }
+
+    /**
+     * 获取Application的Context
+     **/
+    public static Context getAppContext() {
+        if (app == null)
+            return null;
+        return app.getApplicationContext();
+    }
+
+    @Override
+    protected void attachBaseContext(Context base) {
+        super.attachBaseContext(base);
+        // 使用 Dex分包
+        MultiDex.install(this);
+    }
+}

+ 21 - 0
.svn/pristine/09/09712df68144a94e71d42209d6c523ece7f3bb30.svn-base

@@ -0,0 +1,21 @@
+package eVVM.apk.ui.login.findpwd;
+
+import eVVM.apk.ui.bean.VerificationCodeBean;
+
+/**
+ * Created by Android Studio.
+ * User:  zbb
+ * Date: 2019/6/1
+ * Describe: FindpwdOnListener
+ */
+public interface FindpwdOnListener {
+
+    void onSucceed(VerificationCodeBean data);
+
+    void onFail(String msg);
+
+    void onCodeSucceed(VerificationCodeBean codeData);
+
+    void onCodeFail(String msg);
+
+}

+ 88 - 0
.svn/pristine/09/09b50d15af2cbbdaeb093afc52d9376fd35c7a13.svn-base

@@ -0,0 +1,88 @@
+package eVVM.apk.ui.toreview.no;
+
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.Unbinder;
+import eVVM.apk.R;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.mvp.MvpLazyFragment;
+import eVVM.apk.ui.toreview.adapter.NoToreAdapter;
+import eVVM.apk.ui.toreview.bean.ToreviewBean;
+
+public class NoToreviewFragment extends MvpLazyFragment<NoTorePresenter> implements NoToreContract.View {
+
+    @BindView(R.id.notore_rv)
+    RecyclerView notoreRv;
+
+    private int page = 1;
+    private int size = 20;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.notore_fragment;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return 0;
+    }
+
+    @Override
+    protected void initView() {
+
+    }
+
+    @Override
+    protected void initData() {
+        String user_roleId = (String) SPUtils.get( "USER_ID", "");
+        getPresenter().getNoList(page,size,user_roleId);
+    }
+
+    @Override
+    protected NoTorePresenter createPresenter() {
+        return new NoTorePresenter();
+    }
+
+    @Override
+    public void onNoToreError(String msg) {
+        toast(msg);
+    }
+
+    @Override
+    public void onNoToreSuccess(List<ToreviewBean.DataBean> list) {
+        //toast(list.toString());
+        NoToreAdapter noToreAdapter = new NoToreAdapter(R.layout.notoreviewlist,list);
+        notoreRv.setAdapter(noToreAdapter);
+        notoreRv.setLayoutManager(new LinearLayoutManager(getBindingActivity()));
+    }
+
+    @Override
+    public void onLoading() {
+
+    }
+
+    @Override
+    public void onComplete() {
+
+    }
+
+    @Override
+    public void onEmpty() {
+
+    }
+
+    @Override
+    public void onError() {
+
+    }
+
+}

+ 225 - 0
.svn/pristine/09/09ce692a84bd6fdc00abccec2625a1787e33836e.svn-base

@@ -0,0 +1,225 @@
+package eVVM.apk.ui.login;
+
+import android.content.Intent;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.hjq.permissions.OnPermission;
+import com.hjq.permissions.Permission;
+import com.hjq.permissions.XXPermissions;
+import com.hjq.widget.ClearEditText;
+
+
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.InputTextHelper;
+import eVVM.apk.helper.MD5;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.My.ExamineActivity;
+import eVVM.apk.ui.bean.LoginBean;
+import eVVM.apk.ui.home.FactorAdminActivity;
+import eVVM.apk.ui.home.FactoryOperatorActivity;
+import eVVM.apk.ui.home.HomeActivity;
+import eVVM.apk.ui.launcher.LikeActivity;
+import eVVM.apk.ui.login.login.LoginContract;
+import eVVM.apk.ui.login.login.LoginPresenter;
+
+public class LoginActivity extends MvpActivity<LoginPresenter> implements LoginContract.View {
+
+
+    @BindView(R.id.login_et_phone)
+    ClearEditText loginEtPhone;
+    @BindView(R.id.login_et_pwd)
+    ClearEditText loginEtPwd;  //密码输入框
+    @BindView(R.id.login_tv_forgetpwd)
+    TextView loginTvForgetpwd;  //忘记密码
+    @BindView(R.id.login_btn_login)
+    Button loginBtnLogin;     //登录
+    @BindView(R.id.login_tv_goregist)
+    TextView loginTvGoregist;  //去注册
+    private String getMD5Pwd;
+    private String userPhone;
+
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_login;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return 0;
+    }
+
+    @Override
+    protected void initView() {
+        new InputTextHelper.Builder(this)
+                .setMain(loginBtnLogin)
+                .addView(loginEtPhone)
+                .addView(loginEtPwd)
+                .build();
+    }
+
+    @Override
+    protected void initData() {
+        getPermissions();
+        String user_phone = (String) SPUtils.get("USER_PHONE", "");
+        String user_pwd = (String) SPUtils.get("USER_PWD", "");
+        if (TextUtils.isEmpty(user_phone) && TextUtils.isEmpty(user_pwd)) {
+            //用户没有登录过
+        } else {
+//            if (!checkGpsAndNfc()) {
+//                return;
+//            }
+            showLoading();
+            //登陆过 进行自动登录
+            userPhone = user_phone;
+            getMD5Pwd = user_pwd;
+            getPresenter().login(user_phone, user_pwd);
+        }
+    }
+
+    private void getPermissions() {
+        // 联系人
+        String[] CONTACTS = new String[]{
+                Permission.CAMERA,
+                Permission.RECEIVE_SMS,
+                Permission.READ_SMS,
+                Permission.READ_EXTERNAL_STORAGE,
+                Permission.WRITE_EXTERNAL_STORAGE,
+                Permission.ACCESS_FINE_LOCATION,
+                Permission.ACCESS_COARSE_LOCATION,
+                Permission.REQUEST_INSTALL_PACKAGES};
+
+        XXPermissions.with(LoginActivity.this)
+                //.constantRequest() //可设置被拒绝后继续申请,直到用户授权或者永久拒绝
+                //.permission(Permission.SYSTEM_ALERT_WINDOW, Permission.REQUEST_INSTALL_PACKAGES) //支持请求6.0悬浮窗权限8.0请求安装权限
+                .permission(CONTACTS) //不指定权限则自动获取清单中的危险权限
+                .request(new OnPermission() {
+
+                    @Override
+                    public void hasPermission(List<String> granted, boolean isAll) {
+                        /*if (isAll) {
+                            toast("获取权限成功");
+                        }else {
+                            toast("获取权限成功,部分权限未正常授予");
+                        }*/
+                    }
+
+                    @Override
+                    public void noPermission(List<String> denied, boolean quick) {
+                        /*if(quick) {
+                            toast("被永久拒绝授权,请手动授予权限");
+                            //如果是被永久拒绝就跳转到应用权限系统设置页面
+                            XXPermissions.gotoPermissionSettings(LoginActivity.this);
+                        }else {
+                            //toast("获取权限失败,部分功能可能无法使用");
+                        }*/
+
+                    }
+                });
+    }
+
+    @OnClick({R.id.login_tv_forgetpwd, R.id.login_btn_login, R.id.login_tv_goregist})
+    public void onViewClicked(View view) {
+//        if (!checkGpsAndNfc()) {
+//            return;
+//        }
+        switch (view.getId()) {
+            case R.id.login_tv_forgetpwd:
+                startActivity(PasswordForgetActivity.class);
+                break;
+            case R.id.login_btn_login:
+                if (loginEtPhone.getText().toString().length() != 11) {
+                    toast(getString(R.string.common_phone_input_error));
+                } else {
+                    //登录 密码进行md5加密
+                    getMD5Pwd = MD5.GetMD5Code(loginEtPwd.getText().toString().trim());
+                    userPhone = loginEtPhone.getText().toString().trim();
+                    getPresenter().login(userPhone, getMD5Pwd);
+                    showLoading();
+                }
+                break;
+            case R.id.login_tv_goregist:
+                startActivity(RegisterActivity.class);
+                break;
+        }
+    }
+
+    @Override
+    protected LoginPresenter createPresenter() {
+        return new LoginPresenter();
+    }
+
+    @Override
+    public void loginError(String msg) {
+        showComplete();
+        toast(msg);
+    }
+
+    @Override
+    public void loginSuccess(LoginBean data) {
+
+        // 处理登录
+        showComplete();
+        LoginBean.DataBean userData = data.getData();
+        SPUtils.put("USER_ID", userData.getId() + "");
+        SPUtils.put("USER_TOKEN", userData.getToken() + "");
+
+        if (userData.getStatus() == 1) {//状态(0禁用 1正常 2删除 3未审核 4审核未通过 5未完成注册 6未同意协议)
+
+            Log.e("userData", "" + userData.getPassword());
+            //保存用户数据
+            SPUtils.put("USER_PHONE", userPhone + "");
+            SPUtils.put("USER_PWD", getMD5Pwd + "");
+            SPUtils.put("USER_ROLEID", userData.getRoleId() + "");
+            SPUtils.put("USER_FACTORY_ID", userData.getFactoryId() + "");
+            SPUtils.put("USER_NAME", userData.getUserName() + "");
+            SPUtils.put("PHONE_MODEL", userData.getPhoneModel());
+            SPUtils.put("USER_EMAIL", userData.getEmail());
+            SPUtils.put("USER_CALLNUM", userData.getTelephone());
+
+            switch (userData.getRoleId()) {   //根据不同角色 跳转进入不同的页面
+                case 2: //医生
+                    startActivityFinish(HomeActivity.class);
+                    break;
+                case 3: //医药企业管理员
+                    startActivityFinish(FactorAdminActivity.class);
+                    break;
+                case 4: //医药企业操作员
+                    startActivityFinish(FactoryOperatorActivity.class);
+                    break;
+            }
+        } else if (userData.getStatus() == 0) {
+            toast("当前账号已被禁用");
+        } else if (userData.getStatus() == 2) {
+            toast("当前账号已被删除");
+        } else if (userData.getStatus() == 3) {
+            Intent in= new Intent(this,ExamineActivity.class);
+            in.putExtra("LoginStatusCode",3);
+            startActivity(in);
+            //toast("您的账号正在审核中,请耐心等待");
+        } else if (userData.getStatus() == 4) {
+            Intent in= new Intent(this,ExamineActivity.class);
+            in.putExtra("LoginStatusCode",4);
+            startActivity(in);
+            //toast("审核未通过");
+        } else if (userData.getStatus() == 5) {
+//            toast("未完成注册");
+            Intent in = new Intent(this,AuthenticationActivity.class);
+            in.putExtra("registerUserId",data.getData().getId()+"");
+            startActivity(in);
+        } else if (userData.getStatus() == 6) {
+            Intent in= new Intent(this,ExamineActivity.class);
+            in.putExtra("LoginStatusCode",6);
+            startActivity(in);
+        }
+    }
+}

+ 98 - 0
.svn/pristine/0a/0a082b4e89625967817454b2a1d2f4b75e47229f.svn-base

@@ -0,0 +1,98 @@
+package eVVM.apk.ui.home.uploadChip;
+
+import com.allen.library.RxHttpUtils;
+import com.allen.library.interceptor.Transformer;
+import com.allen.library.observer.CommonObserver;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import eVVM.apk.api.ApiService;
+ import eVVM.apk.helper.HexUtil;
+ import eVVM.apk.mvp.MvpModel;
+ import eVVM.apk.ui.bean.UploadChipBean;
+
+/**
+ * Created by Android Studio.
+ * User:  zbb
+ * Date: 2019/6/1
+ * Describe: UploadChipModel
+ */
+public class UploadChipModel extends MvpModel<UploadChipOnListener> {
+
+    public UploadChipModel() {
+
+    }
+
+
+    public void forFactoryOperator(String chipNumber, String cipherText,double longitude,double latitude) {
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("chipNumber", chipNumber);
+        map.put("longitude", longitude );
+        map.put("latitude", latitude );
+        map.put("cipherText", HexUtil.toHexStr(cipherText));
+
+        RxHttpUtils.createApi(ApiService.class)
+                .saveChip(map)
+                .compose(Transformer.<UploadChipBean>switchSchedulers())
+                .subscribe(new CommonObserver<UploadChipBean>() {
+                    @Override
+                    protected void onError(String errorMsg) {
+                        getListener().onFail(errorMsg);
+                    }
+
+                    @Override
+                    protected void onSuccess(UploadChipBean data) {
+                        if (data.getCode() == 200){
+                            getListener().onSucceed(data);
+                        }else {
+                            getListener().onFail(data.getMsg());
+                        }
+
+                    }
+
+                    @Override
+                    protected boolean isHideToast() {
+                        return true;
+                    }
+                });
+
+    }
+
+    public void forDoctor(String chipNumber, String cipherText,double longitude,double latitude) {
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("chipNumber", chipNumber);
+        map.put("longitude", longitude );
+        map.put("latitude", latitude );
+        map.put("cipherText", HexUtil.toHexStr(cipherText));
+
+        RxHttpUtils.createApi(ApiService.class)
+                .saveChip(map)
+                .compose(Transformer.<UploadChipBean>switchSchedulers())
+                .subscribe(new CommonObserver<UploadChipBean>() {
+                    @Override
+                    protected void onError(String errorMsg) {
+                        getListener().onFail(errorMsg);
+                    }
+
+                    @Override
+                    protected void onSuccess(UploadChipBean data) {
+                        if (data.getCode() == 200){
+                            getListener().onSucceed(data);
+                        }else {
+                            getListener().onFail(data.getMsg());
+                        }
+
+                    }
+
+                    @Override
+                    protected boolean isHideToast() {
+                        return true;
+                    }
+                });
+
+    }
+
+}

BIN
.svn/pristine/0a/0a0901dfe3e836f8a08edf90cc91708007a796f1.svn-base


BIN
.svn/pristine/0a/0a09a2084e6659ac2a268d3815b7bafd389ae502.svn-base


+ 46 - 0
.svn/pristine/0a/0ad3d9e860fd4436a94d02a548fc50226497447a.svn-base

@@ -0,0 +1,46 @@
+package eVVM.apk.api;
+
+import java.util.Map;
+
+import eVVM.apk.ui.bean.LoginBean;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+import eVVM.apk.ui.toreview.bean.ToreviewBean;
+import io.reactivex.Observable;
+import retrofit2.http.GET;
+import retrofit2.http.POST;
+import retrofit2.http.QueryMap;
+
+/**
+ * Created by Android Studio.
+ * User:  zbb
+ * Date: 2019/6/1
+ * Describe: ApiService
+ */
+public interface ApiService {
+
+    /**
+     * get 请求,参数以map的形式传入
+     *
+     * @param map
+     * @return
+     */
+    @GET(ApiUrl.ARTICLE_LIST) //测试的  没有作用
+    Observable<ToreviewBean> getceshi(@QueryMap Map<String, String> map);
+
+
+    //登录
+    @POST(ApiUrl.ARTICLE_LIST+"login")
+    Observable<LoginBean> login(@QueryMap Map<String, String> map);
+
+    //注册
+    @POST(ApiUrl.ARTICLE_LIST+"register")
+    Observable<VerificationCodeBean> register(@QueryMap Map<String, String> map);
+
+    //获取验证码
+    @POST(ApiUrl.ARTICLE_LIST+"sendVerificationCodeByPhone")
+    Observable<VerificationCodeBean> getCode(@QueryMap Map<String, String> map);
+
+    //找回密码
+    @POST(ApiUrl.ARTICLE_LIST+"updatePasswordByTelephone")
+    Observable<VerificationCodeBean> findpwd(@QueryMap Map<String, String> map);
+}

+ 84 - 0
.svn/pristine/0a/0adb0c48f7ec808f541b6c6aa97135deeff36f94.svn-base

@@ -0,0 +1,84 @@
+package eVVM.apk.ui.My;
+
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.common.MyLazyFragment;
+import eVVM.apk.helper.ActivityStackManager;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.ui.bean.LoginBean;
+import eVVM.apk.ui.home.HomeActivity;
+import eVVM.apk.ui.login.AuthenticationActivity;
+import eVVM.apk.ui.login.LoginActivity;
+
+public class MyFragment extends MyLazyFragment<HomeActivity> {
+
+    @BindView(R.id.my_img_head)
+    ImageView myImgHead;
+    @BindView(R.id.my_tv_name)
+    TextView myTvName;
+
+    public static MyFragment newInstance() {
+        return new MyFragment();
+    }
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.my_fragment;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return 0;
+    }
+
+    @Override
+    protected void initView() {
+
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+    @Override
+    public boolean isStatusBarEnabled() {
+        // 使用沉浸式状态栏
+        return !super.isStatusBarEnabled();
+    }
+
+
+    @OnClick({R.id.my_img_head, R.id.my_sb_information, R.id.sb_setting_explain, R.id.sb_setting_about, R.id.my_btn_exit})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.my_img_head:
+                //点击头像
+                break;
+            case R.id.my_sb_information:
+                //个人信息
+                startActivity(InformationActivity.class);
+                break;
+            case R.id.sb_setting_explain:
+                //说明
+                startActivity(AuthenticationActivity.class);
+                break;
+            case R.id.sb_setting_about:
+                //关于
+                startActivity(AboutActivity.class);
+                break;
+            case R.id.my_btn_exit:
+
+                //退出的操作
+                startActivity(LoginActivity.class);
+                SPUtils.clear(getBindingActivity());
+                // 进行内存优化,销毁掉所有的界面
+                ActivityStackManager.getInstance().finishAllActivities(LoginActivity.class);
+                break;
+        }
+    }
+}

+ 170 - 0
.svn/pristine/0b/0b054ed482dfb15497256bf5a154f6c3f59533cc.svn-base

@@ -0,0 +1,170 @@
+package eVVM.apk.helper;
+
+
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.Toast;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.UUID;
+
+/**
+ * Created by vimi8 on 2017/6/9.
+ */
+
+public class ImgDonwloads {
+
+    private static String filePath;
+    private static Bitmap mBitmap;
+    private static String mFileName = "sshs";
+    private static String mSaveMessage;
+    private final static String TAG = "ImageActivity";
+    private static Context context;
+
+    private static ProgressDialog mSaveDialog = null;
+
+    public static void donwloadImg(Context contexts, String filePaths) {
+        context = contexts;
+        filePath = filePaths;
+        mSaveDialog = ProgressDialog.show(context, "保存图片", "图片正在保存中,请稍等...", true);
+
+        new Thread(saveFileRunnable).start();
+    }
+
+    private static Runnable saveFileRunnable = new Runnable() {
+        @Override
+        public void run() {
+            try {
+//                mBitmap = BitmapFactory.decodeStream(getImageStream(filePath));
+                if (!TextUtils.isEmpty(filePath)) {                 //网络图片
+                    //对资源链接
+                    URL url = new URL(filePath);
+                    //打开输入流
+                    InputStream inputStream = url.openStream();
+                    //对网上资源进行下载转换位图图片
+                    mBitmap = BitmapFactory.decodeStream(inputStream);
+                    inputStream.close();
+                }
+
+//                Bitmap bmp = BitmapFactory.decodeResource(context.getResources(),R.drawable.bg_guid_1 );   //本地的图片,根据自己情况
+                saveFile(mBitmap);
+//                saveFile(bmp);
+                mSaveMessage = "图片已保存到相册";
+            } catch (IOException e) {
+                mSaveMessage = "图片保存失败!";
+                e.printStackTrace();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            messageHandler.sendMessage(messageHandler.obtainMessage());
+        }
+    };
+    private static Handler messageHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            mSaveDialog.dismiss();
+            Log.d(TAG, mSaveMessage);
+            Toast.makeText(context, mSaveMessage, Toast.LENGTH_SHORT).show();
+        }
+    };
+
+
+    /**
+     * Get image from newwork
+     *
+     * @param path The path of image
+     * @return InputStream
+     * @throws Exception
+     */
+    public static InputStream getImageStream(String path) throws Exception {
+        URL url = new URL(path);
+        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+        conn.setConnectTimeout(5 * 1000);
+        conn.setRequestMethod("GET");
+        if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
+            return conn.getInputStream();
+        }
+        return null;
+    }
+
+    /**
+     * 保存文件
+     *
+     * @param bm
+     * @param fileName
+     * @throws IOException
+     */
+    public static void saveFile(Bitmap bm, String fileName) throws IOException {
+        File dirFile = new File(Environment.getExternalStorageDirectory().getPath());
+        if (!dirFile.exists()) {
+            dirFile.mkdir();
+        }
+        fileName = UUID.randomUUID().toString() + ".jpg";
+        File myCaptureFile = new File(Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/" + fileName);
+        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
+        bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
+        bos.flush();
+        bos.close();
+
+        //把图片保存后声明这个广播事件通知系统相册有新图片到来
+        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
+        Uri uri = Uri.fromFile(myCaptureFile);
+        intent.setData(uri);
+        context.sendBroadcast(intent);
+    }
+
+    /**
+     * 保存图片到图库
+     *
+     * @param bmp
+     */
+    public static void saveFile(Bitmap bmp) {
+        // 首先保存图片
+        File appDir = new File(Environment.getExternalStorageDirectory(),
+                "sshs");
+        if (!appDir.exists()) {
+            appDir.mkdir();
+        }
+        String fileName = System.currentTimeMillis() + "authImage" + ".jpg";
+        File file = new File(appDir, fileName);
+        try {
+            FileOutputStream fos = new FileOutputStream(file);
+            bmp.compress(Bitmap.CompressFormat.JPEG, 80, fos);
+            fos.flush();
+            fos.close();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+
+            e.printStackTrace();
+        }
+
+        // 其次把文件插入到系统图库
+        /*       try {*/
+           /* MediaStore.Images.Media.insertImage(context.getContentResolver(),
+                    bmp, fileName, null);
+            file.delete();*/
+       /* } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }*/
+        // 最后通知图库更新
+        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
+                Uri.fromFile(new File(file.getPath()))));
+    }
+}

+ 550 - 0
.svn/pristine/0b/0b0560ae98525a0aba3ff84c9db99a3fec6185ca.svn-base

@@ -0,0 +1,550 @@
+package eVVM.apk.ui.vaccination;
+
+import android.app.Dialog;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Handler;
+import android.os.Message;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.google.gson.Gson;
+import com.hjq.base.BaseDialog;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.db.nrcreportdb.NRCReportDaoOpe;
+import eVVM.apk.entity.NRCReportEntity;
+import eVVM.apk.helper.MyClickListener;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.helper.SoundPoolHelper;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.bean.ModelListBean;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+import eVVM.apk.ui.bean.VnDetailBean;
+import eVVM.apk.ui.report.vndetail.VnDetailContract;
+import eVVM.apk.ui.report.vndetail.VnDetailPresenter;
+import eVVM.apk.ui.webview.WebActivity;
+import eVVM.apk.widget.EvvmMsgDiago;
+import eVVM.apk.widget.ZoomView;
+
+public class VnReportDetailForNctActivity extends MvpActivity<VnDetailPresenter> implements VnDetailContract.View, MyClickListener.MyClickCallBack {
+
+
+    private boolean isWarning = true;
+    private VnDetailBean.DataBean chipModel = null;
+    private SoundPoolHelper soundPoolHelper;
+
+    @BindView(R.id.vndetail_tv_typemsg)
+    TextView vndetailTvTypemsg;
+    @BindView(R.id.vndetail_tv_vncode)
+    TextView vndetailTvVncode;
+    @BindView(R.id.vndetail_tv_vndate)
+    TextView vndetailTvVndate;
+    @BindView(R.id.vndetail_tv_factoryName)
+    TextView vndetailTvFactoryName;
+    @BindView(R.id.vndetail_tv_gmpName)
+    TextView vndetailTvGmpName;
+    @BindView(R.id.vndetail_tv_gmpPath)
+    TextView vndetailTvGmpPath;
+    @BindView(R.id.vndetail_tv_hospitalName)
+    TextView vndetailTvHospitalName;
+    @BindView(R.id.vndetail_tv_doctorName)
+    TextView vndetailTvDoctorName;
+    @BindView(R.id.vndetail_tv_doctorTelephone)
+    TextView vndetailTvDoctorTelephone;
+    @BindView(R.id.vndetail_tv_chatImage)
+    ImageView vndetailTvChatImage;
+    @BindView(R.id.vndetail_tv_othervn1)
+    TextView vndetailTvOthervn1;
+    @BindView(R.id.vndetail_tv_othervn2)
+    TextView vndetailTvOthervn2;
+    @BindView(R.id.vndetail_tv_othervn3)
+    TextView vndetailTvOthervn3;
+    @BindView(R.id.vndetail_iv_tipsimg)
+    ImageView vndetailIvTipsimg;
+    @BindView(R.id.vndetail_tv_tips)
+    TextView vndetailTvTips;
+    @BindView(R.id.vndetail_tv_disclaimer)
+    TextView vndetailTvDisclaimer;
+    @BindView(R.id.zv_report)
+    ZoomView myzoomview;
+    @BindView(R.id.vndetail_tv_chatImage_title)
+    TextView vndetail_tv_chatImage_title;
+    @BindView(R.id.coverview)
+    TextView coverview;
+    @BindView(R.id.next_btn_report)
+    Button nextbtn;
+    private int status;
+
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_vn_report_detail_for_nct;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.tb_vndetail_title;
+    }
+
+    @Override
+    protected void initView() {
+        myzoomview.setOnTouchListener(new MyClickListener(this));
+        soundPoolHelper = new SoundPoolHelper(4, SoundPoolHelper.TYPE_MUSIC)
+                .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC)
+                .loadDefault(VnReportDetailForNctActivity.this)
+                .load(VnReportDetailForNctActivity.this, "rewarning", R.raw.rewarning)
+                .load(VnReportDetailForNctActivity.this, "renormal", R.raw.renormal);
+
+
+        List<NRCReportEntity> nrcReportEntities = NRCReportDaoOpe.queryAll(this);
+        Log.e("nrcReportEntities", "" + nrcReportEntities.size() + " " + nrcReportEntities.toString());
+        if (nrcReportEntities.size() == 1) {
+            nextbtn.setText("退出");
+        } else {
+            nextbtn.setText("下一个");
+        }
+    }
+
+    @Override
+    public void onLeftClick(View v) {
+        super.onLeftClick(v);
+        /*if (isWarning) {
+            if (status == 6 || status == 7 || status == 8) {
+
+            } else {
+                startActivityFinish(ReadingActivity.class);
+            }
+        }*/
+        NRCReportDaoOpe.deleteAllData(this);
+        finish();
+    }
+
+    @OnClick({R.id.next_btn_report, R.id.vndetail_bt_magnifier})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.next_btn_report:
+
+                nextorexit();
+               /* if (status == 4) {
+                    startActivityFinish(ReadingActivity.class);
+                } else {
+                    if (status == 6 || status == 7 || status == 8) {
+                        startActivityFinish(HomeActivity.class);
+                    }
+                }*/
+
+                break;
+            case R.id.vndetail_bt_magnifier:
+                //放大
+                myzoomview.magnifier();
+                break;
+        }
+    }
+
+    private void nextorexit() {
+        List<NRCReportEntity> nrcReportEntities = NRCReportDaoOpe.queryAll(this);
+        NRCReportDaoOpe.deleteData(this, nrcReportEntities.get(0));
+
+        if (nrcReportEntities.size() == 1) {
+            //nextbtn.setText("退出");
+            finish();
+        } else {
+            VnDetailBean vnDetailBean = new Gson().fromJson(nrcReportEntities.get(1).getVnDetailBean(), VnDetailBean.class);
+            Intent in = new Intent(getActivity(), VnReportDetailForNctActivity.class);
+            in.putExtra("dataBean", vnDetailBean.getData());
+            in.putExtra("isWarning", nrcReportEntities.get(1).getIsWarning());
+            in.putExtra("status", vnDetailBean.getData().getStatus());
+            finish();
+            startActivity(in);
+        }
+    }
+
+    private Handler warninghandler = new Handler() {
+        public void handlerMessage(Message msg) {
+        }
+    };
+    private Handler normalhandler = new Handler() {
+        public void handlerMessage(Message msg) {
+        }
+    };
+
+    private Runnable warningRunnable = new Runnable() {
+        @Override
+        public void run() {
+            //用户2秒没操作了
+            Log.e("DoctorVnReportActivity", "两秒未操作");
+            // startActivityFinish(ReadingActivity.class);
+            nextorexit();
+        }
+    };
+    private Runnable normalRunnable = new Runnable() {
+        @Override
+        public void run() {
+            //用户2秒没操作了
+            Log.e("DoctorVnReportActivity", "两秒未操作");
+            // finish();
+            nextorexit();
+        }
+    };
+
+    @Override
+    protected void initData() {
+        Intent in = getIntent();
+        chipModel = (VnDetailBean.DataBean) in.getSerializableExtra("dataBean");
+        //给页面赋值
+        setViewData(chipModel);
+        isWarning = in.getBooleanExtra("isWarning", true);
+
+        status = in.getIntExtra("status", 0);
+        if (status == 4) {
+            // findViewById(R.id.btn_ll).setVisibility(View.VISIBLE);
+            vndetailTvTypemsg.setText("此疫苗需复核,请联系厂家复核");
+            vndetailTvTypemsg.setTextColor(Color.RED);
+            vndetailTvChatImage.setImageResource(R.mipmap.report_warning_ico);
+            //播放提示语
+            postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    soundPoolHelper.play("rewarning", false);
+                }
+            }, 500);
+
+            getWarningOper();
+        } else {
+            if (status == 6 || status == 7) {
+                //findViewById(R.id.btn_ll).setVisibility(View.VISIBLE);
+                vndetailTvTypemsg.setText("此疫苗未发现异常");
+                vndetailTvTypemsg.setTextColor(Color.GREEN);
+                vndetailTvChatImage.setImageResource(R.mipmap.report_normal_ico);
+                vndetailTvChatImage.setVisibility(View.GONE);
+                vndetail_tv_chatImage_title.setVisibility(View.GONE);
+                coverview.setVisibility(View.VISIBLE);
+                getnormalOper();
+                postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        soundPoolHelper.play("renormal", false);
+                    }
+                }, 500);
+            } else if (status == 8) {
+                vndetailTvTypemsg.setText("此疫苗需复核,请联系厂家复核");
+                vndetailTvTypemsg.setTextColor(Color.RED);
+                vndetailTvChatImage.setImageResource(R.mipmap.report_warning_ico);
+                postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        soundPoolHelper.play("rewarning", false);
+                    }
+                }, 500);
+                normalhandler.postDelayed(normalRunnable, 1000 * 60);
+            }
+
+            // normalhandler.postDelayed(normalRunnable, 1000 * 10);
+        }
+
+
+    }
+
+    private void getnormalOper() {
+        final BaseDialog normalDiago = new EvvmMsgDiago.Builder(this)
+                .setTitle("pdf报告已自动保存到你指定的路径,医生已做好“三查七对”,并按规定完成接种,是否推送给受种者(监护人)?") // 标题可以不用填写
+                .setConfirm("发送给家长")
+                .setCancel("取消") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .setListener(new EvvmMsgDiago.OnListener() {
+
+                    @Override
+                    public void onConfirm(Dialog dialog) {
+                        String emailsOfInoculator = "";
+                        try {
+                            String str = (String) SPUtils.get("INOCULATOR_LIST", "");
+                            if (!str.equals("")) {
+                                JSONArray jsonArr = new JSONArray(str);
+                                for (int i = 0; i < jsonArr.length(); i++) {
+                                    String arr[] = jsonArr.getString(i).split("▇");
+                                    if (!arr[3].trim().equals("")) {
+                                        emailsOfInoculator += arr[3] + ",";
+                                    }
+                                }
+                                if (emailsOfInoculator.lastIndexOf(",") == emailsOfInoculator.length() - 1) {
+                                    emailsOfInoculator = emailsOfInoculator.substring(0, emailsOfInoculator.length() - 1);
+                                }
+                            }
+                        } catch (JSONException e) {
+                            e.printStackTrace();
+                        }
+
+                        getPresenter().sendMailToInoculator(chipModel.getChipNumber(), emailsOfInoculator);
+                    }
+
+                    @Override
+                    public void onCancel(Dialog dialog) {
+                        //toast("取消了");
+                    }
+                })
+                .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                    @Override
+                    public void onDismiss(BaseDialog dialog) {
+                        //toast("asfad");
+                        normalhandler.postDelayed(normalRunnable, 1000 * 30);
+                    }
+                })
+                .show();
+
+        postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                if (normalDiago.isShowing()) {
+                    normalDiago.dismiss();
+                }
+            }
+        }, 30000);
+    }
+
+    private void getWarningOper() {
+        final BaseDialog warningDiago = new EvvmMsgDiago.Builder(this)
+                .setTitle("此疫苗需复核,请换支疫苗") // 标题可以不用填写
+                .setConfirm("")
+                .setCancel("") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                    @Override
+                    public void onDismiss(BaseDialog dialog) {
+                        //toast("asfad");
+                        //warninghandler.postDelayed(warningRunnable, 1000 * 10);
+                    }
+                })
+                .show();
+        postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                if (warningDiago.isShowing()) {
+                    warningDiago.dismiss();
+                }
+            }
+        }, 5000);
+    }
+
+    private void setViewData(final VnDetailBean.DataBean dataBean) {
+
+        vndetailTvVncode.setText("evvm Code " + dataBean.getCodeX());
+        DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+        vndetailTvVndate.setText(format1.format(new Date()));
+        vndetailTvFactoryName.setText("" + dataBean.getFactoryName());
+        vndetailTvHospitalName.setText("" + dataBean.getHospitalName());
+        vndetailTvDoctorName.setText("" + dataBean.getDoctorName());
+        vndetailTvDoctorTelephone.setText("" + dataBean.getDoctorTelephone());
+        vndetailTvChatImage.setScaleType(ImageView.ScaleType.CENTER);
+
+        SpannableString spanGmpPath = new SpannableString(TextUtils.isEmpty(dataBean.getGmpName()) ? "N/A" : dataBean.getGmpName());
+        spanGmpPath.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getGmpPath() == null || TextUtils.isEmpty(dataBean.getGmpPath())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getGmpPath());
+
+                }
+            }
+        }, 0, spanGmpPath.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvGmpName.setText(spanGmpPath);
+        vndetailTvGmpName.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn0 = new SpannableString("点击查看");
+        spanvndetailTvOthervn0.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getBatchCertificate() == null || TextUtils.isEmpty(dataBean.getBatchCertificate())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getBatchCertificate());
+
+                }
+            }
+        }, 0, spanvndetailTvOthervn0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvGmpPath.setText(spanvndetailTvOthervn0);
+        vndetailTvGmpPath.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn1 = new SpannableString("点击查询");
+        spanvndetailTvOthervn1.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameBatchOtherColdChain() == null || TextUtils.isEmpty(dataBean.getSameBatchOtherColdChain())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getSameBatchOtherColdChain());
+                }
+            }
+        }, 0, spanvndetailTvOthervn1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn1.setText(spanvndetailTvOthervn1);
+        vndetailTvOthervn1.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+
+        SpannableString spanvndetailTvOthervn2 = new SpannableString("点击查询");
+        spanvndetailTvOthervn2.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameBatchOtherFlow() == null || TextUtils.isEmpty(dataBean.getSameBatchOtherFlow())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getSameBatchOtherFlow());
+                }
+            }
+        }, 0, spanvndetailTvOthervn2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn2.setText(spanvndetailTvOthervn2);
+        vndetailTvOthervn2.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+
+        SpannableString spanvndetailTvOthervn3 = new SpannableString("点击查询");
+        spanvndetailTvOthervn3.setSpan(new ClickableSpan() {
+            @Override
+            public void onClick(View view) {
+                //点击的响应事件
+                if (dataBean.getSameFactoryOtherVaccines() == null || TextUtils.isEmpty(dataBean.getSameFactoryOtherVaccines())) {
+                    toast("暂时无法提供,需索取");
+                } else {
+                    gotoWebActivity(dataBean.getSameFactoryOtherVaccines());
+
+                }
+            }
+        }, 0, spanvndetailTvOthervn3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        vndetailTvOthervn3.setText(spanvndetailTvOthervn3);
+        vndetailTvOthervn3.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
+    }
+
+    private void gotoWebActivity(String path) {
+        if (isWarning) {
+            warninghandler.removeCallbacks(warningRunnable);
+        } else {
+            normalhandler.removeCallbacks(normalRunnable);
+        }
+        Intent in = new Intent(VnReportDetailForNctActivity.this, WebActivity.class);
+        in.putExtra("WebViewUrl", "" + path + "");
+        startActivity(in);
+    }
+
+
+    @Override
+    protected VnDetailPresenter createPresenter() {
+        return new VnDetailPresenter();
+    }
+
+    @Override
+    public void getSendMailSuccess(VnDetailBean data) {
+        toast("邮件已发送");
+        //finish();
+    }
+
+    @Override
+    public void getmlistError(String msg) {
+        toast("邮件发送失败");
+    }
+
+    @Override
+    public void getmlistSuccess(ModelListBean data) {
+
+    }
+
+    @Override
+    public void getToReviewError(String msg) {
+
+    }
+
+    @Override
+    public void getToReviewSuccess(VerificationCodeBean data) {
+
+    }
+
+    @Override
+    public void getDetailError(String msg) {
+
+    }
+
+    @Override
+    public void getDetailSuccess(VnDetailBean data) {
+
+    }
+
+    @Override
+    public void getSendMailError(String msg) {
+        toast(msg);
+    }
+
+    public static void i(String tag, String msg) {  //信息太长,分段打印
+        //因为String的length是字符数量不是字节数量所以为了防止中文字符过多,
+        //  把4*1024的MAX字节打印长度改为2001字符数
+        int max_str_length = 2001 - tag.length();
+        //大于4000时
+        while (msg.length() > max_str_length) {
+            Log.i(tag, msg.substring(0, max_str_length));
+            msg = msg.substring(max_str_length);
+        }
+        //剩余部分
+        Log.i(tag, msg);
+
+    }
+
+    @Override
+    protected void onDestroy() {
+        if (status == 6 || status == 7 || status == 8) {
+            SPUtils.remove("INOCULATOR_LIST");
+        }
+        // soundPoolHelper.release();
+        normalhandler.removeCallbacksAndMessages(null);
+        warninghandler.removeCallbacksAndMessages(null);
+        super.onDestroy();
+    }
+
+    @Override
+    public void onDown() {
+        Log.e("DoctorVnReportActivity", "down");
+        if (isWarning) {
+            warninghandler.removeCallbacks(warningRunnable);
+        } else {
+            normalhandler.removeCallbacks(normalRunnable);
+        }
+    }
+
+    @Override
+    public void onUp() {
+        Log.e("DoctorVnReportActivity", "up");
+        if (isWarning) {
+            warninghandler.postDelayed(warningRunnable, 1000 * 10);
+        } else {
+            normalhandler.postDelayed(normalRunnable, 1000 * 10);
+        }
+    }
+
+    @Override
+    public void oneClick() {
+
+    }
+
+    @Override
+    public void doubleClick() {
+
+    }
+}

BIN
.svn/pristine/0b/0b21f541d74b6dd042b53925ee810f10caa6d050.svn-base


+ 56 - 0
.svn/pristine/0b/0b6a88c2632aad13ff89099f4050bcef9007f4ec.svn-base

@@ -0,0 +1,56 @@
+// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.geocities.com/kpdus/jad.html
+// Decompiler options: braces fieldsfirst space lnc 
+
+package eVVM.apk.helper.basepicker;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+// Referenced classes of package com.qingchifan.view:
+//            LoopView
+
+final class MyTimerTask extends TimerTask {
+
+    float a;
+    float b;
+    final int c;
+    final Timer timer;
+    final LoopMsgView loopView;
+
+    MyTimerTask(LoopMsgView loopview, int i, Timer timer) {
+        super();
+        this.loopView = loopview;
+        c = i;
+        this.timer = timer;
+
+        a = 2.147484E+09F;
+        b = 0.0F;
+    }
+
+    public final void run() {
+        if (a == 2.147484E+09F) {
+            a = (float) (c - LoopMsgView.getSelectItem(loopView)) * loopView.l * (float) loopView.h;
+            if (c > LoopMsgView.getSelectItem(loopView)) {
+                b = -1000F;
+            } else {
+                b = 1000F;
+            }
+        }
+        if (Math.abs(a) < 1.0F) {
+            timer.cancel();
+            loopView.handler.sendEmptyMessage(2000);
+            return;
+        }
+        int j = (int) ((b * 10F) / 1000F);
+        int i = j;
+        if (Math.abs(a) < (float) Math.abs(j)) {
+            i = (int) (-a);
+        }
+        LoopMsgView loopview = loopView;
+        loopview.totalScrollY = loopview.totalScrollY - i;
+        float f = a;
+        a = (float) i + f;
+        loopView.handler.sendEmptyMessage(1000);
+    }
+}

+ 182 - 0
.svn/pristine/0b/0b8d7204e04f34207c2830d32d7940b1d3695b82.svn-base

@@ -0,0 +1,182 @@
+package eVVM.apk.ui.login;
+
+import android.content.Intent;
+import android.graphics.Color;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.style.ForegroundColorSpan;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.hjq.widget.CountdownView;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.common.MyActivity;
+import eVVM.apk.mvp.MvpActivity;
+import eVVM.apk.ui.bean.VerificationCodeBean;
+import eVVM.apk.ui.login.AuthenticationActivity;
+import eVVM.apk.ui.login.register.RegisterContract;
+import eVVM.apk.ui.login.register.RegisterPresenter;
+
+public class RegisterActivity extends MvpActivity<RegisterPresenter> implements RegisterContract.View {
+
+    @BindView(R.id.forget_et_phone)
+    EditText forgetEtPhone;
+    @BindView(R.id.cv_password_forget_countdown)
+    CountdownView cvPasswordForgetCountdown;
+    @BindView(R.id.forget_et_code)
+    EditText forgetEtCode;
+    @BindView(R.id.forget_et_pwd)
+    EditText forgetEtPwd;
+    @BindView(R.id.forget_et_pwdAgain)
+    EditText forgetEtPwdAgain;
+    @BindView(R.id.forget_btn_login)
+    Button forgetBtnLogin;
+    @BindView(R.id.register_cb_agree)
+    CheckBox registerCbAgree;
+    @BindView(R.id.register_tv_protocol)
+    TextView registerTvProtocol;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_register;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.tb_register_title;
+    }
+
+    @Override
+    protected void initView() {
+
+        //设置用户协议
+        toProtocol();
+
+        forgetBtnLogin.setEnabled(false);
+
+        //设置 button的状态
+        getBtnStact();
+
+    }
+
+    private void getBtnStact() {
+
+        registerCbAgree.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+                if (b) {
+                    /*forgetBtnLogin.setClickable(true);
+                    forgetBtnLogin.setEnabled(true);*/
+                    if (TextUtils.isEmpty(forgetEtPhone.getText().toString().trim()) || TextUtils.isEmpty(forgetEtCode.getText().toString().trim())
+                            || TextUtils.isEmpty(forgetEtPwd.getText().toString().trim()) || TextUtils.isEmpty(forgetEtPwdAgain.getText().toString().trim())) {
+                        forgetBtnLogin.setEnabled(false);
+                    } else {
+                        forgetBtnLogin.setEnabled(true);
+                    }
+                } else {
+                    //forgetBtnLogin.setClickable(false);
+                    forgetBtnLogin.setEnabled(false);
+                }
+            }
+        });
+
+    }
+
+    private void toProtocol() {
+        SpannableStringBuilder builder = new SpannableStringBuilder(registerTvProtocol.getText().toString());
+        ForegroundColorSpan blueSpan = new ForegroundColorSpan(Color.BLUE);
+        //UnderlineSpan lineSpan = new UnderlineSpan();
+        // builder.setSpan(lineSpan,8,16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //下划线
+        builder.setSpan(blueSpan, 9, 14, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //字体颜色
+
+        registerTvProtocol.setText(builder);
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+
+    @OnClick({R.id.cv_password_forget_countdown, R.id.forget_btn_login, R.id.register_tv_protocol})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.cv_password_forget_countdown:
+                if (forgetEtPhone.getText().toString().length() != 11) {
+                    // 重置验证码倒计时控件
+                    cvPasswordForgetCountdown.resetState();
+                    toast(getString(R.string.common_phone_input_error));
+                } else {
+
+                    getPresenter().getCode(forgetEtPhone.getText().toString().trim(),1);
+
+                }
+                break;
+            case R.id.forget_btn_login:
+
+                if (TextUtils.isEmpty(forgetEtPhone.getText().toString().trim()) || TextUtils.isEmpty(forgetEtCode.getText().toString().trim())
+                        || TextUtils.isEmpty(forgetEtPwd.getText().toString().trim()) || TextUtils.isEmpty(forgetEtPwdAgain.getText().toString().trim())) {
+                    //forgetBtnLogin.setEnabled(false);
+                    toast("请重新输入");
+                } else {
+                    if (forgetEtPhone.getText().toString().length() != 11) {
+                        toast(getString(R.string.common_phone_input_error));
+                    } else if (!forgetEtPwd.getText().toString().equals(forgetEtPwdAgain.getText().toString())) {
+                        toast(getString(R.string.register_password_input_error));
+                    } else {
+
+                      getPresenter().register(forgetEtPhone.getText().toString().trim(),
+                              forgetEtPwd.getText().toString().trim(),forgetEtCode.getText().toString().trim());
+
+                    }
+                }
+                break;
+            case R.id.register_tv_protocol:
+                //点击用户协议
+                break;
+        }
+    }
+
+    @Override
+    protected RegisterPresenter createPresenter() {
+        return new RegisterPresenter();
+    }
+
+    @Override
+    public void registerError(String msg) {
+        toast(msg);
+    }
+
+    @Override
+    public void registerSuccess(VerificationCodeBean data) {
+        Intent in = new Intent(this,AuthenticationActivity.class);
+       // int id = Integer.parseInt(String.valueOf(data.getData()));
+
+        int id = Double.valueOf(String.valueOf(data.getData())).intValue();
+        Log.e("Authentication---- ",String.valueOf(data.getData())+"-----"+id);
+        in.putExtra("registerUserId",id+"");
+        startActivity(in);
+    }
+
+    @Override
+    public void getCodeError(String msg) {
+        toast(msg);
+    }
+
+    @Override
+    public void getCodeSuccess(VerificationCodeBean codeData) {
+        // 获取验证码
+        toast(getString(R.string.common_send_code_succeed));
+
+    }
+
+}

+ 29 - 0
.svn/pristine/0b/0bb329376ffde75260fdf6ae9ee0e1c4e4e1dc04.svn-base

@@ -0,0 +1,29 @@
+package com.hjq.widget.square;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.RelativeLayout;
+
+/**
+ *    desc   : 正方形的RelativeLayout
+ */
+public final class SquareRelativeLayout extends RelativeLayout {
+
+    public SquareRelativeLayout(Context context) {
+        super(context);
+    }
+
+    public SquareRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    public SquareRelativeLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(SquareDelegate.measureWidth(widthMeasureSpec, heightMeasureSpec),
+                SquareDelegate.measureHeight(widthMeasureSpec, heightMeasureSpec));
+    }
+}

+ 691 - 0
.svn/pristine/0b/0bc7a69134a19cfaf3940e30adc4c2a2a74ad248.svn-base

@@ -0,0 +1,691 @@
+package eVVM.apk.helper;
+
+import android.annotation.TargetApi;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
+import android.os.Build;
+import android.support.annotation.ColorInt;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+import android.support.design.widget.CoordinatorLayout;
+import android.support.design.widget.Snackbar;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.Space;
+import android.widget.TextView;
+
+import java.lang.ref.WeakReference;
+
+import eVVM.apk.R;
+
+/**
+ * Created by Android Studio.
+ * User:  zbb
+ * Date: 2019/7/2
+ * Describe: SnackbarUtils
+ */
+public class SnackbarUtils {
+    //设置Snackbar背景颜色
+    private static final int color_info = 0XFF2094F3;
+    private static final int color_confirm = 0XFF4CB04E;
+    private static final int color_warning = 0XFFFEC005;
+    private static final int color_danger = 0XFFF44336;
+    //工具类当前持有的Snackbar实例
+    private static WeakReference<Snackbar> snackbarWeakReference;
+
+    private SnackbarUtils(){
+        throw new RuntimeException("禁止无参创建实例");
+    }
+
+    private SnackbarUtils(@Nullable WeakReference<Snackbar> snackbarWeakReference){
+        this.snackbarWeakReference = snackbarWeakReference;
+    }
+
+    /**
+     * 获取 mSnackbar
+     * @return
+     */
+    public Snackbar getSnackbar() {
+        if(this.snackbarWeakReference != null && this.snackbarWeakReference.get()!=null){
+            return this.snackbarWeakReference.get();
+        }else {
+            return null;
+        }
+    }
+
+    /**
+     * 初始化Snackbar实例
+     *      展示时间:Snackbar.LENGTH_SHORT
+     * @param view
+     * @param message
+     * @return
+     */
+    public static SnackbarUtils Short(View view, String message){
+        /*
+        <view xmlns:android="http://schemas.android.com/apk/res/android"
+          class="android.support.design.widget.Snackbar$SnackbarLayout"
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:layout_gravity="bottom"
+          android:theme="@style/ThemeOverlay.AppCompat.Dark"
+          style="@style/Widget.Design.Snackbar" />
+        <style name="Widget.Design.Snackbar" parent="android:Widget">
+            <item name="android:minWidth">@dimen/design_snackbar_min_width</item>
+            <item name="android:maxWidth">@dimen/design_snackbar_max_width</item>
+            <item name="android:background">@drawable/design_snackbar_background</item>
+            <item name="android:paddingLeft">@dimen/design_snackbar_padding_horizontal</item>
+            <item name="android:paddingRight">@dimen/design_snackbar_padding_horizontal</item>
+            <item name="elevation">@dimen/design_snackbar_elevation</item>
+            <item name="maxActionInlineWidth">@dimen/design_snackbar_action_inline_max_width</item>
+        </style>
+        <shape xmlns:android="http://schemas.android.com/apk/res/android"
+            android:shape="rectangle">
+            <corners android:radius="@dimen/design_snackbar_background_corner_radius"/>
+            <solid android:color="@color/design_snackbar_background_color"/>
+        </shape>
+        <color name="design_snackbar_background_color">#323232</color>
+        */
+        return new SnackbarUtils(new WeakReference<Snackbar>(Snackbar.make(view,message,Snackbar.LENGTH_SHORT))).backColor(0XFF323232);
+    }
+    /**
+     * 初始化Snackbar实例
+     *      展示时间:Snackbar.LENGTH_LONG
+     * @param view
+     * @param message
+     * @return
+     */
+    public static SnackbarUtils Long(View view, String message){
+        return new SnackbarUtils(new WeakReference<Snackbar>(Snackbar.make(view,message,Snackbar.LENGTH_LONG))).backColor(0XFF323232);
+    }
+    /**
+     * 初始化Snackbar实例
+     *      展示时间:Snackbar.LENGTH_INDEFINITE
+     * @param view
+     * @param message
+     * @return
+     */
+    public static SnackbarUtils Indefinite(View view, String message){
+        return new SnackbarUtils(new WeakReference<Snackbar>(Snackbar.make(view,message,Snackbar.LENGTH_INDEFINITE))).backColor(0XFF323232);
+    }
+    /**
+     * 初始化Snackbar实例
+     *      展示时间:duration 毫秒
+     * @param view
+     * @param message
+     * @param duration 展示时长(毫秒)
+     * @return
+     */
+    public static SnackbarUtils Custom(View view, String message, int duration){
+        return new SnackbarUtils(new WeakReference<Snackbar>(Snackbar.make(view,message,Snackbar.LENGTH_SHORT).setDuration(duration))).backColor(0XFF323232);
+    }
+
+    /**
+     * 设置mSnackbar背景色为  color_info
+     */
+    public SnackbarUtils info(){
+        if(getSnackbar()!=null){
+            getSnackbar().getView().setBackgroundColor(color_info);
+        }
+        return this;
+    }
+    /**
+     * 设置mSnackbar背景色为  color_confirm
+     */
+    public SnackbarUtils confirm(){
+        if(getSnackbar()!=null){
+            getSnackbar().getView().setBackgroundColor(color_confirm);
+        }
+        return this;
+    }
+    /**
+     * 设置Snackbar背景色为   color_warning
+     */
+    public SnackbarUtils warning(){
+        if(getSnackbar()!=null){
+            getSnackbar().getView().setBackgroundColor(color_warning);
+        }
+        return this;
+    }
+    /**
+     * 设置Snackbar背景色为   color_warning
+     */
+    public SnackbarUtils danger(){
+        if(getSnackbar()!=null){
+            getSnackbar().getView().setBackgroundColor(color_danger);
+        }
+        return this;
+    }
+
+    /**
+     * 设置Snackbar背景色
+     * @param backgroundColor
+     */
+    public SnackbarUtils backColor(@ColorInt int backgroundColor){
+        if(getSnackbar()!=null){
+            getSnackbar().getView().setBackgroundColor(backgroundColor);
+        }
+        return this;
+    }
+
+    /**
+     * 设置TextView(@+id/snackbar_text)的文字颜色
+     * @param messageColor
+     */
+    public SnackbarUtils messageColor(@ColorInt int messageColor){
+        if(getSnackbar()!=null){
+            ((TextView)getSnackbar().getView().findViewById(R.id.snackbar_text)).setTextColor(messageColor);
+        }
+        return this;
+    }
+
+    /**
+     * 设置Button(@+id/snackbar_action)的文字颜色
+     * @param actionTextColor
+     */
+    public SnackbarUtils actionColor(@ColorInt int actionTextColor){
+        if(getSnackbar()!=null){
+            ((Button)getSnackbar().getView().findViewById(R.id.snackbar_action)).setTextColor(actionTextColor);
+        }
+        return this;
+    }
+
+    /**
+     * 设置   Snackbar背景色 + TextView(@+id/snackbar_text)的文字颜色 + Button(@+id/snackbar_action)的文字颜色
+     * @param backgroundColor
+     * @param messageColor
+     * @param actionTextColor
+     */
+    public SnackbarUtils colors(@ColorInt int backgroundColor, @ColorInt int messageColor, @ColorInt int actionTextColor){
+        if(getSnackbar()!=null){
+            getSnackbar().getView().setBackgroundColor(backgroundColor);
+            ((TextView)getSnackbar().getView().findViewById(R.id.snackbar_text)).setTextColor(messageColor);
+            ((Button)getSnackbar().getView().findViewById(R.id.snackbar_action)).setTextColor(actionTextColor);
+        }
+        return this;
+    }
+
+    /**
+     * 设置Snackbar 背景透明度
+     * @param alpha
+     * @return
+     */
+    public SnackbarUtils alpha(float alpha){
+        if(getSnackbar()!=null){
+            alpha = alpha>=1.0f?1.0f:(alpha<=0.0f?0.0f:alpha);
+            getSnackbar().getView().setAlpha(alpha);
+        }
+        return this;
+    }
+
+    /**
+     * 设置Snackbar显示的位置
+     * @param gravity
+     */
+    public SnackbarUtils gravityFrameLayout(int gravity){
+        if(getSnackbar()!=null){
+            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(getSnackbar().getView().getLayoutParams().width,getSnackbar().getView().getLayoutParams().height);
+            params.gravity = gravity;
+            getSnackbar().getView().setLayoutParams(params);
+        }
+        return this;
+    }
+
+    /**
+     * 设置Snackbar显示的位置,当Snackbar和CoordinatorLayout组合使用的时候
+     * @param gravity
+     */
+    public SnackbarUtils gravityCoordinatorLayout(int gravity){
+        if(getSnackbar()!=null){
+            CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(getSnackbar().getView().getLayoutParams().width,getSnackbar().getView().getLayoutParams().height);
+            params.gravity = gravity;
+            getSnackbar().getView().setLayoutParams(params);
+        }
+        return this;
+    }
+
+    /**
+     * 设置按钮文字内容 及 点击监听
+     *      {@link Snackbar#setAction(CharSequence, View.OnClickListener)}
+     * @param resId
+     * @param listener
+     * @return
+     */
+    public SnackbarUtils setAction(@StringRes int resId, View.OnClickListener listener){
+        if(getSnackbar()!=null){
+            return setAction(getSnackbar().getView().getResources().getText(resId), listener);
+        }else {
+            return this;
+        }
+    }
+
+    /**
+     * 设置按钮文字内容 及 点击监听
+     *      {@link Snackbar#setAction(CharSequence, View.OnClickListener)}
+     * @param text
+     * @param listener
+     * @return
+     */
+    public SnackbarUtils setAction(CharSequence text, View.OnClickListener listener){
+        if(getSnackbar()!=null){
+            getSnackbar().setAction(text,listener);
+        }
+        return this;
+    }
+
+    /**
+     * 设置 mSnackbar 展示完成 及 隐藏完成 的监听
+     * @param setCallback
+     * @return
+     */
+    public SnackbarUtils setCallback(Snackbar.Callback setCallback){
+        if(getSnackbar()!=null){
+            getSnackbar().setCallback(setCallback);
+        }
+        return this;
+    }
+
+    /**
+     * 设置TextView(@+id/snackbar_text)左右两侧的图片
+     * @param leftDrawable
+     * @param rightDrawable
+     * @return
+     */
+    public SnackbarUtils leftAndRightDrawable(@Nullable @DrawableRes Integer leftDrawable, @Nullable @DrawableRes Integer rightDrawable){
+        if(getSnackbar()!=null){
+            Drawable drawableLeft = null;
+            Drawable drawableRight = null;
+            if(leftDrawable!=null){
+                try {
+                    drawableLeft = getSnackbar().getView().getResources().getDrawable(leftDrawable.intValue());
+                }catch (Exception e){
+                }
+            }
+            if(rightDrawable!=null){
+                try {
+                    drawableRight = getSnackbar().getView().getResources().getDrawable(rightDrawable.intValue());
+                }catch (Exception e){
+                }
+            }
+            return leftAndRightDrawable(drawableLeft,drawableRight);
+        }else {
+            return this;
+        }
+    }
+
+    /**
+     * 设置TextView(@+id/snackbar_text)左右两侧的图片
+     * @param leftDrawable
+     * @param rightDrawable
+     * @return
+     */
+    public SnackbarUtils leftAndRightDrawable(@Nullable Drawable leftDrawable, @Nullable Drawable rightDrawable){
+        if(getSnackbar()!=null){
+            TextView message = (TextView) getSnackbar().getView().findViewById(R.id.snackbar_text);
+            LinearLayout.LayoutParams paramsMessage = (LinearLayout.LayoutParams) message.getLayoutParams();
+            paramsMessage = new LinearLayout.LayoutParams(paramsMessage.width, paramsMessage.height,0.0f);
+            message.setLayoutParams(paramsMessage);
+            message.setCompoundDrawablePadding(message.getPaddingLeft());
+            int textSize = (int) message.getTextSize();
+            Log.e("Jet","textSize:"+textSize);
+            if(leftDrawable!=null){
+                leftDrawable.setBounds(0,0,textSize,textSize);
+            }
+            if(rightDrawable!=null){
+                rightDrawable.setBounds(0,0,textSize,textSize);
+            }
+            message.setCompoundDrawables(leftDrawable,null,rightDrawable,null);
+            LinearLayout.LayoutParams paramsSpace = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT,1.0f);
+            ((Snackbar.SnackbarLayout)getSnackbar().getView()).addView(new Space(getSnackbar().getView().getContext()),1,paramsSpace);
+        }
+        return this;
+    }
+
+    /**
+     * 设置TextView(@+id/snackbar_text)中文字的对齐方式 居中
+     * @return
+     */
+    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+    public SnackbarUtils messageCenter(){
+        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
+            if(getSnackbar()!=null){
+                TextView message = (TextView) getSnackbar().getView().findViewById(R.id.snackbar_text);
+                //View.setTextAlignment需要SDK>=17
+                message.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
+                message.setGravity(Gravity.CENTER);
+            }
+        }
+        return this;
+    }
+
+    /**
+     * 设置TextView(@+id/snackbar_text)中文字的对齐方式 居右
+     * @return
+     */
+    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+    public SnackbarUtils messageRight(){
+        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
+            if(getSnackbar()!=null){
+                TextView message = (TextView) getSnackbar().getView().findViewById(R.id.snackbar_text);
+                //View.setTextAlignment需要SDK>=17
+                message.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
+                message.setGravity(Gravity.CENTER_VERTICAL|Gravity.RIGHT);
+            }
+        }
+        return this;
+    }
+
+    /**
+     * 向Snackbar布局中添加View(Google不建议,复杂的布局应该使用DialogFragment进行展示)
+     * @param layoutId  要添加的View的布局文件ID
+     * @param index
+     * @return
+     */
+    public SnackbarUtils addView(int layoutId, int index) {
+        if(getSnackbar()!=null){
+            //加载布局文件新建View
+            View addView = LayoutInflater.from(getSnackbar().getView().getContext()).inflate(layoutId,null);
+            return addView(addView,index);
+        }else {
+            return this;
+        }
+    }
+
+    /**
+     * 向Snackbar布局中添加View(Google不建议,复杂的布局应该使用DialogFragment进行展示)
+     * @param addView
+     * @param index
+     * @return
+     */
+    public SnackbarUtils addView(View addView, int index) {
+        if(getSnackbar()!=null){
+            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);//设置新建布局参数
+            //设置新建View在Snackbar内垂直居中显示
+            params.gravity= Gravity.CENTER_VERTICAL;
+            addView.setLayoutParams(params);
+            ((Snackbar.SnackbarLayout)getSnackbar().getView()).addView(addView,index);
+        }
+        return this;
+    }
+
+    /**
+     * 设置Snackbar布局的外边距
+     *      注:经试验发现,调用margins后再调用 gravityFrameLayout,则margins无效.
+     *          为保证margins有效,应该先调用 gravityFrameLayout,在 show() 之前调用 margins
+     * @param margin
+     * @return
+     */
+    public SnackbarUtils margins(int margin){
+        if(getSnackbar()!=null){
+            return margins(margin,margin,margin,margin);
+        }else {
+            return this;
+        }
+    }
+
+    /**
+     * 设置Snackbar布局的外边距
+     *      注:经试验发现,调用margins后再调用 gravityFrameLayout,则margins无效.
+     *         为保证margins有效,应该先调用 gravityFrameLayout,在 show() 之前调用 margins
+     * @param left
+     * @param top
+     * @param right
+     * @param bottom
+     * @return
+     */
+    public SnackbarUtils margins(int left, int top, int right, int bottom){
+        if(getSnackbar()!=null){
+            ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
+            ((ViewGroup.MarginLayoutParams) params).setMargins(left,top,right,bottom);
+            getSnackbar().getView().setLayoutParams(params);
+        }
+        return this;
+    }
+
+    /**
+     * 经试验发现:
+     *      执行过{@link SnackbarUtils#backColor(int)}后:background instanceof ColorDrawable
+     *      未执行过{@link SnackbarUtils#backColor(int)}:background instanceof GradientDrawable
+     * @return
+     */
+    /*
+    public SnackbarUtils radius(){
+        Drawable background = snackbarWeakReference.get().getView().getBackground();
+        if(background instanceof GradientDrawable){
+            Log.e("Jet","radius():GradientDrawable");
+        }
+        if(background instanceof ColorDrawable){
+            Log.e("Jet","radius():ColorDrawable");
+        }
+        if(background instanceof StateListDrawable){
+            Log.e("Jet","radius():StateListDrawable");
+        }
+        Log.e("Jet","radius()background:"+background.getClass().getSimpleName());
+        return new SnackbarUtils(mSnackbar);
+    }
+    */
+
+    /**
+     * 通过SnackBar现在的背景,获取其设置圆角值时候所需的GradientDrawable实例
+     * @param backgroundOri
+     * @return
+     */
+    private GradientDrawable getRadiusDrawable(Drawable backgroundOri){
+        GradientDrawable background = null;
+        if(backgroundOri instanceof GradientDrawable){
+            background = (GradientDrawable) backgroundOri;
+        }else if(backgroundOri instanceof ColorDrawable){
+            int backgroundColor = ((ColorDrawable)backgroundOri).getColor();
+            background = new GradientDrawable();
+            background.setColor(backgroundColor);
+        }else {
+        }
+        return background;
+    }
+    /**
+     * 设置Snackbar布局的圆角半径值
+     * @param radius    圆角半径
+     * @return
+     */
+    public SnackbarUtils radius(float radius){
+        if(getSnackbar()!=null){
+            //将要设置给mSnackbar的背景
+            GradientDrawable background = getRadiusDrawable(getSnackbar().getView().getBackground());
+            if(background != null){
+                radius = radius<=0?12:radius;
+                background.setCornerRadius(radius);
+                getSnackbar().getView().setBackgroundDrawable(background);
+            }
+        }
+        return this;
+    }
+
+    /**
+     * 设置Snackbar布局的圆角半径值及边框颜色及边框宽度
+     * @param radius
+     * @param strokeWidth
+     * @param strokeColor
+     * @return
+     */
+    public SnackbarUtils radius(int radius, int strokeWidth, @ColorInt int strokeColor){
+        if(getSnackbar()!=null){
+            //将要设置给mSnackbar的背景
+            GradientDrawable background = getRadiusDrawable(getSnackbar().getView().getBackground());
+            if(background != null){
+                radius = radius<=0?12:radius;
+                strokeWidth = strokeWidth<=0?1:(strokeWidth>=getSnackbar().getView().findViewById(R.id.snackbar_text).getPaddingTop()?2:strokeWidth);
+                background.setCornerRadius(radius);
+                background.setStroke(strokeWidth,strokeColor);
+                getSnackbar().getView().setBackgroundDrawable(background);
+            }
+        }
+        return this;
+    }
+
+    /**
+     * 计算单行的Snackbar的高度值(单位 pix)
+     * @return
+     */
+    private int calculateSnackBarHeight(){
+        /*
+        <TextView
+                android:id="@+id/snackbar_text"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:paddingTop="@dimen/design_snackbar_padding_vertical"
+                android:paddingBottom="@dimen/design_snackbar_padding_vertical"
+                android:paddingLeft="@dimen/design_snackbar_padding_horizontal"
+                android:paddingRight="@dimen/design_snackbar_padding_horizontal"
+                android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
+                android:maxLines="@integer/design_snackbar_text_max_lines"
+                android:layout_gravity="center_vertical|left|start"
+                android:ellipsize="end"
+                android:textAlignment="viewStart"/>
+        */
+        //文字高度+paddingTop+paddingBottom : 14sp + 14dp*2
+        int SnackbarHeight = ScreenUtil.dp2px(getSnackbar().getView().getContext(),28) + ScreenUtil.sp2px(getSnackbar().getView().getContext(),14);
+        Log.e("Jet","直接获取MessageView高度:"+getSnackbar().getView().findViewById(R.id.snackbar_text).getHeight());
+        return SnackbarHeight;
+    }
+
+    /**
+     * 设置Snackbar显示在指定View的上方
+     *      注:暂时仅支持单行的Snackbar,因为{@link SnackbarUtils#calculateSnackBarHeight()}暂时仅支持单行Snackbar的高度计算
+     * @param targetView        指定View
+     * @param contentViewTop    Activity中的View布局区域 距离屏幕顶端的距离
+     * @param marginLeft        左边距
+     * @param marginRight       右边距
+     * @return
+     */
+    public SnackbarUtils above(View targetView, int contentViewTop, int marginLeft, int marginRight){
+        if(getSnackbar()!=null){
+            marginLeft = marginLeft<=0?0:marginLeft;
+            marginRight = marginRight<=0?0:marginRight;
+            int[] locations = new int[2];
+            targetView.getLocationOnScreen(locations);
+            Log.e("Jet","距离屏幕左侧:"+locations[0]+"==距离屏幕顶部:"+locations[1]);
+            int snackbarHeight = calculateSnackBarHeight();
+            Log.e("Jet","Snackbar高度:"+snackbarHeight);
+            //必须保证指定View的顶部可见 且 单行Snackbar可以完整的展示
+            if(locations[1] >= contentViewTop+snackbarHeight){
+                gravityFrameLayout(Gravity.BOTTOM);
+                ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
+                ((ViewGroup.MarginLayoutParams) params).setMargins(marginLeft,0,marginRight,getSnackbar().getView().getResources().getDisplayMetrics().heightPixels-locations[1]);
+                getSnackbar().getView().setLayoutParams(params);
+            }
+        }
+        return this;
+    }
+
+    //CoordinatorLayout
+    public SnackbarUtils aboveCoordinatorLayout(View targetView, int contentViewTop, int marginLeft, int marginRight){
+        if(getSnackbar()!=null){
+            marginLeft = marginLeft<=0?0:marginLeft;
+            marginRight = marginRight<=0?0:marginRight;
+            int[] locations = new int[2];
+            targetView.getLocationOnScreen(locations);
+            Log.e("Jet","距离屏幕左侧:"+locations[0]+"==距离屏幕顶部:"+locations[1]);
+            int snackbarHeight = calculateSnackBarHeight();
+            Log.e("Jet","Snackbar高度:"+snackbarHeight);
+            //必须保证指定View的顶部可见 且 单行Snackbar可以完整的展示
+            if(locations[1] >= contentViewTop+snackbarHeight){
+                gravityCoordinatorLayout(Gravity.BOTTOM);
+                ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
+                ((ViewGroup.MarginLayoutParams) params).setMargins(marginLeft,0,marginRight,getSnackbar().getView().getResources().getDisplayMetrics().heightPixels-locations[1]);
+                getSnackbar().getView().setLayoutParams(params);
+            }
+        }
+        return this;
+    }
+
+    /**
+     * 设置Snackbar显示在指定View的下方
+     *      注:暂时仅支持单行的Snackbar,因为{@link SnackbarUtils#calculateSnackBarHeight()}暂时仅支持单行Snackbar的高度计算
+     * @param targetView        指定View
+     * @param contentViewTop    Activity中的View布局区域 距离屏幕顶端的距离
+     * @param marginLeft        左边距
+     * @param marginRight       右边距
+     * @return
+     */
+    public SnackbarUtils bellow(View targetView, int contentViewTop, int marginLeft, int marginRight){
+        if(getSnackbar()!=null){
+            marginLeft = marginLeft<=0?0:marginLeft;
+            marginRight = marginRight<=0?0:marginRight;
+            int[] locations = new int[2];
+            targetView.getLocationOnScreen(locations);
+            int snackbarHeight = calculateSnackBarHeight();
+            int screenHeight = ScreenUtil.getScreenHeight(getSnackbar().getView().getContext());
+            //必须保证指定View的底部可见 且 单行Snackbar可以完整的展示
+            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
+                //为什么要'+2'? 因为在Android L(Build.VERSION_CODES.LOLLIPOP)以上,例如Button会有一定的'阴影(shadow)',阴影的大小由'高度(elevation)'决定.
+                //为了在Android L以上的系统中展示的Snackbar不要覆盖targetView的阴影部分太大比例,所以人为减小2px的layout_marginBottom属性.
+                if(locations[1]+targetView.getHeight()>=contentViewTop&&locations[1]+targetView.getHeight()+snackbarHeight+2<=screenHeight){
+                    gravityFrameLayout(Gravity.BOTTOM);
+                    ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
+                    ((ViewGroup.MarginLayoutParams) params).setMargins(marginLeft,0,marginRight,screenHeight - (locations[1]+targetView.getHeight()+snackbarHeight+2));
+                    getSnackbar().getView().setLayoutParams(params);
+                }
+            }else {
+                if(locations[1]+targetView.getHeight()>=contentViewTop&&locations[1]+targetView.getHeight()+snackbarHeight<=screenHeight){
+                    gravityFrameLayout(Gravity.BOTTOM);
+                    ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
+                    ((ViewGroup.MarginLayoutParams) params).setMargins(marginLeft,0,marginRight,screenHeight - (locations[1]+targetView.getHeight()+snackbarHeight));
+                    getSnackbar().getView().setLayoutParams(params);
+                }
+            }
+        }
+        return this;
+    }
+
+    public SnackbarUtils bellowCoordinatorLayout(View targetView, int contentViewTop, int marginLeft, int marginRight){
+        if(getSnackbar()!=null){
+            marginLeft = marginLeft<=0?0:marginLeft;
+            marginRight = marginRight<=0?0:marginRight;
+            int[] locations = new int[2];
+            targetView.getLocationOnScreen(locations);
+            int snackbarHeight = calculateSnackBarHeight();
+            int screenHeight = ScreenUtil.getScreenHeight(getSnackbar().getView().getContext());
+            //必须保证指定View的底部可见 且 单行Snackbar可以完整的展示
+            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
+                //为什么要'+2'? 因为在Android L(Build.VERSION_CODES.LOLLIPOP)以上,例如Button会有一定的'阴影(shadow)',阴影的大小由'高度(elevation)'决定.
+                //为了在Android L以上的系统中展示的Snackbar不要覆盖targetView的阴影部分太大比例,所以人为减小2px的layout_marginBottom属性.
+                if(locations[1]+targetView.getHeight()>=contentViewTop&&locations[1]+targetView.getHeight()+snackbarHeight+2<=screenHeight){
+                    gravityCoordinatorLayout(Gravity.BOTTOM);
+                    ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
+                    ((ViewGroup.MarginLayoutParams) params).setMargins(marginLeft,0,marginRight,screenHeight - (locations[1]+targetView.getHeight()+snackbarHeight+2));
+                    getSnackbar().getView().setLayoutParams(params);
+                }
+            }else {
+                if(locations[1]+targetView.getHeight()>=contentViewTop&&locations[1]+targetView.getHeight()+snackbarHeight<=screenHeight){
+                    gravityCoordinatorLayout(Gravity.BOTTOM);
+                    ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
+                    ((ViewGroup.MarginLayoutParams) params).setMargins(marginLeft,0,marginRight,screenHeight - (locations[1]+targetView.getHeight()+snackbarHeight));
+                    getSnackbar().getView().setLayoutParams(params);
+                }
+            }
+        }
+        return this;
+    }
+
+
+    /**
+     * 显示 mSnackbar
+     */
+    public void show(){
+        Log.e("Jet","show()");
+        if(getSnackbar()!=null){
+            Log.e("Jet","show");
+            getSnackbar().show();
+        }else {
+            Log.e("Jet","已经被回收");
+        }
+    }
+}

BIN
.svn/pristine/0b/0be6f188decf629212495c885b9cec3a02f00d24.svn-base


+ 189 - 0
.svn/pristine/0c/0c2e9b709bf359017b7e180c63a96ea3188560e6.svn-base

@@ -0,0 +1,189 @@
+apply plugin: 'com.android.application'
+apply plugin: 'org.greenrobot.greendao' // apply plugin
+
+android {
+    compileSdkVersion rootProject.ext.compileSdkVersion
+    buildToolsVersion rootProject.ext.buildToolsVersion
+    defaultConfig {
+        applicationId "eVVM.apk"
+        minSdkVersion 15
+        targetSdkVersion rootProject.ext.targetSdkVersion
+        versionCode 1
+        versionName "1.0"
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
+        multiDexEnabled true
+
+        javaCompileOptions {
+            annotationProcessorOptions {
+                // EventBus Apt 索引类生成位置
+                arguments = [eventBusIndex: applicationId + '.MyEventBusIndex']
+            }
+        }
+
+        ndk {
+            //选择要添加的对应 cpu 类型的 .so 库。
+            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
+            // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
+        }
+
+        manifestPlaceholders = [
+                JPUSH_PKGNAME: applicationId,
+                JPUSH_APPKEY : "a34cef708ddaa15e2d8367f0", //JPush 上注册的包名对应的 Appkey.
+                JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
+        ]
+    }
+
+    packagingOptions {
+        doNotStrip '*/mips/*.so'
+        doNotStrip '*/mips64/*.so'
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+
+    // JNI 目录
+    sourceSets {
+        main {
+            jniLibs.srcDirs = ['libs']
+        }
+    }
+
+}
+
+
+greendao {
+    /**
+     * 数据库版本
+     */
+    schemaVersion 1
+    /**
+     * greenDao输出到Dao数据库实体操作类文件目录
+     */
+    daoPackage 'greendao'
+    /**
+     * GreenDao实体类dao文件目录
+     */
+    targetGenDir 'src/main/java'
+}
+
+
+dependencies {
+    // 依赖 libs 目录下所有 jar 包
+    implementation fileTree(include: ['*.jar'], dir: 'libs')
+    // 依赖 libs 目录下所有 aar 包
+    implementation fileTree(include: ['*.aar'], dir: 'libs')
+
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+    // 基础库(不包任何第三方框架)
+    implementation project(':base')
+    // 自定义 View
+    implementation project(':widget')
+    // Dialog 封装
+    implementation project(':dialog')
+    // Glide 隔离
+    implementation project(':image')
+
+    implementation 'com.android.support:appcompat-v7:28.0.0'
+    implementation 'com.android.support:support-v4:28.0.0'
+    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+
+    implementation 'com.android.support:appcompat-v7:28.0.0'
+    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+    implementation "com.android.support:design:$rootProject.ext.supportLibraryVersion"
+
+    // Dex分包,解决 64k 问题
+    implementation 'com.android.support:multidex:1.0.3'
+
+    // ButterKnife 注解库:https://github.com/JakeWharton/butterknife
+    implementation 'com.jakewharton:butterknife:9.0.0-rc1'
+    annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'
+
+    // EventBus 事件总线
+    implementation "org.greenrobot:eventbus:3.1.1"
+    annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
+
+    //recyclerview
+    implementation 'com.android.support:appcompat-v7:28.0.0-alpha1'
+    implementation 'com.android.support:recyclerview-v7:28.0.0-alpha1'
+
+    // 状态栏沉浸:https://github.com/gyf-dev/ImmersionBar
+    implementation 'com.gyf.immersionbar:immersionbar:2.3.3'
+    // 侧滑功能:https://github.com/bingoogolapple/BGASwipeBackLayout-Android
+    implementation 'cn.bingoogolapple:bga-swipebacklayout:1.2.0'
+
+    // 权限请求框架:https://github.com/getActivity/XXPermissions
+    implementation 'com.hjq:xxpermissions:5.5'
+    // 标题栏:https://github.com/getActivity/TitleBar
+    implementation 'com.hjq:titlebar:5.0'
+    // 吐司工具类:https://github.com/getActivity/ToastUtils
+    implementation 'com.hjq:toast:6.0'
+
+    // viewhelper
+    implementation 'com.nineoldandroids:library:2.4.0'
+
+    // 圆形的ImageView:https://github.com/hdodenhof/CircleImageView
+    implementation 'de.hdodenhof:circleimageview:2.2.0'
+
+    // 支持放大缩放的ImageView:https://github.com/chrisbanes/PhotoView 出问题了看看 https://www.jianshu.com/p/f7a7a8765294
+    implementation 'com.github.chrisbanes:PhotoView:2.0.0'
+
+    //AutoSize 今日头条屏幕适配方案终极版
+    implementation 'me.jessyan:autosize:1.1.2'
+
+    //BGAQRCode-Android 二维码  + Android 图片选择、预览、九宫格图片控件、拖拽排序九宫格图片控件
+    //https://github.com/bingoogolapple/BGAQRCode-Android + https://github.com/bingoogolapple/BGAPhotoPicker-Android
+    implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.3.6'
+    implementation 'cn.bingoogolapple:bga-photopicker:1.2.8'
+    implementation 'cn.bingoogolapple:bga-baseadapter:1.2.7'
+
+    //recyclerview适配器 https://github.com/CymChad/BaseRecyclerViewAdapterHelper
+    implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46'
+
+    //网络请求框架   https://github.com/lygttpod/RxHttpUtils
+    implementation 'com.github.lygttpod:RxHttpUtils:2.3.3'
+
+    //极光推送   官方文档 : https://docs.jiguang.cn/jpush/client/Android/android_api/
+    implementation 'cn.jiguang.sdk:jpush:3.3.2'
+    implementation 'cn.jiguang.sdk:jcore:2.0.1'
+
+    //netcheck
+    implementation 'com.github.tianma8023:NetDetector:v0.2.0'
+
+    //上拉刷新下拉加载  https://github.com/anzaizai/EasyRefreshLayout  可结合BaseRecyclerViewAdapterHelper
+    implementation 'com.github.anzaizai:EasyRefreshLayout:1.3.1'
+
+    //pdfview   https://github.com/barteksc/AndroidPdfViewer
+    implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'
+
+    //安卓数据库
+    implementation 'org.greenrobot:greendao:3.2.2' // add library
+    implementation 'org.greenrobot:greendao-generator:3.2.2'
+
+    // 布局优化:https://github.com/getActivity/Layouts
+    // 分割线:https://github.com/getActivity/RecyclerItemDecoration
+    // 国际化:https://github.com/getActivity/MultiLanguages
+    // 悬浮窗:https://github.com/getActivity/XToast
+    // 网络请求:https://github.com/zhou-you/RxEasyHttp
+    // RxJava: https://github.com/ReactiveX/RxAndroid
+    // RecyclerView:https://github.com/CymChad/BaseRecyclerViewAdapterHelper
+    // 上拉刷新下拉加载:https://github.com/scwang90/SmartRefreshLayout
+    // 工具类:https://github.com/Blankj/AndroidUtilCode
+    // 图片选择:https://github.com/zhihu/Matisse
+    // 轮播图:https://github.com/bingoogolapple/BGABanner-Android
+    // 二维码:https://github.com/bingoogolapple/BGAQRCode-Android
+    // 第三方支付:https://github.com/getActivity/RxPay
+    // Log 打印:https://github.com/JakeWharton/timber
+    // 重要数据存储:https://github.com/Tencent/MMKV
+}

+ 752 - 0
.svn/pristine/0c/0c563405ca815678661f018560f1839ab601a594.svn-base

@@ -0,0 +1,752 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/white">
+
+
+    <com.hjq.bar.TitleBar
+        android:id="@+id/tb_vndetail_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:visibility="visible"
+        app:lineColor="@color/black"
+        app:title="@string/report_zhuishu" />
+
+    <eVVM.apk.widget.ZoomView
+        android:id="@+id/zv_report"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@+id/tb_vndetail_title">
+
+        <LinearLayout
+            android:id="@+id/tobigll"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:paddingLeft="10dp"
+            android:paddingRight="10dp"
+            android:paddingBottom="40dp">
+
+            <RelativeLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:layout_marginTop="2dp"
+                android:layout_marginRight="10dp">
+
+                <ImageView
+                    android:id="@+id/iv_report_top"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:src="@mipmap/iv_report_top" />
+
+                <TextView
+                    android:id="@+id/vndetail_tv_tt"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentRight="true"
+                    android:layout_marginLeft="25dp"
+                    android:layout_marginBottom="2dp"
+                    android:layout_toRightOf="@id/iv_report_top"
+                    android:gravity="center"
+                    android:text="产品追溯报告"
+                    android:textSize="10sp"
+                    android:visibility="gone" />
+
+
+                <TextView
+                    android:id="@+id/vndetail_tv_line"
+                    android:layout_width="match_parent"
+                    android:layout_height="10dp"
+                    android:layout_below="@id/vndetail_tv_tt"
+                    android:layout_alignParentRight="true"
+                    android:layout_marginLeft="25dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_toRightOf="@id/iv_report_top"
+                    android:background="#a8996e"
+                    android:text="" />
+
+                <TextView
+                    android:id="@+id/vndetail_tv_title"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@id/vndetail_tv_tt"
+                    android:layout_alignLeft="@+id/vndetail_tv_line"
+                    android:layout_alignParentRight="true"
+                    android:layout_marginRight="10dp"
+                    android:background="#a8996e"
+                    android:text=" eVVM®TRACK REPORT"
+                    android:textColor="#ffffff"
+                    android:textSize="11sp"
+                    android:textStyle="bold" />
+
+                <TextView
+                    android:id="@+id/vndetail_tv_vncode"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@+id/vndetail_tv_title"
+                    android:layout_alignLeft="@+id/vndetail_tv_title"
+                    android:layout_marginTop="5dp"
+                    android:layout_marginRight="10dp"
+                    android:text=""
+                    android:textColor="@color/gray"
+                    android:textSize="8sp" />
+
+                <TextView
+                    android:id="@+id/vndetail_tv_vndate"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@+id/vndetail_tv_vncode"
+                    android:layout_alignLeft="@+id/vndetail_tv_title"
+                    android:layout_marginTop="2dp"
+                    android:text=""
+                    android:textColor="@color/gray"
+                    android:textSize="8sp" />
+            </RelativeLayout>
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="6"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/vntype"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="3dp"
+                        android:text="受种人员"
+                        android:textSize="8sp"
+                        android:textStyle="bold" />
+
+                    <LinearLayout
+                        android:id="@+id/ll_shouzhongrenyuan"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="4dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="受种者姓名........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnname"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="性别....................."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnsex"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="出生日期............."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnbirthday"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="二维码编号........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vncodeid"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="受种者监护人....."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnjianhuren"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="联系方式.............."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnphone"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                    </LinearLayout>
+
+
+                    <LinearLayout
+                        android:id="@+id/ll_yumiaoxiangqing"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone"
+                        >
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="3dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="疫苗名称........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_ymname"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="疫苗规格........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnsc"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="生产企业........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_factoryName"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="GMP 编号........"
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_gmpName"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8sp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="批签发证书....."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_gmpPath"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:autoLink="all"
+                                android:text="点击查看"
+                                android:textColor="@color/blue"
+                                android:textSize="8sp" />
+                        </LinearLayout>
+
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="生产日期........."
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vncreatdate"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="2dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="有效期 ............"
+                                android:textSize="8sp" />
+
+                            <TextView
+                                android:id="@+id/vndetail_tv_vnvalid"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textSize="8dp" />
+                        </LinearLayout>
+                    </LinearLayout>
+
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="5"
+                    android:orientation="vertical">
+
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="3dp"
+                        android:text="接种人员"
+                        android:textSize="8sp"
+                        android:textStyle="bold" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="4dp"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="接种单位........"
+                            android:textSize="8sp" />
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_hospitalName"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:textSize="8sp" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="4dp"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="医生姓名........"
+                            android:textSize="8sp" />
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_doctorName"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:textSize="8sp" />
+                    </LinearLayout>
+
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="4dp"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="联系方式........"
+                            android:textSize="8sp" />
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_doctorTelephone"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:textSize="8sp" />
+                    </LinearLayout>
+
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="2dp"
+                android:text="追溯结果:"
+                android:textSize="8sp"
+                android:textStyle="bold" />
+
+            <RelativeLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="1dp"
+                android:background="@drawable/llborder">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:background="@drawable/llborder2"
+                    android:orientation="vertical"
+                    android:paddingLeft="15dp"
+                    android:paddingTop="9dp"
+                    android:paddingRight="15dp"
+                    android:paddingBottom="2dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:text="冷链温度"
+                        android:textColor="#a8996e"
+                        android:textSize="10sp" />
+
+                    <ImageView
+                        android:id="@+id/vndetail_tv_chatImage"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:layout_marginTop="5dp" />
+                </LinearLayout>
+            </RelativeLayout>
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="1dp"
+                android:orientation="horizontal"
+                >
+
+                <TextView
+                    android:id="@+id/vn_type"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="5"
+                    android:textSize="7sp"
+                    android:textStyle="bold" />
+
+                <TextView
+                    android:id="@+id/vn_tips"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="10.2"
+                    android:textSize="7sp" />
+            </LinearLayout>
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="3dp"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="5"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:paddingTop="1dp"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="可追溯:"
+
+                        android:textSize="7sp" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_othervn1"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="点击查询......"
+                            android:textSize="7sp" />
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="同批次其他疫苗冷链"
+                            android:textSize="7sp" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="4dp"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_othervn2"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="点击查询......"
+                            android:textSize="7sp" />
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="同批次其他疫苗流向"
+                            android:textSize="7sp" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="4dp"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_othervn3"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="点击查询......"
+                            android:textSize="7sp" />
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="同企业其他疫苗"
+                            android:textSize="7sp" />
+                    </LinearLayout>
+                </LinearLayout>
+
+                <RelativeLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="10.2"
+                    android:orientation="horizontal">
+
+                    <ScrollView
+
+                        android:layout_width="wrap_content"
+                        android:layout_height="58dp"
+                        android:layout_toLeftOf="@+id/vndetail_iv_tipsimg">
+
+                        <TextView
+                            android:paddingTop="3dp"
+                            android:id="@+id/vndetail_tv_tips"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/vndeatil_tips"
+                            android:textColor="@color/gray"
+                            android:textSize="4.5sp" />
+                    </ScrollView>
+
+
+                    <ImageView
+                        android:id="@+id/vndetail_iv_tipsimg"
+                        android:layout_width="59dp"
+                        android:layout_height="59dp"
+                        android:layout_alignParentRight="true"
+
+                        android:src="@mipmap/qrcode" />
+                </RelativeLayout>
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="4dp"
+                android:orientation="horizontal">
+
+                <RelativeLayout
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_marginRight="-2dp"
+                    android:layout_weight="1"
+                    android:background="@drawable/border_report"
+                    android:orientation="vertical"
+                    android:padding="10dp">
+
+                    <ImageView
+                        android:layout_width="20dp"
+                        android:layout_height="wrap_content"
+                        android:layout_centerInParent="true"
+                        android:src="@mipmap/dun" />
+                </RelativeLayout>
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="6"
+                    android:background="@drawable/border_report"
+                    android:orientation="vertical"
+                    android:padding="5dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="免责声明:"
+                        android:textColor="#97885c"
+                        android:textSize="8sp"
+                        android:textStyle="bold" />
+
+                    <ScrollView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content">
+
+                        <TextView
+                            android:id="@+id/vndetail_tv_disclaimer"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/vndeatil_disclaimer"
+                            android:textColor="#97885c"
+                            android:textSize="4.5sp" />
+                    </ScrollView>
+
+                </LinearLayout>
+            </LinearLayout>
+
+
+        </LinearLayout>
+
+    </eVVM.apk.widget.ZoomView>
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:background="@color/white"
+        android:gravity="center_horizontal"
+        android:paddingTop="5dp"
+        android:paddingBottom="5dp">
+
+        <Button
+            android:id="@+id/send_btn_report"
+            android:layout_width="140dp"
+            android:layout_height="35dp"
+            android:background="@drawable/small_btn"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:text="@string/report_fuhe"
+            android:textColor="@color/white"
+            android:textSize="15.3sp" />
+
+    </RelativeLayout>
+
+    <ImageButton
+        android:id="@+id/vndetail_bt_magnifier"
+        android:layout_width="30dp"
+        android:layout_height="30dp"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginRight="10dp"
+        android:layout_marginBottom="5dp"
+        android:background="@color/transparent"
+        android:src="@mipmap/magnifier" />
+
+</RelativeLayout>

+ 793 - 0
.svn/pristine/0c/0c6580dbd717d50f7cb237dc8c38e38de169a456.svn-base

@@ -0,0 +1,793 @@
+package com.hjq.base;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.SystemClock;
+import android.support.annotation.ColorRes;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.IdRes;
+import android.support.annotation.LayoutRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+import android.support.annotation.StyleRes;
+import android.support.v7.app.AppCompatDialog;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *    desc   : Dialog 基类
+ */
+public class BaseDialog extends AppCompatDialog implements
+        DialogInterface.OnShowListener,
+        DialogInterface.OnCancelListener,
+        DialogInterface.OnDismissListener {
+
+    private static final Handler HANDLER = new Handler(Looper.getMainLooper());
+
+    private List<BaseDialog.OnShowListener> mOnShowListeners;
+    private List<BaseDialog.OnCancelListener> mOnCancelListeners;
+    private List<BaseDialog.OnDismissListener> mOnDismissListeners;
+
+    public BaseDialog(Context context) {
+        this(context, R.style.BaseDialogStyle);
+    }
+
+    public BaseDialog(Context context, int themeResId) {
+        super(context, themeResId > 0 ? themeResId : R.style.BaseDialogStyle);
+    }
+
+    /**
+     * 设置一个显示监听器
+     *
+     * @param listener       监听器对象
+     * @deprecated          请使用 {@link #addOnShowListener(BaseDialog.OnShowListener)}}
+     */
+    @Deprecated
+    @Override
+    public void setOnShowListener(@Nullable DialogInterface.OnShowListener listener) {
+        addOnShowListener(new ShowListenerWrapper(listener));
+    }
+
+    /**
+     * 设置一个取消监听器
+     *
+     * @param listener       监听器对象
+     * @deprecated          请使用 {@link #addOnCancelListener(BaseDialog.OnCancelListener)}
+     */
+    @Deprecated
+    @Override
+    public void setOnCancelListener(@Nullable DialogInterface.OnCancelListener listener) {
+        addOnCancelListener(new CancelListenerWrapper(listener));
+    }
+
+    /**
+     * 设置一个销毁监听器
+     *
+     * @param listener       监听器对象
+     * @deprecated          请使用 {@link #addOnDismissListener(BaseDialog.OnDismissListener)}
+     */
+    @Deprecated
+    @Override
+    public void setOnDismissListener(@Nullable DialogInterface.OnDismissListener listener) {
+        addOnDismissListener(new DismissListenerWrapper(listener));
+    }
+
+    /**
+     * 添加一个取消监听器
+     *
+     * @param listener      监听器对象
+     */
+    public void addOnShowListener(@Nullable BaseDialog.OnShowListener listener) {
+        if (mOnShowListeners == null) {
+            mOnShowListeners = new ArrayList<>();
+            super.setOnShowListener(this);
+        }
+        mOnShowListeners.add(listener);
+    }
+
+    /**
+     * 添加一个取消监听器
+     *
+     * @param listener      监听器对象
+     */
+    public void addOnCancelListener(@Nullable BaseDialog.OnCancelListener listener) {
+        if (mOnCancelListeners == null) {
+            mOnCancelListeners = new ArrayList<>();
+            super.setOnCancelListener(this);
+        }
+        mOnCancelListeners.add(listener);
+    }
+
+    /**
+     * 添加一个销毁监听器
+     *
+     * @param listener      监听器对象
+     */
+    public void addOnDismissListener(@Nullable BaseDialog.OnDismissListener listener) {
+        if (mOnDismissListeners == null) {
+            mOnDismissListeners = new ArrayList<>();
+            super.setOnDismissListener(this);
+        }
+        mOnDismissListeners.add(listener);
+    }
+
+    /**
+     * 设置显示监听器集合
+     */
+    private void setOnShowListeners(@Nullable List<BaseDialog.OnShowListener> listeners) {
+        super.setOnShowListener(this);
+        mOnShowListeners = listeners;
+    }
+
+    /**
+     * 设置取消监听器集合
+     */
+    private void setOnCancelListeners(@Nullable List<BaseDialog.OnCancelListener> listeners) {
+        super.setOnCancelListener(this);
+        mOnCancelListeners = listeners;
+    }
+
+    /**
+     * 设置销毁监听器集合
+     */
+    private void setOnDismissListeners(@Nullable List<BaseDialog.OnDismissListener> listeners) {
+        super.setOnDismissListener(this);
+        mOnDismissListeners = listeners;
+    }
+
+    /**
+     * {@link DialogInterface.OnShowListener}
+     */
+    @Override
+    public void onShow(DialogInterface dialog) {
+        if (mOnShowListeners != null) {
+            for (BaseDialog.OnShowListener listener : mOnShowListeners) {
+                listener.onShow(this);
+            }
+        }
+    }
+
+    /**
+     * {@link DialogInterface.OnCancelListener}
+     */
+    @Override
+    public void onCancel(DialogInterface dialog) {
+        if (mOnCancelListeners != null) {
+            for (BaseDialog.OnCancelListener listener : mOnCancelListeners) {
+                listener.onCancel(this);
+            }
+        }
+    }
+
+    /**
+     * {@link DialogInterface.OnDismissListener}
+     */
+    @Override
+    public void onDismiss(DialogInterface dialog) {
+
+        // 移除和这个 Dialog 相关的消息回调
+        HANDLER.removeCallbacksAndMessages(this);
+
+        if (mOnDismissListeners != null) {
+            for (BaseDialog.OnDismissListener listener : mOnDismissListeners) {
+                listener.onDismiss(this);
+            }
+        }
+    }
+
+    /**
+     * 延迟执行
+     */
+    public final boolean post(Runnable r) {
+        return postDelayed(r, 0);
+    }
+
+    /**
+     * 延迟一段时间执行
+     */
+    public final boolean postDelayed(Runnable r, long delayMillis) {
+        if (delayMillis < 0) {
+            delayMillis = 0;
+        }
+        return postAtTime(r, SystemClock.uptimeMillis() + delayMillis);
+    }
+
+    /**
+     * 在指定的时间执行
+     */
+    public final boolean postAtTime(Runnable r, long uptimeMillis) {
+        return HANDLER.postAtTime(r, this, uptimeMillis);
+    }
+
+    /**
+     * Dialog 动画样式
+     */
+    public static final class AnimStyle {
+
+        // 默认动画效果
+        static final int DEFAULT = R.style.ScaleAnimStyle;
+
+        // 缩放动画
+        public static final int SCALE = R.style.ScaleAnimStyle;
+
+        // IOS 动画
+        public static final int IOS = R.style.IOSAnimStyle;
+
+        // 吐司动画
+        public static final int TOAST = android.R.style.Animation_Toast;
+
+        // 顶部弹出动画
+        public static final int TOP = R.style.TopAnimStyle;
+
+        // 底部弹出动画
+        public static final int BOTTOM = R.style.BottomAnimStyle;
+
+        // 左边弹出动画
+        public static final int LEFT = R.style.LeftAnimStyle;
+
+        // 右边弹出动画
+        public static final int RIGHT = R.style.RightAnimStyle;
+    }
+
+    @SuppressWarnings("unchecked")
+    public static class Builder<B extends Builder> {
+
+        protected static final int MATCH_PARENT = ViewGroup.LayoutParams.MATCH_PARENT;
+        protected static final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT;
+
+        private BaseDialog mDialog;
+
+        // Context 对象
+        private Context mContext;
+
+        // Dialog 布局
+        private View mContentView;
+
+        // Dialog Show 监听
+        private List<BaseDialog.OnShowListener> mOnShowListeners;
+        // Dialog Cancel 监听
+        private List<BaseDialog.OnCancelListener> mOnCancelListeners;
+        // Dialog Dismiss 监听
+        private List<BaseDialog.OnDismissListener> mOnDismissListeners;
+        // Dialog Key 监听
+        private OnKeyListener mOnKeyListener;
+
+        // 点击空白是否能够取消  默认点击阴影可以取消
+        private boolean mCancelable = true;
+
+        private SparseArray<CharSequence> mTextArray = new SparseArray<>();
+        private SparseIntArray mVisibilityArray = new SparseIntArray();
+        private SparseArray<Drawable> mBackgroundArray = new SparseArray<>();
+        private SparseArray<Drawable> mImageArray = new SparseArray<>();
+        private SparseArray<BaseDialog.OnClickListener> mClickArray = new SparseArray<>();
+
+        // 主题
+        private int mThemeResId = -1;
+        // 动画
+        private int mAnimations = -1;
+        // 位置
+        private int mGravity = Gravity.CENTER;
+        // 宽度和高度
+        private int mWidth = WRAP_CONTENT;
+        private int mHeight = WRAP_CONTENT;
+        // 垂直和水平边距
+        private int mVerticalMargin;
+        private int mHorizontalMargin;
+
+        public Builder(Context context) {
+            mContext = context;
+        }
+
+        /**
+         * 延迟执行,一定要在创建了Dialog之后调用(供子类调用)
+         */
+        protected final boolean post(Runnable r) {
+            return mDialog.post(r);
+        }
+
+        /**
+         * 延迟一段时间执行,一定要在创建了Dialog之后调用(仅供子类调用)
+         */
+        protected final boolean postDelayed(Runnable r, long delayMillis) {
+            return mDialog.postDelayed(r, delayMillis);
+        }
+
+        /**
+         * 在指定的时间执行,一定要在创建了Dialog之后调用(仅供子类调用)
+         */
+        protected final boolean postAtTime(Runnable r, long uptimeMillis) {
+            return mDialog.postAtTime(r, uptimeMillis);
+        }
+
+        /**
+         * 是否设置了取消(仅供子类调用)
+         */
+        protected boolean isCancelable() {
+            return mCancelable;
+        }
+
+        /**
+         * 获取上下文对象(仅供子类调用)
+         */
+        protected Context getContext() {
+            return mContext;
+        }
+
+        /**
+         * 获取 Dialog 重心(仅供子类调用)
+         */
+        protected int getGravity() {
+            return mGravity;
+        }
+
+        /**
+         * 获取资源对象(仅供子类调用)
+         */
+        protected Resources getResources() {
+            return mContext.getResources();
+        }
+
+        /**
+         * 根据 id 获取一个文本(仅供子类调用)
+         */
+        protected CharSequence getText(@StringRes int resId) {
+            return mContext.getText(resId);
+        }
+
+        /**
+         * 根据 id 获取一个 String(仅供子类调用)
+         */
+        protected String getString(@StringRes int resId) {
+            return mContext.getString(resId);
+        }
+
+        /**
+         * 根据 id 获取一个颜色(仅供子类调用)
+         */
+        protected int getColor(@ColorRes int id) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+                return mContext.getColor(id);
+            }else {
+                return mContext.getResources().getColor(id);
+            }
+        }
+
+        /**
+         * 根据 id 获取一个 Drawable(仅供子类调用)
+         */
+        protected Drawable getDrawable(@DrawableRes int id) {
+
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                return mContext.getDrawable(id);
+            }else {
+                return mContext.getResources().getDrawable(id);
+            }
+        }
+
+        /**
+         * 根据 id 查找 View(仅供子类调用)
+         */
+        protected <V extends View> V findViewById(@IdRes int id) {
+            return mContentView.findViewById(id);
+        }
+
+        /**
+         * 获取当前 Dialog 对象(仅供子类调用)
+         */
+        protected BaseDialog getDialog() {
+            return mDialog;
+        }
+
+        /**
+         * 销毁当前 Dialog(仅供子类调用)
+         */
+        protected void dismiss() {
+            mDialog.dismiss();
+        }
+
+        /**
+         * 设置主题 id
+         */
+        public B setThemeStyle(@StyleRes int themeResId) {
+            mThemeResId = themeResId;
+            return (B) this;
+        }
+
+        /**
+         * 设置布局
+         */
+        public B setContentView(@LayoutRes int layoutId) {
+            return setContentView(LayoutInflater.from(mContext).inflate(layoutId, null));
+        }
+        public B setContentView(@NonNull View view) {
+            mContentView = view;
+            return (B) this;
+        }
+
+        /**
+         * 设置重心位置
+         */
+        public B setGravity(int gravity) {
+            // 适配 Android 4.2 新特性,布局反方向(开发者选项 - 强制使用从右到左的布局方向)
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+                gravity = Gravity.getAbsoluteGravity(gravity, mContext.getResources().getConfiguration().getLayoutDirection());
+            }
+            mGravity = gravity;
+            if (mAnimations == -1) {
+                switch (mGravity) {
+                    case Gravity.TOP:
+                        mAnimations = AnimStyle.TOP;
+                        break;
+                    case Gravity.BOTTOM:
+                        mAnimations = AnimStyle.BOTTOM;
+                        break;
+                    case Gravity.LEFT:
+                        mAnimations = AnimStyle.LEFT;
+                        break;
+                    case Gravity.RIGHT:
+                        mAnimations = AnimStyle.RIGHT;
+                        break;
+                }
+            }
+            return (B) this;
+        }
+
+        /**
+         * 设置宽度
+         */
+        public B setWidth(int width) {
+            mWidth = width;
+            return (B) this;
+        }
+
+        /**
+         * 设置高度
+         */
+        public B setHeight(int height) {
+            mHeight = height;
+            return (B) this;
+        }
+
+        /**
+         * 是否可以取消
+         */
+        public B setCancelable(boolean cancelable) {
+            mCancelable = cancelable;
+            return (B) this;
+        }
+
+        /**
+         * 设置动画,已经封装好几种样式,具体可见{@link AnimStyle}类
+         */
+        public B setAnimStyle(@StyleRes int resId) {
+            mAnimations = resId;
+            return (B) this;
+        }
+
+        /**
+         * 设置垂直间距
+         */
+        public B setVerticalMargin(int margin) {
+            mVerticalMargin = margin;
+            return (B) this;
+        }
+
+        /**
+         * 设置水平间距
+         */
+        public B setHorizontalMargin(int margin) {
+            mHorizontalMargin = margin;
+            return (B) this;
+        }
+
+        /**
+         * 添加显示监听
+         */
+        public B addOnShowListener(@NonNull BaseDialog.OnShowListener listener) {
+            if (mOnShowListeners == null) {
+                mOnShowListeners = new ArrayList<>();
+            }
+            mOnShowListeners.add(listener);
+            return (B) this;
+        }
+
+        /**
+         * 添加取消监听
+         */
+        public B addOnCancelListener(@NonNull BaseDialog.OnCancelListener listener) {
+            if (mOnCancelListeners == null) {
+                mOnCancelListeners = new ArrayList<>();
+            }
+            mOnCancelListeners.add(listener);
+            return (B) this;
+        }
+
+        /**
+         * 添加销毁监听
+         */
+        public B addOnDismissListener(@NonNull BaseDialog.OnDismissListener listener) {
+            if (mOnDismissListeners == null) {
+                mOnDismissListeners = new ArrayList<>();
+            }
+            mOnDismissListeners.add(listener);
+            return (B) this;
+        }
+
+        /**
+         * 设置按键监听
+         */
+        public B setOnKeyListener(@NonNull OnKeyListener onKeyListener) {
+            mOnKeyListener = onKeyListener;
+            return (B) this;
+        }
+
+        /**
+         * 设置文本
+         */
+        public B setText(@IdRes int id, @StringRes int resId) {
+            return setText(id, mContext.getResources().getString(resId));
+        }
+        public B setText(@IdRes int id, CharSequence text) {
+            mTextArray.put(id, text);
+            return (B) this;
+        }
+
+        /**
+         * 设置可见状态
+         */
+        public B setVisibility(@IdRes int id, int visibility) {
+            mVisibilityArray.put(id, visibility);
+            return (B) this;
+        }
+
+        /**
+         * 设置背景
+         */
+        public B setBackground(@IdRes int id, @DrawableRes int resId) {
+            return setBackground(id, mContext.getResources().getDrawable(resId));
+        }
+        public B setBackground(@IdRes int id, Drawable drawable) {
+            mBackgroundArray.put(id, drawable);
+            return (B) this;
+        }
+
+        /**
+         * 设置图片
+         */
+        public B setImageDrawable(@IdRes int id, @DrawableRes int resId) {
+            return setBackground(id, mContext.getResources().getDrawable(resId));
+        }
+        public B setImageDrawable(@IdRes int id, Drawable drawable) {
+            mImageArray.put(id, drawable);
+            return (B) this;
+        }
+
+        /**
+         * 设置点击事件
+         */
+        public B setOnClickListener(@IdRes int id, @NonNull BaseDialog.OnClickListener listener) {
+            mClickArray.put(id, listener);
+            return (B) this;
+        }
+
+        /**
+         * 创建
+         */
+        public BaseDialog create() {
+
+            // 判断布局是否为空
+            if (mContentView == null) {
+                throw new IllegalArgumentException("Dialog layout cannot be empty");
+            }
+
+            ViewGroup.LayoutParams layoutParams = mContentView.getLayoutParams();
+            if (layoutParams != null) {
+
+                if (mWidth == ViewGroup.LayoutParams.WRAP_CONTENT) {
+                    mWidth = layoutParams.width;
+                }
+                if (mHeight == ViewGroup.LayoutParams.WRAP_CONTENT) {
+                    mHeight = layoutParams.height;
+                }
+            }
+
+//            // 判断有没有设置主题
+//            if (mThemeResId == -1) {
+//                mDialog = new BaseDialog(mContext);
+//            } else {
+//                mDialog = new BaseDialog(mContext, mThemeResId);
+//            }
+
+            mDialog = createDialog(mContext, mThemeResId);
+
+            mDialog.setContentView(mContentView);
+
+            mDialog.setCancelable(mCancelable);
+            if (mCancelable) {
+                mDialog.setCanceledOnTouchOutside(true);
+            }
+
+            if (mOnShowListeners != null) {
+                mDialog.setOnShowListeners(mOnShowListeners);
+            }
+
+            if (mOnCancelListeners != null) {
+                mDialog.setOnCancelListeners(mOnCancelListeners);
+            }
+
+            if (mOnDismissListeners != null) {
+                mDialog.setOnDismissListeners(mOnDismissListeners);
+            }
+
+            if (mOnKeyListener != null) {
+                mDialog.setOnKeyListener(mOnKeyListener);
+            }
+
+            // 判断有没有设置动画
+            if (mAnimations == -1) {
+                // 没有的话就设置默认的动画
+                mAnimations = AnimStyle.DEFAULT;
+            }
+
+            // 设置参数
+            WindowManager.LayoutParams params = mDialog.getWindow().getAttributes();
+            params.width = mWidth;
+            params.height = mHeight;
+            params.gravity = mGravity;
+            params.windowAnimations = mAnimations;
+            params.horizontalMargin = mHorizontalMargin;
+            params.verticalMargin = mVerticalMargin;
+            mDialog.getWindow().setAttributes(params);
+
+            // 设置文本
+            for (int i = 0; i < mTextArray.size(); i++) {
+                ((TextView) mContentView.findViewById(mTextArray.keyAt(i))).setText(mTextArray.valueAt(i));
+            }
+
+            // 设置可见状态
+            for (int i = 0; i < mVisibilityArray.size(); i++) {
+                mContentView.findViewById(mVisibilityArray.keyAt(i)).setVisibility(mVisibilityArray.valueAt(i));
+            }
+
+            // 设置背景
+            for (int i = 0; i < mBackgroundArray.size(); i++) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+                    mContentView.findViewById(mBackgroundArray.keyAt(i)).setBackground(mBackgroundArray.valueAt(i));
+                }else {
+                    mContentView.findViewById(mBackgroundArray.keyAt(i)).setBackgroundDrawable(mBackgroundArray.valueAt(i));
+                }
+            }
+
+            // 设置图片
+            for (int i = 0; i < mImageArray.size(); i++) {
+                ((ImageView) mContentView.findViewById(mImageArray.keyAt(i))).setImageDrawable(mImageArray.valueAt(i));
+            }
+
+            // 设置点击事件
+            for (int i = 0; i < mClickArray.size(); i++) {
+                mContentView.findViewById(mClickArray.keyAt(i)).setOnClickListener(new ViewClickWrapper(mDialog, mClickArray.valueAt(i)));
+            }
+
+            return mDialog;
+        }
+
+        /**
+         * 创建对话框对象(子类可以重写此方法来改变 Dialog 类型)
+         */
+        protected BaseDialog createDialog(Context context, int themeResId) {
+            return new BaseDialog(context, themeResId);
+        }
+
+        /**
+         * 显示
+         */
+        public BaseDialog show() {
+            final BaseDialog dialog = create();
+            dialog.show();
+            return dialog;
+        }
+    }
+
+    public interface OnClickListener<V extends View> {
+        void onClick(BaseDialog dialog, V view);
+    }
+
+    public interface OnShowListener {
+        void onShow(BaseDialog dialog);
+    }
+
+    public interface OnCancelListener {
+        void onCancel(BaseDialog dialog);
+    }
+
+    public interface OnDismissListener {
+        void onDismiss(BaseDialog dialog);
+    }
+
+    /**
+     * 点击事件包装类
+     */
+    private static final class ViewClickWrapper implements View.OnClickListener {
+
+        private final BaseDialog mDialog;
+        private final BaseDialog.OnClickListener mListener;
+
+        private ViewClickWrapper(BaseDialog dialog, BaseDialog.OnClickListener listener) {
+            mDialog = dialog;
+            mListener = listener;
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public final void onClick(View v) {
+            mListener.onClick(mDialog, v);
+        }
+    }
+
+    /**
+     * 显示监听包装类
+     */
+    private static final class ShowListenerWrapper implements BaseDialog.OnShowListener {
+
+        private final DialogInterface.OnShowListener mListener;
+
+        private ShowListenerWrapper(DialogInterface.OnShowListener listener) {
+            mListener = listener;
+        }
+
+        @Override
+        public void onShow(BaseDialog dialog) {
+            mListener.onShow(dialog);
+        }
+    }
+
+    /**
+     * 取消监听包装类
+     */
+    private static final class CancelListenerWrapper implements BaseDialog.OnCancelListener {
+
+        private final DialogInterface.OnCancelListener mListener;
+
+        private CancelListenerWrapper(DialogInterface.OnCancelListener listener) {
+            mListener = listener;
+        }
+
+        @Override
+        public void onCancel(BaseDialog dialog) {
+            mListener.onCancel(dialog);
+        }
+    }
+
+    /**
+     * 销毁监听包装类
+     */
+    private static final class DismissListenerWrapper implements BaseDialog.OnDismissListener {
+
+        private final DialogInterface.OnDismissListener mListener;
+
+        private DismissListenerWrapper(DialogInterface.OnDismissListener listener) {
+            mListener = listener;
+        }
+
+        @Override
+        public void onDismiss(BaseDialog dialog) {
+            mListener.onDismiss(dialog);
+        }
+    }
+}

+ 165 - 0
.svn/pristine/0c/0c71d2e0f697db6194c79928d12a311afe92b601.svn-base

@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="eVVM.apk">
+
+    <!--极光推送需要的权限-->
+    <uses-permission android:name="eVVM.apk.permission.JPUSH_MESSAGE" />
+    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.VIBRATE" />
+    <uses-permission
+        android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
+        tools:ignore="ProtectedPermissions" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+
+    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /><!-- 安装包的权限 -->
+    <uses-permission android:name="android.permission.READ_SMS" /> <!-- 阅读消息 -->
+    <uses-permission android:name="android.permission.RECEIVE_SMS" /> <!-- 接收消息 -->
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 外部存储读写权限 -->
+    <uses-permission android:name="android.permission.VIBRATE" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.CAMERA" /> <!-- 拍照权限 -->
+    <uses-permission android:name="android.permission.INTERNET" /> <!-- 联网权限 -->
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 访问当前网络状态权限 -->
+    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
+    <uses-permission android:name="android.permission.NFC" /> <!-- NFC权限 -->
+    <uses-feature
+        android:name="android.hardware.nfc"
+        android:required="true" /> <!-- 要求当前设备必须要有NFC芯片 -->
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- GPS权限 -->
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- GPS是精确定位 -->
+    <uses-permission android:name="android.permission.PERMISSION_GRANTED" />
+
+    <application
+        android:name=".app.MyApplication"
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:networkSecurityConfig="@xml/network_security_config"
+        android:roundIcon="@mipmap/ic_launcher"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme"
+        android:usesCleartextTraffic="true"
+        tools:targetApi="n">
+        <activity android:name=".ui.webview.WebActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.report.vndetail.VnReportDetailActivity"
+            android:screenOrientation="portrait"></activity>
+        <activity
+            android:name=".ui.report.vndetail.VnReportDetailForDoctorActivity"
+            android:screenOrientation="portrait"></activity>
+
+        <activity
+            android:name=".ui.home.FactoryOperatorActivity"
+            android:launchMode="singleTop"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.home.FactorAdminActivity"
+            android:alwaysRetainTaskState="true"
+            android:launchMode="singleTask"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.first.ReadingActivity"
+            android:launchMode="singleTop"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.My.ExamineActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.launcher.LikeActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.login.AuthenticationActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.first.InoculationRegistActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.first.QrCodeActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.My.InformationActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.My.AboutActivity"
+            android:screenOrientation="portrait" />
+
+        <meta-data
+            android:name="design_width_in_dp"
+            android:value="360" />
+        <meta-data
+            android:name="design_height_in_dp"
+            android:value="640" /> <!-- 适配Android 7.0文件意图 -->
+        <provider
+            android:name="android.support.v4.content.FileProvider"
+            android:authorities="${applicationId}.provider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths" />
+        </provider>
+
+        <activity
+            android:name=".MainActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.launcher.LauncherActivity"
+            android:screenOrientation="portrait">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".ui.login.RegisterActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.login.PasswordForgetActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".ui.login.LoginActivity"
+            android:screenOrientation="portrait" /> <!-- 主页界面 -->
+        <activity
+            android:name=".ui.home.HomeActivity"
+            android:alwaysRetainTaskState="true"
+            android:launchMode="singleTask"
+            android:screenOrientation="portrait" />
+
+
+        <service
+            android:name=".jpush.EvvmPushService"
+            android:enabled="true"
+            android:exported="false"
+            android:process=":pushcore">
+            <intent-filter>
+                <action android:name="cn.jiguang.user.service.action" />
+            </intent-filter>
+        </service>
+
+
+        <receiver
+            android:name=".jpush.EvvmPushReceiver"
+            android:enabled="true"
+            android:exported="false">
+            <intent-filter>
+                <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
+                <action android:name="cn.jpush.android.intent.REGISTRATION" />
+                <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
+                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
+                <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
+                <action android:name="cn.jpush.android.intent.NOTIFICATION_CLICK_ACTION" />
+                <action android:name="cn.jpush.android.intent.CONNECTION" />
+
+                <category android:name="eVVM.apk" />
+            </intent-filter>
+        </receiver>
+
+
+    </application>
+
+</manifest>

+ 483 - 0
.svn/pristine/0c/0c7d3663418fd2163e665fa2d671f442bfd9e076.svn-base

@@ -0,0 +1,483 @@
+package eVVM.apk.ui.home;
+
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.app.Dialog;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.location.Location;
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+import android.nfc.NfcAdapter;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Parcelable;
+import android.os.Bundle;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.View;
+
+import com.hjq.bar.OnTitleBarListener;
+import com.hjq.bar.TitleBar;
+import com.hjq.base.BaseDialog;
+import com.hjq.base.BaseDialogFragment;
+import com.hjq.dialog.MessageDialog;
+
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.CycleInterpolator;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.LinearInterpolator;
+import android.view.animation.RotateAnimation;
+import android.widget.ImageView;
+import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
+
+import java.util.Arrays;
+
+import butterknife.BindView;
+import eVVM.apk.R;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.helper.SoundPoolHelper;
+import eVVM.apk.ui.bean.VnDetailBean;
+import eVVM.apk.ui.home.uploadChip.UploadChipContract;
+import eVVM.apk.helper.ActivityStackManager;
+import eVVM.apk.helper.DoubleClickHelper;
+import eVVM.apk.ui.login.LoginActivity;
+
+/**
+ * 厂家操作员登录页面
+ */
+public class FactoryOperatorActivity extends BaseNfcActivity implements UploadChipContract.View {
+
+    private String textRecord;
+
+    @BindView(R.id.reading_title)
+    TitleBar readingTitle;
+
+    @BindView(R.id.reading__line)
+    ImageView imgreadline;
+
+    @BindView(R.id.fly_phonerl)
+    RelativeLayout flyphonerl;
+    private Animation animation;
+    private AlphaAnimation alp;
+    private AnimatorSet animatorSetsuofang;
+    private AnimatorSet animatorSetsuofang2;
+    private BaseDialog loadDiago;
+    private ProgressBar readpb;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_factory_operator;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return R.id.reading_title;
+    }
+
+    @Override
+    protected void initView() {
+        getAnimationSao(); //进行雷达扫描动画
+        soundPoolHelper = new SoundPoolHelper(4, SoundPoolHelper.TYPE_MUSIC)
+                .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC)
+                .loadDefault(FactoryOperatorActivity.this)
+                .load(FactoryOperatorActivity.this, "factory_operator_success", R.raw.factory_operator_success)
+                .load(FactoryOperatorActivity.this, "factory_operator_error", R.raw.factory_operator_error);
+
+        readingTitle.setOnTitleBarListener(new OnTitleBarListener() {
+            @Override
+            public void onLeftClick(View v) {
+
+            }
+
+            @Override
+            public void onTitleClick(View v) {
+
+            }
+
+            @Override
+            public void onRightClick(View v) {
+
+
+                getExit();
+
+                //toast("tuichu");
+            }
+        });
+        getFlyPhone();
+    }
+
+    private void getFlyPhone() {
+        Resources resources = this.getResources();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+        int height3 = dm.heightPixels;
+
+        //组合动画
+        animatorSetsuofang = new AnimatorSet();
+        // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f);
+        ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", height3, flyphonerl.getY());
+
+        animatorSetsuofang.setDuration(3500);
+        animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
+        animatorSetsuofang.play(scaleY);
+        animatorSetsuofang.start();
+        animatorSetsuofang.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        //flyphonerl.setVisibility(View.GONE);
+
+                        animatorSetsuofang.cancel();
+                        getFlyGoBack();
+                    }
+                }, 3500);
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+
+            }
+        });
+
+    }
+
+    private void getFlyGoBack() {
+        Resources resources = this.getResources();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+        int height3 = dm.heightPixels;
+
+        //组合动画
+        animatorSetsuofang2 = new AnimatorSet();
+        // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f);
+        ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", 0, height3);
+
+        animatorSetsuofang2.setDuration(3000);
+        animatorSetsuofang2.setInterpolator(new DecelerateInterpolator());
+        animatorSetsuofang2.play(scaleY);
+        animatorSetsuofang2.start();
+        animatorSetsuofang2.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+
+                flyphonerl.setVisibility(View.GONE);
+                animatorSetsuofang2.cancel();
+
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+
+            }
+        });
+    }
+
+    private void getExit() {
+        new MessageDialog.Builder(this)
+                .setTitle("") // 标题可以不用填写
+                .setMessage("您确定要退出吗")
+                .setConfirm("确定")
+                .setCancel("取消") // 设置 null 表示不显示取消按钮
+                //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
+                .setListener(new MessageDialog.OnListener() {
+
+                    @Override
+                    public void onConfirm(Dialog dialog) {
+                        //退出的操作
+                        startActivity(LoginActivity.class);
+                        SPUtils.logout();
+                        // 进行内存优化,销毁掉所有的界面
+                        ActivityStackManager.getInstance().finishAllActivities(LoginActivity.class);
+                    }
+
+                    @Override
+                    public void onCancel(Dialog dialog) {
+                        //toast("取消了");
+                    }
+                })
+                .show();
+    }
+
+    private void getAnimationSao() {
+        animation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
+        animation.setFillAfter(true);
+        animation.setDuration(2000);   //两秒转一圈
+        animation.setInterpolator(new LinearInterpolator());
+        animation.setRepeatCount(Animation.INFINITE);  //循环执行
+        imgreadline.startAnimation(animation);
+
+
+        int[] antenna = new int[]{R.id.reading_antenna1, R.id.reading_antenna2, R.id.reading_antenna3, R.id.reading_antenna4, R.id.reading_antenna5, R.id.reading_antenna6,
+                R.id.reading_antenna7, R.id.reading_antenna8, R.id.reading_antenna9};
+        int nfcWireIndex = 2;
+        try {
+            nfcWireIndex = Integer.parseInt(String.valueOf(SPUtils.get("PHONE_MODEL", "2")));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        alp = new AlphaAnimation(1, 0.2f);
+        alp.setStartOffset(500);
+        alp.setDuration(1000);
+        alp.setFillAfter(false);
+        alp.setInterpolator(new CycleInterpolator(2));
+        alp.setRepeatCount(Animation.INFINITE);
+        findViewById(antenna[nfcWireIndex - 1]).setAnimation(alp);
+        alp.start();
+    }
+
+    @Override
+    protected void initData() {
+        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
+//        gpsLocationManager = GPSLocationManager.getInstances(FactoryOperatorActivity.this);
+    }
+
+    //记录ProgressBar的完成进度
+    private int status = 0; //进度条进度
+    private int hasDate = 0;//每次快进多少
+    //创建一个负责更新进度的Handler
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            //表明消息是由该程序发送的
+            if (msg.what == 0x111) {
+                readpb.setProgress(status);
+                if (status == 100) {
+                    loadDiago.dismiss();
+                }
+            }
+        }
+    };
+
+    @Override
+    public void onNewIntent(Intent intent) {
+        readNfcTag(intent);
+        Log.e("***", textRecord);
+        if (textRecord != null) {
+            hasDate = 0;
+            status = 0;
+            loadDiago = new BaseDialogFragment.Builder(FactoryOperatorActivity.this)
+                    .setContentView(R.layout.progressreader)
+                    .setAnimStyle(BaseDialog.AnimStyle.SCALE)
+                    //.setText(id, "我是预设置的文本")
+                    .addOnShowListener(new BaseDialog.OnShowListener() {
+                        @Override
+                        public void onShow(BaseDialog dialog) {
+                            //toast("Dialog  显示了");
+                        }
+                    })
+                    .addOnCancelListener(new BaseDialog.OnCancelListener() {
+                        @Override
+                        public void onCancel(BaseDialog dialog) {
+                            //toast("Dialog 取消了");
+                        }
+                    })
+                    .addOnDismissListener(new BaseDialog.OnDismissListener() {
+                        @Override
+                        public void onDismiss(BaseDialog dialog) {
+                            //进度条走完 进行加载
+                            if (textRecord.length() > 94) {
+                                if (SPUtils.contains("LOCATION")) {
+                                    Log.e("LOCATION", SPUtils.get("LOCATION", "").toString());
+                                    String location[] = SPUtils.get("LOCATION", "").toString().split(",");
+                                    if (location.length > 1) {
+                                        Double latitude = Double.parseDouble(location[0]);
+                                        Double longitude = Double.parseDouble(location[1]);
+                                        String chipNumber = textRecord.substring(6, chipNumberEndIndex);
+                                        getPresenter().forFactoryOperator(chipNumber, textRecord, longitude, latitude);
+                                    } else {
+                                        toast("位置信息错误");
+                                    }
+                                } else {
+                                    toast("位置信息获取失败");
+                                }
+                            } else {
+                                toast("读取失败,请重试");
+                            }
+
+                        }
+                    })
+                    .show();
+
+            readpb = loadDiago.findViewById(R.id.read_progress);
+            //启动线程来执行任务
+            new Thread() {
+                @Override
+                public void run() {
+                    super.run();
+                    while (status < 100) {
+                        //获取耗时操作的完成百分比
+                        status = doWork();
+                        //发送消息
+                        mHandler.sendEmptyMessage(0x111);
+                    }
+                }
+            }.start();
+        }
+
+
+    }
+
+
+    //进行进度条加载
+    private int doWork() {
+        //为元素赋值
+        hasDate += 10;
+        try {
+            Thread.sleep(200);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return hasDate;
+    }
+
+    private SoundPoolHelper soundPoolHelper;
+
+    @Override
+    public void uploadChipError(String msg) {
+        if (msg.equals("芯片不存在")) {
+            soundPoolHelper.play("factory_operator_error", false);
+        }
+        toast(msg);
+    }
+
+    @Override
+    public void uploadChipSuccess(VnDetailBean data) {
+        soundPoolHelper.play("factory_operator_success", false);
+        toast("读取成功");
+
+        Log.e("FactoryOperatorActivity", data.getCode() + "");
+    }
+
+    /**
+     * 读取NFC标签文本数据
+     */
+    private void readNfcTag(Intent intent) {
+        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
+            Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
+                    NfcAdapter.EXTRA_NDEF_MESSAGES);
+            NdefMessage msgs[] = null;
+            int contentSize = 0;
+            if (rawMsgs != null) {
+                msgs = new NdefMessage[rawMsgs.length];
+                for (int i = 0; i < rawMsgs.length; i++) {
+                    msgs[i] = (NdefMessage) rawMsgs[i];
+                    contentSize += msgs[i].toByteArray().length;
+                }
+            }
+            try {
+                if (msgs != null) {
+                    NdefRecord record = msgs[0].getRecords()[0];
+                    textRecord = parseTextRecord(record);
+//                    mTagText += textRecord + "\n\ntext\n" + contentSize + " bytes";
+                }
+            } catch (Exception e) {
+            }
+        }
+    }
+
+    /**
+     * 解析NDEF文本数据
+     */
+    public static String parseTextRecord(NdefRecord ndefRecord) {
+        /**
+         * 判断数据是否为NDEF格式
+         */
+        //判断TNF
+        if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
+            return null;
+        }
+        //判断可变的长度的类型
+        if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
+            return null;
+        }
+        try {
+            byte[] bArray = ndefRecord.getPayload();
+            StringBuffer sb = new StringBuffer(bArray.length);
+            String sTemp;
+            for (int i = 0; i < bArray.length; i++) {
+                sTemp = Integer.toHexString(0xFF & bArray[i]);
+                if (sTemp.length() < 2)
+                    sb.append(0);
+                sb.append(sTemp.toUpperCase());
+            }
+            return sb.toString();
+        } catch (Exception e) {
+            throw new IllegalArgumentException();
+        }
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        //终止定位
+//        gpsLocationManager.stop();
+    }
+
+    @Override
+    protected void onDestroy() {
+        animation.cancel();
+        alp.cancel();
+        mHandler.removeCallbacksAndMessages(true);
+        super.onDestroy();
+    }
+
+
+    @Override
+    public void onBackPressed() {
+        if (DoubleClickHelper.isOnDoubleClick()) {
+            //移动到上一个任务栈,避免侧滑引起的不良反应
+            moveTaskToBack(false);
+            postDelayed(new Runnable() {
+
+                @Override
+                public void run() {
+                    // 进行内存优化,销毁掉所有的界面
+                    ActivityStackManager.getInstance().finishAllActivities();
+                    // 销毁进程
+                    System.exit(0);
+                }
+            }, 300);
+        } else {
+            toast(getResources().getString(R.string.home_exit_hint));
+        }
+    }
+
+
+    @Override
+    public boolean isSupportSwipeBack() {
+        // 不使用侧滑功能
+        return false;
+    }
+
+}
+

+ 157 - 0
.svn/pristine/0c/0c8b988227e36a6e337208a599453529058190d6.svn-base

@@ -0,0 +1,157 @@
+package eVVM.apk.ui.vaccination;
+
+import android.widget.ImageView;
+
+import com.hjq.permissions.OnPermission;
+import com.hjq.permissions.Permission;
+import com.hjq.permissions.XXPermissions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+import eVVM.apk.R;
+import eVVM.apk.helper.SPUtils;
+import eVVM.apk.mvp.MvpLazyFragment;
+import eVVM.apk.ui.bean.CategoryTimesBean;
+import eVVM.apk.ui.home.uploadChip.UploadChipOnListener;
+import eVVM.apk.ui.home.uploadChip.UploadChipPresenter;
+import eVVM.apk.ui.vaccination.categoryTimes.CategoryTimesContract;
+import eVVM.apk.ui.vaccination.categoryTimes.CategoryTimesPresenter;
+import eVVM.apk.ui.vaccination.save.ChipModel;
+
+
+public class FirstFragment extends MvpLazyFragment<CategoryTimesPresenter> implements CategoryTimesContract.View {
+
+    @BindView(R.id.first_iv_scanning)
+    ImageView firstIvScanning;
+
+    public static FirstFragment newInstance() {
+        return new FirstFragment();
+    }
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.first_fragment;
+    }
+
+    @Override
+    protected int getTitleId() {
+        return 0;
+    }
+
+    @Override
+    protected void initView() {
+
+    }
+
+    @Override
+    public void setUserVisibleHint(boolean isVisibleToUser) {
+       super.setUserVisibleHint(isVisibleToUser);
+       if (isVisibleToUser) {
+           //相当于Fragment的onResume,为true时,Fragment已经可见 
+           SPUtils.remove("INOCULATOR_LIST");
+       } else {
+           //相当于Fragment的onPause,为false时,Fragment不可见
+       }
+   }
+   //提交未上传的数据
+   private void uploadChip(){
+
+       String user_id = (String) SPUtils.get("USER_ID", "");
+       if (!user_id.equals("")) {
+           ArrayList<ChipModel> chipModelList = (ArrayList<ChipModel>) SPUtils.get("CHIP_MODEL_LIST_" + user_id, new ArrayList<ChipModel>());
+           for(ChipModel chipModel : chipModelList){
+//               getPresenter().forDoctor(chipModel.getChipNumber(),chipModel.getTextRecord(),chipModel.getInoculatorIds(),chipModel.getLongitude(),chipModel.getLatitude());
+
+           }
+       }
+   }
+
+    @Override
+    protected void initData() {
+        getPresenter().categoryTimesList();
+    }
+
+
+    @Override
+    public void categoryTimesListError(String msg) {
+
+    }
+
+    @Override
+    public void categoryTimesListSuccess(List<CategoryTimesBean.DataBean> data) {
+        for(CategoryTimesBean.DataBean bean : data){
+            SPUtils.put( "CATEGORY_TIMES_" + bean.getCode2(), bean.getOvertimes());
+        }
+    }
+
+    @Override
+    public boolean isStatusBarEnabled() {
+        // 使用沉浸式状态栏
+        return !super.isStatusBarEnabled();
+    }
+
+    @OnClick(R.id.first_iv_scanning)
+    public void onViewClicked() {
+
+        getCameraPermission();
+    }
+
+    private void getCameraPermission() {
+        XXPermissions.with(getBindingActivity())
+                //.constantRequest() //可设置被拒绝后继续申请,直到用户授权或者永久拒绝
+                //.permission(Permission.SYSTEM_ALERT_WINDOW, Permission.REQUEST_INSTALL_PACKAGES) //支持请求6.0悬浮窗权限8.0请求安装权限
+                .permission(Permission.CAMERA) //不指定权限则自动获取清单中的危险权限
+                .request(new OnPermission() {
+
+                    @Override
+                    public void hasPermission(List<String> granted, boolean isAll) {
+                        if (isAll) {
+                            //toast("获取权限成功");
+                            startActivity(QrCodeActivity.class);
+                        }else {
+                            toast("获取权限成功,部分权限未正常授予");
+                        }
+                    }
+                    @Override
+                    public void noPermission(List<String> denied, boolean quick) {
+                        if(quick) {
+                            toast("未获取到照相机权限,请手动授予");
+                            //如果是被永久拒绝就跳转到应用权限系统设置页面
+                            XXPermissions.gotoPermissionSettings(getBindingActivity());
+                        }else {
+                            toast("获取照相机权限失败,无法使用扫一扫");
+                        }
+
+                    }
+                });
+    }
+
+
+    @Override
+    public void onLoading() {
+
+    }
+
+    @Override
+    public void onComplete() {
+
+    }
+
+    @Override
+    public void onEmpty() {
+
+    }
+
+    @Override
+    public void onError() {
+
+    }
+
+    @Override
+    protected CategoryTimesPresenter createPresenter() {
+        return new CategoryTimesPresenter();
+    }
+}

BIN
.svn/pristine/0c/0ca9c51af111e99c9edf08df5f4e303453da32a7.svn-base


+ 528 - 0
.svn/pristine/0c/0ce4ee5eef23abd4b09ab05752d6e406aab5131b.svn-base

@@ -0,0 +1,528 @@
+package com.hjq.base;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.annotation.ColorRes;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.IdRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.SparseArray;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *    desc   : RecyclerView 适配器基类
+ */
+public abstract class BaseRecyclerViewAdapter
+        <T, VH extends BaseRecyclerViewAdapter.ViewHolder>
+                        extends RecyclerView.Adapter<VH> {
+
+    // 列表数据
+    private List<T> mDataSet;
+
+    // RecyclerView 对象
+    private RecyclerView mRecyclerView;
+    // 上下文对象,注意不要在构造函数中使用
+    private Context mContext;
+
+    // 条目点击事件
+    private OnItemClickListener mItemClickListener;
+    // 条目长按事件
+    private OnItemLongClickListener mItemLongClickListener;
+    // RecyclerView 滚动事件
+    private OnScrollingListener mScrollingListener;
+
+    // 条目子 View 点击事件
+    private SparseArray<OnChildClickListener> mChildClickListeners;
+    // 条目子 View 长按事件
+    private SparseArray<OnChildLongClickListener> mChildLongClickListeners;
+
+    public BaseRecyclerViewAdapter(Context context) {
+        mContext = context;
+    }
+
+    @Override
+    public int getItemCount() {
+        return mDataSet == null ? 0 : mDataSet.size();
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    /**
+     * 设置新的数据
+     */
+    public void setData(List<T> data) {
+        mDataSet = data;
+        notifyDataSetChanged();
+    }
+
+    /**
+     * 获取当前数据
+     */
+    @Nullable
+    public List<T> getData() {
+        return mDataSet;
+    }
+
+    /**
+     * 追加一些数据
+     */
+    public void addData(List<T> data) {
+        if (data == null || data.size() == 0) return;
+
+        if (mDataSet == null || mDataSet.size() == 0) {
+            setData(data);
+        }else {
+            mDataSet.addAll(data);
+            notifyItemRangeInserted(mDataSet.size() - data.size(), data.size());
+        }
+    }
+
+    /**
+     * 清空当前数据
+     */
+    public void clearData() {
+        if (mDataSet == null || mDataSet.size() == 0) return;
+
+        mDataSet.clear();
+        notifyDataSetChanged();
+    }
+
+    /**
+     * 获取某个位置上的数据
+     */
+    public T getItem(int position) {
+        return mDataSet.get(position);
+    }
+
+    /**
+     * 更新某个位置上的数据
+     */
+    public void setItem(int position, T item) {
+        if (mDataSet == null) mDataSet = new ArrayList<>();
+        mDataSet.set(position, item);
+        notifyItemChanged(position);
+    }
+
+    /**
+     * 添加单条数据
+     */
+    public void addItem(T item) {
+        if (mDataSet == null) mDataSet = new ArrayList<>();
+
+        addItem(mDataSet.size(), item);
+    }
+
+    public void addItem(int position, T item) {
+        if (mDataSet == null) mDataSet = new ArrayList<>();
+
+        if (position < mDataSet.size()) {
+            mDataSet.add(position, item);
+        } else {
+            mDataSet.add(item);
+            position = mDataSet.size() - 1;
+        }
+        notifyItemInserted(position);
+    }
+
+    /**
+     * 删除单条数据
+     */
+    public void removeItem(T item) {
+        int index = mDataSet.indexOf(item);
+        if (index != -1) {
+            removeItem(index);
+        }
+    }
+
+    public void removeItem(int position) {
+        //如果是在for循环删除后要记得i--
+        mDataSet.remove(position);
+        //告诉适配器删除数据的位置,会有动画效果
+        notifyItemRemoved(position);
+    }
+
+    /**
+     * 获取RecyclerView对象,需要在setAdapter之后绑定
+     */
+    public RecyclerView getRecyclerView() {
+        return mRecyclerView;
+    }
+
+    /**
+     * 获取上下文对象,注意不要在构造方法中调用
+     */
+    public Context getContext() {
+        return mContext;
+    }
+
+    /**
+     * 获取资源对象
+     */
+    protected Resources getResources() {
+        return mContext.getResources();
+    }
+
+    /**
+     * 获取资源文本
+     */
+    public String getString(@StringRes int resId) {
+        return mContext.getString(resId);
+    }
+
+    /**
+     * 获取资源颜色
+     */
+    protected int getColor(@ColorRes int id) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            return mContext.getColor(id);
+        }else {
+            return mContext.getResources().getColor(id);
+        }
+    }
+
+    /**
+     * 获取资源图像
+     */
+    protected Drawable getDrawable(@DrawableRes int id) {
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            return mContext.getDrawable(id);
+        }else {
+            return mContext.getResources().getDrawable(id);
+        }
+    }
+
+    /**
+     * 条目ViewHolder,需要子类ViewHolder继承
+     */
+    public class ViewHolder extends RecyclerView.ViewHolder
+            implements View.OnClickListener, View.OnLongClickListener {
+
+        // 内存优化和防止泄露
+        private SparseArray<WeakReference<View>> mViews = new SparseArray<>();
+
+        public ViewHolder(ViewGroup parent, int layoutId) {
+            this(LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false));
+        }
+
+        public ViewHolder(View itemView) {
+            super(itemView);
+            initViewListener();
+        }
+
+        /**
+         * 初始化 View 的监听
+         */
+        private void initViewListener() {
+
+            // 设置条目的点击和长按事件
+            if (mItemClickListener != null) {
+                getItemView().setOnClickListener(this);
+            }
+            if (mItemLongClickListener != null) {
+                getItemView().setOnLongClickListener(this);
+            }
+
+            // 设置条目子 View 点击和长按事件
+            if (mChildClickListeners != null) {
+                for (int i = 0; i < mChildClickListeners.size(); i++) {
+                    View childView = findViewById(mChildClickListeners.keyAt(i));
+                    if (childView != null) {
+                        childView.setOnClickListener(this);
+                    }
+                }
+            }
+            if (mChildLongClickListeners != null) {
+                for (int i = 0; i < mChildLongClickListeners.size(); i++) {
+                    View childView = findViewById(mChildLongClickListeners.keyAt(i));
+                    if (childView != null) {
+                        childView.setOnLongClickListener(this);
+                    }
+                }
+            }
+        }
+
+        /**
+         * {@link View.OnClickListener}
+         */
+
+        @Override
+        public void onClick(View v) {
+            if (v == getItemView()) {
+                if(mItemClickListener != null) {
+                    mItemClickListener.onItemClick(mRecyclerView, v, getLayoutPosition());
+                    return;
+                }
+            }
+            if (mChildClickListeners != null) {
+                OnChildClickListener childClickListener = mChildClickListeners.get(v.getId());
+                if (childClickListener != null) {
+                    childClickListener.onChildClick(mRecyclerView, v, getLayoutPosition());
+                }
+            }
+        }
+
+        /**
+         * {@link View.OnLongClickListener}
+         */
+
+        @Override
+        public boolean onLongClick(View v) {
+            if (v == getItemView()) {
+                if (mItemLongClickListener != null) {
+                    return mItemLongClickListener.onItemLongClick(mRecyclerView, v, getLayoutPosition());
+                }
+            }
+            if (mChildLongClickListeners != null) {
+                OnChildLongClickListener childClickLongListener = mChildLongClickListeners.get(v.getId());
+                if (childClickLongListener != null) {
+                    childClickLongListener.onChildLongClick(mRecyclerView, v, getLayoutPosition());
+                }
+            }
+            return false;
+        }
+
+        public final View  getItemView() {
+            return itemView;
+        }
+
+        @SuppressWarnings("unchecked")
+        public final <V extends View> V findViewById(@IdRes int viewId) {
+            WeakReference<View> reference = mViews.get(viewId);
+            if (reference != null && reference.get() != null) {
+                return (V) reference.get();
+            }else {
+                View view = getItemView().findViewById(viewId);
+                mViews.put(viewId, new WeakReference<>(view));
+                return (V) view;
+            }
+        }
+    }
+
+    @Override
+    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
+        mRecyclerView = recyclerView;
+        //用户设置了滚动监听,需要给RecyclerView设置监听
+        if (mScrollListener != null) {
+            //添加滚动监听
+            mRecyclerView.addOnScrollListener(mScrollListener);
+        }
+        //判断当前的布局管理器是否为空,如果为空则设置默认的布局管理器
+        if (mRecyclerView.getLayoutManager() == null) {
+            RecyclerView.LayoutManager manager = getDefaultLayoutManager(mContext);
+            if (manager != null) {
+                mRecyclerView.setLayoutManager(manager);
+            }
+        }
+    }
+
+    @Override
+    public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
+        //移除滚动监听
+        if (mScrollListener != null) {
+            mRecyclerView.removeOnScrollListener(mScrollListener);
+        }
+        mRecyclerView = null;
+    }
+
+    /**
+     * 获取默认的布局摆放器
+     */
+    protected RecyclerView.LayoutManager getDefaultLayoutManager(Context context) {
+        return new LinearLayoutManager(context);
+    }
+
+    /**
+     * 设置RecyclerView条目点击监听
+     */
+    public void setOnItemClickListener(OnItemClickListener l) {
+        checkRecyclerViewState();
+        mItemClickListener = l;
+    }
+
+    /**
+     * 设置 RecyclerView 条目子 View 点击监听
+     */
+    public void setOnChildClickListener(@IdRes int childId, OnChildClickListener l) {
+        checkRecyclerViewState();
+        if (mChildClickListeners == null) {
+            mChildClickListeners = new SparseArray<>();
+        }
+        mChildClickListeners.put(childId, l);
+    }
+
+    /**
+     * 设置RecyclerView条目长按监听
+     */
+    public void setOnItemLongClickListener(OnItemLongClickListener l) {
+        checkRecyclerViewState();
+        mItemLongClickListener = l;
+    }
+
+    /**
+     * 设置 RecyclerView 条目子 View 长按监听
+     */
+    public void setOnChildLongClickListener(@IdRes int childId, OnChildLongClickListener l) {
+        checkRecyclerViewState();
+        if (mChildLongClickListeners == null) {
+            mChildLongClickListeners = new SparseArray<>();
+        }
+        mChildLongClickListeners.put(childId, l);
+    }
+
+    private void checkRecyclerViewState() {
+        if (mRecyclerView != null) {
+            // 必须在 RecyclerView.setAdapter() 之前设置监听
+            throw new IllegalStateException("Binding adapters is not allowed before setting listeners");
+        }
+    }
+
+    /**
+     * 设置RecyclerView条目滚动监听
+     */
+    public void setOnScrollingListener(OnScrollingListener l) {
+        mScrollingListener = l;
+
+        //如果当前已经有设置滚动监听,再次设置需要移除原有的监听器
+        if (mScrollListener == null) {
+            mScrollListener = new ScrollListener();
+        }else {
+            mRecyclerView.removeOnScrollListener(mScrollListener);
+        }
+        //用户设置了滚动监听,需要给RecyclerView设置监听
+        if (mRecyclerView != null) {
+            //添加滚动监听
+            mRecyclerView.addOnScrollListener(mScrollListener);
+        }
+    }
+
+    //自定义滚动监听器
+    private ScrollListener mScrollListener;
+
+    private class ScrollListener extends RecyclerView.OnScrollListener {
+
+        @Override
+        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+
+            if (mScrollingListener == null) return;
+
+            if (newState == RecyclerView.SCROLL_STATE_IDLE) {
+
+                if (!recyclerView.canScrollVertically(1)) {
+                    //是否能向下滚动,false表示已经滚动到底部
+                    mScrollingListener.onScrollDown(recyclerView);
+                }else if (!recyclerView.canScrollVertically(-1)) {
+                    //是否能向上滚动,false表示已经滚动到顶部
+                    mScrollingListener.onScrollTop(recyclerView);
+                }
+
+            }else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
+                //正在滚动中
+                mScrollingListener.onScrolling(recyclerView);
+            }
+        }
+    }
+
+    /**
+     * RecyclerView 滚动监听类
+     */
+    public interface OnScrollingListener {
+
+        /**
+         * 列表滚动到最顶部
+         *
+         * @param recyclerView      RecyclerView对象
+         */
+        void onScrollTop(RecyclerView recyclerView);
+
+        /**
+         * 列表滚动到最底部
+         *
+         * @param recyclerView      RecyclerView对象
+         */
+        void onScrollDown(RecyclerView recyclerView);
+
+        /**
+         * 列表滚动中
+         *
+         * @param recyclerView      RecyclerView对象
+         */
+        void onScrolling(RecyclerView recyclerView);
+    }
+
+    /**
+     * RecyclerView 条目点击监听类
+     */
+    public interface OnItemClickListener{
+
+        /**
+         * 当 RecyclerView 某个条目被点击时回调
+         *
+         * @param recyclerView      RecyclerView对象
+         * @param itemView          被点击的条目对象
+         * @param position          被点击的条目位置
+         */
+        void onItemClick(RecyclerView recyclerView, View itemView, int position);
+    }
+
+    /**
+     * RecyclerView 条目长按监听类
+     */
+    public interface OnItemLongClickListener {
+
+        /**
+         * 当 RecyclerView 某个条目被长按时回调
+         *
+         * @param recyclerView      RecyclerView对象
+         * @param itemView          被点击的条目对象
+         * @param position          被点击的条目位置
+         * @return                  是否拦截事件
+         */
+        boolean onItemLongClick(RecyclerView recyclerView, View itemView, int position);
+    }
+
+    /**
+     * RecyclerView 条目子 View 点击监听类
+     */
+    public interface OnChildClickListener {
+
+        /**
+         * 当 RecyclerView 某个条目 子 View 被点击时回调
+         *
+         * @param recyclerView      RecyclerView对象
+         * @param childView         被点击的条目子 View Id
+         * @param position          被点击的条目位置
+         */
+        void onChildClick(RecyclerView recyclerView, View childView, int position);
+    }
+
+    /**
+     * RecyclerView 条目子 View 长按监听类
+     */
+    public interface OnChildLongClickListener {
+
+        /**
+         * 当 RecyclerView 某个条目子 View 被长按时回调
+         *
+         * @param recyclerView      RecyclerView对象
+         * @param childView         被点击的条目子 View Id
+         * @param position          被点击的条目位置
+         */
+        void onChildLongClick(RecyclerView recyclerView, View childView, int position);
+    }
+}

+ 37 - 0
.svn/pristine/0d/0d14fc1eefe0ce89e6f4b26dc8fa94b3a7bb46ac.svn-base

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="250dp"
+    android:layout_height="250dp"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:layout_width="250dp"
+        android:layout_height="250dp"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="努力读取中..."
+            android:layout_gravity="center_horizontal"
+            android:textColor="@color/white"
+            android:textSize="17sp" />
+
+        <ProgressBar
+            android:id="@+id/read_progress"
+            style="@android:style/Widget.ProgressBar.Horizontal"
+            android:layout_width="174dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="50dp"
+            android:max="100"
+            android:maxHeight="4dp"
+            android:minHeight="4dp"
+            android:progress="0"
+            android:progressDrawable="@drawable/m_progress_horizontal"
+            />
+    </LinearLayout>
+
+
+</FrameLayout>

+ 749 - 0
.svn/pristine/0d/0d28a18363d469e65fab8e7ab68c43cd5f205b64.svn-base

@@ -0,0 +1,749 @@
+package com.hjq.dialog.widget;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.SystemClock;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.View;
+import android.view.animation.AnimationUtils;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.Interpolator;
+
+import com.hjq.dialog.R;
+
+/**
+ *    desc   : 圆形进度加载自定义控件
+ */
+public final class CircleProgressView extends View {
+
+    public static final long FRAME_DURATION = 1000 / 60;
+
+    private static final int MODE_DETERMINATE = 0;
+    private static final int MODE_INDETERMINATE = 1;
+
+    private boolean isStart = false;
+    private boolean isAutoStart = true;
+
+    private CircularProgressDrawable mCircularProgressDrawable;
+
+    public CircleProgressView(Context context) {
+        this(context, null);
+    }
+
+    public CircleProgressView(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public CircleProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+
+        mCircularProgressDrawable = new CircularProgressDrawable.Builder(context, R.style.CircularProgress).build();
+        setBackground(mCircularProgressDrawable);
+    }
+
+    @Override
+    public void setBackground(Drawable background) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+            super.setBackground(background);
+        }else {
+            setBackgroundDrawable(background);
+        }
+    }
+
+    public CircularProgressDrawable getCircularProgressDrawable() {
+        return mCircularProgressDrawable;
+    }
+
+    public void setAutoStart(boolean autoStart) {
+        isAutoStart = autoStart;
+    }
+
+    /**
+     * set the stroke size with px
+     */
+    public void setStrokeSizePx(int px) {
+        getCircularProgressDrawable().setStrokeSize(px);
+    }
+
+    /**
+     * set the stroke size with dp
+     */
+    public void setStrokeSizeDp(float dp) {
+        getCircularProgressDrawable().setStrokeSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getContext().getResources().getDisplayMetrics()));
+    }
+
+    /**
+     * set the colors with int[]
+     */
+    public void setStrokeColors(int[] strokeColors) {
+        getCircularProgressDrawable().setStrokeColors(strokeColors);
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        if (isAutoStart) {
+            start();
+        }
+    }
+
+    @Override
+    protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
+        if (visibility == GONE || visibility == INVISIBLE && isStart) {
+            stop();
+        } else {
+            if (isAutoStart) {
+                start();
+            }
+        }
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        if (isStart && getVisibility() == View.VISIBLE) {
+            stop();
+        }
+        super.onDetachedFromWindow();
+    }
+
+    /**
+     * Start showing progress.
+     */
+    public void start() {
+        if (mCircularProgressDrawable != null) {
+            mCircularProgressDrawable.start();
+            isStart = true;
+        }
+    }
+
+    /**
+     * Stop showing progress.
+     */
+    public void stop() {
+        if (mCircularProgressDrawable != null && isStart) {
+            mCircularProgressDrawable.stop();
+            isStart = false;
+        }
+    }
+
+    static class CircularProgressDrawable extends Drawable implements Animatable {
+
+        private long mLastUpdateTime;
+        private long mLastProgressStateTime;
+        private long mLastRunStateTime;
+
+        private int mProgressState;
+
+        private static final int PROGRESS_STATE_HIDE = -1;
+        private static final int PROGRESS_STATE_STRETCH = 0;
+        private static final int PROGRESS_STATE_KEEP_STRETCH = 1;
+        private static final int PROGRESS_STATE_SHRINK = 2;
+        private static final int PROGRESS_STATE_KEEP_SHRINK = 3;
+
+        private int mRunState = RUN_STATE_STOPPED;
+
+        private static final int RUN_STATE_STOPPED = 0;
+        private static final int RUN_STATE_STARTING = 1;
+        private static final int RUN_STATE_STARTED = 2;
+        private static final int RUN_STATE_RUNNING = 3;
+        private static final int RUN_STATE_STOPPING = 4;
+
+        private Paint mPaint;
+        private RectF mRect;
+        private float mStartAngle;
+        private float mSweepAngle;
+        private int mStrokeColorIndex;
+
+        private int mPadding;
+        private float mInitialAngle;
+        private float mMaxSweepAngle;
+        private float mMinSweepAngle;
+        private int mStrokeSize;
+        private int[] mStrokeColors;
+        private boolean mReverse;
+        private int mRotateDuration;
+        private int mTransformDuration;
+        private int mKeepDuration;
+        private float mInStepPercent;
+        private int[] mInColors;
+        private int mInAnimationDuration;
+        private int mOutAnimationDuration;
+        private int mProgressMode;
+        private Interpolator mTransformInterpolator;
+
+        private CircularProgressDrawable(int padding, float initialAngle, float maxSweepAngle, float minSweepAngle,
+                                         int strokeSize, int[] strokeColors, boolean reverse,
+                                         int rotateDuration, int transformDuration, int keepDuration,
+                                         Interpolator transformInterpolator, int progressMode, int inAnimDuration,
+                                         float inStepPercent, int[] inStepColors, int outAnimDuration) {
+            mPadding = padding;
+            mInitialAngle = initialAngle;
+            mMaxSweepAngle = maxSweepAngle;
+            mMinSweepAngle = minSweepAngle;
+            mStrokeSize = strokeSize;
+            mStrokeColors = strokeColors;
+            mReverse = reverse;
+            mRotateDuration = rotateDuration;
+            mTransformDuration = transformDuration;
+            mKeepDuration = keepDuration;
+            mTransformInterpolator = transformInterpolator;
+            mProgressMode = progressMode;
+            mInAnimationDuration = inAnimDuration;
+            mInStepPercent = inStepPercent;
+            mInColors = inStepColors;
+            mOutAnimationDuration = outAnimDuration;
+
+            mPaint = new Paint();
+            mPaint.setAntiAlias(true);
+            mPaint.setStrokeCap(Paint.Cap.ROUND);
+            mPaint.setStrokeJoin(Paint.Join.ROUND);
+
+            mRect = new RectF();
+        }
+
+        @Override
+        public void draw(@NonNull Canvas canvas) {
+            drawIndeterminate(canvas);
+        }
+
+        private int getIndeterminateStrokeColor() {
+            if (mProgressState != PROGRESS_STATE_KEEP_SHRINK || mStrokeColors.length == 1)
+                return mStrokeColors[mStrokeColorIndex];
+
+            float value = Math.max(0f, Math.min(1f, (float) (SystemClock.uptimeMillis() - mLastProgressStateTime) / mKeepDuration));
+            int prev_index = mStrokeColorIndex == 0 ? mStrokeColors.length - 1 : mStrokeColorIndex - 1;
+
+            return getMiddleColor(mStrokeColors[prev_index], mStrokeColors[mStrokeColorIndex], value);
+        }
+
+        private void drawIndeterminate(Canvas canvas) {
+            if (mRunState == RUN_STATE_STARTING) {
+                Rect bounds = getBounds();
+                float x = (bounds.left + bounds.right) / 2f;
+                float y = (bounds.top + bounds.bottom) / 2f;
+                float maxRadius = (Math.min(bounds.width(), bounds.height()) - mPadding * 2) / 2f;
+
+                float stepTime = 1f / (mInStepPercent * (mInColors.length + 2) + 1);
+                float time = (float) (SystemClock.uptimeMillis() - mLastRunStateTime) / mInAnimationDuration;
+                float steps = time / stepTime;
+
+                float outerRadius = 0f;
+                float innerRadius = 0f;
+
+                for (int i = (int) Math.floor(steps); i >= 0; i--) {
+                    innerRadius = outerRadius;
+                    outerRadius = Math.min(1f, (steps - i) * mInStepPercent) * maxRadius;
+
+                    if (i >= mInColors.length)
+                        continue;
+
+                    if (innerRadius == 0) {
+                        mPaint.setColor(mInColors[i]);
+                        mPaint.setStyle(Paint.Style.FILL);
+                        canvas.drawCircle(x, y, outerRadius, mPaint);
+                    } else if (outerRadius > innerRadius) {
+                        float radius = (innerRadius + outerRadius) / 2;
+                        mRect.set(x - radius, y - radius, x + radius, y + radius);
+
+                        mPaint.setStrokeWidth(outerRadius - innerRadius);
+                        mPaint.setStyle(Paint.Style.STROKE);
+                        mPaint.setColor(mInColors[i]);
+
+                        canvas.drawCircle(x, y, radius, mPaint);
+                    } else
+                        break;
+                }
+
+                if (mProgressState == PROGRESS_STATE_HIDE) {
+                    if (steps >= 1 / mInStepPercent || time >= 1) {
+                        resetAnimation();
+                        mProgressState = PROGRESS_STATE_STRETCH;
+                    }
+                } else {
+                    float radius = maxRadius - mStrokeSize / 2f;
+
+                    mRect.set(x - radius, y - radius, x + radius, y + radius);
+                    mPaint.setStrokeWidth(mStrokeSize);
+                    mPaint.setStyle(Paint.Style.STROKE);
+                    mPaint.setColor(getIndeterminateStrokeColor());
+
+                    canvas.drawArc(mRect, mStartAngle, mSweepAngle, false, mPaint);
+                }
+            } else if (mRunState == RUN_STATE_STOPPING) {
+                float size = (float) mStrokeSize * Math.max(0, (mOutAnimationDuration - SystemClock.uptimeMillis() + mLastRunStateTime)) / mOutAnimationDuration;
+
+                if (size > 0) {
+                    Rect bounds = getBounds();
+                    float radius = (Math.min(bounds.width(), bounds.height()) - mPadding * 2 - mStrokeSize * 2 + size) / 2f;
+                    float x = (bounds.left + bounds.right) / 2f;
+                    float y = (bounds.top + bounds.bottom) / 2f;
+
+                    mRect.set(x - radius, y - radius, x + radius, y + radius);
+                    mPaint.setStrokeWidth(size);
+                    mPaint.setStyle(Paint.Style.STROKE);
+                    mPaint.setColor(getIndeterminateStrokeColor());
+
+                    canvas.drawArc(mRect, mStartAngle, mSweepAngle, false, mPaint);
+                }
+            } else if (mRunState != RUN_STATE_STOPPED) {
+                Rect bounds = getBounds();
+                float radius = (Math.min(bounds.width(), bounds.height()) - mPadding * 2 - mStrokeSize) / 2f;
+                float x = (bounds.left + bounds.right) / 2f;
+                float y = (bounds.top + bounds.bottom) / 2f;
+
+                mRect.set(x - radius, y - radius, x + radius, y + radius);
+                mPaint.setStrokeWidth(mStrokeSize);
+                mPaint.setStyle(Paint.Style.STROKE);
+                mPaint.setColor(getIndeterminateStrokeColor());
+
+                canvas.drawArc(mRect, mStartAngle, mSweepAngle, false, mPaint);
+            }
+        }
+
+        public void setStrokeSize(int mStrokeSize) {
+            this.mStrokeSize = mStrokeSize;
+        }
+
+        public void setStrokeColors(int[] mStrokeColors) {
+            this.mStrokeColors = mStrokeColors;
+        }
+
+        @Override
+        public void setAlpha(int alpha) {
+            mPaint.setAlpha(alpha);
+        }
+
+        @Override
+        public void setColorFilter(ColorFilter cf) {
+            mPaint.setColorFilter(cf);
+        }
+
+        @Override
+        public int getOpacity() {
+            return PixelFormat.TRANSLUCENT;
+        }
+
+        private void resetAnimation() {
+            mLastUpdateTime = SystemClock.uptimeMillis();
+            mLastProgressStateTime = mLastUpdateTime;
+            mStartAngle = mInitialAngle;
+            mStrokeColorIndex = 0;
+            mSweepAngle = mReverse ? -mMinSweepAngle : mMinSweepAngle;
+        }
+
+        @Override
+        public void start() {
+            start(mInAnimationDuration > 0);
+        }
+
+        @Override
+        public void stop() {
+            stop(mOutAnimationDuration > 0);
+        }
+
+        private void start(boolean withAnimation) {
+            if (isRunning())
+                return;
+
+            resetAnimation();
+
+            if (withAnimation) {
+                mRunState = RUN_STATE_STARTING;
+                mLastRunStateTime = SystemClock.uptimeMillis();
+                mProgressState = PROGRESS_STATE_HIDE;
+            }
+
+            scheduleSelf(mUpdater, SystemClock.uptimeMillis() + FRAME_DURATION);
+            invalidateSelf();
+        }
+
+        private void stop(boolean withAnimation) {
+            if (!isRunning())
+                return;
+
+            if (withAnimation) {
+                mLastRunStateTime = SystemClock.uptimeMillis();
+                if (mRunState == RUN_STATE_STARTED) {
+                    scheduleSelf(mUpdater, SystemClock.uptimeMillis() + FRAME_DURATION);
+                    invalidateSelf();
+                }
+                mRunState = RUN_STATE_STOPPING;
+            } else {
+                mRunState = RUN_STATE_STOPPED;
+                unscheduleSelf(mUpdater);
+                invalidateSelf();
+            }
+        }
+
+        @Override
+        public boolean isRunning() {
+            return mRunState != RUN_STATE_STOPPED;
+        }
+
+        @Override
+        public void scheduleSelf(Runnable what, long when) {
+            if (mRunState == RUN_STATE_STOPPED)
+                mRunState = mInAnimationDuration > 0 ? RUN_STATE_STARTING : RUN_STATE_RUNNING;
+            super.scheduleSelf(what, when);
+        }
+
+        private final Runnable mUpdater = new Runnable() {
+
+            @Override
+            public void run() {
+                update();
+            }
+        };
+
+        private void update() {
+            switch (mProgressMode) {
+                case CircleProgressView.MODE_DETERMINATE:
+                    updateDeterminate();
+                    break;
+                case CircleProgressView.MODE_INDETERMINATE:
+                    updateIndeterminate();
+                    break;
+            }
+        }
+
+        private void updateDeterminate() {
+            long curTime = SystemClock.uptimeMillis();
+            float rotateOffset = (curTime - mLastUpdateTime) * 360f / mRotateDuration;
+            if (mReverse)
+                rotateOffset = -rotateOffset;
+            mLastUpdateTime = curTime;
+
+            mStartAngle += rotateOffset;
+
+            if (mRunState == RUN_STATE_STARTING) {
+                if (curTime - mLastRunStateTime > mInAnimationDuration) {
+                    mRunState = RUN_STATE_RUNNING;
+                }
+            } else if (mRunState == RUN_STATE_STOPPING) {
+                if (curTime - mLastRunStateTime > mOutAnimationDuration) {
+                    stop(false);
+                    return;
+                }
+            }
+
+            if (isRunning())
+                scheduleSelf(mUpdater, SystemClock.uptimeMillis() + FRAME_DURATION);
+
+            invalidateSelf();
+        }
+
+        private void updateIndeterminate() {
+            //update animation
+            long curTime = SystemClock.uptimeMillis();
+            float rotateOffset = (curTime - mLastUpdateTime) * 360f / mRotateDuration;
+            if (mReverse)
+                rotateOffset = -rotateOffset;
+            mLastUpdateTime = curTime;
+
+            switch (mProgressState) {
+                case PROGRESS_STATE_STRETCH:
+                    if (mTransformDuration <= 0) {
+                        mSweepAngle = mReverse ? -mMinSweepAngle : mMinSweepAngle;
+                        mProgressState = PROGRESS_STATE_KEEP_STRETCH;
+                        mStartAngle += rotateOffset;
+                        mLastProgressStateTime = curTime;
+                    } else {
+                        float value = (curTime - mLastProgressStateTime) / (float) mTransformDuration;
+                        float maxAngle = mReverse ? -mMaxSweepAngle : mMaxSweepAngle;
+                        float minAngle = mReverse ? -mMinSweepAngle : mMinSweepAngle;
+
+                        mStartAngle += rotateOffset;
+                        mSweepAngle = mTransformInterpolator.getInterpolation(value) * (maxAngle - minAngle) + minAngle;
+
+                        if (value > 1f) {
+                            mSweepAngle = maxAngle;
+                            mProgressState = PROGRESS_STATE_KEEP_STRETCH;
+                            mLastProgressStateTime = curTime;
+                        }
+                    }
+                    break;
+                case PROGRESS_STATE_KEEP_STRETCH:
+                    mStartAngle += rotateOffset;
+
+                    if (curTime - mLastProgressStateTime > mKeepDuration) {
+                        mProgressState = PROGRESS_STATE_SHRINK;
+                        mLastProgressStateTime = curTime;
+                    }
+                    break;
+                case PROGRESS_STATE_SHRINK:
+                    if (mTransformDuration <= 0) {
+                        mSweepAngle = mReverse ? -mMinSweepAngle : mMinSweepAngle;
+                        mProgressState = PROGRESS_STATE_KEEP_SHRINK;
+                        mStartAngle += rotateOffset;
+                        mLastProgressStateTime = curTime;
+                        mStrokeColorIndex = (mStrokeColorIndex + 1) % mStrokeColors.length;
+                    } else {
+                        float value = (curTime - mLastProgressStateTime) / (float) mTransformDuration;
+                        float maxAngle = mReverse ? -mMaxSweepAngle : mMaxSweepAngle;
+                        float minAngle = mReverse ? -mMinSweepAngle : mMinSweepAngle;
+
+                        float newSweepAngle = (1f - mTransformInterpolator.getInterpolation(value)) * (maxAngle - minAngle) + minAngle;
+                        mStartAngle += rotateOffset + mSweepAngle - newSweepAngle;
+                        mSweepAngle = newSweepAngle;
+
+                        if (value > 1f) {
+                            mSweepAngle = minAngle;
+                            mProgressState = PROGRESS_STATE_KEEP_SHRINK;
+                            mLastProgressStateTime = curTime;
+                            mStrokeColorIndex = (mStrokeColorIndex + 1) % mStrokeColors.length;
+                        }
+                    }
+                    break;
+                case PROGRESS_STATE_KEEP_SHRINK:
+                    mStartAngle += rotateOffset;
+
+                    if (curTime - mLastProgressStateTime > mKeepDuration) {
+                        mProgressState = PROGRESS_STATE_STRETCH;
+                        mLastProgressStateTime = curTime;
+                    }
+                    break;
+            }
+
+            if (mRunState == RUN_STATE_STARTING) {
+                if (curTime - mLastRunStateTime > mInAnimationDuration) {
+                    mRunState = RUN_STATE_RUNNING;
+                    if (mProgressState == PROGRESS_STATE_HIDE) {
+                        resetAnimation();
+                        mProgressState = PROGRESS_STATE_STRETCH;
+                    }
+                }
+            } else if (mRunState == RUN_STATE_STOPPING) {
+                if (curTime - mLastRunStateTime > mOutAnimationDuration) {
+                    stop(false);
+                    return;
+                }
+            }
+
+            if (isRunning())
+                scheduleSelf(mUpdater, SystemClock.uptimeMillis() + FRAME_DURATION);
+
+            invalidateSelf();
+        }
+
+        public static class Builder {
+            private int mPadding;
+            private float mInitialAngle;
+            private float mMaxSweepAngle;
+            private float mMinSweepAngle;
+            private int mStrokeSize;
+            private int[] mStrokeColors;
+            private boolean mReverse;
+            private int mRotateDuration;
+            private int mTransformDuration;
+            private int mKeepDuration;
+            private Interpolator mTransformInterpolator;
+            private int mProgressMode;
+            private float mInStepPercent;
+            private int[] mInColors;
+            private int mInAnimationDuration;
+            private int mOutAnimationDuration;
+
+            public Builder(Context context, int defStyleRes) {
+                this(context, null, 0, defStyleRes);
+            }
+
+            public Builder(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+                TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CircularProgressDrawable, defStyleAttr, defStyleRes);
+                int resId;
+
+                padding(array.getDimensionPixelSize(R.styleable.CircularProgressDrawable_cpd_padding, 0));
+                initialAngle(array.getInteger(R.styleable.CircularProgressDrawable_cpd_initialAngle, 0));
+                maxSweepAngle(array.getInteger(R.styleable.CircularProgressDrawable_cpd_maxSweepAngle, 270));
+                minSweepAngle(array.getInteger(R.styleable.CircularProgressDrawable_cpd_minSweepAngle, 1));
+                strokeSize(array.getDimensionPixelSize(R.styleable.CircularProgressDrawable_cpd_strokeSize, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, context.getResources().getDisplayMetrics())));
+                strokeColors(array.getColor(R.styleable.CircularProgressDrawable_cpd_strokeColor, colorPrimary(context, 0xFF000000)));
+                if ((resId = array.getResourceId(R.styleable.CircularProgressDrawable_cpd_strokeColors, 0)) != 0) {
+                    TypedArray ta = context.getResources().obtainTypedArray(resId);
+                    int[] colors = new int[ta.length()];
+                    for (int j = 0; j < ta.length(); j++)
+                        colors[j] = ta.getColor(j, 0);
+                    ta.recycle();
+                    strokeColors(colors);
+                }
+                reverse(array.getBoolean(R.styleable.CircularProgressDrawable_cpd_reverse, false));
+                rotateDuration(array.getInteger(R.styleable.CircularProgressDrawable_cpd_rotateDuration, context.getResources().getInteger(android.R.integer.config_longAnimTime)));
+                transformDuration(array.getInteger(R.styleable.CircularProgressDrawable_cpd_transformDuration, context.getResources().getInteger(android.R.integer.config_mediumAnimTime)));
+                keepDuration(array.getInteger(R.styleable.CircularProgressDrawable_cpd_keepDuration, context.getResources().getInteger(android.R.integer.config_shortAnimTime)));
+                if ((resId = array.getResourceId(R.styleable.CircularProgressDrawable_cpd_transformInterpolator, 0)) != 0)
+                    transformInterpolator(AnimationUtils.loadInterpolator(context, resId));
+                progressMode(array.getResourceId(R.styleable.CircularProgressDrawable_pv_progressMode, CircleProgressView.MODE_INDETERMINATE));
+                //progressMode(a.getInteger(R.styleable.CircularProgressDrawable_pv_progressMode, ProgressView.MODE_INDETERMINATE));
+                inAnimDuration(array.getInteger(R.styleable.CircularProgressDrawable_cpd_inAnimDuration, context.getResources().getInteger(android.R.integer.config_mediumAnimTime)));
+                if ((resId = array.getResourceId(R.styleable.CircularProgressDrawable_cpd_inStepColors, 0)) != 0) {
+                    TypedArray ta = context.getResources().obtainTypedArray(resId);
+                    int[] colors = new int[ta.length()];
+                    for (int j = 0; j < ta.length(); j++) {
+                        colors[j] = ta.getColor(j, 0);
+                    }
+                    ta.recycle();
+                    inStepColors(colors);
+                }
+                inStepPercent(array.getFloat(R.styleable.CircularProgressDrawable_cpd_inStepPercent, 0.5f));
+                outAnimDuration(array.getInteger(R.styleable.CircularProgressDrawable_cpd_outAnimDuration, context.getResources().getInteger(android.R.integer.config_mediumAnimTime)));
+                array.recycle();
+            }
+
+            public CircularProgressDrawable build() {
+                if (mStrokeColors == null)
+                    mStrokeColors = new int[]{0xFF0099FF};
+
+                if (mInColors == null && mInAnimationDuration > 0)
+                    mInColors = new int[]{0xFFB5D4FF, 0xFFDEEAFC, 0xFFFAFFFE};
+
+                if (mTransformInterpolator == null)
+                    mTransformInterpolator = new DecelerateInterpolator();
+
+                return new CircularProgressDrawable(mPadding, mInitialAngle, mMaxSweepAngle, mMinSweepAngle, mStrokeSize,
+                        mStrokeColors, mReverse, mRotateDuration, mTransformDuration, mKeepDuration,
+                        mTransformInterpolator, mProgressMode, mInAnimationDuration, mInStepPercent, mInColors, mOutAnimationDuration);
+            }
+
+            public Builder padding(int padding) {
+                mPadding = padding;
+                return this;
+            }
+
+            public Builder initialAngle(float angle) {
+                mInitialAngle = angle;
+                return this;
+            }
+
+            public Builder maxSweepAngle(float angle) {
+                mMaxSweepAngle = angle;
+                return this;
+            }
+
+            public Builder minSweepAngle(float angle) {
+                mMinSweepAngle = angle;
+                return this;
+            }
+
+            public Builder strokeSize(int strokeSize) {
+                mStrokeSize = strokeSize;
+                return this;
+            }
+
+            public Builder strokeColors(int... strokeColors) {
+                mStrokeColors = strokeColors;
+                return this;
+            }
+
+            public Builder reverse(boolean reverse) {
+                mReverse = reverse;
+                return this;
+            }
+
+            public Builder rotateDuration(int duration) {
+                mRotateDuration = duration;
+                return this;
+            }
+
+            public Builder transformDuration(int duration) {
+                mTransformDuration = duration;
+                return this;
+            }
+
+            public Builder keepDuration(int duration) {
+                mKeepDuration = duration;
+                return this;
+            }
+
+            public Builder transformInterpolator(Interpolator interpolator) {
+                mTransformInterpolator = interpolator;
+                return this;
+            }
+
+            public Builder progressMode(int mode) {
+                mProgressMode = mode;
+                return this;
+            }
+
+            public Builder inAnimDuration(int duration) {
+                mInAnimationDuration = duration;
+                return this;
+            }
+
+            public Builder inStepPercent(float percent) {
+                mInStepPercent = percent;
+                return this;
+            }
+
+            public Builder inStepColors(int... colors) {
+                mInColors = colors;
+                return this;
+            }
+
+            public Builder outAnimDuration(int duration) {
+                mOutAnimationDuration = duration;
+                return this;
+            }
+
+        }
+    }
+
+    private static int getMiddleValue(int prev, int next, float factor) {
+        return Math.round(prev + (next - prev) * factor);
+    }
+
+    public static int getMiddleColor(int prevColor, int curColor, float factor) {
+        if (prevColor == curColor)
+            return curColor;
+
+        if (factor == 0f)
+            return prevColor;
+        else if (factor == 1f)
+            return curColor;
+
+        int a = getMiddleValue(Color.alpha(prevColor), Color.alpha(curColor), factor);
+        int r = getMiddleValue(Color.red(prevColor), Color.red(curColor), factor);
+        int g = getMiddleValue(Color.green(prevColor), Color.green(curColor), factor);
+        int b = getMiddleValue(Color.blue(prevColor), Color.blue(curColor), factor);
+
+        return Color.argb(a, r, g, b);
+    }
+
+    private static int getColor(Context context, int id, int defaultValue) {
+        TypedValue value = new TypedValue();
+
+        try {
+            Resources.Theme theme = context.getTheme();
+            if (theme != null && theme.resolveAttribute(id, value, true)) {
+                if (value.type >= TypedValue.TYPE_FIRST_INT && value.type <= TypedValue.TYPE_LAST_INT)
+                    return value.data;
+                else if (value.type == TypedValue.TYPE_STRING)
+                    return context.getResources().getColor(value.resourceId);
+            }
+        } catch (Exception ignored) {}
+
+        return defaultValue;
+    }
+
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    public static int colorPrimary(Context context, int defaultValue) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            return getColor(context, android.R.attr.colorPrimary, defaultValue);
+        } else {
+            return getColor(context, R.attr.colorPrimary, defaultValue);
+        }
+    }
+}

+ 183 - 0
.svn/pristine/0d/0d7a50b3cb5d4b9adee61fc572a000198feb1e85.svn-base

@@ -0,0 +1,183 @@
+package greendao;
+
+import android.database.Cursor;
+import android.database.sqlite.SQLiteStatement;
+
+import org.greenrobot.greendao.AbstractDao;
+import org.greenrobot.greendao.Property;
+import org.greenrobot.greendao.internal.DaoConfig;
+import org.greenrobot.greendao.database.Database;
+import org.greenrobot.greendao.database.DatabaseStatement;
+
+import eVVM.apk.entity.NetReConnectEntity;
+
+// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
+/** 
+ * DAO for table "NET_RE_CONNECT_ENTITY".
+*/
+public class NetReConnectEntityDao extends AbstractDao<NetReConnectEntity, Long> {
+
+    public static final String TABLENAME = "NET_RE_CONNECT_ENTITY";
+
+    /**
+     * Properties of entity NetReConnectEntity.<br/>
+     * Can be used for QueryBuilder and for referencing column names.
+     */
+    public static class Properties {
+        public final static Property Id = new Property(0, Long.class, "id", true, "_id");
+        public final static Property InterfaceName = new Property(1, String.class, "interfaceName", false, "INTERFACE_NAME");
+        public final static Property InterfaceUrl = new Property(2, String.class, "interfaceUrl", false, "INTERFACE_URL");
+        public final static Property Jsonmap = new Property(3, String.class, "jsonmap", false, "JSONMAP");
+        public final static Property Inoculator = new Property(4, String.class, "inoculator", false, "INOCULATOR");
+        public final static Property Type = new Property(5, int.class, "type", false, "TYPE");
+        public final static Property IsWarning = new Property(6, boolean.class, "isWarning", false, "IS_WARNING");
+    }
+
+
+    public NetReConnectEntityDao(DaoConfig config) {
+        super(config);
+    }
+    
+    public NetReConnectEntityDao(DaoConfig config, DaoSession daoSession) {
+        super(config, daoSession);
+    }
+
+    /** Creates the underlying database table. */
+    public static void createTable(Database db, boolean ifNotExists) {
+        String constraint = ifNotExists? "IF NOT EXISTS ": "";
+        db.execSQL("CREATE TABLE " + constraint + "\"NET_RE_CONNECT_ENTITY\" (" + //
+                "\"_id\" INTEGER PRIMARY KEY ," + // 0: id
+                "\"INTERFACE_NAME\" TEXT," + // 1: interfaceName
+                "\"INTERFACE_URL\" TEXT," + // 2: interfaceUrl
+                "\"JSONMAP\" TEXT," + // 3: jsonmap
+                "\"INOCULATOR\" TEXT," + // 4: inoculator
+                "\"TYPE\" INTEGER NOT NULL ," + // 5: type
+                "\"IS_WARNING\" INTEGER NOT NULL );"); // 6: isWarning
+    }
+
+    /** Drops the underlying database table. */
+    public static void dropTable(Database db, boolean ifExists) {
+        String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"NET_RE_CONNECT_ENTITY\"";
+        db.execSQL(sql);
+    }
+
+    @Override
+    protected final void bindValues(DatabaseStatement stmt, NetReConnectEntity entity) {
+        stmt.clearBindings();
+ 
+        Long id = entity.getId();
+        if (id != null) {
+            stmt.bindLong(1, id);
+        }
+ 
+        String interfaceName = entity.getInterfaceName();
+        if (interfaceName != null) {
+            stmt.bindString(2, interfaceName);
+        }
+ 
+        String interfaceUrl = entity.getInterfaceUrl();
+        if (interfaceUrl != null) {
+            stmt.bindString(3, interfaceUrl);
+        }
+ 
+        String jsonmap = entity.getJsonmap();
+        if (jsonmap != null) {
+            stmt.bindString(4, jsonmap);
+        }
+ 
+        String inoculator = entity.getInoculator();
+        if (inoculator != null) {
+            stmt.bindString(5, inoculator);
+        }
+        stmt.bindLong(6, entity.getType());
+        stmt.bindLong(7, entity.getIsWarning() ? 1L: 0L);
+    }
+
+    @Override
+    protected final void bindValues(SQLiteStatement stmt, NetReConnectEntity entity) {
+        stmt.clearBindings();
+ 
+        Long id = entity.getId();
+        if (id != null) {
+            stmt.bindLong(1, id);
+        }
+ 
+        String interfaceName = entity.getInterfaceName();
+        if (interfaceName != null) {
+            stmt.bindString(2, interfaceName);
+        }
+ 
+        String interfaceUrl = entity.getInterfaceUrl();
+        if (interfaceUrl != null) {
+            stmt.bindString(3, interfaceUrl);
+        }
+ 
+        String jsonmap = entity.getJsonmap();
+        if (jsonmap != null) {
+            stmt.bindString(4, jsonmap);
+        }
+ 
+        String inoculator = entity.getInoculator();
+        if (inoculator != null) {
+            stmt.bindString(5, inoculator);
+        }
+        stmt.bindLong(6, entity.getType());
+        stmt.bindLong(7, entity.getIsWarning() ? 1L: 0L);
+    }
+
+    @Override
+    public Long readKey(Cursor cursor, int offset) {
+        return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
+    }    
+
+    @Override
+    public NetReConnectEntity readEntity(Cursor cursor, int offset) {
+        NetReConnectEntity entity = new NetReConnectEntity( //
+            cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id
+            cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // interfaceName
+            cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // interfaceUrl
+            cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // jsonmap
+            cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // inoculator
+            cursor.getInt(offset + 5), // type
+            cursor.getShort(offset + 6) != 0 // isWarning
+        );
+        return entity;
+    }
+     
+    @Override
+    public void readEntity(Cursor cursor, NetReConnectEntity entity, int offset) {
+        entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
+        entity.setInterfaceName(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1));
+        entity.setInterfaceUrl(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2));
+        entity.setJsonmap(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));
+        entity.setInoculator(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4));
+        entity.setType(cursor.getInt(offset + 5));
+        entity.setIsWarning(cursor.getShort(offset + 6) != 0);
+     }
+    
+    @Override
+    protected final Long updateKeyAfterInsert(NetReConnectEntity entity, long rowId) {
+        entity.setId(rowId);
+        return rowId;
+    }
+    
+    @Override
+    public Long getKey(NetReConnectEntity entity) {
+        if(entity != null) {
+            return entity.getId();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public boolean hasKey(NetReConnectEntity entity) {
+        return entity.getId() != null;
+    }
+
+    @Override
+    protected final boolean isEntityUpdateable() {
+        return true;
+    }
+    
+}

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels