Browse Source

Apex Mobile
完成基本框架

Ray Zhang 8 years ago
parent
commit
bd4640f98e
55 changed files with 2796 additions and 403 deletions
  1. 46 88
      Apex Mobile/app/app.iml
  2. 4 1
      Apex Mobile/app/build.gradle
  3. BIN
      Apex Mobile/app/libs/bcprov-jdk15on-157.jar
  4. 18 5
      Apex Mobile/app/src/main/AndroidManifest.xml
  5. 1 1
      Apex Mobile/app/src/main/java/com/usai/apex/Alarmreceiver.java
  6. 3 1
      Apex Mobile/app/src/main/java/com/usai/apex/ApexActivity.java
  7. 14 10
      Apex Mobile/app/src/main/java/com/usai/apex/ApexTrackingApplication.java
  8. 37 0
      Apex Mobile/app/src/main/java/com/usai/apex/BottomNavigationViewHelper.java
  9. 6 8
      Apex Mobile/app/src/main/java/com/usai/apex/InnerMapActivity.java
  10. 2 6
      Apex Mobile/app/src/main/java/com/usai/apex/InnerToolsActivity.java
  11. 2 2
      Apex Mobile/app/src/main/java/com/usai/apex/SearchHistoryActivity.java
  12. 14 17
      Apex Mobile/app/src/main/java/com/usai/apex/SearchHistoryFragment.java
  13. 45 0
      Apex Mobile/app/src/main/java/com/usai/apex/ViewPagerAdapter.java
  14. 70 0
      Apex Mobile/app/src/main/java/com/usai/apex/mainframe/HistoryFragment.java
  15. 71 0
      Apex Mobile/app/src/main/java/com/usai/apex/mainframe/HomeFragment.java
  16. 41 17
      Apex Mobile/app/src/main/java/com/usai/apex/mainframe/LoginFragment.java
  17. 54 0
      Apex Mobile/app/src/main/java/com/usai/apex/mainframe/MyFragment.java
  18. 428 0
      Apex Mobile/app/src/main/java/com/usai/apex/mainframe/RootActivity.java
  19. 105 0
      Apex Mobile/app/src/main/java/com/usai/apex/mainframe/SearchFragment.java
  20. 216 0
      Apex Mobile/app/src/main/java/com/usai/apex/mainframe/StaticModelistFragment.java
  21. 33 20
      Apex Mobile/app/src/main/java/com/usai/apex/mainframe/ToolsFragment.java
  22. 333 0
      Apex Mobile/app/src/main/java/com/usai/apex/mainframe/TrackingListFragment.java
  23. 242 0
      Apex Mobile/app/src/main/java/com/usai/util/AES.java
  24. 0 133
      Apex Mobile/app/src/main/java/com/usai/util/Crypto.java
  25. 143 39
      Apex Mobile/app/src/main/java/com/usai/util/commonUtil.java
  26. 10 0
      Apex Mobile/app/src/main/res/drawable-mdpi/bottom_shadow.xml
  27. 17 0
      Apex Mobile/app/src/main/res/drawable/list_bg.xml
  28. 22 0
      Apex Mobile/app/src/main/res/drawable/list_corner_round.xml
  29. 17 0
      Apex Mobile/app/src/main/res/drawable/list_corner_round_bg.xml
  30. 7 0
      Apex Mobile/app/src/main/res/drawable/list_div.xml
  31. 42 0
      Apex Mobile/app/src/main/res/layout/activity_root.xml
  32. 13 0
      Apex Mobile/app/src/main/res/layout/fragment_history.xml
  33. 13 0
      Apex Mobile/app/src/main/res/layout/fragment_home.xml
  34. 13 0
      Apex Mobile/app/src/main/res/layout/fragment_my.xml
  35. 13 0
      Apex Mobile/app/src/main/res/layout/fragment_search.xml
  36. 13 0
      Apex Mobile/app/src/main/res/layout/fragment_static_modelist.xml
  37. 2 2
      Apex Mobile/app/src/main/res/layout/fragment_tools.xml
  38. 51 0
      Apex Mobile/app/src/main/res/layout/static_modelist_cell.xml
  39. 95 0
      Apex Mobile/app/src/main/res/layout/tracking_list_cell.xml
  40. 26 0
      Apex Mobile/app/src/main/res/menu/navi_login.xml
  41. 12 0
      Apex Mobile/app/src/main/res/menu/navi_logout.xml
  42. 29 0
      Apex Mobile/app/src/main/res/raw/fake_container_list.json
  43. 251 0
      Apex Mobile/app/src/main/res/raw/fake_search.json
  44. 53 0
      Apex Mobile/app/src/main/res/raw/fake_tracking.json
  45. 44 0
      Apex Mobile/app/src/main/res/raw/my.json
  46. 31 0
      Apex Mobile/app/src/main/res/raw/search.json
  47. 37 0
      Apex Mobile/app/src/main/res/raw/tools.json
  48. 0 10
      Apex Mobile/app/src/main/res/values-large/styles.xml
  49. 0 11
      Apex Mobile/app/src/main/res/values-v11/styles.xml
  50. 0 12
      Apex Mobile/app/src/main/res/values-v14/styles.xml
  51. 13 0
      Apex Mobile/app/src/main/res/values/colors.xml
  52. 3 0
      Apex Mobile/app/src/main/res/values/strings.xml
  53. 39 18
      Apex Mobile/app/src/main/res/values/styles.xml
  54. BIN
      Apex Mobile/captures/com.usai.apex_2018.02.07_17.14.li
  55. 2 2
      Apex Mobile/local.properties

+ 46 - 88
Apex Mobile/app/app.iml

@@ -49,13 +49,6 @@
       <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
@@ -63,6 +56,13 @@
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
@@ -70,13 +70,6 @@
       <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
@@ -84,7 +77,13 @@
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
-      <excludeFolder url="file://$MODULE_DIR$/build/.DS_Store" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/check-manifest" />
@@ -94,12 +93,9 @@
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged-not-compiled-resources" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/multi-dex" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard-rules" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res_stripped" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/splits-support" />
@@ -107,82 +103,44 @@
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/tmp" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
       <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
-      <excludeFolder url="file://$MODULE_DIR$/build/reports" />
       <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
     </content>
-    <orderEntry type="jdk" jdkName="Android API 25 Platform (1)" jdkType="Android SDK" />
+    <orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="com.android.support:multidex-1.0.2" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-tagmanager-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-appindexing-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-crash-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-drive-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-auth-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-awareness-11.0.4" level="project" />
-    <orderEntry type="library" name="__local_aars__:/Users/macmini1/android project/Apex Mobile/app/libs/httpmime-4.1.1.jar:unspecified@jar" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-tagmanager-v4-impl-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-wearable-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-iid-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-panorama-11.0.4" level="project" />
-    <orderEntry type="library" name="com.android.support:mediarouter-v7-25.2.0" level="project" />
+    <orderEntry type="library" name="com.google.android.gms:play-services-tasks-license-11.4.2" level="project" />
+    <orderEntry type="library" name="com.android.support:support-media-compat-26.1.0" level="project" />
+    <orderEntry type="library" name="__local_aars__:/Users/ray/Documents/code_ERPSuiteAndroid/Apex Mobile/app/libs/core-2.3.0.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="com.android.support:recyclerview-v7-26.1.0" level="project" />
+    <orderEntry type="library" name="__local_aars__:/Users/ray/Documents/code_ERPSuiteAndroid/Apex Mobile/app/libs/BaiduLBS_Android.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="android.arch.lifecycle:common:1.0.0@jar" level="project" />
+    <orderEntry type="library" name="com.google.android.gms:play-services-base-license-11.4.2" level="project" />
+    <orderEntry type="library" name="com.android.support:support-fragment-26.1.0" level="project" />
+    <orderEntry type="library" name="com.android.support:support-vector-drawable-26.1.0" level="project" />
+    <orderEntry type="library" name="android.arch.lifecycle:runtime-1.0.0" level="project" />
+    <orderEntry type="library" name="com.android.support:appcompat-v7-26.1.0" level="project" />
+    <orderEntry type="library" name="com.google.android.gms:play-services-maps-license-11.4.2" level="project" />
+    <orderEntry type="library" name="com.google.android.gms:play-services-basement-license-11.4.2" level="project" />
+    <orderEntry type="library" name="com.android.support:support-annotations:26.1.0@jar" level="project" />
+    <orderEntry type="library" name="com.google.android.gms:play-services-basement-11.4.2" level="project" />
     <orderEntry type="library" name="com.android.support.constraint:constraint-layout-solver:1.0.2@jar" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-iid-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-plus-11.0.4" level="project" />
+    <orderEntry type="library" name="com.android.support:support-core-utils-26.1.0" level="project" />
     <orderEntry type="library" name="com.android.support.constraint:constraint-layout-1.0.2" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-vision-common-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-games-11.0.4" level="project" />
-    <orderEntry type="library" name="com.android.support:support-fragment-25.2.0" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-11.0.4" level="project" />
-    <orderEntry type="library" name="com.android.support:support-core-utils-25.2.0" level="project" />
-    <orderEntry type="library" name="com.android.support:animated-vector-drawable-25.2.0" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-tasks-11.0.4" level="project" />
-    <orderEntry type="library" name="com.android.support:appcompat-v7-25.2.0" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-identity-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-vision-11.0.4" level="project" />
-    <orderEntry type="library" name="com.android.support:support-annotations:25.2.0@jar" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-ads-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-ads-lite-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-cast-framework-11.0.4" level="project" />
+    <orderEntry type="library" name="com.android.support:support-core-ui-26.1.0" level="project" />
+    <orderEntry type="library" name="__local_aars__:/Users/ray/Documents/code_ERPSuiteAndroid/Apex Mobile/app/libs/httpmime-4.1.1.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="com.android.support:support-compat-26.1.0" level="project" />
+    <orderEntry type="library" name="android.arch.core:common:1.0.0@jar" level="project" />
+    <orderEntry type="library" name="com.google.android.gms:play-services-tasks-11.4.2" level="project" />
+    <orderEntry type="library" name="com.google.android.gms:play-services-maps-11.4.2" level="project" />
+    <orderEntry type="library" name="__local_aars__:/Users/ray/Documents/code_ERPSuiteAndroid/Apex Mobile/app/libs/bcprov-jdk15on-157.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="com.android.support:support-v4-26.1.0" level="project" />
+    <orderEntry type="library" name="com.google.android.gms:play-services-location-11.4.2" level="project" />
+    <orderEntry type="library" name="com.google.android.gms:play-services-location-license-11.4.2" level="project" />
+    <orderEntry type="library" name="com.android.support:animated-vector-drawable-26.1.0" level="project" />
     <orderEntry type="library" scope="TEST" name="com.android.support:multidex-instrumentation-1.0.2" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-analytics-impl-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-common-11.0.4" level="project" />
-    <orderEntry type="library" name="com.android.support:palette-v7-25.2.0" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-analytics-impl-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-auth-11.0.4" level="project" />
-    <orderEntry type="library" name="__local_aars__:/Users/macmini1/android project/Apex Mobile/app/libs/BaiduLBS_Android.jar:unspecified@jar" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-base-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-places-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-config-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-auth-api-phone-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-database-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-analytics-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-storage-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-clearcut-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-nearby-11.0.4" level="project" />
-    <orderEntry type="library" name="com.android.support:support-core-ui-25.2.0" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-storage-common-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-wallet-11.0.4" level="project" />
-    <orderEntry type="library" name="com.android.support:support-media-compat-25.2.0" level="project" />
-    <orderEntry type="library" name="__local_aars__:/Users/macmini1/android project/Apex Mobile/app/libs/core-2.3.0.jar:unspecified@jar" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-basement-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-cast-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-appinvite-11.0.4" level="project" />
-    <orderEntry type="library" name="com.android.support:support-v4-25.2.0" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-analytics-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-safetynet-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-dynamic-links-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-gcm-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-database-connection-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-instantapps-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-auth-base-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-maps-11.0.4" level="project" />
-    <orderEntry type="library" name="com.android.support:support-compat-25.2.0" level="project" />
-    <orderEntry type="library" name="com.google.firebase:firebase-messaging-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-tagmanager-api-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-fitness-11.0.4" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-gass-11.0.4" level="project" />
-    <orderEntry type="library" name="com.android.support:support-vector-drawable-25.2.0" level="project" />
-    <orderEntry type="library" name="com.google.android.gms:play-services-location-11.0.4" level="project" />
-    <orderEntry type="library" name="org.apache.http.legacy-android-25" level="project" />
+    <orderEntry type="library" name="com.android.support:design-26.1.0" level="project" />
+    <orderEntry type="library" name="com.android.support:transition-26.1.0" level="project" />
+    <orderEntry type="library" name="com.google.android.gms:play-services-base-11.4.2" level="project" />
+    <orderEntry type="library" name="org.apache.http.legacy-android-26" level="project" />
   </component>
 </module>

+ 4 - 1
Apex Mobile/app/build.gradle

@@ -7,7 +7,7 @@ android {
     buildToolsVersion '26.0.2'
     defaultConfig {
         applicationId "com.usai.apex"
-        minSdkVersion 14
+        minSdkVersion 16
         targetSdkVersion 25
         multiDexEnabled true
     }
@@ -34,9 +34,12 @@ android {
 
 dependencies {
     //    compile 'com.android.support:support-v4:19.1.0'
+
+    compile files('libs/bcprov-jdk15on-157.jar')
     compile 'com.android.support:appcompat-v7:26.1.0'
     compile 'com.android.support:support-v4:26.1.0'
     compile 'com.android.support.constraint:constraint-layout:1.0.2'
+    compile 'com.android.support:design:26.1.0'
     //    compile 'com.android.support:recyclerview-v7:26.1.0'
 //    compile 'com.google.android.gms:play-services:11.0.4'
     compile 'com.google.android.gms:play-services-maps:11.4.2'

BIN
Apex Mobile/app/libs/bcprov-jdk15on-157.jar


+ 18 - 5
Apex Mobile/app/src/main/AndroidManifest.xml

@@ -101,7 +101,7 @@
         android:allowBackup="true"
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name"
-        android:theme="@android:style/Theme.Holo.Light" >
+        android:theme="@style/AppTheme" >
 
         <!-- release key -->
        <!--<meta-data-->
@@ -170,17 +170,30 @@
 
 
         -->
+
+
+        <activity android:name=".mainframe.RootActivity"
+
+            >
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
         <activity
             android:name="com.usai.apex.FunctionSelectActivity"
             android:label="@string/title_activity_function_select"
             android:launchMode="singleTop"
             android:logo="@drawable/apexlogo_2"
             android:screenOrientation="portrait" >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
+            <!--<intent-filter>-->
+                <!--<action android:name="android.intent.action.MAIN" />-->
 
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
+                <!--<category android:name="android.intent.category.LAUNCHER" />-->
+            <!--</intent-filter>-->
         </activity>
         <activity
             android:name="com.usai.apex.SearchActivity"

+ 1 - 1
Apex Mobile/app/src/main/java/com/usai/apex/Alarmreceiver.java

@@ -3,7 +3,7 @@ package com.usai.apex;
 import org.json.JSONException;
 import org.json.JSONObject;
 
-import com.usai.util.Crypto;
+//import com.usai.util.Crypto;
 import com.usai.util.Network;
 import com.usai.util.dbUtil;
 import com.usai.util.dbgUtil;

+ 3 - 1
Apex Mobile/app/src/main/java/com/usai/apex/ApexActivity.java

@@ -3,7 +3,6 @@ package com.usai.apex;
 //import com.google.android.gms.maps.SupportMapFragment;
 
 import android.app.ActionBar;
-import android.content.Intent;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Bundle;
@@ -16,6 +15,9 @@ import android.util.Log;
 import android.view.KeyEvent;
 import android.widget.TabHost;
 
+import com.usai.apex.mainframe.LoginFragment;
+import com.usai.apex.mainframe.ToolsFragment;
+
 public class ApexActivity extends FragmentActivity /*
 													 * implements
 													 * OnTabChangeListener

+ 14 - 10
Apex Mobile/app/src/main/java/com/usai/apex/ApexTrackingApplication.java

@@ -1,11 +1,7 @@
 package com.usai.apex;
 
-import com.usai.util.Crypto;
-import com.usai.util.dbUtil;
-
 import android.app.AlarmManager;
 import android.app.Application;
-import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
@@ -14,8 +10,12 @@ import android.os.SystemClock;
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.usai.util.AES;
+import com.usai.util.dbUtil;
+
 public class ApexTrackingApplication extends Application
 {
+
 	static final String						TAG				= "ApexTrackingApplication";
 	private static ApexTrackingApplication	instance;
 	private static String					m_sessionid		= "";
@@ -35,6 +35,10 @@ public class ApexTrackingApplication extends Application
 	{
 		return LastAlermTime;
 	}
+
+	public static ApexTrackingApplication getInstance() {
+		return instance;
+	}
 	@Override
 	public void onCreate()
 	{
@@ -57,11 +61,11 @@ public class ApexTrackingApplication extends Application
 			try
 			{
 				if (!TextUtils.isEmpty(u))
-					m_user = Crypto.decrypt("apexu", u);
+					m_user = AES.decrypt("apexu", u);
 				if (!TextUtils.isEmpty(p))
-					m_password = Crypto.decrypt("apexp", p);
+					m_password = AES.decrypt("apexp", p);
 				if (!TextUtils.isEmpty(s))
-					m_sessionid = Crypto.decrypt("apexp", s);
+					m_sessionid = AES.decrypt("apexp", s);
 			}
 			catch (Exception e)
 			{
@@ -166,10 +170,10 @@ public class ApexTrackingApplication extends Application
 		try
 		{
 
-			editor.putString("user", Crypto.encrypt("apexu", m_user));
-			editor.putString("password", Crypto.encrypt("apexp", m_password));
+			editor.putString("user", AES.encrypt("apexu", m_user));
+			editor.putString("password", AES.encrypt("apexp", m_password));
 			editor.putBoolean("autologin", true);
-			editor.putString("sessionid", Crypto.encrypt("apexp", m_sessionid));
+			editor.putString("sessionid", AES.encrypt("apexp", m_sessionid));
 
 		}
 		catch (Exception e)

+ 37 - 0
Apex Mobile/app/src/main/java/com/usai/apex/BottomNavigationViewHelper.java

@@ -0,0 +1,37 @@
+package com.usai.apex;
+
+import android.support.design.internal.BottomNavigationItemView;
+import android.support.design.internal.BottomNavigationMenuView;
+import android.support.design.widget.BottomNavigationView;
+
+import java.lang.reflect.Field;
+
+// 利用反射,改变 item 中 mShiftingMode 的值
+public class BottomNavigationViewHelper {
+
+    public static void disableShiftMode(BottomNavigationView navigationView) {
+
+
+        BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.getChildAt(0);
+        try {
+            Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
+            shiftingMode.setAccessible(true);
+            shiftingMode.setBoolean(menuView, false);
+            shiftingMode.setAccessible(false);
+
+            for (int i = 0; i < menuView.getChildCount(); i++) {
+                BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(i);
+                itemView.setShiftingMode(false);
+                itemView.setChecked(itemView.getItemData().isChecked());
+
+
+            }
+//            navigationView.setSelectedItemId(navigationView.getMenu().getItem(0).getItemId());
+
+
+
+        } catch (NoSuchFieldException | IllegalAccessException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 6 - 8
Apex Mobile/app/src/main/java/com/usai/apex/InnerMapActivity.java

@@ -1,10 +1,5 @@
 package com.usai.apex;
 
-import com.baidu.mapapi.BMapManager;
-//import com.baidu.mapapi.MKGeneralListener;
-//import com.baidu.mapapi.map.MKEvent;
-import com.baidu.mapapi.map.SupportMapFragment;
-
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Bundle;
@@ -12,9 +7,12 @@ import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
-import android.util.Log;
 import android.view.KeyEvent;
-import android.widget.Toast;
+
+import com.baidu.mapapi.map.SupportMapFragment;
+
+//import com.baidu.mapapi.MKGeneralListener;
+//import com.baidu.mapapi.map.MKEvent;
 
 public class InnerMapActivity extends FragmentActivity
 {
@@ -123,7 +121,7 @@ public class InnerMapActivity extends FragmentActivity
 
 
 
-		m_bhasgoogleframework= false;
+		m_bhasgoogleframework= true;
 
 		Fragment slFragment = null;
 		if (m_bhasgoogleframework )

+ 2 - 6
Apex Mobile/app/src/main/java/com/usai/apex/InnerToolsActivity.java

@@ -1,13 +1,9 @@
 package com.usai.apex;
 
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import android.content.Intent;
 import android.os.Bundle;
-import android.os.Parcelable;
 import android.support.v4.app.FragmentActivity;
-import android.util.Log;
+
+import com.usai.apex.mainframe.ToolsFragment;
 
 public class InnerToolsActivity extends FragmentActivity
 {

+ 2 - 2
Apex Mobile/app/src/main/java/com/usai/apex/SearchHistoryActivity.java

@@ -56,7 +56,7 @@ public class SearchHistoryActivity extends FragmentActivity
 								{
 									
 									db.execSQL("delete from history");
-									HistoryFragment f = (HistoryFragment)getSupportFragmentManager().findFragmentById(R.id.tab1);
+									SearchHistoryFragment f = (SearchHistoryFragment)getSupportFragmentManager().findFragmentById(R.id.tab1);
 									f.searchresult.getData().clear();
 									f.adapter.notifyDataSetChanged();
 								}
@@ -139,7 +139,7 @@ public class SearchHistoryActivity extends FragmentActivity
 
 
 		Fragment favorites = new FavoritesFragment();
-		Fragment history = new HistoryFragment();
+		Fragment history = new SearchHistoryFragment();
 
 		// Add the fragment to the activity, pushing this transaction
 		// on to the back stack.

+ 14 - 17
Apex Mobile/app/src/main/java/com/usai/apex/HistoryFragment.java → Apex Mobile/app/src/main/java/com/usai/apex/SearchHistoryFragment.java

@@ -1,25 +1,10 @@
 package com.usai.apex;
 
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-
-import com.usai.util.dbUtil;
-
 import android.content.Context;
 import android.content.Intent;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.os.Bundle;
-import android.support.v4.app.Fragment;
 import android.support.v4.app.ListFragment;
 import android.text.TextUtils;
 import android.text.format.DateFormat;
@@ -27,14 +12,26 @@ import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.ViewGroup;
 import android.view.View.OnTouchListener;
+import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 import android.widget.Button;
 import android.widget.ListView;
 import android.widget.TextView;
 
-public class HistoryFragment extends ListFragment implements OnTouchListener
+import com.usai.util.dbUtil;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class SearchHistoryFragment extends ListFragment implements OnTouchListener
 {
 	SearchResult	searchresult	= new SearchResult();
 	BaseAdapter		adapter			= null;

+ 45 - 0
Apex Mobile/app/src/main/java/com/usai/apex/ViewPagerAdapter.java

@@ -0,0 +1,45 @@
+package com.usai.apex;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentStatePagerAdapter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by bruce on 2016/11/1.
+ * ViewPagerAdapter
+ */
+
+public class ViewPagerAdapter extends FragmentStatePagerAdapter {
+
+    private final List<Fragment> mFragmentList = new ArrayList<>();
+
+    public ViewPagerAdapter(FragmentManager manager) {
+        super(manager);
+    }
+
+    @Override
+    public Fragment getItem(int position) {
+        return mFragmentList.get(position);
+    }
+
+    @Override
+    public int getCount() {
+        return mFragmentList.size();
+    }
+
+    public void addFragment(Fragment fragment) {
+        mFragmentList.add(fragment);
+    }
+    //解决ViewPager数据源改变时,刷新无效的解决办法
+    @Override
+    public int getItemPosition(Object object) {
+        return POSITION_NONE;
+    }
+//    public void clear()
+//    {
+//        mFragmentList.clear();
+//    }
+}

+ 70 - 0
Apex Mobile/app/src/main/java/com/usai/apex/mainframe/HistoryFragment.java

@@ -0,0 +1,70 @@
+package com.usai.apex.mainframe;
+
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+
+import com.usai.apex.R;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+/**
+ * A simple {@link Fragment} subclass.
+ */
+public class HistoryFragment extends TrackingListFragment {
+
+
+    public HistoryFragment() {
+        // Required empty public constructor
+    }
+
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState)
+    {
+        super.onActivityCreated(savedInstanceState);
+
+//        setupAdapter();
+//        customize_style();
+
+        // this.getListView().setBackgroundColor(Color.WHITE);
+        requestdata();
+
+    }
+    private void requestdata()
+    {
+
+        JSONObject jsobj = loadfakecontent(R.raw.fake_container_list);
+        // if (searchresult.get_fieldscount() == 0)
+        // {
+        // JSONObject objfields = jsobj.getJSONObject("fields");
+        // if (objfields != null)
+        // searchresult.init_fields(objfields.toString());
+        // }
+
+
+        try {
+            JSONArray datalist = jsobj.getJSONArray("container_list");
+            int count = datalist.length();
+            searchresult.add_records(datalist.toString(), count);
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+//        int count = jsobj.getInt("total");
+//
+//        if (count < limit)
+//            bfinish = true;
+//        JSONObject objrecords = jsobj.getJSONObject("records");
+//        if (objrecords != null)
+//            searchresult.add_records(objrecords.toString(), count);
+//        errorcode = Network.RESULT_TRUE;
+
+        adapter.notifyDataSetChanged();
+    }
+
+}

+ 71 - 0
Apex Mobile/app/src/main/java/com/usai/apex/mainframe/HomeFragment.java

@@ -0,0 +1,71 @@
+package com.usai.apex.mainframe;
+
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+
+import com.usai.apex.R;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+/**
+ * A simple {@link Fragment} subclass.
+ */
+public class HomeFragment extends TrackingListFragment {
+
+
+    public HomeFragment() {
+        // Required empty public constructor
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState)
+    {
+        super.onActivityCreated(savedInstanceState);
+
+//        setupAdapter();
+//        customize_style();
+
+        // this.getListView().setBackgroundColor(Color.WHITE);
+        requestdata();
+
+    }
+    private void requestdata()
+    {
+
+        JSONObject jsobj = loadfakecontent(R.raw.fake_container_list);
+        // if (searchresult.get_fieldscount() == 0)
+        // {
+        // JSONObject objfields = jsobj.getJSONObject("fields");
+        // if (objfields != null)
+        // searchresult.init_fields(objfields.toString());
+        // }
+
+
+        try {
+            JSONArray datalist = jsobj.getJSONArray("container_list");
+            int count = datalist.length();
+            searchresult.add_records(datalist.toString(), count);
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+//        int count = jsobj.getInt("total");
+//
+//        if (count < limit)
+//            bfinish = true;
+//        JSONObject objrecords = jsobj.getJSONObject("records");
+//        if (objrecords != null)
+//            searchresult.add_records(objrecords.toString(), count);
+//        errorcode = Network.RESULT_TRUE;
+
+        adapter.notifyDataSetChanged();
+    }
+
+
+
+}

+ 41 - 17
Apex Mobile/app/src/main/java/com/usai/apex/LoginFragment.java → Apex Mobile/app/src/main/java/com/usai/apex/mainframe/LoginFragment.java

@@ -1,21 +1,15 @@
-package com.usai.apex;
+package com.usai.apex.mainframe;
 
 //import android.app.Fragment;
 
-import com.usai.util.Crypto;
-import com.usai.util.Network;
-
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
-import android.app.Activity;
-//import android.app.Fragment;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.AsyncTask;
 import android.os.Build;
-//import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
 import android.text.TextUtils;
@@ -30,15 +24,31 @@ import android.view.inputmethod.InputMethodManager;
 import android.widget.CheckBox;
 import android.widget.EditText;
 import android.widget.TextView;
-//import android.widget.TextView;
 import android.widget.Toast;
 
+import com.usai.apex.ApexTrackingApplication;
+import com.usai.apex.R;
+import com.usai.apex.RetrievePasswordActivity;
+import com.usai.util.AES;
+import com.usai.util.Network;
+
+//import android.app.Fragment;
+//import android.content.SharedPreferences;
+//import android.widget.TextView;
+
 /**
  * Activity which displays a login screen to the user, offering registration as
  * well.
  */
 public class LoginFragment extends Fragment/* implements OnClickListener */
 {
+
+
+	public interface LoginCallBack{
+		public abstract void onLogin();
+//		public abstract void onLogout();
+	}
+	private LoginCallBack mCallBack;
 	private String m_sUser;
 	private String m_sPassword;
 	private EditText m_etName;
@@ -51,14 +61,16 @@ public class LoginFragment extends Fragment/* implements OnClickListener */
 	private CheckBox m_cbSave;
 
 	// SQLiteDatabase m_db;
-
+	public void setCallBack(LoginCallBack callBack) {
+		this.mCallBack = callBack;
+	}
 	@Override
 	public View onCreateView(LayoutInflater inflater, ViewGroup container,
 			Bundle savedInstanceState) {
 		View view = inflater.inflate(R.layout.fragment_login, null);
 		TextView tv_ver = (TextView) view.findViewById(R.id.tv_ver);
 		try {
-			tv_ver.setText(getText(R.string.str_ver)+ApexTrackingApplication.get_instance().getPackageManager().getPackageInfo(
+			tv_ver.setText(getText(R.string.str_ver)+ ApexTrackingApplication.get_instance().getPackageManager().getPackageInfo(
 						"com.usai.apex", 0).versionName);
 		} catch (NameNotFoundException e1) {
 			// TODO Auto-generated catch block
@@ -128,8 +140,8 @@ public class LoginFragment extends Fragment/* implements OnClickListener */
 		String p = pref.getString("password", null);
 		if (u != null && p != null) {
 			try {
-				m_etName.setText(Crypto.decrypt("apexu", u));
-				m_etPassword.setText(Crypto.decrypt("apexp", p));
+				m_etName.setText(AES.decrypt("apexu", u));
+				m_etPassword.setText(AES.decrypt("apexp", p));
 				m_cbSave.setChecked(true);
 			} catch (Exception e) {
 				// TODO Auto-generated catch block
@@ -202,6 +214,13 @@ public class LoginFragment extends Fragment/* implements OnClickListener */
 	// * errors are presented and no actual login attempt is made.
 	// */
 	public void attemptLogin() {
+
+//		if(1==1)
+//		{
+//			if(mCallBack!=null)
+//				mCallBack.onLogin();
+//			return;
+//		}
 		if (mAuthTask != null) {
 			return;
 		}
@@ -339,17 +358,19 @@ public class LoginFragment extends Fragment/* implements OnClickListener */
 				SharedPreferences.Editor editor = pref.edit();
 
 				try {
-					if (m_cbSave.isChecked()) {
+					if (/*m_cbSave.isChecked()*/ true) {
 						editor.putString("user",
-								Crypto.encrypt("apexu", m_sUser));
+								AES.encrypt("apexu", m_sUser));
 						editor.putString("password",
-								Crypto.encrypt("apexp", m_sPassword));
+								AES.encrypt("apexp", m_sPassword));
 						editor.putBoolean("autologin", true);
 					} else {
 						editor.putString("user", null);
 						editor.putString("password", null);
 						editor.putBoolean("autologin", false);
 					}
+
+
 				} catch (Exception e) {
 					editor.putString("user", null);
 					editor.putString("password", null);
@@ -358,13 +379,16 @@ public class LoginFragment extends Fragment/* implements OnClickListener */
 				}
 				editor.commit();
 
+				if(mCallBack!=null)
+					mCallBack.onLogin();
+
 //				Intent intent = new Intent();
 //				intent.setClass(getActivity(), FunctionSelectActivity.class);
 ////				intent.putExtra("user", m_sUser);
 ////				intent.putExtra("password", m_sPassword);
 //				startActivity(intent);
-				getActivity().setResult(Activity.RESULT_OK, null);
-				getActivity().finish();
+//				getActivity().setResult(Activity.RESULT_OK, null);
+//				getActivity().finish();
 			} else {
 				switch (errorcode) {
 				case Network.RESULT_NET_NOTAVAILABLE: {

+ 54 - 0
Apex Mobile/app/src/main/java/com/usai/apex/mainframe/MyFragment.java

@@ -0,0 +1,54 @@
+package com.usai.apex.mainframe;
+
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+
+import com.usai.apex.R;
+
+/**
+ * A simple {@link Fragment} subclass.
+ */
+public class MyFragment extends StaticModelistFragment {
+
+    public interface LogoutCallBack{
+        //        public abstract void onLogin();
+        public abstract void onLogout();
+    }
+    private LogoutCallBack mCallBack;
+    public void setCallBack(LogoutCallBack callBack) {
+        this.mCallBack = callBack;
+    }
+
+    public MyFragment() {
+        // Required empty public constructor
+    }
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState)
+    {
+        super.onActivityCreated(savedInstanceState);
+
+        setupAdapter(R.raw.my);
+
+//        adapter.getView()
+
+        customize_style();
+//        JSONObject jsonobj=loadjson(R.raw.search);
+//        adapter        = new SimpleRoundCornerAdapter(this.getActivity(),
+//                getData(jsonobj), R.layout.static_modelist_cell, new String[] { "title",
+//                "img","detail" }, new int[] { R.id.tv_name, R.id.iv_icon,R.id.tv_detail });
+//        setListAdapter(adapter);
+////        this.getListView().setDivider(R.drawable.);
+//        this.getListView().setDividerHeight(18);
+//        this.getListView().setBackgroundColor(Color.WHITE);
+
+    }
+//
+//    @Override
+//    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+//                             Bundle savedInstanceState) {
+//        // Inflate the layout for this fragment
+//        return inflater.inflate(R.layout.fragment_my, container, false);
+//    }
+
+}

+ 428 - 0
Apex Mobile/app/src/main/java/com/usai/apex/mainframe/RootActivity.java

@@ -0,0 +1,428 @@
+package com.usai.apex.mainframe;
+
+import android.Manifest;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.design.widget.BottomNavigationView;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.Fragment;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.view.MenuItem;
+
+import com.usai.apex.BottomNavigationViewHelper;
+import com.usai.apex.R;
+import com.usai.apex.ViewPagerAdapter;
+import com.usai.util.commonUtil;
+
+/**
+ * Created by bruce on 2016/11/1.
+ * HomeActivity 主界面
+ */
+
+public class RootActivity extends AppCompatActivity {
+
+    private ViewPager viewPager;
+    private MenuItem menuItem;
+    private BottomNavigationView bottomNavigationView;
+    int selectedMenuItem;
+    boolean login=false;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_root);
+
+        viewPager = (ViewPager) findViewById(R.id.viewpager);
+        bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation);
+
+        bottomNavigationView.setItemIconTintList(null);
+//        bottomNavigationView.setlistener
+
+        //默认 >3 的选中效果会影响ViewPager的滑动切换时的效果,故利用反射去掉
+        BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
+        bottomNavigationView.setOnNavigationItemSelectedListener(
+                new BottomNavigationView.OnNavigationItemSelectedListener() {
+                    @Override
+                    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
+                        switch (item.getItemId()) {
+                            case R.id.item_login:
+                                viewPager.setCurrentItem(0);
+                                return true;
+
+                            case R.id.item_tool:
+                                viewPager.setCurrentItem(3);
+                                return true;
+
+                            case R.id.item_otool:
+                                viewPager.setCurrentItem(1);
+                                return true;
+
+                            case R.id.item_home:
+                                viewPager.setCurrentItem(0);
+                                return true;
+
+                            case R.id.item_history:
+                                viewPager.setCurrentItem(1);
+                                return true;
+
+                            case R.id.item_search:
+                                viewPager.setCurrentItem(2);
+                                return true;
+
+                            case R.id.item_my:
+                                viewPager.setCurrentItem(4);
+                                return true;
+
+                        }
+                        return false;
+                    }
+                });
+
+        /*
+        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+            @Override
+            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+
+            }
+
+            @Override
+            public void onPageSelected(int position) {
+//                if (menuItem != null) {
+//                    menuItem.setChecked(false);
+//                } else {
+//                    bottomNavigationView.getMenu().getItem(0).setChecked(false);
+//                }
+//                menuItem = bottomNavigationView.getMenu().getItem(position);
+//                menuItem.setChecked(true);
+            }
+
+            @Override
+            public void onPageScrollStateChanged(int state) {
+            }
+        });
+*/
+
+
+//        viewPager.set
+////        禁止ViewPager滑动
+//        viewPager.setOnTouchListener(new View.OnTouchListener() {
+//            @Override
+//            public boolean onTouch(View v, MotionEvent event) {
+//                return true;
+//            }
+//        });
+
+        setupViewPager(viewPager);
+
+
+        boolean pop = checkAllPermission();
+//        if(!pop)
+//        {
+//            if(TextUtils.isEmpty(ApexTrackingApplication.station_name))
+//            {
+//                Intent intent = new Intent();
+//                intent.setClass(RootActivity.this,ServerSettingActivity.class);
+////            startActivity(intent);
+//                startActivityForResult(intent, 0);
+//            }
+//        }
+    }
+    public boolean checkAllPermission() {
+
+
+        /*
+        *
+        *     -->
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.READ_CONTACTS" />
+    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
+    <!-- External storage for caching. -->
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <!-- My Location -->
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+    <!-- Maps API needs OpenGL ES 2.0. -->
+    <uses-feature
+        android:glEsVersion="0x00020000"
+        android:required="true" />
+    <!-- End of copy. -->
+
+
+    <!-- Baidu Map API -->
+
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+        * */
+
+
+
+        String[] permissions = {
+//                Manifest.permission.CAMERA,
+//                Manifest.permission.VIBRATE,
+                Manifest.permission.READ_CONTACTS,
+                Manifest.permission.READ_PHONE_STATE,
+                Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                Manifest.permission.READ_EXTERNAL_STORAGE,
+//                Manifest.permission.RECEIVE_BOOT_COMPLETED,
+//                Manifest.permission.ACCESS_NETWORK_STATE,
+//                Manifest.permission.ACCESS_WIFI_STATE,
+//                Manifest.permission.INTERNET,
+//                Manifest.permission.ACCESS_FINE_LOCATION,
+//
+//                Manifest.permission.CHANGE_CONFIGURATION
+
+
+
+        };
+
+
+
+//        RAUtil.checkPermissions1(this,permissions);
+        boolean ret = true;
+//        for(String permission : permissions) {
+//            boolean granted = ;
+//            if (!granted) {
+//                ret= false;
+//            }
+//        }
+
+
+        return commonUtil.checkPermissions(this,permissions);
+
+//        return ret;
+    }
+
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
+    {
+
+        if (requestCode == commonUtil.MY_PERMISSIONS_REQUEST)
+        {
+            boolean missing=false;
+            boolean request = false;
+            for(int i=0;i<grantResults.length;i++)
+            {
+
+                if(grantResults[i]!= PackageManager.PERMISSION_GRANTED)
+                    missing=true;
+                boolean bshow= ActivityCompat.shouldShowRequestPermissionRationale(this,permissions[i]);
+                if(bshow)
+                    request = true;
+            }
+
+            String msg=null;
+            if(request)
+                msg="Apex Mobile needs some essential permissions.";
+            else
+                msg="Apex Mobile will quit because missing some essential permissions.\nPlease check your system setting.";
+
+            if(missing) {
+                final boolean finalRequest = request;
+                new AlertDialog.Builder(this)
+                        .setTitle("Warning")
+                        .setMessage(msg)
+                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+//                                checkAllPermission();
+                                if (finalRequest)
+                                    checkAllPermission();
+                                else
+                                    finish();
+                            }
+                        })
+//                    .setNegativeButton("No", new DialogInterface.OnClickListener() {
+//                        @Override
+//                        public void onClick(DialogInterface dialog, int which) {
+//                            finish();
+//                        }
+//                    })
+                        .show();
+            }
+            else
+            {
+//                if(TextUtils.isEmpty(ApexTrackingApplication.station_name))
+//                {
+//                    Intent intent = new Intent();
+//                    intent.setClass(FullScreenLoginActivity.this,ServerSettingActivity.class);
+////            startActivity(intent);
+//                    startActivityForResult(intent, 0);
+//                }
+            }
+//            if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
+//            {
+//               // callPhone();
+//            } else
+//            {
+//
+//
+//                            new AlertDialog.Builder(this)
+//                    .setTitle("Warning")
+//                    .setMessage("RA Image missing essential permission")
+//                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
+//                        @Override
+//                        public void onClick(DialogInterface dialog, int which) {
+//                            checkAllPermission();
+//                        }
+//                    })
+////                    .setNegativeButton("No", new DialogInterface.OnClickListener() {
+////                        @Override
+////                        public void onClick(DialogInterface dialog, int which) {
+////                            finish();
+////                        }
+////                    })
+//                    .show();
+//
+//                // Permission Denied
+//               // Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
+//            }
+            return;
+        }
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+    }
+
+    private void setupViewPager(final ViewPager viewPager) {
+//        TestFragment.LoginCallBack logincallback = new TestFragment.LoginCallBack() {
+//            @Override
+//            public void onLogin() {
+//                System.out.println("login ");
+//                login = true;
+////                bottomNavigationView.setSelectedItemId(bottomNavigationView.getMenu().getItem(0).getItemId());
+//                bottomNavigationView.getChildAt(0).setSelected(true);
+//                bottomNavigationView.getMenu().clear();
+////                bottomNavigationView.getMenu().
+//                bottomNavigationView.inflateMenu(R.menu.navi_login);
+//                BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
+//                setupViewPager(viewPager);
+//
+//            }
+//
+//            @Override
+//            public void onLogout() {
+//                System.out.println("log out ");
+//                login=false;
+//
+////                BottomNavigationView v;
+//
+////                v.getse
+////                bottomNavigationView.setSelectedItemId(bottomNavigationView.getMenu().getItem(0).getItemId());
+////                navigation.setSelectedItemId(navigation.getMenu().getItem(position).getItemId());
+//                bottomNavigationView.getMenu().clear();
+//                bottomNavigationView.inflateMenu(R.menu.navi_logout);
+//                BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
+//                setupViewPager(viewPager);
+//            }
+//        };
+
+
+        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
+
+
+//        adapter.clear();
+
+        if(login)
+        {
+
+            bottomNavigationView.getChildAt(0).setSelected(true);
+            bottomNavigationView.getMenu().clear();
+//                bottomNavigationView.getMenu().
+            bottomNavigationView.inflateMenu(R.menu.navi_login);
+            BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
+
+
+            HomeFragment homeFragment = new HomeFragment();
+            HistoryFragment historyFragment = new HistoryFragment();
+            SearchFragment searchFragment = new SearchFragment();
+            ToolsFragment toolsFragment = new ToolsFragment();
+            MyFragment myFragment = new MyFragment();
+            myFragment.setCallBack(new MyFragment.LogoutCallBack() {
+                @Override
+                public void onLogout() {
+
+                                    System.out.println("log out ");
+                login=false;
+
+//                BottomNavigationView v;
+
+//                v.getse
+//                bottomNavigationView.setSelectedItemId(bottomNavigationView.getMenu().getItem(0).getItemId());
+//                navigation.setSelectedItemId(navigation.getMenu().getItem(position).getItemId());
+
+                setupViewPager(viewPager);
+                }
+            });
+
+
+            adapter.addFragment(homeFragment);
+            adapter.addFragment(historyFragment);
+            adapter.addFragment(searchFragment);
+            adapter.addFragment(toolsFragment);
+
+
+            adapter.addFragment(myFragment);
+
+
+
+
+
+//            adapter.addFragment(BaseFragment.newInstance("home"));
+//            adapter.addFragment(BaseFragment.newInstance("history"));
+//            adapter.addFragment(BaseFragment.newInstance("search"));
+//            adapter.addFragment(BaseFragment.newInstance("tool"));
+//
+//            TestFragment logoutf = TestFragment.newInstance("logout");
+//            logoutf.setCallBack(logincallback);
+//            adapter.addFragment(logoutf);
+        }
+        else
+        {
+
+            bottomNavigationView.getChildAt(0).setSelected(true);
+            bottomNavigationView.getMenu().clear();
+            bottomNavigationView.inflateMenu(R.menu.navi_logout);
+            BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
+
+
+            LoginFragment loginFragment = new LoginFragment();
+            loginFragment.setCallBack(new LoginFragment.LoginCallBack() {
+                @Override
+                public void onLogin() {
+                System.out.println("login ");
+                login = true;
+//                bottomNavigationView.setSelectedItemId(bottomNavigationView.getMenu().getItem(0).getItemId());
+
+                setupViewPager(viewPager);
+                }
+            });
+//            TestFragment loginf = TestFragment.newInstance("login");
+//            loginf.setCallBack(logincallback);
+
+
+            adapter.addFragment(loginFragment);
+
+//            SearchFragment searchFragment = new SearchFragment();
+//            adapter.addFragment(searchFragment);
+
+            Fragment toolsFragment = new ToolsFragment();
+            adapter.addFragment(toolsFragment);
+        }
+
+
+
+
+
+
+
+//        viewPager.removeAllViews();
+
+
+        viewPager.setAdapter(adapter);
+    }
+}

+ 105 - 0
Apex Mobile/app/src/main/java/com/usai/apex/mainframe/SearchFragment.java

@@ -0,0 +1,105 @@
+package com.usai.apex.mainframe;
+
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.util.Log;
+import android.view.View;
+import android.widget.ListView;
+
+import com.usai.apex.R;
+
+
+/**
+ * A simple {@link Fragment} subclass.
+ */
+public class SearchFragment extends StaticModelistFragment {
+
+
+    public SearchFragment() {
+        // Required empty public constructor
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState)
+    {
+        super.onActivityCreated(savedInstanceState);
+
+        setupAdapter(R.raw.search);
+
+//        adapter.getView()
+
+        customize_style();
+//        JSONObject jsonobj=loadjson(R.raw.search);
+//        adapter        = new SimpleRoundCornerAdapter(this.getActivity(),
+//                getData(jsonobj), R.layout.static_modelist_cell, new String[] { "title",
+//                "img","detail" }, new int[] { R.id.tv_name, R.id.iv_icon,R.id.tv_detail });
+//        setListAdapter(adapter);
+////        this.getListView().setDivider(R.drawable.);
+//        this.getListView().setDividerHeight(18);
+//        this.getListView().setBackgroundColor(Color.WHITE);
+
+    }
+
+//    @Override
+//    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+//                             Bundle savedInstanceState) {
+//
+//        View v= super.onCreateView(inflater,container,savedInstanceState);
+//
+//
+//        return v;
+//        // Inflate the layout for this fragment
+////        return inflater.inflate(R.layout.fragment_search, container, false);
+//    }
+
+    @Override
+    public void onListItemClick(ListView l, View v, int position, long id)
+    {
+        Log.d("FragmentList", "Item clicked: " + id);
+
+//        String title = (String) getData().get(position).get("title");
+//        Intent intent = new Intent();
+//        if (title.equals("Market news"))
+//        {
+//            intent.setClass(getActivity(), AnnouncementActivity.class);
+//            intent.putExtra("module_name", "Market News");
+//        }
+//        else if (title.equals("Announcements"))
+//        {
+//            intent.setClass(getActivity(), AnnouncementActivity.class);
+//            intent.putExtra("module_name", "Announcements");
+//        }
+//        else if (title.equals("About this App"))
+//        {
+//            intent.setClass(getActivity(), AboutActivity.class);
+//        }
+//        else if (title.equals("Saved Detail/Search"))
+//        {
+//            intent.setClass(getActivity(), SearchHistoryActivity.class);
+//        }
+//        else if (title.equals("Change Password"))
+//        {
+//            intent.setClass(getActivity(), ChangePasswordActivity.class);
+//
+////            startActivityForResult(intent, REQUEST_CHANGEPASSWORD_ACTIVITY);
+//            return;
+//        }
+//        else if (title.equals("Apex History"))
+//        {
+//            intent.setClass(getActivity(), ApexHistoryActivity.class);
+//
+////			startActivityForResult(intent, REQUEST_CHANGEPASSWORD_ACTIVITY);
+////			return;
+//        }
+//        else if (title.equals("Setting"))
+//        {
+//            intent.setClass(getActivity(), SettingsActivity.class);
+//
+////			startActivityForResult(intent, REQUEST_CHANGEPASSWORD_ACTIVITY);
+////			return;
+//        }
+//        startActivity(intent);
+
+    }
+}

+ 216 - 0
Apex Mobile/app/src/main/java/com/usai/apex/mainframe/StaticModelistFragment.java

@@ -0,0 +1,216 @@
+package com.usai.apex.mainframe;
+
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.ListFragment;
+import android.widget.SimpleAdapter;
+
+import com.usai.apex.R;
+import com.usai.util.commonUtil;
+
+import org.apache.http.util.EncodingUtils;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A simple {@link Fragment} subclass.
+ */
+public class StaticModelistFragment extends ListFragment {
+
+    String ModeName=null;
+    String ModeIcon= null;
+
+
+//    public class SimpleRoundCornerAdapter extends  SimpleAdapter{
+//        public SimpleRoundCornerAdapter(Context context, List<? extends Map<String, ?>> data,
+//                                        @LayoutRes int resource, String[] from, @IdRes int[] to) {
+//            super(context, data, resource, from, to);
+//
+//        }
+//        @Override
+//        public View getView(int position, View convertView, ViewGroup parent) {
+//            View v = super.getView(position,convertView,parent);
+////            v.setBackground(getResources().getDrawable(R.drawable.list_corner_round_bg));
+////            v.setBackgroundColor(Color.BLUE);
+//            return v;
+//        }
+//    }
+
+    SimpleAdapter adapter;
+
+
+
+
+    public StaticModelistFragment() {
+        // Required empty public constructor
+    }
+
+//
+//    @Override
+//    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+//                             Bundle savedInstanceState) {
+//
+//
+//
+//        // Inflate the layout for this fragment
+//        return inflater.inflate(R.layout.fragment_static_modelist, container, false);
+//
+//
+////        super.onActivityCreated(savedInstanceState);
+//
+//
+//    }
+
+    protected  void setupAdapter(int rawid)
+    {
+        JSONObject jsonobj=loadjson(rawid);
+        adapter        = new SimpleAdapter(this.getActivity(),
+                getData(jsonobj), R.layout.static_modelist_cell, new String[] { "title",
+                "img","detail" }, new int[] { R.id.tv_name, R.id.iv_icon,R.id.tv_detail });
+        setListAdapter(adapter);
+    }
+
+    protected void customize_style()
+    {
+
+
+
+//        this.getListView().setDivider(new ColorDrawable(Color.RED));
+        this.getListView().setDivider(getResources().getDrawable(R.drawable.list_div));
+        this.getListView().setDividerHeight(20);
+
+
+//        this.getListView().setBackground(getResources().getDrawable(R.drawable.list_corner_round_bg));
+        this.getListView().setBackgroundColor(getResources().getColor(R.color.table_bg)  );
+//        this.getListView().setSelector(R.drawable.list_corner_round);
+
+
+    }
+
+    protected JSONObject loadjson(int rawid)
+    {
+
+        String jstring = "";
+        try
+        {
+            InputStream in = getResources().openRawResource(rawid);
+            // 获取文件的字节数
+            int lenght = in.available();
+            // 创建byte数组
+            byte[] buffer = new byte[lenght];
+            // 将文件中的数据读到byte数组中
+            in.read(buffer);
+            jstring = EncodingUtils.getString(buffer, "UTF-8");
+            JSONObject jsobj = new JSONObject(jstring);
+            return jsobj;
+//            JSONObject objrecords = jsobj.getJSONObject("records");
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return null;
+
+    }
+
+    protected List<Map<String, Object>> getData(JSONObject jsobj)
+    {
+
+        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
+
+        try {
+            ModeName=jsobj.getString("title");
+            ModeIcon=jsobj.getString("icon");
+
+            JSONArray array = jsobj.getJSONArray("modelist");
+             for(int i=0;i<array.length();i++) {
+
+                 JSONObject rowobj = array.getJSONObject(i);
+
+                 Map<String, Object> map = new HashMap<String, Object>();
+                 String name=rowobj.getString("name");
+                 String info=rowobj.getString("detail");
+                 String    icon=rowobj.getString("icon");
+                 String    type=rowobj.getString("type");
+
+
+                 int iconid = commonUtil.iconName2Rid(icon);
+                 map.put("title", name);
+                 map.put("detail", info);
+                 map.put("img", iconid);
+                 map.put("type", type);
+                 list.add(map);
+
+
+             }
+
+
+            // jsonobject.put("name", key);
+            // jsonobject.put("exp", key+"="+jsonobject.getString("value"));
+            // newArray.put(jsonobject);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+//        boolean login = false;
+//        Bundle b = getArguments();
+//
+//        if(b!=null)
+//        {
+//            login = b.getBoolean("Login");
+//        }
+
+
+//        Map<String, Object> map = new HashMap<String, Object>();
+//        map.put("title", "Market news");
+//        map.put("info", "google 1");
+//        map.put("img", R.drawable.rect_market_news);
+//        list.add(map);
+//
+//        map = new HashMap<String, Object>();
+//        map.put("title", "Announcements");
+//        map.put("info", "google 2");
+//        map.put("img", R.drawable.rect_announcements);
+//        list.add(map);
+//
+//        if (login)
+//        {
+//            map = new HashMap<String, Object>();
+//            map.put("title", "Saved Detail/Search");
+//            map.put("info", "google 2");
+//            map.put("img", R.drawable.rect_search_history);
+//            list.add(map);
+//
+//            map = new HashMap<String, Object>();
+//            map.put("title", "Change Password");
+//            map.put("img", R.drawable.rect_change_password);
+//            list.add(map);
+//            map = new HashMap<String, Object>();
+//            map.put("title", "Setting");
+//            map.put("img", R.drawable.rect_setting);
+//            list.add(map);
+//        }
+//
+//        map = new HashMap<String, Object>();
+//        map.put("title", "Apex History");
+//
+//        map.put("img", R.drawable.rect_history);
+//        list.add(map);
+//
+//        map = new HashMap<String, Object>();
+//        map.put("title", "About this App");
+//        map.put("info", "google 2");
+//        map.put("img", R.drawable.rect_about);
+//        list.add(map);
+
+        return list;
+    }
+
+}

+ 33 - 20
Apex Mobile/app/src/main/java/com/usai/apex/ToolsFragment.java → Apex Mobile/app/src/main/java/com/usai/apex/mainframe/ToolsFragment.java

@@ -1,28 +1,28 @@
-package com.usai.apex;
+package com.usai.apex.mainframe;
 
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import android.R.color;
 import android.app.Activity;
 import android.content.ComponentName;
-import android.content.Context;
 import android.content.Intent;
 import android.content.Intent.ShortcutIconResource;
-import android.graphics.Color;
 import android.os.Bundle;
-import android.os.Parcelable;
-import android.support.v4.app.ListFragment;
 import android.util.Log;
 import android.view.View;
-import android.widget.ArrayAdapter;
 import android.widget.ListView;
-import android.widget.SimpleAdapter;
 
-public class ToolsFragment extends ListFragment
+import com.usai.apex.AboutActivity;
+import com.usai.apex.AnnouncementActivity;
+import com.usai.apex.ApexHistoryActivity;
+import com.usai.apex.ChangePasswordActivity;
+import com.usai.apex.R;
+import com.usai.apex.SearchHistoryActivity;
+import com.usai.apex.SettingsActivity;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ToolsFragment extends StaticModelistFragment
 {
 
 	static final int PASSWORD_CHANGED = 1;
@@ -187,15 +187,28 @@ public class ToolsFragment extends ListFragment
 		return list;
 	}
 
+//	@Override
+//	public void onActivityCreated(Bundle savedInstanceState)
+//	{
+//		super.onActivityCreated(savedInstanceState);
+//		SimpleAdapter adapter = new SimpleAdapter(this.getActivity(),
+//				getData(), R.layout.fragment_tools, new String[] { "title",
+//						"img" }, new int[] { R.id.tv_toolname, R.id.iv_icon });
+//		setListAdapter(adapter);
+//		this.getListView().setBackgroundColor(Color.WHITE);
+//	}
+
+
 	@Override
 	public void onActivityCreated(Bundle savedInstanceState)
 	{
 		super.onActivityCreated(savedInstanceState);
-		SimpleAdapter adapter = new SimpleAdapter(this.getActivity(),
-				getData(), R.layout.fragment_tools, new String[] { "title",
-						"img" }, new int[] { R.id.tv_toolname, R.id.iv_icon });
-		setListAdapter(adapter);
-		this.getListView().setBackgroundColor(Color.WHITE);
+
+        setupAdapter(R.raw.tools);
+
+//        adapter.getView()
+
+		customize_style();
 	}
 
 	@Override

+ 333 - 0
Apex Mobile/app/src/main/java/com/usai/apex/mainframe/TrackingListFragment.java

@@ -0,0 +1,333 @@
+package com.usai.apex.mainframe;
+
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.ListFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.usai.apex.R;
+import com.usai.util.commonUtil;
+
+import org.apache.http.util.EncodingUtils;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A simple {@link Fragment} subclass.
+ */
+public class TrackingListFragment extends ListFragment {
+    protected BaseAdapter adapter;
+    List<Map<String, Object>> list_data;
+    SearchResult searchresult	= new SearchResult();
+    protected class SearchResult
+    {
+        List<Map<String, Object>>	datalist	= new ArrayList<Map<String, Object>>();
+
+        public int get_count()
+        {
+            return datalist.size();
+        }
+
+        public void add_records(String source, int count)
+        {
+            JSONArray arrrecords=null;
+            try
+            {
+                arrrecords = new JSONArray(source);
+
+                for (int i=0;i<arrrecords.length();i++)
+                {
+                    JSONObject objrec =arrrecords.getJSONObject(i);
+
+
+                    String title = objrec.getString("title");
+                    String icon = objrec.getString("icon");
+                    String description = objrec.getString("description");
+                    String detail = objrec.getString("detail");
+                    String date = objrec.getString("date");
+                    String port = objrec.getString("port");
+
+                    int iconid = commonUtil.iconName2Rid(icon);
+
+
+
+//                    lastid = id;
+                    Map<String, Object> map = new HashMap<String, Object>();
+                    map.put("title", title);
+                    map.put("icon", iconid);
+                    map.put("description", description);
+                    map.put("detail", detail);
+                    map.put("date", date);
+                    map.put("port", port);
+                    datalist.add(map);
+
+                }
+
+//                for (int i = 0; i < count; i++)
+//                {
+//                    // offset++;
+//                    JSONObject objrec = objrecords.getJSONObject("record" + i);
+//                    String title = objrec.getString("title");
+//                    String content = objrec.getString("content");
+//                    String image = objrec.getString("image");
+//                    String id = objrec.getString("id");
+//                    String url = objrec.getString("url");
+////                    lastid = id;
+//                    Map<String, Object> map = new HashMap<String, Object>();
+//                    map.put("title", title);
+//                    map.put("content", content);
+//                    map.put("image", image);
+//                    map.put("id", id);
+//                    map.put("url", url);
+//                    datalist.add(map);
+//
+//                    // Iterator<?> it = rec.keys();
+//                    // HashMap<String, String> record = new HashMap<String,
+//                    // String>();
+//                    // while (it.hasNext()) // loop for each function
+//                    // {
+//                    // String field_name = (String) it.next();
+//                    // String val = rec.getString(field_name)
+//                    // .replace("\n", "");
+//                    // record.put(field_name, val);
+//                    // }
+//                    // records.add(record);
+//
+//                }
+            }
+            catch (JSONException e)
+            {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+
+        }
+
+        public List<Map<String, Object>> getData()
+        {
+
+            return datalist;
+        }
+    }
+    private class TrackingAdapter extends BaseAdapter
+    {
+        private LayoutInflater mInflater;	// 动态布局映射
+        private TrackingListFragment.SearchResult result;
+
+        // private Context context;
+        // private int i = 0;
+        public TrackingAdapter(TrackingListFragment.SearchResult result, Context context)
+        {
+            this.result = result;
+            // this.context = context;
+            this.mInflater = LayoutInflater.from(context);
+        }
+
+        @Override
+        public int getCount()
+        {
+            // TODO Auto-generated method stub
+            return result.get_count();
+        }
+
+        @Override
+        public Object getItem(int position)
+        {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public long getItemId(int position)
+        {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent)
+        {
+            // TODO Auto-generated method stub
+
+            /*
+                             String title = objrec.getString("title");
+                    String icon = objrec.getString("icon");
+                    String description = objrec.getString("description");
+                    String detail = objrec.getString("detail");
+                    String date = objrec.getString("date");
+                    String port = objrec.getString("port");
+             */
+
+            convertView = mInflater.inflate(R.layout.tracking_list_cell, null);// 根据布局文件实例化view
+
+            TextView title = (TextView) convertView.findViewById(R.id.tv_title);// 找某个控件
+            title.setText(result.getData().get(position).get("title")
+                    .toString());// 给该控件设置数据(数据从集合类中来)
+
+            TextView date = (TextView) convertView
+                    .findViewById(R.id.tv_time);
+            date.setText(result.getData().get(position).get("date")
+                    .toString());
+
+            TextView description = (TextView) convertView
+                    .findViewById(R.id.tv_description);
+            description.setText(result.getData().get(position).get("description")
+                    .toString());
+
+            TextView detail = (TextView) convertView
+                    .findViewById(R.id.tv_detail);
+            detail.setText(result.getData().get(position).get("detail")
+                    .toString());
+
+            TextView port = (TextView) convertView
+                    .findViewById(R.id.tv_port);
+            port.setText(result.getData().get(position).get("port")
+                    .toString());
+
+            ImageView iv_status = (ImageView) convertView
+                    .findViewById(R.id.iv_status);
+            iv_status.setImageResource((int)result.getData().get(position).get("icon"));
+
+//            if (result.getData().get(position).get("image").toString().length() > 0)
+//            {
+//                byte[] gzipBuff = Base64.decode(result.getData().get(position)
+//                        .get("image").toString(), 0);
+//
+//                ByteArrayInputStream memstream = new ByteArrayInputStream(
+//                        gzipBuff, 0, gzipBuff.length);
+//
+//                ByteArrayOutputStream baos = new ByteArrayOutputStream(
+//                        gzipBuff.length);
+//                ImageView iv_thumb = (ImageView) convertView
+//                        .findViewById(R.id.iv_thumb);
+//                try
+//                {
+//                    baos.write(gzipBuff);
+//
+//                    Bitmap bmp = BitmapFactory.decodeStream(memstream);
+//
+//                    // ImageView image = new ImageView(this);
+//
+//                    iv_thumb.setImageBitmap(bmp);
+//                }
+//                catch (IOException e)
+//                {
+//                    // TODO Auto-generated catch block
+//                    e.printStackTrace();
+//                }
+//            }
+            // img.setBackgroundResource((Integer)jObject.get("img"));
+
+            return convertView;
+        }
+    }
+    public TrackingListFragment() {
+        // Required empty public constructor
+    }
+
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState)
+    {
+        super.onActivityCreated(savedInstanceState);
+
+        setupAdapter();
+        customize_style();
+
+        // this.getListView().setBackgroundColor(Color.WHITE);
+//        requestdata();
+
+    }
+
+    protected  void setupAdapter()
+    {
+        adapter = new TrackingAdapter(searchresult, this.getActivity());
+
+//        module_name = getIntent().getStringExtra("module_name");
+//
+//        setTitle(module_name);
+//        view_page_footer = LayoutInflater.from(this).inflate(
+//                R.layout.view_page_footer, null);
+//        getListView().addFooterView(view_page_footer);// 添加底部视图
+//        TextView text_page = (TextView) view_page_footer
+//                .findViewById(R.id.text_page);
+//        text_page.setOnClickListener(new View.OnClickListener()
+//        {
+//            // 点击按钮 追加数据 并通知适配器
+//            @Override
+//            public void onClick(View v)
+//            {
+//                // TODO Auto-generated method stub
+//                // TextView tv = (TextView) v;
+//                // tv.setText("Loading...");
+//                requestdata();
+//                // tv.setText("下一页");
+//                // adapter.notifyDataSetChanged();
+//            }
+//        });
+
+        setListAdapter(adapter);
+    }
+
+    protected void customize_style()
+    {
+
+
+
+//        this.getListView().setDivider(new ColorDrawable(Color.RED));
+        this.getListView().setDivider(getResources().getDrawable(R.drawable.list_div));
+        this.getListView().setDividerHeight(20);
+
+
+//        this.getListView().setBackground(getResources().getDrawable(R.drawable.list_corner_round_bg));
+        this.getListView().setBackgroundColor(getResources().getColor(R.color.table_bg)  );
+//        this.getListView().setSelector(R.drawable.list_corner_round);
+
+
+    }
+
+    protected JSONObject loadfakecontent(int rawid)
+    {
+
+        String jstring = "";
+        try
+        {
+            InputStream in = getResources().openRawResource(rawid);
+            // 获取文件的字节数
+            int lenght = in.available();
+            // 创建byte数组
+            byte[] buffer = new byte[lenght];
+            // 将文件中的数据读到byte数组中
+            in.read(buffer);
+            jstring = EncodingUtils.getString(buffer, "UTF-8");
+            JSONObject jsobj = new JSONObject(jstring);
+            return jsobj;
+//            JSONObject objrecords = jsobj.getJSONObject("records");
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return null;
+
+    }
+
+    protected List<Map<String, Object>> getData(JSONObject jsobj)
+    {
+        return null;
+    }
+}

+ 242 - 0
Apex Mobile/app/src/main/java/com/usai/util/AES.java

@@ -0,0 +1,242 @@
+package com.usai.util;
+
+import android.util.Base64;
+import android.util.Log;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.Security;
+import java.util.Arrays;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import static android.content.ContentValues.TAG;
+
+/**
+ * Created by ray on 07/06/2017.
+ * AES128 算法
+ *
+ * CBC 模式
+ *
+ * PKCS7Padding 填充模式
+ *
+ * CBC模式需要添加一个参数iv
+ *
+ * 介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别
+ * 要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现
+ */
+
+public class AES {
+    // 算法名称
+    final static String KEY_ALGORITHM = "AES";
+    // 加解密算法/模式/填充方式
+    final static String algorithmStr = "AES/CBC/PKCS7Padding";
+    //
+//    private Key key;
+//    private Cipher cipher;
+//    boolean isInited = false;
+
+    static byte[] iv = new byte[16];//{ 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38 };
+//    private static void init(byte[] keyBytes) {
+//
+//        // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
+//        int base = 16;
+//        if (keyBytes.length % base != 0) {
+//            int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
+//            byte[] temp = new byte[groups * base];
+//            Arrays.fill(temp, (byte) 0);
+//            System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
+//            keyBytes = temp;
+//        }
+//        // 初始化
+//        Security.addProvider(new BouncyCastleProvider());
+//        // 转化成JAVA的密钥格式
+//        key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
+//        try {
+//            // 初始化cipher
+//            cipher = Cipher.getInstance(algorithmStr, "BC");
+//        } catch (NoSuchAlgorithmException e) {
+//            // TODO Auto-generated catch block
+//            e.printStackTrace();
+//        } catch (NoSuchPaddingException e) {
+//            // TODO Auto-generated catch block
+//            e.printStackTrace();
+//        } catch (NoSuchProviderException e) {
+//            // TODO Auto-generated catch block
+//            e.printStackTrace();
+//        }
+//    }
+
+    private static String toHex(byte[] buf)
+    {
+        if (buf == null)
+            return "";
+        StringBuffer result = new StringBuffer(2 * buf.length);
+        for (int i = 0; i < buf.length; i++)
+        {
+            appendHex(result, buf[i]);
+        }
+        return result.toString();
+    }
+    private static void appendHex(StringBuffer sb, byte b)
+    {
+        sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
+    }
+    private final static String HEX = "0123456789ABCDEF";
+
+    public static String encrypt(String key, String content)
+    {
+        byte[] result=encrypt(content.getBytes(),key.getBytes());
+        Log.d(TAG, "encrypt: "+toHex(result));
+        return Base64.encodeToString(result, Base64.DEFAULT);
+    }
+
+    public static String decrypt(String key, String content)
+    {
+        byte[] buffer = Base64.decode(content, Base64.DEFAULT);
+
+        byte[] result = decrypt(buffer,key.getBytes());
+
+        return new String(result);
+    }
+
+    /**
+     * 加密方法
+     *
+     * @param content
+     *            要加密的字符串
+     * @param keyBytes
+     *            加密密钥
+     * @return
+     */
+    private static byte[] encrypt(byte[] content, byte[] keyBytes) {
+        byte[] encryptedText = null;
+//        init(keyBytes);
+
+     Key key;
+     Cipher cipher;
+        // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
+        int base = 16;
+        if (keyBytes.length % base != 0) {
+            int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
+            byte[] temp = new byte[groups * base];
+            Arrays.fill(temp, (byte) 0);
+            System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
+            keyBytes = temp;
+        }
+        // 初始化
+        Security.addProvider(new BouncyCastleProvider());
+        // 转化成JAVA的密钥格式
+        key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
+        try {
+            // 初始化cipher
+            cipher = Cipher.getInstance(algorithmStr, "BC");
+
+
+            cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
+            encryptedText = cipher.doFinal(content);
+
+        } catch (NoSuchAlgorithmException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (NoSuchPaddingException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (NoSuchProviderException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (BadPaddingException e) {
+            e.printStackTrace();
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (IllegalBlockSizeException e) {
+            e.printStackTrace();
+        } catch (InvalidAlgorithmParameterException e) {
+            e.printStackTrace();
+        }
+
+
+//        System.out.println("IV:" + new String(iv));
+//        try {
+//
+//        } catch (Exception e) {
+//            // TODO Auto-generated catch block
+//            e.printStackTrace();
+//        }
+        return encryptedText;
+    }
+    /**
+     * 解密方法
+     *
+     * @param encryptedData
+     *            要解密的字符串
+     * @param keyBytes
+     *            解密密钥
+     * @return
+     */
+    private static byte[] decrypt(byte[] encryptedData, byte[] keyBytes) {
+        byte[] encryptedText = null;
+//        init(keyBytes);
+
+        Key key;
+        Cipher cipher;
+                // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
+        int base = 16;
+        if (keyBytes.length % base != 0) {
+            int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
+            byte[] temp = new byte[groups * base];
+            Arrays.fill(temp, (byte) 0);
+            System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
+            keyBytes = temp;
+        }
+        // 初始化
+        Security.addProvider(new BouncyCastleProvider());
+        // 转化成JAVA的密钥格式
+        key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
+        try {
+            // 初始化cipher
+            cipher = Cipher.getInstance(algorithmStr, "BC");
+            cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
+            encryptedText = cipher.doFinal(encryptedData);
+        } catch (NoSuchAlgorithmException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (NoSuchPaddingException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (NoSuchProviderException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (BadPaddingException e) {
+            e.printStackTrace();
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (IllegalBlockSizeException e) {
+            e.printStackTrace();
+        } catch (InvalidAlgorithmParameterException e) {
+            e.printStackTrace();
+        }
+
+//        System.out.println("IV:" + new String(iv));
+//        try {
+//
+//        } catch (Exception e) {
+//            // TODO Auto-generated catch block
+//            e.printStackTrace();
+//        }
+
+        return encryptedText;
+    }
+
+
+}

+ 0 - 133
Apex Mobile/app/src/main/java/com/usai/util/Crypto.java

@@ -1,133 +0,0 @@
-package com.usai.util;
-
-import java.security.SecureRandom;
-
-import javax.crypto.Cipher;
-import javax.crypto.KeyGenerator;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
-
-/**
- * Usage:
- * 
- * <pre>
- * String crypto = Crypto.encrypt(masterpassword, cleartext) 
- * ... 
- * String cleartext = Crypto.decrypt(masterpassword, crypto)
- * </pre>
- * 
- * @author ferenc.hechler
- */
-public class Crypto
-{
-//    public static SecretKeySpec setSecretKey(String password) throws Exception {
-//        SecretKeySpec key = null;
-//        KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM);
-//        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
-//        sr.setSeed(password.getBytes());
-//        kgen.init(128, sr);
-//        SecretKey secretKey = kgen.generateKey();
-//        byte[] enCodeFormat = secretKey.getEncoded();
-//        key = new SecretKeySpec(enCodeFormat, SecretKeySpec.ALGORITHM);
-//
-//        return key;
-//    }
-
-	public static String encrypt(String seed, String cleartext)
-			throws Exception
-	{
-		byte[] rawKey = getRawKey(seed.getBytes());
-		byte[] result = encrypt(rawKey, cleartext.getBytes());
-		return toHex(result);
-	}
-
-	public static String decrypt(String seed, String encrypted)
-			throws Exception
-	{
-		byte[] rawKey = getRawKey(seed.getBytes());
-		byte[] enc = toByte(encrypted);
-		byte[] result = decrypt(rawKey, enc);
-		return new String(result);
-	}
-
-	private static byte[] getRawKey(byte[] seed) throws Exception
-	{
-		
-        KeyGenerator kgen = KeyGenerator.getInstance("AES");
-        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
-        sr.setSeed(seed);
-        kgen.init(128, sr);
-        SecretKey secretKey = kgen.generateKey();	
-        byte[] enCodeFormat = secretKey.getEncoded();
-//        key = new SecretKeySpec(enCodeFormat, SecretKeySpec.ALGORITHM);
-        return enCodeFormat;
-//
-//        return key;	
-//		KeyGenerator kgen = KeyGenerator.getInstance("AES");
-//		SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
-//		sr.setSeed(seed);
-//		kgen.init(128, sr); // 192 and 256 bits may not be available
-//		SecretKey skey = kgen.generateKey();
-//		byte[] raw = skey.getEncoded();
-//		return raw;
-	}
-
-	private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception
-	{
-		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
-		Cipher cipher = Cipher.getInstance("AES");
-		cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
-		byte[] encrypted = cipher.doFinal(clear);
-		return encrypted;
-	}
-
-	private static byte[] decrypt(byte[] raw, byte[] encrypted)
-			throws Exception
-	{
-		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
-		Cipher cipher = Cipher.getInstance("AES");
-		cipher.init(Cipher.DECRYPT_MODE, skeySpec);
-		byte[] decrypted = cipher.doFinal(encrypted);
-		return decrypted;
-	}
-
-	public static String toHex(String txt)
-	{
-		return toHex(txt.getBytes());
-	}
-
-	public static String fromHex(String hex)
-	{
-		return new String(toByte(hex));
-	}
-
-	public static byte[] toByte(String hexString)
-	{
-		int len = hexString.length() / 2;
-		byte[] result = new byte[len];
-		for (int i = 0; i < len; i++)
-			result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),
-					16).byteValue();
-		return result;
-	}
-
-	public static String toHex(byte[] buf)
-	{
-		if (buf == null)
-			return "";
-		StringBuffer result = new StringBuffer(2 * buf.length);
-		for (int i = 0; i < buf.length; i++)
-		{
-			appendHex(result, buf[i]);
-		}
-		return result.toString();
-	}
-
-	private final static String HEX = "0123456789ABCDEF";
-
-	private static void appendHex(StringBuffer sb, byte b)
-	{
-		sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
-	}
-
-}

+ 143 - 39
Apex Mobile/app/src/main/java/com/usai/util/commonUtil.java

@@ -1,54 +1,158 @@
 package com.usai.util;
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import com.usai.apex.ApexTrackingApplication;
+import com.usai.apex.R;
 
+import android.Manifest;
+import android.app.Activity;
 import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Build;
 import android.os.Environment;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.PermissionChecker;
 import android.telephony.TelephonyManager;
 import android.util.Log;
 
-public class commonUtil
-{
-	private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
-
-	
-	
-	public static boolean localdirExist()
-	{
-
-		File folder = new File(Environment.getExternalStorageDirectory().getPath()+"/Apex Mobile");
-		return (folder.exists() && folder.isDirectory()) ? true : folder.mkdirs();
-	}
-	/**
-	 * Generate a value suitable for use in {@link #setId(int)}.
-	 * This value will not collide with ID values generated at build time by aapt for R.id.
-	 *
-	 * @return a generated ID value
-	 */
-	public static int generateViewId() {
-	    for (;;) {
-	        final int result = sNextGeneratedId.get();
-	        // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
-	        int newValue = result + 1;
-	        if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
-	        if (sNextGeneratedId.compareAndSet(result, newValue)) {
-	            return result;
-	        }
-	    }
-	}
-	public static  String getDUID(){
-		  final TelephonyManager tm = (TelephonyManager) ApexTrackingApplication.get_instance().getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);    
-		  final String tmDevice, tmSerial, androidId;    
-		  tmDevice = "" + tm.getDeviceId();   
-		  tmSerial = "" + tm.getSimSerialNumber();    
-		  androidId = "" + android.provider.Settings.Secure.getString(ApexTrackingApplication.get_instance().getContentResolver(),android.provider.Settings.Secure.ANDROID_ID);    
-		  UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());    
-		  String uniqueId = deviceUuid.toString();
-		  Log.d("debug","uuid="+uniqueId);
-		  return uniqueId;
+public class commonUtil {
+    public static final int MY_PERMISSIONS_REQUEST = 1;
+    private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
+
+    public static Boolean checkPermissions(Activity activity, String[] permissions) {
+        if (Build.VERSION.SDK_INT >= 23) {
+            return checkPermissions_23(activity, permissions);
+        } else {
+            return false;
+//            return checkPermissions_23(activity,permissions);
+        }
+    }
+
+    public static Boolean checkPermissions_23(Activity activity, String[] permissions) {
+        Log.d("_APEXMOBILE", "checkPermissions23:==================================== ");
+        ArrayList<String> request_list = new ArrayList<String>();
+        for (String permission : permissions) {
+            boolean bshow = ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);
+//            boolean granted= ContextCompat.checkSelfPermission(activity,
+//                    Manifest.permission.ACCESS_FINE_LOCATION)
+//                    == PackageManager.PERMISSION_GRANTED;
+            boolean pc = PermissionChecker.checkSelfPermission(activity, permission) == PermissionChecker.PERMISSION_GRANTED;
+//            Log.d("_RAIMAGE", "checkPermissions23: "+permission+"  SHOW  "+bshow+"  granted  "+granted +","+pc);
+
+            if (!pc)
+                request_list.add(permission);
+        }
+        Log.d("_APEXMOBILE", "checkPermissions23:==================================== ");
+
+
+        if (request_list.isEmpty())
+            return false;
+        ActivityCompat.requestPermissions(activity,
+                request_list.toArray(new String[0]),
+                MY_PERMISSIONS_REQUEST);
+
+
+        return true;
+
+    }
+//	public static Boolean checkPermissions_24(Activity activity, String[] permissions)
+//	{
+//
+//
+//		if(permissions.length==0)
+//			return true;
+//		ActivityCompat.requestPermissions(activity,
+//				permissions,
+//				MY_PERMISSIONS_REQUEST);
+//
+//
+//		return true;
+//
+//
+//	}
+//
+//	public static Boolean checkPermissions_23(String[] permissions)
+//	{
+//		Log.d("_RAIMAGE", "checkPermissions23:==================================== ");
+//		ArrayList<String> request_list = new ArrayList<String>();
+//		Context context = ApexTrackingApplication.getInstance().getApplicationContext();
+//		for(String permission : permissions) {
+//
+//			boolean pc = PermissionChecker.checkSelfPermission(context,permission)==PermissionChecker.PERMISSION_GRANTED;
+//			if(!pc)
+//				return false;
+//		}
+//		Log.d("_RAIMAGE", "checkPermissions23:==================================== ");
+//
+//
+//
+//		return true;
+//
+//	}
+
+    public static int iconName2Rid(String name) {
+
+        if (name.equals(""))
+            return R.drawable.bg_4;
+        return R.drawable.bg_4;
+    }
+
+    public static boolean localdirExist() {
+
+        File folder = new File(Environment.getExternalStorageDirectory().getPath() + "/Apex Mobile");
+        return (folder.exists() && folder.isDirectory()) ? true : folder.mkdirs();
+    }
+
+    /**
+     * Generate a value suitable for use in {@link #setId(int)}.
+     * This value will not collide with ID values generated at build time by aapt for R.id.
+     *
+     * @return a generated ID value
+     */
+    public static int generateViewId() {
+        for (; ; ) {
+            final int result = sNextGeneratedId.get();
+            // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
+            int newValue = result + 1;
+            if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
+            if (sNextGeneratedId.compareAndSet(result, newValue)) {
+                return result;
+            }
+        }
+    }
+
+    public static String getDUID() {
+        final TelephonyManager tm = (TelephonyManager) ApexTrackingApplication.get_instance().getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
+        final String tmDevice, tmSerial, androidId;
+        String uniqueId;
+        try {
+            if (ActivityCompat.checkSelfPermission(ApexTrackingApplication.get_instance(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
+                // TODO: Consider calling
+                //    ActivityCompat#requestPermissions
+                // here to request the missing permissions, and then overriding
+                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
+                //                                          int[] grantResults)
+                // to handle the case where the user grants the permission. See the documentation
+                // for ActivityCompat#requestPermissions for more details.
+                return null;
+            }
+            tmDevice = "" + tm.getDeviceId();
+            tmSerial = "" + tm.getSimSerialNumber();
+            androidId = "" + android.provider.Settings.Secure.getString(ApexTrackingApplication.get_instance().getContentResolver(),android.provider.Settings.Secure.ANDROID_ID);
+            UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
+            uniqueId = deviceUuid.toString();
+            Log.d("debug","uuid="+uniqueId);
+
+        }
+        catch(Exception e)
+        {
+            uniqueId= null;
+        }
+        return uniqueId;
+
 		 }
 }

+ 10 - 0
Apex Mobile/app/src/main/res/drawable-mdpi/bottom_shadow.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <gradient
+        android:angle="90"
+        android:endColor="#0000"
+        android:startColor="#30000000"
+        android:type="linear"/>
+
+</shape>

+ 17 - 0
Apex Mobile/app/src/main/res/drawable/list_bg.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
+    <!--&lt;!&ndash; 渐变 &ndash;&gt;-->
+    <!--&lt;!&ndash;<gradient android:angle="180" android:endColor="#FFCCCCCC"&ndash;&gt;-->
+    <!--&lt;!&ndash;android:startColor="@android:color/white" />&ndash;&gt;-->
+    <!--&lt;!&ndash; 描边 &ndash;&gt;-->
+    <!--<stroke android:width="1dp" android:color="@android:color/darker_gray" />-->
+
+    <!-- 实心填充 -->
+    <solid android:color="@android:color/white" />
+
+    <!--&lt;!&ndash; 圆角 &ndash;&gt;-->
+    <!--<corners android:bottomLeftRadius="8dip"-->
+        <!--android:bottomRightRadius="8dip" android:topLeftRadius="8dip"-->
+        <!--android:topRightRadius="8dip" />-->
+
+</shape>

+ 22 - 0
Apex Mobile/app/src/main/res/drawable/list_corner_round.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <!--
+    渐变
+    <gradient android:startColor="#B5E7B8"
+        android:endColor="#76D37B"
+        android:angle="270"/>
+
+    -->
+    <gradient
+        android:angle="270"
+        android:endColor="#40B9FF"
+        android:startColor="#BFEEFF" />
+
+    <corners
+        android:bottomLeftRadius="8dip"
+        android:bottomRightRadius="8dip"
+        android:topLeftRadius="8dip"
+        android:topRightRadius="8dip" />
+
+</shape>

+ 17 - 0
Apex Mobile/app/src/main/res/drawable/list_corner_round_bg.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
+    <!-- 渐变 -->
+    <!--<gradient android:angle="180" android:endColor="#FFCCCCCC"-->
+        <!--android:startColor="@android:color/white" />-->
+    <!-- 描边 -->
+    <stroke android:width="0.3dp" android:color="@android:color/darker_gray" />
+
+    <!-- 实心填充 -->
+    <solid android:color="@android:color/white" />
+
+    <!-- 圆角 -->
+    <corners android:bottomLeftRadius="8dip"
+        android:bottomRightRadius="8dip" android:topLeftRadius="8dip"
+        android:topRightRadius="8dip" />
+
+</shape>  

+ 7 - 0
Apex Mobile/app/src/main/res/drawable/list_div.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <solid android:color="@color/table_bg" />
+
+
+</shape>

+ 42 - 0
Apex Mobile/app/src/main/res/layout/activity_root.xml

@@ -0,0 +1,42 @@
+<?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:id="@+id/activity_main"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <android.support.v4.view.ViewPager
+        android:id="@+id/viewpager"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@+id/bottom_navigation" />
+
+    <android.support.design.widget.BottomNavigationView
+        android:id="@+id/bottom_navigation"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+
+
+        android:background="@color/tab_bg"
+        app:itemTextColor="@color/icon_red">
+
+    </android.support.design.widget.BottomNavigationView>
+
+    <View
+        android:id="@+id/view"
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_above="@id/bottom_navigation"
+        android:background="@drawable/bottom_shadow" />
+    <!--app:itemIconTint="@drawable/bottom_navigation_selector"-->
+    <!--app:itemTextColor="@drawable/bottom_navigation_selector"-->
+
+    <!--<View-->
+        <!--android:layout_width="match_parent"-->
+        <!--android:layout_height="5dp"-->
+        <!--android:layout_above="@id/bottom_navigation"-->
+        <!--android:background="@drawable/bottom_shadow" />-->
+
+</RelativeLayout>

+ 13 - 0
Apex Mobile/app/src/main/res/layout/fragment_history.xml

@@ -0,0 +1,13 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.usai.apex.mainframe.HistoryFragment">
+
+    <!-- TODO: Update blank fragment layout -->
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="@string/hello_blank_fragment" />
+
+</FrameLayout>

+ 13 - 0
Apex Mobile/app/src/main/res/layout/fragment_home.xml

@@ -0,0 +1,13 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.usai.apex.mainframe.HomeFragment">
+
+    <!-- TODO: Update blank fragment layout -->
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="@string/hello_blank_fragment" />
+
+</FrameLayout>

+ 13 - 0
Apex Mobile/app/src/main/res/layout/fragment_my.xml

@@ -0,0 +1,13 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.usai.apex.mainframe.MyFragment">
+
+    <!-- TODO: Update blank fragment layout -->
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="@string/hello_blank_fragment" />
+
+</FrameLayout>

+ 13 - 0
Apex Mobile/app/src/main/res/layout/fragment_search.xml

@@ -0,0 +1,13 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.usai.apex.mainframe.SearchFragment">
+
+    <!-- TODO: Update blank fragment layout -->
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="@string/hello_blank_fragment" />
+
+</FrameLayout>

+ 13 - 0
Apex Mobile/app/src/main/res/layout/fragment_static_modelist.xml

@@ -0,0 +1,13 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.usai.apex.mainframe.StaticModelistFragment">
+
+    <!-- TODO: Update blank fragment layout -->
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="@string/hello_blank_fragment" />
+
+</FrameLayout>

+ 2 - 2
Apex Mobile/app/src/main/res/layout/fragment_tools.xml

@@ -7,7 +7,7 @@
         android:id="@+id/iv_icon"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:src="@drawable/ic_launcher" 
+        android:src="@drawable/ic_launcher"
         />
 
     <TextView
@@ -17,7 +17,7 @@
         android:layout_gravity="center"
         android:layout_weight="1"
         android:gravity="center"
-        android:text="Tool name" 
+        android:text="Tool name"
         android:textSize="20sp"/>
 
     <ImageView

+ 51 - 0
Apex Mobile/app/src/main/res/layout/static_modelist_cell.xml

@@ -0,0 +1,51 @@
+<?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="wrap_content"
+    android:background="@drawable/list_bg"
+    android:orientation="vertical">
+
+    <android.support.constraint.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="64dp">
+
+        <TextView
+            android:id="@+id/tv_name"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginEnd="16dp"
+            android:layout_marginStart="8dp"
+            android:layout_weight="1"
+            android:gravity="left"
+            android:text="Tool name"
+            android:textAlignment="viewStart"
+            android:textColor="@android:color/black"
+            android:textSize="20sp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/iv_icon"
+            app:layout_constraintTop_toTopOf="@+id/iv_icon" />
+
+        <ImageView
+            android:id="@+id/iv_icon"
+            android:layout_width="48dp"
+            android:layout_height="48dp"
+            android:layout_marginStart="16dp"
+            android:src="@drawable/ic_launcher"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/tv_detail"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="8dp"
+            android:text="TextView"
+            app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
+            app:layout_constraintStart_toEndOf="@+id/iv_icon" />
+    </android.support.constraint.ConstraintLayout>
+
+</LinearLayout>

+ 95 - 0
Apex Mobile/app/src/main/res/layout/tracking_list_cell.xml

@@ -0,0 +1,95 @@
+<?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="wrap_content"
+    android:orientation="vertical">
+
+    <android.support.constraint.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="110dp"
+        android:layout_marginLeft="5dp"
+        android:layout_marginRight="5dp"
+        android:background="@drawable/list_corner_round_bg">
+
+        <ImageView
+            android:id="@+id/iv_status"
+            android:layout_width="48dp"
+            android:layout_height="48dp"
+            android:layout_marginStart="15dp"
+            android:layout_marginTop="5dp"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tv_time"
+            app:srcCompat="@drawable/ic_launcher" />
+
+        <TextView
+            android:id="@+id/tv_title"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="15dp"
+            android:layout_marginStart="15dp"
+            android:layout_marginTop="10dp"
+            android:text="TextView"
+            android:textColor="@color/icon_gray"
+            android:textSize="15sp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/tv_time"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="8dp"
+            android:layout_marginStart="15dp"
+            android:layout_marginTop="3dp"
+            android:text="TextView"
+            android:textColor="@color/icon_red"
+            android:textSize="12sp"
+            app:layout_constraintEnd_toStartOf="@+id/tv_port"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tv_title" />
+
+        <TextView
+            android:id="@+id/tv_port"
+            android:layout_width="94dp"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="15dp"
+            android:layout_marginTop="3dp"
+            android:gravity="right"
+            android:text="CNTAO - USLAX"
+            android:textColor="@color/icon_red"
+            android:textSize="12sp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tv_title" />
+
+        <TextView
+            android:id="@+id/tv_description"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="15dp"
+            android:layout_marginStart="8dp"
+            android:text="TextView"
+            android:textColor="@color/icon_gray"
+            android:textSize="15sp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/iv_status"
+            app:layout_constraintTop_toTopOf="@+id/iv_status" />
+
+        <TextView
+            android:id="@+id/tv_detail"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_marginEnd="15dp"
+            android:layout_marginStart="8dp"
+            android:layout_marginTop="5dp"
+            android:text="TextView"
+            android:textColor="@android:color/darker_gray"
+            android:textSize="12sp"
+            app:layout_constraintBottom_toBottomOf="@+id/iv_status"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/iv_status"
+            app:layout_constraintTop_toBottomOf="@+id/tv_description" />
+    </android.support.constraint.ConstraintLayout>
+</LinearLayout>

+ 26 - 0
Apex Mobile/app/src/main/res/menu/navi_login.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/item_home"
+        android:icon="@drawable/ic_about"
+        android:title="home" />
+    <item
+        android:id="@+id/item_history"
+        android:icon="@drawable/ic_about"
+        android:title="history" />
+
+    <item
+        android:id="@+id/item_search"
+        android:icon="@drawable/ic_about"
+        android:title="search" />
+
+    <item
+        android:id="@+id/item_tool"
+        android:icon="@drawable/ic_about"
+        android:title="tool" />
+    <item
+        android:id="@+id/item_my"
+        android:icon="@drawable/ic_about"
+        android:title="my" />
+
+</menu>

+ 12 - 0
Apex Mobile/app/src/main/res/menu/navi_logout.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/item_login"
+        android:icon="@drawable/ic_about"
+        android:title="login" />
+    <item
+        android:id="@+id/item_otool"
+        android:icon="@android:drawable/btn_star"
+        android:title="tool" />
+
+</menu>

+ 29 - 0
Apex Mobile/app/src/main/res/raw/fake_container_list.json

@@ -0,0 +1,29 @@
+{
+    "container_list": [
+                       {
+                       "title": "FACTORY/CUSTOMER",
+                       "icon": "status_departport",
+                       "description": "A1801350973 (6 containers)",
+                       "detail": "Container# MOFU0744152 depart relay port SINGAPORE (SGSIN)",
+                       "date": "12/10/2017 - 02/18/2018",
+                       "port": "CNTAO - USLAX"
+                       },
+                       {
+                       "title": "FACTORY/CUSTOMER",
+                       "icon": "status_load_vessel",
+                       "description": "A1801350973 (6 containers)",
+                       "detail": "Container# GESU1059076 loaded on vessel YM UBIQUITY",
+                       "date": "12/10/2017 - 02/18/2018",
+                       "port": "CNTAO - USLAX"
+                       },
+                       {
+                       "title": "FACTORY/CUSTOMER",
+                       "icon": "status_delivery",
+                       "description": "A1801350973 (6 containers)",
+                       "detail": "Container# UACU3259986 available for pickup or delivery",
+                       "date": "12/10/2017 - 02/18/2018",
+                       "port": "CNTAO - USLAX"
+                       }
+                       ],
+    "result": -1
+}

+ 251 - 0
Apex Mobile/app/src/main/res/raw/fake_search.json

@@ -0,0 +1,251 @@
+{
+    "result": 2,
+    "table_title":"Test Search Title",
+    "menu": [
+             {
+             "title": "Export 1",
+             "action": "download",
+             "url": "xxx"
+             },
+             {
+             "title": "Export 2",
+             "action": "download",
+             "url": "xxx"
+             },
+             {
+             "title": "Save",
+             "action": "save"
+             }
+             ],
+    "row_action": [
+                   {
+                   "title": "demo title",
+                   "module0": "quick_look",
+                   "module1": "kv_detail",
+                   "module": "order_detail",
+                   "url": "http://1.1.1.1",
+                   "params": {
+                   "order#": 0
+                   }
+                   }
+                   ],
+    "data": {
+        "count": 17,
+        "item_0": [
+                   "<b></b>",
+                   "<b>def</b>",
+                   "$ 123.45",
+                   "43",
+                   "metal table with 4 chairs"
+                   ],
+        "item_1": [
+                   "2",
+                   "315318",
+                   "$ 99.49",
+                   "13",
+                   "WOOD table with 4 chairs"
+                   ],
+        "item_2": [
+                   "3",
+                   "7033566",
+                   "$ 13.45",
+                   "57",
+                   "bed"
+                   ],
+        "item_3": [
+                   "4",
+                   "8533-UVR",
+                   "$ 1123.45",
+                   "143",
+                   "<b>Desk</b> & chair UILongPressGestureRecognizer *longPress"
+                   ],
+        "item_4": [
+                   "1",
+                   "8533-UPK",
+                   "$ 123.45",
+                   "43",
+                   "metal table with 4 chairs"
+                   ],
+        "item_5": [
+                   "2",
+                   "315318",
+                   "$ 99.49",
+                   "13",
+                   "WOOD table with 4 chairs"
+                   ],
+        "item_6": [
+                   "3",
+                   "7033566",
+                   "$ 13.45",
+                   "57",
+                   "bed"
+                   ],
+        "item_7": [
+                   "4",
+                   "8533-UVR",
+                   "$ 1123.45",
+                   "143",
+                   "Desk & chair UILongPressGestureRecognizer *longPress"
+                   ],
+        "item_8": [
+                   "1",
+                   "8533-UPK",
+                   "$ 123.45",
+                   "43",
+                   "metal table with 4 chairs"
+                   ],
+        "item_9": [
+                   "2",
+                   "315318",
+                   "$ 99.49",
+                   "13",
+                   "WOOD table with 4 chairs"
+                   ],
+        "item_10": [
+                    "3",
+                    "7033566",
+                    "$ 13.45",
+                    "57",
+                    "bed"
+                    ],
+        "item_11": [
+                    "1",
+                    "8533-UPK",
+                    "$ 123.45",
+                    "43",
+                    "metal table with 4 chairs"
+                    ],
+        "item_12": [
+                    "2",
+                    "315318",
+                    "$ 99.49",
+                    "13",
+                    "WOOD table with 4 chairs"
+                    ],
+        "item_13": [
+                    "3",
+                    "7033566",
+                    "$ 13.45",
+                    "57",
+                    "bed"
+                    ],
+        "item_14": [
+                    "1",
+                    "8533-UPK",
+                    "$ 123.45",
+                    "43",
+                    "metal table with 4 chairs"
+                    ],
+        "item_15": [
+                    "2",
+                    "315318",
+                    "$ 99.49",
+                    "13",
+                    "WOOD table with 4 chairs"
+                    ],
+        "item_16": [
+                    "3",
+                    "7033566",
+                    "$ 13.45",
+                    "57",
+                    "bed"
+                    ]
+    },
+    "layout": {
+        "header": {
+            "width": 810,
+            "height": 44,
+            "margin_r": 10,
+            "margin_l": 10,
+            "margin_t": 10,
+            "margin_b": 10,
+            "bg_color": "0x123456",
+            "f_color": "0x987654",
+            "col": [
+                    {
+                    "width": 100,
+                    "name": "id",
+                    "h_align": "center",
+                    "v_center": "center",
+                    "bg_color": "0x123456",
+                    "f_color": "0x654321"
+                    },
+                    {
+                    "width": 160,
+                    "name": "model",
+                    "h_align": "center",
+                    "v_center": "center",
+                    "bg_color": "0x123456",
+                    "f_color": "0x654321"
+                    },
+                    {
+                    "width": 180,
+                    "name": "price",
+                    "h_align": "center",
+                    "v_center": "center",
+                    "bg_color": "0x123456",
+                    "f_color": "0x654321"
+                    },
+                    {
+                    "width": 120,
+                    "name": "stock",
+                    "h_align": "center",
+                    "v_center": "center",
+                    "bg_color": "0x123456",
+                    "f_color": "0x654321"
+                    },
+                    {
+                    "width": 250,
+                    "name": "description",
+                    "h_align": "center",
+                    "v_center": "center",
+                    "bg_color": "0x123456",
+                    "f_color": "0x654321"
+                    }
+                    ]
+        },
+        "row": {
+            "height": 44,
+            "f_color": "0x654321",
+            "color_0": "0xffffff",
+            "color_1": "0x666666",
+            "val": [
+                    {
+                    "type": "image",
+                    "h_align": "center",
+                    "v_center": "center",
+                    "bg_color": "0x123456",
+                    "f_color": "0x654321"
+                    },
+                    {
+                    "type": "text",
+                    "h_align": "center",
+                    "v_center": "center",
+                    "bg_color": "0x123456",
+                    "f_color": "0x654321"
+                    },
+                    {
+                    "type": "text",
+                    "h_align": "center",
+                    "v_center": "center",
+                    "bg_color": "0x123456",
+                    "f_color": "0x654321"
+                    },
+                    {
+                    "type": "text",
+                    "h_align": "center",
+                    "v_center": "center",
+                    "bg_color": "0x123456",
+                    "f_color": "0x654321"
+                    },
+                    {
+                    "type": "text",
+                    "h_align": "center",
+                    "v_center": "center",
+                    "bg_color": "0x123456",
+                    "f_color": "0x654321"
+                    }
+                    ]
+        }
+    }
+}

+ 53 - 0
Apex Mobile/app/src/main/res/raw/fake_tracking.json

@@ -0,0 +1,53 @@
+{
+    "result": 2,
+    "group0": {
+        "_name": "General Info",
+        "_type": "mapping",
+        "count": 8,
+        "item0": {
+            "H_BOL": "A1802310244"
+        },
+        "item1": {
+            "ETD": "2018-02-01"
+        },
+        "item2": {
+            "ETA": "2018-02-20"
+        },
+        "item3": {
+            "Place_Of_Receipt": "BANGKOK,  THAILAND"
+        },
+        "item4": {
+            "Port_Of_Loading": "LAEM CHABANG, THAILAND"
+        },
+        "item5": {
+            "Port_Of_Discharge": "NHAVA SHEVA,INDIA."
+        },
+        "item6": {
+            "Place_Of_Delivery": "NHAVA SHEVA,INDIA."
+        },
+        "item7": {
+            "Tracing on the carrier website": "HTTP://WWW.MOLPOWER.COM/HTM/DEFAULT.HTM"
+        }
+    },
+    "group1": {
+        "_name": "Container NO : TRHU2473608",
+        "_type": "tracking",
+        "count": 3,
+        "item0": {
+            "icon": "status_delivery",
+            "msg": "tracking message 3 bla bla bla bla bla 12/25/2017 18:23:35",
+            "time": "12/25/2017 18:23:35"
+        },
+        "item1": {
+            "icon": "status_load_vessel",
+            "msg": "tracking message 2 bla bla bla 12/22/2017 18:23:35",
+            "time": "12/22/2017 18:23:35"
+        },
+        "item2": {
+            "icon": "status_departport",
+            "msg": "tracking message 1 bla bla bla bla 12/20/2017 18:23:35",
+            "time": "12/20/2017 18:23:35"
+        }
+    },
+    "count": 2
+}

+ 44 - 0
Apex Mobile/app/src/main/res/raw/my.json

@@ -0,0 +1,44 @@
+{
+    "remark":"my菜单",
+    "modelist": [
+                 {
+                 "name": "Saved Detail",
+                 "detail": "View saved detail information",
+                 "icon": "mode_detail",
+                 "type": "saved_detail"
+                 },
+                 {
+                 "name": "Saved Search",
+                 "detail": "View saved search criteria",
+                 "icon": "mode_search",
+                 "type": "saved_search"
+                 },
+                 {
+                 "name": "Saved Documents",
+                 "detail": "Documents you have downloaded",
+                 "icon": "mode_document",
+                 "type": "saved_document"
+                 },
+                 {
+                 "name": "Message",
+                 "detail": "Notifacation message",
+                 "icon": "mode_message",
+                 "type": "message"
+                 },
+                 {
+                 "name": "Change Password",
+                 "detail": "Update login password",
+                 "icon": "mode_change_password",
+                 "type": "change_password"
+                 },
+                 {
+                 "name": "Logout",
+                 "detail": "Sign out",
+                 "icon": "mode_logout",
+                 "type": "logout"
+                 }
+                 ],
+    "title": "My",
+    "icon":"tab_my"
+}
+

+ 31 - 0
Apex Mobile/app/src/main/res/raw/search.json

@@ -0,0 +1,31 @@
+{
+    "remark":"search菜单",
+    "modelist": [
+                 {
+                 "name": "Ocean Booking",
+                 "detail": "Search ocean booking information",
+                 "icon": "mode_booking",
+                 "type": "ocean_booking"
+                 },
+                 {
+                 "name": "Ocean B/L Info.",
+                 "detail": "Search ocean bill of lading information",
+                 "icon": "mode_bl",
+                 "type": "ocean_blinfo"
+                 },
+                 {
+                 "name": "Container Detail",
+                 "detail": "Search container",
+                 "icon": "mode_container",
+                 "type": "container_detail"
+                 },
+                 {
+                 "name": "Document",
+                 "detail": "Search document",
+                 "icon": "mode_document",
+                 "type": "document"
+                 }
+                 ],
+    "title": "Search",
+    "icon":"tab_search"
+}

+ 37 - 0
Apex Mobile/app/src/main/res/raw/tools.json

@@ -0,0 +1,37 @@
+{
+    "remark":"tool菜单",
+    "modelist": [
+                 {
+                 "name": "Market News",
+                 "detail": "View market news",
+                 "icon": "mode_news",
+                 "type": "market_news"
+                 },
+                 {
+                 "name": "Announcements",
+                 "detail": "Public statement by Apex Group",
+                 "icon": "mode_announcement",
+                 "type": "announcements"
+                 },
+                 {
+                 "name": "Apex History",
+                 "detail": "Learn history of Apex Group",
+                 "icon": "mode_history",
+                 "type": "history"
+                 },
+                 {
+                 "name": "Service Location",
+                 "detail": "Find local Apex office",
+                 "icon": "mode_service_location",
+                 "type": "service_location"
+                 },
+                 {
+                 "name": "About",
+                 "detail": "About this app",
+                 "icon": "mode_about",
+                 "type": "about"
+                 }
+                 ],
+    "title": "Tools",
+    "icon":"tab_tools"
+}

+ 0 - 10
Apex Mobile/app/src/main/res/values-large/styles.xml

@@ -1,10 +0,0 @@
-<resources>
-
-    <style name="LoginFormContainer">
-        <item name="android:layout_width">400dp</item>
-        <item name="android:layout_height">wrap_content</item>
-        <item name="android:layout_gravity">center</item>
-        <item name="android:padding">16dp</item>
-    </style>
-
-</resources>

+ 0 - 11
Apex Mobile/app/src/main/res/values-v11/styles.xml

@@ -1,11 +0,0 @@
-<resources>
-
-    <!--
-        Base application theme for API 11+. This theme completely replaces
-        AppBaseTheme from res/values/styles.xml on API 11+ devices.
-    -->
-    <style name="AppBaseTheme" parent="android:Theme.Light">
-        <!-- API 11 theme customizations can go here. -->
-    </style>
-
-</resources>

+ 0 - 12
Apex Mobile/app/src/main/res/values-v14/styles.xml

@@ -1,12 +0,0 @@
-<resources>
-
-    <!--
-        Base application theme for API 14+. This theme completely replaces
-        AppBaseTheme from BOTH res/values/styles.xml and
-        res/values-v11/styles.xml on API 14+ devices.
-    -->
-    <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
-        <!-- API 14 theme customizations can go here. -->
-    </style>
-
-</resources>

+ 13 - 0
Apex Mobile/app/src/main/res/values/colors.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="colorPrimary">#FAFAFA</color>
+    <color name="tab_bg">#F7f7f7</color>
+
+    <color name="colorPrimaryDark">#303F9F</color>
+    <color name="colorAccent">#FF4081</color>
+
+
+    <color name="icon_red">#b22123</color>
+    <color name="icon_gray">#444445</color>
+    <color name="table_bg">#efeff4</color>
+</resources>

+ 3 - 0
Apex Mobile/app/src/main/res/values/strings.xml

@@ -126,6 +126,9 @@
     <string name="title_activity_settings">Settings</string>
     <!-- RELEASE KEY -->
     <string name="baidu_key">nqBQoSDbxrslhuzW91uViQX7</string>
+
+    <!-- TODO: Remove or change this placeholder text -->
+    <string name="hello_blank_fragment">Hello blank fragment</string>
     <!-- DEBUG KEY -->
     <!-- <string name="baidu_key">tznWFxd3RvSoul1TGQp6GSzo</string> -->
 

+ 39 - 18
Apex Mobile/app/src/main/res/values/styles.xml

@@ -1,27 +1,48 @@
-<?xml version="1.0" encoding="utf-8"?>
+<!--<?xml version="1.0" encoding="utf-8"?>-->
+<!--<resources>-->
+
+    <!--&lt;!&ndash;-->
+        <!--Base application theme, dependent on API level. This theme is replaced-->
+        <!--by AppBaseTheme from res/values-vXX/styles.xml on newer devices.-->
+
+    <!--&ndash;&gt;-->
+    <!--<style name="AppBaseTheme" parent="android:Theme.Light">-->
+        <!--&lt;!&ndash;-->
+            <!--Theme customizations available in newer API levels can go in-->
+            <!--res/values-vXX/styles.xml, while customizations related to-->
+            <!--backward-compatibility can go here.-->
+
+        <!--&ndash;&gt;-->
+    <!--</style>-->
+
+    <!--&lt;!&ndash; Application theme. &ndash;&gt;-->
+    <!--<style name="AppTheme" parent="android:Theme.Light">-->
+        <!--&lt;!&ndash; All customizations that are NOT specific to a particular API-level can go here. &ndash;&gt;-->
+    <!--</style>-->
+
+    <!--<style name="LoginFormContainer">-->
+        <!--<item name="android:layout_width">match_parent</item>-->
+        <!--<item name="android:layout_height">wrap_content</item>-->
+        <!--<item name="android:padding">16dp</item>-->
+    <!--</style>-->
+
+<!--</resources>-->
+
 <resources>
 
-    <!--
-        Base application theme, dependent on API level. This theme is replaced
-        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.

-    -->
-    <style name="AppBaseTheme" parent="android:Theme.Light">
-        <!--
-            Theme customizations available in newer API levels can go in
-            res/values-vXX/styles.xml, while customizations related to
-            backward-compatibility can go here.

-        -->
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
     </style>
 
-    <!-- Application theme. -->
-    <style name="AppTheme" parent="android:Theme.Light">
-        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
-    </style>
 
     <style name="LoginFormContainer">
-        <item name="android:layout_width">match_parent</item>
-        <item name="android:layout_height">wrap_content</item>
-        <item name="android:padding">16dp</item>
+    <item name="android:layout_width">match_parent</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:padding">16dp</item>
     </style>
 
 </resources>

BIN
Apex Mobile/captures/com.usai.apex_2018.02.07_17.14.li


+ 2 - 2
Apex Mobile/local.properties

@@ -7,5 +7,5 @@
 # Location of the SDK. This is only used by Gradle.
 # For customization when using a Version Control System, please read the
 # header note.
-#Mon Feb 05 10:04:32 CST 2018
-sdk.dir=/Users/macmini1/Library/Android/sdk
+#Tue Feb 06 09:33:38 CST 2018
+sdk.dir=/Users/ray/Library/Android/sdk