Ray Zhang 12 ani în urmă
părinte
comite
5669adc457
41 a modificat fișierele cu 2138 adăugiri și 545 ștergeri
  1. 24 9
      Apex/AndroidManifest.xml
  2. BIN
      Apex/res/drawable-xxhdpi/ic_launcher_new.png
  3. BIN
      Apex/res/drawable-xxhdpi/ic_message.png
  4. BIN
      Apex/res/drawable-xxhdpi/ic_message_new.png
  5. BIN
      Apex/res/drawable-xxhdpi/ic_tools.png
  6. 7 0
      Apex/res/layout/activity_blank.xml
  7. 7 0
      Apex/res/layout/activity_inner_tools.xml
  8. 3 3
      Apex/res/layout/activity_result.xml
  9. 40 0
      Apex/res/layout/activity_search_history.xml
  10. 1 1
      Apex/res/layout/activity_search_list.xml
  11. 16 0
      Apex/res/layout/fragment_inner_tools.xml
  12. 5 3
      Apex/res/layout/fragment_login.xml
  13. 15 0
      Apex/res/layout/message_detail_item.xml
  14. 14 0
      Apex/res/layout/message_list.xml
  15. 39 0
      Apex/res/layout/message_list_item.xml
  16. 10 10
      Apex/res/layout/new_function_select.xml
  17. 4 4
      Apex/res/layout/search_item_datepicker.xml
  18. 11 6
      Apex/res/menu/detail.xml
  19. 11 0
      Apex/res/menu/inner_tools.xml
  20. 11 0
      Apex/res/menu/message.xml
  21. 87 0
      Apex/res/values-zh-rCN/strings.xml
  22. 35 2
      Apex/res/values/strings.xml
  23. 23 13
      Apex/src/com/usai/apex/Alarmreceiver.java
  24. 60 25
      Apex/src/com/usai/apex/ApexTrackingApplication.java
  25. 0 83
      Apex/src/com/usai/apex/CargoTrackingActivity.java
  26. 2 9
      Apex/src/com/usai/apex/ChangePasswordActivity.java
  27. 68 28
      Apex/src/com/usai/apex/DetailActivity.java
  28. 227 145
      Apex/src/com/usai/apex/DetailFragment.java
  29. 68 23
      Apex/src/com/usai/apex/FunctionSelectActivity.java
  30. 31 0
      Apex/src/com/usai/apex/InnerToolsActivity.java
  31. 2 2
      Apex/src/com/usai/apex/LoginFragment.java
  32. 345 0
      Apex/src/com/usai/apex/MessageActivity.java
  33. 424 0
      Apex/src/com/usai/apex/MessageDetailActivity.java
  34. 25 5
      Apex/src/com/usai/apex/ResultActivity.java
  35. 169 120
      Apex/src/com/usai/apex/RetrievePasswordActivity.java
  36. 63 0
      Apex/src/com/usai/apex/SearchHistoryActivity.java
  37. 15 0
      Apex/src/com/usai/apex/SearchListActivity.java
  38. 81 11
      Apex/src/com/usai/apex/ToolsFragment.java
  39. 146 19
      Apex/src/com/usai/util/Network.java
  40. 14 4
      Apex/src/com/usai/util/SqlOpenHelper.java
  41. 35 20
      Apex/src/com/usai/util/dbUtil.java

+ 24 - 9
Apex/AndroidManifest.xml

@@ -10,6 +10,8 @@
         android:targetSdkVersion="18" />
 
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
+    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
     <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" />
@@ -139,11 +141,6 @@
             android:logo="@drawable/apexlogo_2"
             android:screenOrientation="portrait"
             android:windowSoftInputMode="adjustPan" >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
         </activity>
         <!--
              <activity
@@ -159,8 +156,14 @@
         <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" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
         </activity>
         <activity
             android:name="com.usai.apex.SearchActivity"
@@ -195,10 +198,6 @@
             android:screenOrientation="portrait"
             android:theme="@android:style/Theme.Holo.NoActionBar" >
         </activity>
-        <activity
-            android:name="com.usai.apex.CargoTrackingActivity"
-            android:label="@string/title_activity_cargo_tracking" >
-        </activity>
         <activity
             android:name="com.usai.apex.SearchListActivity"
             android:label="@string/title_activity_search_list"
@@ -210,6 +209,11 @@
             android:label="@string/title_activity_retrieve_password"
             android:screenOrientation="portrait" >
         </activity>
+        <activity
+            android:name="com.usai.apex.MessageActivity"
+            android:label="@string/title_activity_message"
+            android:screenOrientation="portrait" >
+        </activity>
         <activity
             android:name="com.usai.apex.ChangePasswordActivity"
             android:label="Change Password"
@@ -237,8 +241,19 @@
         <receiver android:name="com.usai.apex.Alarmreceiver" >
             <intent-filter>
                 <action android:name="com.usai.apex.push" />
+                <action android:name="com.usai.apex.push.cancel" />
             </intent-filter>
         </receiver>
+
+        <activity
+            android:name="com.usai.apex.MessageDetailActivity"
+            android:label="@string/title_activity_message_detail"
+            android:screenOrientation="portrait" >
+        </activity>
+        <activity
+            android:name="com.usai.apex.InnerToolsActivity"
+            android:label="@string/title_activity_inner_tools" >
+        </activity>
     </application>
 
 </manifest>

BIN
Apex/res/drawable-xxhdpi/ic_launcher_new.png


BIN
Apex/res/drawable-xxhdpi/ic_message.png


BIN
Apex/res/drawable-xxhdpi/ic_message_new.png


BIN
Apex/res/drawable-xxhdpi/ic_tools.png


+ 7 - 0
Apex/res/layout/activity_blank.xml

@@ -0,0 +1,7 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.usai.apex.MessageDetailActivity"
+    tools:ignore="MergeRootFrame" />

+ 7 - 0
Apex/res/layout/activity_inner_tools.xml

@@ -0,0 +1,7 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.usai.apex.InnerToolsActivity"
+    tools:ignore="MergeRootFrame" />

+ 3 - 3
Apex/res/layout/activity_result.xml

@@ -73,7 +73,7 @@
             android:layout_height="wrap_content"
             android:layout_weight="1"
             style="@android:attr/buttonBarButtonStyle"
-            android:text="Pre Page" 
+            android:text="@string/str_prepage" 
             android:enabled="false"/>
 
         <Button
@@ -84,7 +84,7 @@
             android:layout_weight="1"
 
             android:enabled="false"
-            android:text="Next Page" />
+            android:text="@string/str_nextpage" />
 
     </LinearLayout>
 
@@ -94,7 +94,7 @@
         android:layout_height="wrap_content"
         android:layout_alignParentTop="true"
         android:layout_centerHorizontal="true"
-        android:text="0 records"
+        android:text="@string/str_0"
         android:textAppearance="?android:attr/textAppearanceLarge" />
 
     <LinearLayout

+ 40 - 0
Apex/res/layout/activity_search_history.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/tabhost"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
+
+    <RelativeLayout
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent" >
+
+        <TabWidget
+            android:id="@android:id/tabs"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true" >
+        </TabWidget>
+
+        <FrameLayout
+            android:id="@android:id/tabcontent"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:layout_above="@android:id/tabs"
+            android:layout_alignParentLeft="true" >
+
+            <FrameLayout
+                android:id="@+id/tab1"
+                android:layout_width="fill_parent"
+                android:layout_height="fill_parent" >
+            </FrameLayout>
+
+            <FrameLayout
+                android:id="@+id/tab2"
+                android:layout_width="fill_parent"
+                android:layout_height="fill_parent" >
+            </FrameLayout>
+
+        </FrameLayout>
+    </RelativeLayout>
+
+</TabHost>

+ 1 - 1
Apex/res/layout/activity_search_list.xml

@@ -41,7 +41,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_weight="1"
-            android:text="Reset" />
+            android:text="@string/str_reset" />
 
         <Button
             android:id="@+id/btnok"

+ 16 - 0
Apex/res/layout/fragment_inner_tools.xml

@@ -0,0 +1,16 @@
+<RelativeLayout 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"
+    android:paddingBottom="@dimen/activity_vertical_margin"
+    android:paddingLeft="@dimen/activity_horizontal_margin"
+    android:paddingRight="@dimen/activity_horizontal_margin"
+    android:paddingTop="@dimen/activity_vertical_margin"
+    tools:context="com.usai.apex.InnerToolsActivity$PlaceholderFragment" >
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/hello_world" />
+
+</RelativeLayout>

+ 5 - 3
Apex/res/layout/fragment_login.xml

@@ -73,8 +73,10 @@
                 android:id="@+id/cb_save"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="Save Password"
-                android:layout_alignBottom="@+id/sign_in_button"/>
+                android:layout_alignBottom="@+id/sign_in_button"
+                android:checked="true"
+                android:text="@string/str_savepass"
+                android:visibility="invisible" />
 
             <Button
                 android:id="@+id/sign_in_button"
@@ -96,7 +98,7 @@
             android:layout_marginTop="5dp"
             android:clickable="true"
             android:focusable="true"
-            android:text="Retrieve password"
+            android:text="@string/str_retrievepass"
             android:textAppearance="?android:attr/textAppearanceMedium"
             android:textColor="@android:color/holo_blue_dark" />
 

+ 15 - 0
Apex/res/layout/message_detail_item.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="10dp" >
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentTop="true"
+
+        android:text="Medium Text" />
+
+</RelativeLayout>

+ 14 - 0
Apex/res/layout/message_list.xml

@@ -0,0 +1,14 @@
+<RelativeLayout 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=".MessageActivity" >
+
+    <ListView
+        android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentTop="true" >
+    </ListView>
+</RelativeLayout>

+ 39 - 0
Apex/res/layout/message_list_item.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="10dp" >
+
+    <TextView
+        android:id="@+id/tv_message"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentTop="true"
+        android:layout_alignParentLeft="true"
+
+        android:layout_toLeftOf="@+id/btn_del"
+        android:text="message"
+        android:textAppearance="?android:attr/textAppearanceMedium"  />
+
+    <Button
+        android:id="@+id/btn_del"
+        style="?android:attr/buttonStyleSmall"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentTop="true"
+        android:text="@string/str_del"
+        android:visibility="gone" />
+
+    <TextView
+        android:id="@+id/tv_time"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignRight="@+id/tv_message"
+        android:layout_below="@+id/tv_message"
+
+        android:text="time" />
+
+
+
+</RelativeLayout>

+ 10 - 10
Apex/res/layout/new_function_select.xml

@@ -11,7 +11,7 @@
         android:id="@+id/tv_content"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="Container Status"
+        android:text="@string/str_containerstatus"
         android:textAppearance="?android:attr/textAppearanceMedium"/>
 
     <RadioGroup
@@ -60,14 +60,14 @@
             android:id="@+id/btn_clear"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
-            android:text="Clear" 
+            android:text="@string/str_clear" 
             android:layout_weight="1"/>
 
         <Button
             android:id="@+id/btn_search"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
-            android:text="Search" 
+            android:text="@string/search" 
             android:layout_weight="1"/>
 
     </LinearLayout>
@@ -142,15 +142,15 @@
             android:layout_marginTop="10dp" >
 
             <TextView
-                android:id="@+id/tv_password"
+                android:id="@+id/tv_message"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:clickable="true"
-                android:drawableTop="@drawable/ic_password"
+                android:drawableTop="@drawable/ic_message"
                 android:enabled="true"
                 android:focusable="true"
                 android:gravity="center"
-                android:text="Change\nPassword" />
+                android:text="Message" />
 
             <TextView
                 android:id="@+id/tv_location"
@@ -164,15 +164,15 @@
                 android:text="Service\nLocation" />
 
             <TextView
-                android:id="@+id/tv_about"
+                android:id="@+id/tv_tools"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:clickable="true"
-                android:drawableTop="@drawable/ic_about"
+                android:drawableTop="@drawable/ic_tools"
                 android:enabled="true"
                 android:focusable="true"
                 android:gravity="center"
-                android:text="About" />
+                android:text="Tools" />
 
             <TextView
                 android:id="@+id/tv_exit"
@@ -183,7 +183,7 @@
                 android:enabled="true"
                 android:focusable="true"
                 android:gravity="center"
-                android:text="Exit" />
+                android:text="Logout" />
         </TableRow>
     </TableLayout>
 

+ 4 - 4
Apex/res/layout/search_item_datepicker.xml

@@ -30,7 +30,7 @@
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
                 android:ems="10"
-                android:hint="from"
+                android:hint="@string/str_from"
 
                 android:focusable="false"
                 />
@@ -40,7 +40,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
-                android:text="Clear" />
+                android:text="@string/str_clear"  />
 
         </LinearLayout>
 
@@ -54,7 +54,7 @@
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
                 android:ems="10"
-                android:hint="to"
+                android:hint="@string/str_to"
                 android:focusable="false"
                  >
 
@@ -66,7 +66,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
-                android:text="Clear" />
+                android:text="@string/str_clear"/>
 
         </LinearLayout>
 

+ 11 - 6
Apex/res/menu/detail.xml

@@ -1,12 +1,17 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
-
+<!-- 
     <item
         android:id="@+id/action_lockscroll"
+        android:checkable="true"
+        android:checked="true"
         android:orderInCategory="100"
         android:showAsAction="always"
-        
+        android:title="@string/actoin_lock_scroll"/> -->
+    <item
+        android:id="@+id/action_addto_favorite"
         android:checkable="true"
-android:checked="true"
-        android:title="@string/action_settings"/>
-
-</menu>
+        android:checked="true"
+        android:orderInCategory="200"
+        android:showAsAction="always"
+        android:title="@string/actoin_add_favorite"/>
+</menu>

+ 11 - 0
Apex/res/menu/inner_tools.xml

@@ -0,0 +1,11 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:context="com.usai.apex.InnerToolsActivity" >
+
+    <item
+        android:id="@+id/action_settings"
+        android:orderInCategory="100"
+        android:showAsAction="never"
+        android:title="@string/action_settings"/>
+
+</menu>

+ 11 - 0
Apex/res/menu/message.xml

@@ -0,0 +1,11 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:context="com.usai.apex.BlankActivity" >
+
+    <item
+        android:id="@+id/action_deleteall"
+        android:orderInCategory="100"
+        android:showAsAction="never"
+        android:title="@string/action_deleteall"/>
+
+</menu>

+ 87 - 0
Apex/res/values-zh-rCN/strings.xml

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <string name="app_name">Apex Mobile</string>
+    <string name="action_settings">设置</string>
+    <string name="actoin_lock_scroll">滚屏锁定</string>
+        <string name="actoin_add_favorite">收藏</string>
+    <string name="action_deleteall">清空消息</string>
+    <string name="action_forget_password">忘记密码</string>
+    <string name="action_custom_fields">自定义字段</string>
+    <string name="action_sign_in_register"><b>登录</b></string>
+    <string name="action_sign_in_short">登录</string>
+    <string name="action_forgot_password">Recover lost password</string>
+    <string name="action_help">帮助</string>
+    <string name="error_invalid_email">email地址无效</string>
+    <string name="error_invalid_password">密码太短</string>
+    <string name="error_incorrect_password">密码错误</string>
+    <string name="error_field_required">This field is required</string>
+    <string name="login_progress_signing_in">正在登录&#8230;</string>
+    <string name="msg_net_resulterror">通信错误,请联系sales。CODE</string>
+    <string name="msg_net_passwordchangedremote">密码在其他设备上修改过,请重新登录。</string>
+    <string name="msg_net_error">无法连接服务器</string>
+    <string name="msg_ver_low">app版本太低</string>
+    <string name="msg_connection_none">没有可用连接</string>
+    <string name="prompt_search_criterion">输入条件</string>
+    <string name="prompt_email">Email</string>
+    <string name="prompt_user">用户名</string>
+    <string name="prompt_password">密码</string>
+    <string name="search">搜索</string>
+    <string name="str_del">删除</string>
+    <string name="str_tool">工具</string>
+     <string name="str_createname">为收藏项起名</string>
+    <string name="str_location">服务网点</string>
+    <string name="str_savepass">保存密码</string>
+    <string name="str_retrievepass">找回密码</string>
+    <string name="str_containerstatus">Container status</string>
+    <string name="str_true">true</string>
+    <string name="str_false">false</string>
+    <string name="str_cancel">取消</string>
+    <string name="str_search">搜索</string>
+    <string name="str_ver">ver:</string>
+    <string name="str_notification_title">来自Apex的新消息</string>
+    <string name="str_mnotification_title">条来自Apex的新消息</string>
+    <string name="str_notification_text">集装箱状态改变 @</string>
+    <string name="str_from">起始日期</string>
+    <string name="str_to">结束日志</string>
+    <string name="str_reset">全部清除</string>
+    <string name="str_displayitem">显示字段</string>
+    <string name="str_hideitem">不显示字段</string>
+    <string name="str_clear">清除</string>
+    <string name="str_version">version:</string>
+    <string name="str_search_by">Search by</string>
+    <string name="str_tech_support">技术支持:\nusairedant@united-us.net</string>
+    <string name="str_2000">2000+条记录</string>
+    <string name="str_0">0条记录</string>
+    <string name="str_nextpage">下页</string>
+    <string name="str_prepage">前页</string>
+    <string name="str_detail">详细信息</string>
+    <string name="str_confirmdownload">确认下载</string>
+    <string name="str_confirmdelete">确认删除</string>
+    <string name="str_downloadmessage">单击下载按钮开始下载</string>
+    <string name="str_deletemessage">单击删除按钮开始下载</string>
+    <string name="str_download">下载</string>
+    <string name="str_records"> 记录</string>
+    <string name="str_Loading">载入中</string>
+    <string name="time_format">yyyy年 MM月dd日 kk:mm:ss</string>
+    <string name="title_activity_apex">Apex Mobile</string>
+    <string name="title_activity_announcements">Announcements</string>
+    <string name="title_activity_direct_tracking">DirectTracking</string>
+    <string name="title_activity_function_select">Apex</string>
+    <string name="title_activity_search">Search</string>
+    <string name="title_activity_customize_fields">Customize Fields</string>
+    <string name="title_activity_result">Result</string>
+    <string name="title_activity_location_detail">LocationDetail</string>
+    <string name="title_activity_inner_map">Service Location</string>
+    <string name="title_activity_login">Login</string>
+    <string name="title_activity_help">HelpActivity</string>
+    <string name="title_activity_detail">Detail</string>
+    <string name="title_activity_cargo_tracking">CargoTracking</string>
+    <string name="title_activity_search_list">Search</string>
+    <string name="title_activity_retrieve_password">RetrievePassword</string>
+    <string name="title_activity_message">消息</string>
+    <string name="title_activity_about">About</string>
+    <string name="title_activity_web">WebActivity</string>
+    <string name="title_activity_message_detail">消息内容</string>
+
+</resources>

+ 35 - 2
Apex/res/values/strings.xml

@@ -3,6 +3,9 @@
 
     <string name="app_name">Apex Mobile</string>
     <string name="action_settings">Settings</string>
+    <string name="actoin_lock_scroll">Lock Scroll</string>
+    <string name="actoin_add_favorite">Add to favorite</string>
+    <string name="action_deleteall">Delete All</string>
     <string name="action_forget_password">Forget password</string>
     <string name="action_custom_fields">Customize Fields</string>
     <string name="action_sign_in_register"><b>Login</b></string>
@@ -14,7 +17,8 @@
     <string name="error_incorrect_password">This password is incorrect</string>
     <string name="error_field_required">This field is required</string>
     <string name="login_progress_signing_in">Signing in&#8230;</string>
-    <string name="msg_net_resulterror">An error occur on server</string>
+    <string name="msg_net_resulterror">An error occur on server,please contact our sales.CODE</string>
+    <string name="msg_net_passwordchangedremote">Password changed on other device,please relogin.</string>
     <string name="msg_net_error">Can not connect to server</string>
     <string name="msg_ver_low">Client version is too low</string>
     <string name="msg_connection_none">No available connection </string>
@@ -23,18 +27,43 @@
     <string name="prompt_user">User</string>
     <string name="prompt_password">Password</string>
     <string name="search">Search</string>
+    <string name="str_del">del</string>
     <string name="str_true">true</string>
     <string name="str_false">false</string>
     <string name="str_cancel">Cancel</string>
+    <string name="str_createname">Create a tag to save detail</string>
     <string name="str_search">Search</string>
+    <string name="str_clear">Clear</string>
     <string name="str_ver">ver:</string>
+    <string name="str_notification_title">New message from Apex</string>
+    <string name="str_mnotification_title"> new messages from Apex</string>
+    <string name="str_notification_text">Container status changed @</string>
+    <string name="str_tool">Tools</string>
+    <string name="str_location">Service Location</string>
+    <string name="str_savepass">Save Password</string>
+    <string name="str_retrievepass">Retrieve password</string>
+    <string name="str_containerstatus">Container Status</string>
+    <string name="str_displayitem">Display items</string>
+    <string name="str_hideitem">Hide items</string>
+    <string name="str_reset">Reset</string>
+    <string name="str_nextpage">Next Page</string>
+    <string name="str_prepage">Pre Page</string>
+    <string name="str_detail">Detail</string>
+    <string name="str_confirmdownload">Confirm download</string>
+    <string name="str_confirmdelete">Confirm delete</string>
+    <string name="str_downloadmessage">Click download button to begin download</string>
+    <string name="str_deletemessage">Click delete button to begin download</string>
+    <string name="str_download">Download</string>
+    <string name="str_from">from</string>
+    <string name="str_to">to</string>
     <string name="str_version">version:</string>
     <string name="str_search_by">Search by</string>
     <string name="str_tech_support">Tech support:\nusairedant@united-us.net</string>
     <string name="str_2000">2000+ records</string>
-    <string name="str_0">0 record found</string>
+    <string name="str_0">0 record</string>
     <string name="str_records"> records</string>
     <string name="str_Loading">Loading</string>
+    <string name="time_format">MM/dd/yyyy kk:mm:ss</string>
     <string name="title_activity_apex">Apex Mobile</string>
     <string name="title_activity_announcements">Announcements</string>
     <string name="title_activity_direct_tracking">DirectTracking</string>
@@ -50,8 +79,12 @@
     <string name="title_activity_cargo_tracking">CargoTracking</string>
     <string name="title_activity_search_list">Search</string>
     <string name="title_activity_retrieve_password">RetrievePassword</string>
+    <string name="title_activity_message">Message</string>
     <string name="title_activity_about">About</string>
     <string name="title_activity_web">WebActivity</string>
+    <string name="title_activity_blank">BlankActivity</string>
+    <string name="title_activity_message_detail">Message Detail</string>
+    <string name="title_activity_inner_tools">InnerToolsActivity</string>
     <string name="hello_world">Hello world!</string>
 
 </resources>

+ 23 - 13
Apex/src/com/usai/apex/Alarmreceiver.java

@@ -16,6 +16,7 @@ import android.content.Intent;
 import android.content.SharedPreferences;
 import android.database.sqlite.SQLiteDatabase;
 import android.os.AsyncTask;
+import android.os.Parcelable;
 import android.os.SystemClock;
 import android.util.Log;
 
@@ -141,7 +142,7 @@ public class Alarmreceiver extends BroadcastReceiver
 					int count = jsobj.getInt("count");
 					SQLiteDatabase db = dbUtil.OpenDB(
 							ApexTrackingApplication.get_instance(), null, true);
-					db.execSQL("insert into push_message(s_id,e_id,msgcount,message,h_time,user,read) values('"
+					db.execSQL("insert into push_message(s_id,e_id,msgcount,message,h_time,user,create_time,read) values('"
 							+ s_id
 							+ "','"
 							+ e_id
@@ -152,7 +153,9 @@ public class Alarmreceiver extends BroadcastReceiver
 							+ "','"
 							+ date
 							+ "','"
-							+ ApexTrackingApplication.get_user() + "'" + ",0)");
+							+ ApexTrackingApplication.get_user()
+							+ "',"
+							+ System.currentTimeMillis() + ",0)");
 					dbUtil.CloseDB(db);
 
 					NotificationManager nManager = (NotificationManager) mcontext
@@ -199,6 +202,20 @@ public class Alarmreceiver extends BroadcastReceiver
 														R.string.str_notification_text)
 												+ date, pintent);
 					nManager.notify(R.layout.activity_apex, notification);
+					
+					 Intent intenticon = new Intent(); 
+					 intenticon.setClass(ApexTrackingApplication
+								.get_instance(), FunctionSelectActivity.class); 
+					 Intent addShortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); 
+					 Parcelable icon = Intent.ShortcutIconResource.fromContext(mcontext, 
+					 R.drawable.ic_launcher_new); 
+					 addShortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, ApexTrackingApplication
+								.get_instance().getString(R.string.app_name)); 
+					 addShortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent); 
+					 addShortcut.putExtra("duplicate", 0); 
+					 addShortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); 
+					 ApexTrackingApplication
+						.get_instance().sendBroadcast(addShortcut); 
 
 					// notification
 
@@ -249,8 +266,7 @@ public class Alarmreceiver extends BroadcastReceiver
 		String tag = "onReceive@Alarmreceiver";
 		if (intent.getAction().equals("com.usai.apex.push"))
 		{
-			if(true)
-			return;
+
 			// Bundle b = intent.getExtras();
 			// Set<String> keySet = b.keySet();
 			// for(String key : keySet) {
@@ -276,17 +292,11 @@ public class Alarmreceiver extends BroadcastReceiver
 					.getSystemService(Context.NOTIFICATION_SERVICE);
 			nManager.cancel(R.layout.activity_apex);
 			ApexTrackingApplication.cancelalarm();
-//			ApexTrackingApplication.put_password("");
-//			ApexTrackingApplication.put_sessionid("");
-//			ApexTrackingApplication.put_user("");
+			// ApexTrackingApplication.put_password("");
+			// ApexTrackingApplication.put_sessionid("");
+			// ApexTrackingApplication.put_user("");
 			ApexTrackingApplication.logout();
 
-			SharedPreferences pref = ApexTrackingApplication.get_instance()
-					.getSharedPreferences("Apex", 0);
-			SharedPreferences.Editor editor = pref.edit();
-
-			editor.putBoolean("autologin", false);
-			editor.commit();
 		}
 	}
 

+ 60 - 25
Apex/src/com/usai/apex/ApexTrackingApplication.java

@@ -55,7 +55,7 @@ public class ApexTrackingApplication extends Application
 				e.printStackTrace();
 			}
 		}
-		startalarm("app start");
+
 		// Intent serviceintent = new Intent();
 		// serviceintent.setClass(this, ApexPushService.class);
 		//
@@ -80,7 +80,11 @@ public class ApexTrackingApplication extends Application
 
 	public static void startalarm(String caller)
 	{
-
+		SharedPreferences pref = ApexTrackingApplication.get_instance()
+				.getSharedPreferences("Apex", 0);
+		boolean autologin = pref.getBoolean("autologin", false);
+		if (autologin == false)
+			return;
 		// 启动完成
 		Intent iAlarm = new Intent(get_instance(), Alarmreceiver.class);
 		iAlarm.putExtra("caller", caller);
@@ -114,31 +118,62 @@ public class ApexTrackingApplication extends Application
 
 	public static void logout()
 	{
+		cancelalarm();
 		m_sessionid = "";
 		m_user = "";
 		m_password = "";
 		m_bauthorized = false;
+		SharedPreferences pref = ApexTrackingApplication.get_instance()
+				.getSharedPreferences("Apex", 0);
+		SharedPreferences.Editor editor = pref.edit();
+
+		editor.putBoolean("autologin", false);
+		editor.commit();
+
 	}
-	public static void login(String sid,String user,String pass)
+
+	public static void login(String sid, String user, String pass)
 	{
 		m_sessionid = sid;
 		m_user = user;
 		m_password = pass;
 		m_bauthorized = true;
+		ncount = 1;
+		SharedPreferences pref = ApexTrackingApplication.get_instance()
+				.getSharedPreferences("Apex", 0);
+		SharedPreferences.Editor editor = pref.edit();
+		try
+		{
+
+			editor.putString("user", Crypto.encrypt("apexu", m_user));
+			editor.putString("password", Crypto.encrypt("apexp", m_password));
+			editor.putBoolean("autologin", true);
+
+		}
+		catch (Exception e)
+		{
+			editor.putString("user", null);
+			editor.putString("password", null);
+			editor.putBoolean("autologin", false);
+			e.printStackTrace();
+		}
+		editor.commit();
+
+		startalarm("app start");
 	}
 
-//	public static void put_sessionid(String id)
-//	{
-//
-//		Log.e(TAG, "put_sessionid");
-//		m_sessionid = id;
-//	}
+	// public static void put_sessionid(String id)
+	// {
+	//
+	// Log.e(TAG, "put_sessionid");
+	// m_sessionid = id;
+	// }
 
-//	public static void put_authorization(boolean bauth)
-//	{
-//
-//		m_bauthorized = bauth;
-//	}
+	// public static void put_authorization(boolean bauth)
+	// {
+	//
+	// m_bauthorized = bauth;
+	// }
 
 	public static boolean get_authorization()
 	{
@@ -146,17 +181,17 @@ public class ApexTrackingApplication extends Application
 		return m_bauthorized;
 	}
 
-//	public static void put_user(String user)
-//	{
-//
-//		m_user = user;
-//	}
-//
-//	public static void put_password(String pass)
-//	{
-//
-//		m_password = pass;
-//	}
+	// public static void put_user(String user)
+	// {
+	//
+	// m_user = user;
+	// }
+	//
+	// public static void put_password(String pass)
+	// {
+	//
+	// m_password = pass;
+	// }
 
 	public static String get_sessionid()
 	{

+ 0 - 83
Apex/src/com/usai/apex/CargoTrackingActivity.java

@@ -1,83 +0,0 @@
-package com.usai.apex;
-
-import android.os.Bundle;
-import android.app.Activity;
-import android.content.Intent;
-import android.text.TextUtils;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.RadioGroup;
-
-public class CargoTrackingActivity extends Activity implements OnClickListener
-{
-	String function_name;
-
-	@Override
-	protected void onCreate(Bundle savedInstanceState)
-	{
-		super.onCreate(savedInstanceState);
-		setContentView(R.layout.activity_cargo_tracking);
-		Button btn_cancel = (Button) findViewById(R.id.btn_cancel);
-		btn_cancel.setOnClickListener(this);
-		Button btn_search = (Button) findViewById(R.id.btn_search);
-		btn_search.setOnClickListener(this);
-		function_name = getIntent().getStringExtra("function_name");
-	}
-
-	// @Override
-	// public boolean onCreateOptionsMenu(Menu menu)
-	// {
-	// // Inflate the menu; this adds items to the action bar if it is present.
-	// getMenuInflater().inflate(R.menu.cargo_tracking, menu);
-	// return true;
-	// }
-
-	@Override
-	public void onClick(View v)
-	{
-		switch (v.getId())
-		{
-		case R.id.btn_cancel:
-		{
-			finish();
-			break;
-		}
-		case R.id.btn_search:
-		{
-			EditText et = (EditText) findViewById(R.id.et_criterion);
-			String cargo_criterion = et.getText().toString();
-			if (TextUtils.isEmpty(cargo_criterion))
-			{
-				et.setError(getString(R.string.error_field_required));
-				et.requestFocus();
-			}
-			else
-			{
-				Intent intent = new Intent();
-				intent.setClass(this, DetailActivity.class);
-
-				intent.putExtra("action0" , "Tracking");
-				intent.putExtra("function_name", "Cargo Tracking");
-				intent.putExtra("cargo_criterion", cargo_criterion);
-				intent.putExtra("actions_count", 1);
-				intent.putExtra("_id", "dumb");
-				RadioGroup rg = (RadioGroup) findViewById(R.id.radioGroup1);
-				if(rg.getCheckedRadioButtonId ()==R.id.radio0)
-					intent.putExtra("criterion_type", 0);
-				else
-					intent.putExtra("criterion_type", 1);
-//				hbol
-//				container_no
-				startActivity(intent);
-			}
-			break;
-		}
-		default:
-			break;
-		}
-
-	}
-
-}

+ 2 - 9
Apex/src/com/usai/apex/ChangePasswordActivity.java

@@ -258,13 +258,6 @@ public class ChangePasswordActivity extends Activity {
 					}
 				});
 
-//				builder.setNegativeButton("取消", new OnClickListener() {
-//
-//					@Override
-//					public void onClick(DialogInterface dialog, int which) {
-//						dialog.dismiss();
-//					}
-//				});
 
 				builder.create().show();
 
@@ -317,8 +310,8 @@ public class ChangePasswordActivity extends Activity {
 				}
 				default: {
 					Toast toast = Toast.makeText(getApplicationContext(),
-							"An error occur on server code:" + errorcode,
-							Toast.LENGTH_LONG);
+							getText(R.string.msg_net_resulterror) + ":"
+									+ errorcode, Toast.LENGTH_LONG);
 					toast.setGravity(Gravity.CENTER, 0, 0);
 					toast.show();
 					break;

+ 68 - 28
Apex/src/com/usai/apex/DetailActivity.java

@@ -5,12 +5,21 @@ import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 
+
 import com.usai.util.commonUtil;
+import com.usai.util.dbUtil;
 
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.database.sqlite.SQLiteDatabase;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
+import android.widget.EditText;
 import android.widget.FrameLayout;
 import android.widget.TabHost;
 import android.support.v4.app.Fragment;
@@ -20,6 +29,7 @@ import android.support.v4.app.FragmentTransaction;
 public class DetailActivity extends FragmentActivity implements
 		TabHost.TabContentFactory
 {
+	boolean showlogin = false;
 	// int radomid = 1 + (int) (Math.random() * 15);
 	TabHost							mTabHost;
 	LinkedHashMap<String, Integer>	tabmap	= new LinkedHashMap<String, Integer>();
@@ -32,6 +42,10 @@ public class DetailActivity extends FragmentActivity implements
 	String							cargo_criterion;
 	int								criterion_type;
 
+	public DetailActivity get_instance()
+	{
+		return this;
+	}
 	public void save_content(String which,String content)
 	{
 		contentmap.put(which, content);
@@ -325,33 +339,59 @@ public class DetailActivity extends FragmentActivity implements
 		// mTabHost.setOnTabChangedListener(this);
 	}
 
-	// @Override
-	// public boolean onCreateOptionsMenu(Menu menu)
-	// {
-	// // Inflate the menu; this adds items to the action bar if it is present.
-	// getMenuInflater().inflate(R.menu.detail, menu);
-	// return true;
-	// }
-	//
-	// @Override
-	// public boolean onOptionsItemSelected(MenuItem item)
-	// {
-	// switch (item.getItemId())
-	// {
-	// case android.R.id.home:
-	// // This ID represents the Home or Up button. In the case of this
-	// // activity, the Up button is shown. Use NavUtils to allow users
-	// // to navigate up one level in the application structure. For
-	// // more details, see the Navigation pattern on Android Design:
-	// //
-	// //
-	// // http: //
-	// // developer.android.com/design/patterns/navigation.html#up-vs-back
-	// //
-	// NavUtils.navigateUpFromSameTask(this);
-	// return true;
-	// }
-	// return super.onOptionsItemSelected(item);
-	// }
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu)
+	{
+		// Inflate the menu; this adds items to the action bar if it is present.
+		getMenuInflater().inflate(R.menu.detail, menu);
+		return true;
+	}
+
+	@Override
+	public boolean onOptionsItemSelected(MenuItem item)
+	{
+		switch (item.getItemId())
+		{
+			case R.id.action_addto_favorite:
+//	            LayoutInflater factory = LayoutInflater.from(this);
+//	            final View textEntryView = factory.inflate(R.layout.alert_dialog_text_entry, null);
+	            final View edit = new EditText(this);
+	             new AlertDialog.Builder(this)
+	                .setIconAttribute(android.R.attr.alertDialogIcon)
+	                .setTitle(R.string.str_createname)
+	                .setView(edit)
+	                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+	                    public void onClick(DialogInterface dialog, int whichButton) {
+	                    	String name = ((EditText)edit).getText().toString();
+	                    	String param = getIntent().toUri(0);
+	                    	
+	        				SQLiteDatabase db = dbUtil.OpenDB(
+	        						ApexTrackingApplication.get_instance(), null, true);
+	        				db.execSQL("insert into favorites(name,params,user,create_time) values('"
+	        						+ name
+	        						+ "','"
+	        						+ param
+	        						+ "','"
+	        						+ ApexTrackingApplication.get_user()
+	        						+ "',"
+	        						+ System.currentTimeMillis() + ")");
+	        				dbUtil.CloseDB(db);                    	
+	    
+	                        /* User clicked OK so do some stuff */
+	                    }
+	                })
+	                .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+	                    public void onClick(DialogInterface dialog, int whichButton) {
+
+	                        /* User clicked cancel so do some stuff */
+	                    }
+	                })
+	                .create().show();
+	             return true;
+
+
+		}
+		return super.onOptionsItemSelected(item);
+	}
 
 }

+ 227 - 145
Apex/src/com/usai/apex/DetailFragment.java

@@ -15,6 +15,7 @@ import android.app.AlertDialog.Builder;
 import android.app.DownloadManager.Request;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.Intent;
 import android.graphics.Bitmap;
 import android.net.Uri;
 import android.os.AsyncTask;
@@ -44,18 +45,23 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 																		 * OnGestureListener
 																		 */
 {
-//	DataFragment mdataFragment;
+
+	private static final int	REQUEST_LOGINACTIVITY	= 1;
+
+	// DataFragment mdataFragment;
 
 	/* private GestureDetector mGestureDetector; */
 	@Override
-	public void onCreate(Bundle savedInstanceState) {
+	public void onCreate(Bundle savedInstanceState)
+	{
 		// TODO Auto-generated method stub
 		super.onCreate(savedInstanceState);
 
 	}
 
 	@Override
-	public void onDestroyView() {
+	public void onDestroyView()
+	{
 		Log.d("DetailFragment", "onDestroyView()");
 		super.onDestroyView();
 	}
@@ -65,35 +71,37 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 	// return fragment_content;
 	// }
 
-	LinearLayout ll_root;
-	ScrollView sl_root;
-	String mimeType = "text/html";
-	private SearchTask m_task = null;
-	SparseIntArray control = new SparseIntArray();
+	LinearLayout		ll_root;
+	ScrollView			sl_root;
+	String				mimeType			= "text/html";
+	private SearchTask	m_task				= null;
+	SparseIntArray		control				= new SparseIntArray();
 	// private TextView mStatusMessageView;
-	private View mStatusView;
+	private View		mStatusView;
 
-	 String fragment_content = null;
+	String				fragment_content	= null;
 
-	public void requestdata() {
+	public void requestdata()
+	{
 
-		if (m_task != null) {
+		if (m_task != null)
+		{
 			return;
 		}
-		if(fragment_content!=null)
+		if (fragment_content != null)
 		{
 			LayoutInflater inflater = (LayoutInflater) ApexTrackingApplication
-			.get_instance().getSystemService(
-					Context.LAYOUT_INFLATER_SERVICE);
-			init(fragment_content,inflater);
+					.get_instance().getSystemService(
+							Context.LAYOUT_INFLATER_SERVICE);
+			init(fragment_content, inflater);
 			return;
 		}
-//		if (mdataFragment.get_result() != null) {
-//			LayoutInflater inflater = (LayoutInflater) ApexTrackingApplication
-//					.get_instance().getSystemService(
-//							Context.LAYOUT_INFLATER_SERVICE);
-//			init(mdataFragment.get_result(), inflater);
-//		}
+		// if (mdataFragment.get_result() != null) {
+		// LayoutInflater inflater = (LayoutInflater) ApexTrackingApplication
+		// .get_instance().getSystemService(
+		// Context.LAYOUT_INFLATER_SERVICE);
+		// init(mdataFragment.get_result(), inflater);
+		// }
 		// if (fragment_content != null)
 		// return;
 		// mStatusMessageView.setText("Loading");
@@ -102,16 +110,19 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 		m_task.execute();
 
 	}
+
 	public void set_content(String content)
 	{
-		fragment_content=content;
+		fragment_content = content;
 	}
 
-	private void showProgress(final boolean show) {
+	private void showProgress(final boolean show)
+	{
 		// On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
 		// for very easy animations. If available, use these APIs to fade-in
 		// the progress spinner.
-		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
+		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
+		{
 			int shortAnimTime = ApexTrackingApplication.get_instance()
 					.getResources()
 					.getInteger(android.R.integer.config_shortAnimTime);
@@ -119,9 +130,11 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 			mStatusView.setVisibility(View.VISIBLE);
 			mStatusView.animate().setDuration(shortAnimTime)
 					.alpha(show ? 1 : 0)
-					.setListener(new AnimatorListenerAdapter() {
+					.setListener(new AnimatorListenerAdapter()
+					{
 						@Override
-						public void onAnimationEnd(Animator animation) {
+						public void onAnimationEnd(Animator animation)
+						{
 							mStatusView.setVisibility(show ? View.VISIBLE
 									: View.INVISIBLE);
 						}
@@ -129,14 +142,18 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 
 			ll_root.setVisibility(View.VISIBLE);
 			ll_root.animate().setDuration(shortAnimTime).alpha(show ? 0 : 1)
-					.setListener(new AnimatorListenerAdapter() {
+					.setListener(new AnimatorListenerAdapter()
+					{
 						@Override
-						public void onAnimationEnd(Animator animation) {
+						public void onAnimationEnd(Animator animation)
+						{
 							ll_root.setVisibility(show ? View.INVISIBLE
 									: View.VISIBLE);
 						}
 					});
-		} else {
+		}
+		else
+		{
 			// The ViewPropertyAnimator APIs are not available, so simply show
 			// and hide the relevant UI components.
 			mStatusView.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
@@ -164,7 +181,8 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 
 	@Override
 	public View onCreateView(LayoutInflater inflater, ViewGroup container,
-			Bundle savedInstanceState) {
+			Bundle savedInstanceState)
+	{
 		/* mGestureDetector = new GestureDetector(this); */
 		View view = inflater.inflate(R.layout.detail_fragment, null);
 		sl_root = (ScrollView) view.findViewById(R.id.sl_root);
@@ -178,10 +196,12 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 		mStatusView = view.findViewById(R.id.status);
 		LinearLayout ll = (LinearLayout) view.findViewById(R.id.ll_refresh);
 		Button btn_refresh = (Button) ll.findViewById(R.id.btn_refresh);
-		btn_refresh.setOnClickListener(new View.OnClickListener() {
+		btn_refresh.setOnClickListener(new View.OnClickListener()
+		{
 
 			@Override
-			public void onClick(View v) {
+			public void onClick(View v)
+			{
 				LinearLayout ll = (LinearLayout) ll_root
 						.findViewById(R.id.ll_refresh);
 				ll.setVisibility(View.GONE);
@@ -190,44 +210,49 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 
 			}
 		});
-//		FragmentManager fm = getFragmentManager();
-//		List<Fragment> fragments = fm.getFragments();
-//		if (fragments != null) {
-//			Log.e("DetailFragment", "fragments count=" + fragments.size());
-////			for (int i = 0; i < fragments.size(); i++)
-////				Log.e("DetailFragment", "fragments name=" + fragments.size());
-//
-//		}
-////		this.getFragmentManager();
-//		String tag = getArguments().getString("module_name");
-//		// Check to see if we have retained the worker fragment.
-//		mdataFragment = (DataFragment) fm.findFragmentById(12345);
-//
-//		// If not retained (or first time running), we need to create it.
-//		if (mdataFragment == null) {
-//			Log.e("dataFragment creaded ", "tag=data_" + tag);
-//			mdataFragment = new DataFragment();
-//			// Tell it who it is working with.
-//			mdataFragment.setTargetFragment(this, 0);
-//			fm.beginTransaction().add(12345,mdataFragment, "data+" + tag).commit();
-//		}
+		// FragmentManager fm = getFragmentManager();
+		// List<Fragment> fragments = fm.getFragments();
+		// if (fragments != null) {
+		// Log.e("DetailFragment", "fragments count=" + fragments.size());
+		// // for (int i = 0; i < fragments.size(); i++)
+		// // Log.e("DetailFragment", "fragments name=" + fragments.size());
+		//
+		// }
+		// // this.getFragmentManager();
+		// String tag = getArguments().getString("module_name");
+		// // Check to see if we have retained the worker fragment.
+		// mdataFragment = (DataFragment) fm.findFragmentById(12345);
+		//
+		// // If not retained (or first time running), we need to create it.
+		// if (mdataFragment == null) {
+		// Log.e("dataFragment creaded ", "tag=data_" + tag);
+		// mdataFragment = new DataFragment();
+		// // Tell it who it is working with.
+		// mdataFragment.setTargetFragment(this, 0);
+		// fm.beginTransaction().add(12345,mdataFragment, "data+" +
+		// tag).commit();
+		// }
 		requestdata();
 		return view;
 	}
 
-	void init(String jstr, LayoutInflater inflater) {
+	void init(String jstr, LayoutInflater inflater)
+	{
 		String TAG = "init@DetailFragment";
 		Log.d(TAG, jstr);
-		try {
+		try
+		{
 			JSONObject jsonObj = new JSONObject(jstr);
 			int group_count = jsonObj.getInt("count");
-			if (group_count == 0) {
+			if (group_count == 0)
+			{
 
 				TextView tv_empty = (TextView) ll_root
 						.findViewById(R.id.tv_empty);
 				tv_empty.setVisibility(View.VISIBLE);
 			}
-			for (int i = 0; i < group_count; i++) {
+			for (int i = 0; i < group_count; i++)
+			{
 				// String key = (String) it.next();
 				// if (key.equals("result"))
 				// continue;
@@ -242,7 +267,8 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 				ll_root.addView(v);
 				String grouptype = groupobj.getString("_type");
 				// groupobj.remove("_type");
-				if (grouptype.equals("mapping")) {
+				if (grouptype.equals("mapping"))
+				{
 					LinearLayout mappingview = (LinearLayout) inflater.inflate(
 							R.layout.key_mapping, null);
 					mappingview.setId(commonUtil.generateViewId());
@@ -250,7 +276,8 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 					ll_root.addView(mappingview);
 
 					int map_count = groupobj.getInt("count");
-					for (int j = 0; j < map_count; j++) {
+					for (int j = 0; j < map_count; j++)
+					{
 						// String keygroup = (String) itgroup.next();
 						JSONObject itemobj = groupobj.getJSONObject("item" + j);
 						String key = (String) itemobj.keys().next();
@@ -273,7 +300,9 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 					//
 					//
 					// }
-				} else if (grouptype.equals("table")) {
+				}
+				else if (grouptype.equals("table"))
+				{
 					String content = groupobj.getString("content");
 					WebView wv;
 
@@ -282,12 +311,14 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 					wv.getSettings().setDefaultTextEncodingName("UTF-8");
 					wv.setId(commonUtil.generateViewId());
 					wv.setWebViewClient(new MyWebViewClient());
-					wv.setDownloadListener(new DownloadListener() {
+					wv.setDownloadListener(new DownloadListener()
+					{
 
 						@Override
 						public void onDownloadStart(String url,
 								String userAgent, String contentDisposition,
-								String mimetype, long contentLength) {
+								String mimetype, long contentLength)
+						{
 							Log.d("WebView", "Download Action");
 							Log.i("tag", "url=" + url);
 							// Log.i("tag", "userAgent="+userAgent);
@@ -334,27 +365,32 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 
 							builder.setTitle(getString(R.string.str_confirmdownload));
 
-							builder.setPositiveButton(getString(R.string.str_download),
-									new Dialog.OnClickListener() {
+							builder.setPositiveButton(
+									getString(R.string.str_download),
+									new Dialog.OnClickListener()
+									{
 
 										@Override
 										public void onClick(
 												DialogInterface dialog,
-												int which) {
-											downloadManager
-													.enqueue(request);
+												int which)
+										{
+											downloadManager.enqueue(request);
 											dialog.dismiss();
 
 										}
 									});
 
-							builder.setNegativeButton(getString(R.string.str_cancel),
-									new Dialog.OnClickListener() {
+							builder.setNegativeButton(
+									getString(R.string.str_cancel),
+									new Dialog.OnClickListener()
+									{
 
 										@Override
 										public void onClick(
 												DialogInterface dialog,
-												int which) {
+												int which)
+										{
 											dialog.dismiss();
 										}
 									});
@@ -384,14 +420,16 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 					Log.d("table content", content);
 
 				}
-				if (grouptype.equals("list")) {
+				if (grouptype.equals("list"))
+				{
 					LinearLayout listview = (LinearLayout) inflater.inflate(
 							R.layout.list_content, null);
 					listview.setId(commonUtil.generateViewId());
 					control.put(v.getId(), listview.getId());
 					ll_root.addView(listview);
 					long list_count = groupobj.getInt("count");
-					for (int j = 0; j < list_count; j++) {
+					for (int j = 0; j < list_count; j++)
+					{
 						RelativeLayout listitem = (RelativeLayout) inflater
 								.inflate(R.layout.list_item, null);
 
@@ -425,14 +463,17 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 			// {
 			//
 			// }
-		} catch (JSONException e) {
+		}
+		catch (JSONException e)
+		{
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 		}
 	}
 
 	@Override
-	public void onClick(View v) {
+	public void onClick(View v)
+	{
 		View view = ll_root.findViewById(control.get(v.getId()));
 		if (view.getVisibility() == View.VISIBLE)
 			view.setVisibility(View.GONE);
@@ -440,30 +481,37 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 			view.setVisibility(View.VISIBLE);
 
 	}
-	
 
 	@Override
 	public void onDestroy()
 	{
-		if(m_task!=null)
+		if (m_task != null)
 			m_task.cancel(false);
 		super.onDestroy();
 	}
 
+	@Override
+	public void onActivityResult(int requestCode, int resultCode, Intent data)
+	{
+		((DetailActivity) getActivity()).showlogin = false;
+		super.onActivityResult(requestCode, resultCode, data);
+	}
+
 	@Override
 	public void onDetach()
 	{
-		if(m_task!=null)
+		if (m_task != null)
 			m_task.cancel(false);
 		super.onDetach();
 	}
 
-
-	class SearchTask extends AsyncTask<Void, Void, Boolean> {
-		int errorcode;
+	class SearchTask extends AsyncTask<Void, Void, Boolean>
+	{
+		int	errorcode;
 
 		@Override
-		protected Boolean doInBackground(Void... params) {
+		protected Boolean doInBackground(Void... params)
+		{
 			Log.d("SearchTask", "doInBackground");
 			if (!Network.NetworkIsAvailable())
 
@@ -472,18 +520,18 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 				return false;
 			}
 			String jstr = Network.get_detail(getArguments());
-			if (jstr == null || jstr.length() <= 0) {
+			if (jstr == null || jstr.length() <= 0)
+			{
 				// Log.d(TAG, "json is wrong");
 
 				errorcode = Network.RESULT_NET_ERROR;
 				return false;
 			}
 
-//			mdataFragment.put_result(jstr);
-			fragment_content=jstr;
-			DetailActivity activity=(DetailActivity) getActivity();
+			// mdataFragment.put_result(jstr);
+			fragment_content = jstr;
+			DetailActivity activity = (DetailActivity) getActivity();
 			activity.save_content(getArguments().getString("action_type"), jstr);
-			
 
 			errorcode = Network.RESULT_TRUE;
 
@@ -491,55 +539,83 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 		}
 
 		@Override
-		protected void onPostExecute(Boolean success) {
+		protected void onPostExecute(Boolean success)
+		{
 			Log.i("onPostExecute", "entry");
 			m_task = null;
 			showProgress(false);
 
-			switch (errorcode) {
-			case Network.RESULT_NET_NOTAVAILABLE: {
-				Toast toast = Toast.makeText(
-						ApexTrackingApplication.get_instance(),
-						getText(R.string.msg_connection_none),
-						Toast.LENGTH_LONG);
-				toast.setGravity(Gravity.CENTER, 0, 0);
-				toast.show();
-				break;
-			}
-			case Network.RESULT_NET_ERROR: {
-				Toast toast = Toast.makeText(
-						ApexTrackingApplication.get_instance(),
-						getText(R.string.msg_net_error), Toast.LENGTH_LONG);
-				toast.setGravity(Gravity.CENTER, 0, 0);
-				toast.show();
-				break;
-			}
-			case Network.RESULT_ERROR:
-			// case Network.RESULT_RESPONSE_NULL:
+			if (ApexTrackingApplication.get_authorization() == false)
 			{
+				if(((DetailActivity) getActivity()).showlogin == true)
+					return;
+				((DetailActivity) getActivity()).showlogin = true;
+				LinearLayout ll = (LinearLayout) ll_root
+						.findViewById(R.id.ll_refresh);
+				ll.setVisibility(View.VISIBLE);
 				Toast toast = Toast.makeText(
 						ApexTrackingApplication.get_instance(),
-						getText(R.string.msg_net_resulterror),
-						Toast.LENGTH_LONG);
+						getText(R.string.msg_net_passwordchangedremote) , Toast.LENGTH_LONG);
 				toast.setGravity(Gravity.CENTER, 0, 0);
 				toast.show();
-				break;
+				Intent i = new Intent();
+				i.setClass(getActivity(), ApexActivity.class);
+				startActivityForResult(i, REQUEST_LOGINACTIVITY);
+				return;
 			}
+			
+			switch (errorcode)
+			{
+				case Network.RESULT_NET_NOTAVAILABLE:
+				{
+					Toast toast = Toast.makeText(
+							ApexTrackingApplication.get_instance(),
+							getText(R.string.msg_connection_none),
+							Toast.LENGTH_LONG);
+					toast.setGravity(Gravity.CENTER, 0, 0);
+					toast.show();
+					break;
+				}
+				case Network.RESULT_NET_ERROR:
+				{
+					Toast toast = Toast.makeText(
+							ApexTrackingApplication.get_instance(),
+							getText(R.string.msg_net_error), Toast.LENGTH_LONG);
+					toast.setGravity(Gravity.CENTER, 0, 0);
+					toast.show();
+					break;
+				}
+				case Network.RESULT_ERROR:
+				// case Network.RESULT_RESPONSE_NULL:
+				{
+
+					Toast toast = Toast.makeText(
+							ApexTrackingApplication.get_instance(),
+							getText(R.string.msg_net_resulterror) + ":"
+									+ errorcode, Toast.LENGTH_LONG);
+					toast.setGravity(Gravity.CENTER, 0, 0);
+					toast.show();
+
+					break;
+				}
 
-			default:
-				break;
+				default:
+					break;
 			}
 
-			if (success) {
+			if (success)
+			{
 				LayoutInflater inflater = (LayoutInflater) ApexTrackingApplication
 						.get_instance().getSystemService(
 								Context.LAYOUT_INFLATER_SERVICE);
 
 				init(fragment_content, inflater/*
-														 * getActivity().
-														 * getLayoutInflater()
-														 */);
-			} else {
+												 * getActivity().
+												 * getLayoutInflater()
+												 */);
+			}
+			else
+			{
 				LinearLayout ll = (LinearLayout) ll_root
 						.findViewById(R.id.ll_refresh);
 				ll.setVisibility(View.VISIBLE);
@@ -548,54 +624,60 @@ public class DetailFragment extends Fragment implements OnClickListener /*
 		}
 
 		@Override
-		protected void onCancelled() {
+		protected void onCancelled()
+		{
 			m_task = null;
 			showProgress(false);
 		}
 	}
 
-//	public class DataFragment extends Fragment {
-//
-//		String result = null;
-//
-//		@Override
-//		public void onCreate(Bundle savedInstanceState) {
-//			setRetainInstance(true);
-//			super.onCreate(savedInstanceState);
-//		}
-//
-//		public String get_result() {
-//			return result;
-//
-//		}
-//
-//		public void put_result(String s) {
-//			result = s;
-//		}
-//
-//	}
-
-	public class MyWebViewClient extends WebViewClient {
+	// public class DataFragment extends Fragment {
+	//
+	// String result = null;
+	//
+	// @Override
+	// public void onCreate(Bundle savedInstanceState) {
+	// setRetainInstance(true);
+	// super.onCreate(savedInstanceState);
+	// }
+	//
+	// public String get_result() {
+	// return result;
+	//
+	// }
+	//
+	// public void put_result(String s) {
+	// result = s;
+	// }
+	//
+	// }
+
+	public class MyWebViewClient extends WebViewClient
+	{
 		// 如果页面中链接,如果希望点击链接继续在当前browser中响应,
 		// 而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。
-		public boolean shouldOverviewUrlLoading(WebView view, String url) {
+		public boolean shouldOverviewUrlLoading(WebView view, String url)
+		{
 			// L.i("shouldOverviewUrlLoading");
 			view.loadUrl(url);
 			return true;
 		}
 
-		public void onPageStarted(WebView view, String url, Bitmap favicon) {
+		public void onPageStarted(WebView view, String url, Bitmap favicon)
+		{
 			// L.i("onPageStarted");
 			// showProgress();
 		}
 
-		public void onPageFinished(WebView view, String url) {
+		public void onPageFinished(WebView view, String url)
+		{
 			// L.i("onPageFinished");
 			// closeProgress();
 		}
 
 		public void onReceivedError(WebView view, int errorCode,
-				String description, String failingUrl) {
+				String description, String failingUrl)
+		{
 			// L.i("onReceivedError");
 			// closeProgress();
 		}

+ 68 - 23
Apex/src/com/usai/apex/FunctionSelectActivity.java

@@ -1,10 +1,17 @@
 package com.usai.apex;
 
+import com.usai.util.dbUtil;
+
 import android.app.ActionBar;
 import android.app.Activity;
+import android.app.NotificationManager;
+import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
 import android.os.Bundle;
+import android.os.Parcelable;
 import android.support.v4.app.FragmentActivity;
 import android.util.Log;
 import android.view.View;
@@ -42,14 +49,14 @@ public class FunctionSelectActivity extends FragmentActivity implements
 		// tv_cargo.setOnClickListener(this);
 		TextView tv_doc = (TextView) findViewById(R.id.tv_doc);
 		tv_doc.setOnClickListener(this);
-		TextView tv_password = (TextView) findViewById(R.id.tv_password);
-		tv_password.setOnClickListener(this);
+		TextView tv_message = (TextView) findViewById(R.id.tv_message);
+		tv_message.setOnClickListener(this);
 		TextView tv_exit = (TextView) findViewById(R.id.tv_exit);
 		tv_exit.setOnClickListener(this);
 		TextView tv_loc = (TextView) findViewById(R.id.tv_location);
 		tv_loc.setOnClickListener(this);
-		TextView tv_about = (TextView) findViewById(R.id.tv_about);
-		tv_about.setOnClickListener(this);
+		TextView tv_tools = (TextView) findViewById(R.id.tv_tools);
+		tv_tools.setOnClickListener(this);
 		Button btn_search = (Button) findViewById(R.id.btn_search);
 		btn_search.setOnClickListener(this);
 		Button btn_clear = (Button) findViewById(R.id.btn_clear);
@@ -92,7 +99,6 @@ public class FunctionSelectActivity extends FragmentActivity implements
 				break;
 		}
 
-
 		super.onActivityResult(requestCode, resultCode, data);
 	}
 
@@ -187,17 +193,7 @@ public class FunctionSelectActivity extends FragmentActivity implements
 				startActivity(intent);
 				break;
 			}
-			// case R.id.tv_cargo:
-			// {
-			// Intent intent = new Intent();
-			// intent.setClass(this, CargoTrackingActivity.class);
-			// intent.putExtra("user", user);
-			// intent.putExtra("password", password);
-			// intent.putExtra("function_name", "Cargo Tracking");
-			// startActivity(intent);
-			// }
-			//
-			// break;
+
 			case R.id.tv_doc:
 			{
 				Intent intent = new Intent();
@@ -209,12 +205,18 @@ public class FunctionSelectActivity extends FragmentActivity implements
 				startActivity(intent);
 				break;
 			}
-			case R.id.tv_password:
+			case R.id.tv_message:
 			{
+
 				Intent intent = new Intent();
-				intent.setClass(this, ChangePasswordActivity.class);
-				// intent.putExtra("function_name", "Container detail");
-				startActivityForResult(intent, REQUEST_CHANGEPASSWORD_ACTIVITY);
+				intent.setClass(this, MessageActivity.class);
+				startActivity(intent);
+				//
+				// Intent intent = new Intent();
+				// intent.setClass(this, ChangePasswordActivity.class);
+				// // intent.putExtra("function_name", "Container detail");
+				// startActivityForResult(intent,
+				// REQUEST_CHANGEPASSWORD_ACTIVITY);
 				break;
 			}
 			case R.id.tv_exit:
@@ -238,12 +240,12 @@ public class FunctionSelectActivity extends FragmentActivity implements
 				// System.exit(0);
 				break;
 			}
-			case R.id.tv_about:
+			case R.id.tv_tools:
 			{
 				Intent intent = new Intent();
-				intent.setClass(this, AboutActivity.class);
+				intent.setClass(this, InnerToolsActivity.class);
+				intent.putExtra("launcher", "inner");
 				startActivity(intent);
-
 				break;
 			}
 			case R.id.tv_location:
@@ -264,6 +266,7 @@ public class FunctionSelectActivity extends FragmentActivity implements
 		// TODO Auto-generated method stub
 
 	}
+
 	// class HistoryAdapter extends SimpleCursorAdapter{
 	//
 	// public HistoryAdapter(Context context, int layout, Cursor c,
@@ -275,4 +278,46 @@ public class FunctionSelectActivity extends FragmentActivity implements
 	//
 	// }
 
+	@Override
+	protected void onResume()
+	{
+		SQLiteDatabase db = dbUtil.OpenDB(this, null, false);
+		int count = dbUtil.get_count(db, "push_message", "read = 0");
+
+		dbUtil.CloseDB(db);
+		NotificationManager nManager = (NotificationManager) this
+				.getSystemService(Context.NOTIFICATION_SERVICE);
+		nManager.cancel(R.layout.activity_apex);
+
+
+//		Intent intent = new Intent();
+//		intent.setClass(ApexTrackingApplication
+//				.get_instance(), FunctionSelectActivity.class);
+//		Intent addShortcut = new Intent(
+//				"com.android.launcher.action.INSTALL_SHORTCUT");
+//		Parcelable icon = Intent.ShortcutIconResource.fromContext(this,
+//				R.drawable.ic_launcher);
+//		addShortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,
+//				getString(R.string.app_name));
+//		addShortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
+//		addShortcut.putExtra("duplicate", 0);
+//		addShortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
+//		Log.e("uuuuuuuuuuuuuuuurrrrrrrrrrrrrriiiiiiiii", intent.toUri(MODE_WORLD_WRITEABLE));
+//		sendBroadcast(addShortcut);
+		if (count > 0)
+		{
+			TextView tv_message = (TextView) findViewById(R.id.tv_message);
+			tv_message.setCompoundDrawablesWithIntrinsicBounds(0,
+					R.drawable.ic_message_new, 0, 0);
+
+		}
+		else
+		{
+			TextView tv_message = (TextView) findViewById(R.id.tv_message);
+			tv_message.setCompoundDrawablesWithIntrinsicBounds(0,
+					R.drawable.ic_message, 0, 0);
+		}
+		super.onResume();
+	}
+
 }

+ 31 - 0
Apex/src/com/usai/apex/InnerToolsActivity.java

@@ -0,0 +1,31 @@
+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;
+
+public class InnerToolsActivity extends FragmentActivity
+{
+
+	@Override
+	protected void onCreate(Bundle savedInstanceState)
+	{
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.activity_inner_tools);
+
+		// Fragment f = new ToolsFragment();
+		if (savedInstanceState == null)
+		{
+			getSupportFragmentManager().beginTransaction()
+					.add(R.id.container, new ToolsFragment()).commit();
+		}
+
+
+	}
+
+}

+ 2 - 2
Apex/src/com/usai/apex/LoginFragment.java

@@ -415,8 +415,8 @@ public class LoginFragment extends Fragment/* implements OnClickListener */
 				default: {
 					Toast toast = Toast.makeText(getActivity()
 							.getApplicationContext(),
-							"An error occur on server code:" + errorcode,
-							Toast.LENGTH_LONG);
+							getText(R.string.msg_net_resulterror) + ":"
+									+ errorcode, Toast.LENGTH_LONG);
 					toast.setGravity(Gravity.CENTER, 0, 0);
 					toast.show();
 					break;

+ 345 - 0
Apex/src/com/usai/apex/MessageActivity.java

@@ -0,0 +1,345 @@
+package com.usai.apex;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.usai.util.Network;
+import com.usai.util.dbUtil;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.ListActivity;
+import android.app.AlertDialog.Builder;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.text.format.DateFormat;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+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 MessageActivity extends ListActivity implements OnTouchListener
+{
+	SearchResult	searchresult	= new SearchResult();
+	BaseAdapter		adapter			= null;
+
+	private int		pointX, pointY, endX, endY;
+	private int		position, newpos;
+	private Button	curDel_btn;
+
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu)
+	{
+		// Inflate the menu; this adds items to the action bar if it is present.
+		getMenuInflater().inflate(R.menu.message, menu);
+		return true;
+	}
+
+	@Override
+	public boolean onOptionsItemSelected(MenuItem item)
+	{
+		// Intent intent = new Intent();
+		switch (item.getItemId())
+		{
+			case R.id.action_deleteall:
+			{
+				AlertDialog.Builder builder = new Builder(this);
+				builder.setMessage(getString(R.string.str_deletemessage));
+
+				builder.setTitle(getString(R.string.str_confirmdelete));
+
+				builder.setPositiveButton(getString(R.string.str_del),
+						new Dialog.OnClickListener()
+						{
+
+							@Override
+							public void onClick(DialogInterface dialog,
+									int which)
+							{
+								SQLiteDatabase db = dbUtil.OpenDB(
+										MessageActivity.this, null, false);
+								db.execSQL("delete from push_message");
+								Log.d("sql delete" + position,
+										"delete from push_message where _id="
+												+ (Long) searchresult.getData()
+														.get(position).get("_id"));
+
+								dbUtil.CloseDB(db);
+								dialog.dismiss();
+								searchresult.getData().clear();//.remove(position);
+								adapter.notifyDataSetChanged();
+							}
+						});
+
+				builder.setNegativeButton(getString(R.string.str_cancel),
+						new Dialog.OnClickListener()
+						{
+
+							@Override
+							public void onClick(DialogInterface dialog,
+									int which)
+							{
+								dialog.dismiss();
+							}
+						});
+
+				builder.create().show();
+
+				break;
+			}
+			default:
+				break;
+		}
+		return super.onOptionsItemSelected(item);
+	}
+
+	@Override
+	public boolean onTouch(View v, MotionEvent event)
+	{
+		switch (event.getAction())
+		{
+			case MotionEvent.ACTION_DOWN:
+				System.out.println("====>>>>>>>>>>>>>>ACTION_DOWN"
+						+ MotionEvent.ACTION_DOWN);
+				// 手指按下,计算焦点位于ListView的那个条目
+				pointX = (int) event.getX();
+				pointY = (int) event.getY();
+				// 备注1
+				position = getListView().pointToPosition(pointX, pointY);
+				if (curDel_btn != null)
+				{
+					curDel_btn.setVisibility(View.GONE);
+				}
+				break;
+			case MotionEvent.ACTION_MOVE:
+
+				break;
+			case MotionEvent.ACTION_UP:
+				System.out.println("====>>>>>>>>>>>>>>ACTION_UP"
+						+ MotionEvent.ACTION_UP);
+				endX = (int) event.getX();
+				endY = (int) event.getY();
+				newpos = getListView().pointToPosition(endX, endY);
+				// 原本想着加上这个条件(newpos==position)是不是更精确些,
+				// 经过实践发现,其实我们在滑动listView的列表的时候有时候更渴望有滑动就ok
+				if (Math.abs(endX - pointX) > 100 && newpos == position
+						&& Math.abs(endY - pointY) < 100)
+				{
+					// 获取到ListView第一个可见条目的position
+					int firstVisiblePosition = getListView()
+							.getFirstVisiblePosition();
+
+					// --------------备注2
+					View view = getListView().getChildAt(
+							position - firstVisiblePosition);
+					Button delbtn = (Button) view.findViewById(R.id.btn_del);
+					delbtn.setVisibility(View.VISIBLE);
+					curDel_btn = delbtn;
+					delbtn.setOnClickListener(new View.OnClickListener()
+					{
+
+						@Override
+						public void onClick(View v)
+						{
+							// TODO Auto-generated method stub
+
+							SQLiteDatabase db = dbUtil.OpenDB(
+									MessageActivity.this, null, false);
+							db.execSQL("delete from push_message where _id="
+									+ (Long) searchresult.getData()
+											.get(position).get("_id"));
+							Log.d("sql delete" + position,
+									"delete from push_message where _id="
+											+ (Long) searchresult.getData()
+													.get(position).get("_id"));
+
+							dbUtil.CloseDB(db);
+							searchresult.getData().remove(position);
+							adapter.notifyDataSetChanged();
+						}
+					});
+
+				}
+				break;
+
+			default:
+				break;
+		}
+		return false;
+	}
+
+	@Override
+	protected void onListItemClick(ListView l, View v, int position, long id)
+	{
+		SQLiteDatabase db = dbUtil.OpenDB(MessageActivity.this, null, false);
+		db.execSQL("update push_message set read = 1 where _id="
+				+ (Long) searchresult.getData().get(position).get("_id"));
+		searchresult.getData().get(position).put("read", (long) 1);// .get("_id")
+		dbUtil.CloseDB(db);
+		adapter.notifyDataSetChanged();
+		super.onListItemClick(l, v, position, id);
+
+		// Log.i("FragmentList", "Item clicked: " + id);
+		Intent intent = new Intent();
+		intent.putExtra("s_id", (String) searchresult.getData().get(position)
+				.get("s_id"));
+		intent.putExtra("e_id", (String) searchresult.getData().get(position)
+				.get("e_id"));
+		intent.putExtra("msgcount", (Long) searchresult.getData().get(position)
+				.get("msgcount"));
+
+		intent.setClass(this, MessageDetailActivity.class);
+		startActivity(intent);
+	}
+
+	@Override
+	public void onCreate(Bundle savedInstanceState)
+	{
+
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.message_list);
+		adapter = new MessageAdapter(searchresult, this);
+
+		getListView().setOnTouchListener(this);
+		setListAdapter(adapter);
+
+	}
+
+	private class SearchResult
+	{
+		List<Map<String, Object>>	datalist	= new ArrayList<Map<String, Object>>();
+
+		public int get_count()
+		{
+			return datalist.size();
+		}
+
+		public void add_records(Cursor c)
+		{
+			while (c.moveToNext())
+			{
+				long _id = c.getInt(0);
+				String h_time = c.getString(1);
+				long create_time = c.getLong(2);
+				long read = c.getLong(3);
+				String s_id = c.getString(4);
+				String e_id = c.getString(5);
+				long msgcount = c.getInt(6);
+				Map<String, Object> map = new HashMap<String, Object>();
+				map.put("_id", _id);
+				map.put("h_time", h_time);
+				map.put("create_time", create_time);
+				map.put("read", read);
+				map.put("s_id", s_id);
+				map.put("e_id", e_id);
+				map.put("msgcount", msgcount);
+
+				datalist.add(map);
+			}
+
+		}
+
+		public List<Map<String, Object>> getData()
+		{
+
+			return datalist;
+		}
+	}
+
+	private class MessageAdapter extends BaseAdapter
+	{
+		private LayoutInflater	mInflater;	// 动态布局映射
+											// private SearchResult result;
+
+		// private Context context;
+		// private int i = 0;
+		public MessageAdapter(SearchResult result, Context context)
+		{
+			// this.result = result;
+			this.mInflater = LayoutInflater.from(context);
+			SQLiteDatabase db = dbUtil
+					.OpenDB(MessageActivity.this, null, false);
+			Cursor cursor = db.query("push_message",
+					new String[] { "_id", "h_time", "create_time", "read",
+							"s_id", "e_id", "msgcount" }, "user='"
+							+ ApexTrackingApplication.get_user() + "'", null,
+					null, null, "_id desc", null);
+
+			result.add_records(cursor);
+			dbUtil.CloseCursor(cursor);
+			dbUtil.CloseDB(db);
+			// this.result = result;
+			// // this.context = context;
+			// this.mInflater = LayoutInflater.from(context);
+		}
+
+		@Override
+		public View getView(int position, View convertView, ViewGroup parent)
+		{
+			// TODO Auto-generated method stub
+			convertView = mInflater.inflate(R.layout.message_list_item, null);// 根据布局文件实例化view
+
+			TextView message = (TextView) convertView
+					.findViewById(R.id.tv_message);// 找某个控件
+
+			message.setText(getString(R.string.str_notification_text)
+					+ searchresult.getData().get(position).get("h_time")
+							.toString());// 给该控件设置数据(数据从集合类中来)
+			TextView time = (TextView) convertView.findViewById(R.id.tv_time);
+			time.setText(DateFormat.format(
+					getString(R.string.time_format),
+					(Long) searchresult.getData().get(position)
+							.get("create_time")));
+			if ((Long) searchresult.getData().get(position).get("read") == 0)
+			{
+				message.getPaint().setFakeBoldText(true);
+				time.getPaint().setFakeBoldText(true);
+				convertView.setBackgroundColor(Color.LTGRAY);
+			}
+			else
+			{
+				message.getPaint().setFakeBoldText(false);
+				time.getPaint().setFakeBoldText(false);
+				convertView.setBackgroundColor(Color.WHITE);
+			}
+
+			return convertView;
+		}
+
+		@Override
+		public int getCount()
+		{
+			return searchresult.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;
+		}
+	}
+
+}

+ 424 - 0
Apex/src/com/usai/apex/MessageDetailActivity.java

@@ -0,0 +1,424 @@
+package com.usai.apex;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import com.usai.util.Network;
+
+import android.app.ListActivity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.text.Html;
+import android.text.method.LinkMovementMethod;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AutoCompleteTextView;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+
+public class MessageDetailActivity extends ListActivity
+{
+	long				msgcount		= 0;
+	String				e_id			= "";
+	String				s_id			= "";
+	int					limit			= 10;
+	int					offset			= 0;
+	private SearchTask	m_task			= null;
+	SearchResult		searchresult	= new SearchResult();
+	BaseAdapter			adapter			= null;
+	View				view_page_footer;
+
+	// String module_name = "";
+
+	public void requestdata()
+	{
+
+		if (m_task != null)
+		{
+			return;
+		}
+		// mStatusMessageView.setText(R.string.str_Loading);
+		// showProgress(true);
+		m_task = new SearchTask();
+
+		TextView text_page = (TextView) view_page_footer
+				.findViewById(R.id.text_page);
+		text_page.setText("Loading...");
+		text_page.setEnabled(false);
+		m_task.execute();
+
+	}
+
+	@Override
+	protected void onListItemClick(ListView l, View v, int position, long id)
+	{
+		super.onListItemClick(l, v, position, id);
+
+		Intent intent = new Intent();
+		intent.setClass(this, DetailActivity.class);
+
+		intent.putExtra("action0", "Tracking");
+		intent.putExtra("function_name", "Cargo Tracking");
+
+		intent.putExtra("cargo_criterion", searchresult.getData().get(position)
+				.get("url").toString());
+		intent.putExtra("actions_count", 1);
+		intent.putExtra("_id", "dumb");
+//		String h_field;
+		intent.putExtra("criterion_type", 1);
+//		h_field = "container_no";
+
+		startActivity(intent);
+
+	}
+
+	@Override
+	public void onDestroy()
+	{
+		if (m_task != null)
+			m_task.cancel(false);
+		super.onDestroy();
+	}
+
+	@Override
+	protected void onCreate(Bundle savedInstanceState)
+	{
+
+		// setTitle("Booking Result");
+
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.message_list);
+		adapter = new AnnouncementAdapter(searchresult, this);
+
+		s_id = getIntent().getStringExtra("s_id");
+		e_id = getIntent().getStringExtra("e_id");
+		msgcount = getIntent().getLongExtra("msgcount", 0);
+		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...");
+				offset += 10;
+				requestdata();
+				// tv.setText("下一页");
+				// adapter.notifyDataSetChanged();
+			}
+		});
+
+		setListAdapter(adapter);
+		// this.getListView().setBackgroundColor(Color.WHITE);
+		requestdata();
+
+	}
+
+	class SearchTask extends AsyncTask<Void, Void, Boolean>
+	{
+		int		errorcode;
+		boolean	bfinish	= false;
+
+		@Override
+		protected Boolean doInBackground(Void... params)
+		{
+			Log.d("SearchTask", "doInBackground");
+			if (!Network.NetworkIsAvailable())
+
+			{
+				errorcode = Network.RESULT_NET_NOTAVAILABLE;
+				return false;
+			}
+			String jstr = Network.get_push(e_id, s_id, limit, offset);
+			if (jstr == null || jstr.length() <= 0)
+			{
+				// Log.d(TAG, "json is wrong");
+
+				errorcode = Network.RESULT_NET_ERROR;
+				return false;
+			}
+
+			JSONObject jsobj;
+			//
+			// array = new JSONArray(json);
+			try
+			{
+				jsobj = new JSONObject(jstr);
+				// if (searchresult.get_fieldscount() == 0)
+				// {
+				// JSONObject objfields = jsobj.getJSONObject("fields");
+				// if (objfields != null)
+				// searchresult.init_fields(objfields.toString());
+				// }
+				int count = jsobj.getInt("total");
+				if (msgcount - offset <= limit)
+					bfinish = true;
+				JSONObject objrecords = jsobj.getJSONObject("records");
+				if (objrecords != null)
+					searchresult.add_records(objrecords.toString(), count);
+				errorcode = Network.RESULT_TRUE;
+
+				return true;
+
+			}
+			catch (JSONException e)
+			{
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			errorcode = Network.RESULT_NET_ERROR;
+			return false;
+		}
+
+		@Override
+		protected void onPostExecute(Boolean success)
+		{
+			Log.i("onPostExecute", "entry");
+			m_task = null;
+			// showProgress(false);
+
+			switch (errorcode)
+			{
+				case Network.RESULT_NET_NOTAVAILABLE:
+				{
+					Toast toast = Toast.makeText(
+							ApexTrackingApplication.get_instance(),
+							getText(R.string.msg_connection_none),
+							Toast.LENGTH_LONG);
+					toast.setGravity(Gravity.CENTER, 0, 0);
+					toast.show();
+					break;
+				}
+				case Network.RESULT_NET_ERROR:
+				{
+					Toast toast = Toast.makeText(
+							ApexTrackingApplication.get_instance(),
+							getText(R.string.msg_net_error), Toast.LENGTH_LONG);
+					toast.setGravity(Gravity.CENTER, 0, 0);
+					toast.show();
+					break;
+				}
+				case Network.RESULT_ERROR:
+				// case Network.RESULT_RESPONSE_NULL:
+				{
+					Toast toast = Toast.makeText(
+							ApexTrackingApplication.get_instance(),
+							getText(R.string.msg_net_resulterror),
+							Toast.LENGTH_LONG);
+					toast.setGravity(Gravity.CENTER, 0, 0);
+					toast.show();
+					break;
+				}
+
+				default:
+					break;
+			}
+
+			if (success)
+			{
+
+				if (bfinish)
+				{
+					// getListView().removeFooterView(view_page_footer);
+					// Toast.makeText(AnnouncementActivity.this, "Load all!",
+					// Toast.LENGTH_LONG).show();
+
+					TextView tv = (TextView) view_page_footer
+							.findViewById(R.id.text_page);
+					tv.setText("No more items");
+					tv.setEnabled(false);
+				}
+				else
+				{
+					TextView tv = (TextView) view_page_footer
+							.findViewById(R.id.text_page);
+					tv.setText("More...");
+					tv.setEnabled(true);
+				}
+				adapter.notifyDataSetChanged();
+				// getListAdapter().notifyDataSetChanged;
+				// BaseAdapter mJson = null;
+				// mJson.notifyDataSetChanged();
+			}
+
+			super.onPostExecute(success);
+		}
+
+		@Override
+		protected void onCancelled()
+		{
+			m_task = null;
+			// showProgress(false);
+		}
+	}
+
+	private 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)
+		{
+			JSONObject objrecords;
+			try
+			{
+				objrecords = new JSONObject(source);
+
+				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 AnnouncementAdapter extends BaseAdapter
+	{
+		private LayoutInflater	mInflater;	// 动态布局映射
+		private SearchResult	result;
+
+		// private Context context;
+		// private int i = 0;
+		public AnnouncementAdapter(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
+			convertView = mInflater.inflate(R.layout.message_detail_item, null);// 根据布局文件实例化view
+
+			TextView title = (TextView) convertView.findViewById(R.id.tv_title);// 找某个控件
+			title.setText(Html.fromHtml(result.getData().get(position)
+					.get("title").toString()));
+			// title.setMovementMethod(LinkMovementMethod.getInstance());
+			// title.setText(result.getData().get(position).get("title")
+			// .toString());// 给该控件设置数据(数据从集合类中来)
+			// TextView content = (TextView) convertView
+			// .findViewById(R.id.tv_content);
+			// content.setText(result.getData().get(position).get("content")
+			// .toString());
+			// 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;
+		}
+	}
+
+}

+ 25 - 5
Apex/src/com/usai/apex/ResultActivity.java

@@ -47,6 +47,8 @@ import android.widget.Toast;
 
 public class ResultActivity extends Activity
 {
+	
+	private static final int	REQUEST_LOGINACTIVITY			= 1;
 	String				user			= null;
 	String				password		= null;
 	String				function_name	= null;
@@ -707,7 +709,20 @@ public class ResultActivity extends Activity
 			Log.i("onPostExecute", "entry");
 			m_task = null;
 			showProgress(false);
-
+			if (ApexTrackingApplication.get_authorization() == false)
+			{
+				LinearLayout ll = (LinearLayout) findViewById(R.id.ll_refresh);
+				ll.setVisibility(View.VISIBLE);
+				Toast toast = Toast.makeText(
+						ApexTrackingApplication.get_instance(),
+						getText(R.string.msg_net_passwordchangedremote) , Toast.LENGTH_LONG);
+				toast.setGravity(Gravity.CENTER, 0, 0);
+				toast.show();
+				Intent i = new Intent();
+				i.setClass(ResultActivity.this, ApexActivity.class);
+				startActivityForResult(i, REQUEST_LOGINACTIVITY);
+				return;
+			}
 			switch (errorcode)
 			{
 				case Network.RESULT_NET_NOTAVAILABLE:
@@ -721,10 +736,15 @@ public class ResultActivity extends Activity
 				}
 				case Network.RESULT_NET_ERROR:
 				{
-					Toast toast = Toast.makeText(getApplicationContext(),
-							getText(R.string.msg_net_error), Toast.LENGTH_LONG);
-					toast.setGravity(Gravity.CENTER, 0, 0);
-					toast.show();
+
+
+						Toast toast = Toast.makeText(
+								ApexTrackingApplication.get_instance(),
+								getText(R.string.msg_net_resulterror) + ":"
+										+ errorcode, Toast.LENGTH_LONG);
+						toast.setGravity(Gravity.CENTER, 0, 0);
+						toast.show();
+
 					break;
 				}
 				case Network.RESULT_ERROR:

+ 169 - 120
Apex/src/com/usai/apex/RetrievePasswordActivity.java

@@ -29,44 +29,51 @@ import android.widget.Toast;
  * Activity which displays a login screen to the user, offering registration as
  * well.
  */
-public class RetrievePasswordActivity extends Activity {
+public class RetrievePasswordActivity extends Activity
+{
 
 	/**
 	 * Keep track of the login task to ensure we can cancel it if requested.
 	 */
-	private UserLoginTask mAuthTask = null;
+	private UserLoginTask	mAuthTask	= null;
 
 	// Values for email and password at the time of the login attempt.
-	private String m_sEmail;
-	private String m_sUser;
+	private String			m_sEmail;
+	private String			m_sUser;
 
 	// UI references.
-	private EditText mEmailView;
-	private EditText m_userView;
-	private View mLoginFormView;
-	private View mLoginStatusView;
-	private TextView mLoginStatusMessageView;
+	private EditText		mEmailView;
+	private EditText		m_userView;
+	private View			mLoginFormView;
+	private View			mLoginStatusView;
+	private TextView		mLoginStatusMessageView;
 
 	@Override
-	protected void onCreate(Bundle savedInstanceState) {
+	protected void onCreate(Bundle savedInstanceState)
+	{
 		super.onCreate(savedInstanceState);
 
 		setContentView(R.layout.activity_retrieve_password);
 
 		// Set up the login form.
 		m_userView = (EditText) findViewById(R.id.user);
-//		m_sEmail = getIntent().getStringExtra(EXTRA_EMAIL);
+		// m_sEmail = getIntent().getStringExtra(EXTRA_EMAIL);
 		mEmailView = (EditText) findViewById(R.id.email);
-//		mEmailView.setText(m_sEmail);
+		// mEmailView.setText(m_sEmail);
 
 		mEmailView
-				.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+				.setOnEditorActionListener(new TextView.OnEditorActionListener()
+				{
 					@Override
 					public boolean onEditorAction(TextView textView, int id,
-							KeyEvent keyEvent) {
-						if (id == R.id.btn_ok || id == EditorInfo.IME_ACTION_DONE) {
-
-							InputMethodManager inputMethodManager = (InputMethodManager)getApplicationContext().getSystemService(
+							KeyEvent keyEvent)
+					{
+						if (id == R.id.btn_ok
+								|| id == EditorInfo.IME_ACTION_DONE)
+						{
+
+							InputMethodManager inputMethodManager = (InputMethodManager) getApplicationContext()
+									.getSystemService(
 											Context.INPUT_METHOD_SERVICE);
 
 							// EditText editText =
@@ -84,43 +91,49 @@ public class RetrievePasswordActivity extends Activity {
 		mLoginStatusView = findViewById(R.id.login_status);
 		mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);
 
-		findViewById(R.id.btn_ok).setOnClickListener(
-				new View.OnClickListener() {
-					@Override
-					public void onClick(View view) {
-						InputMethodManager inputMethodManager = (InputMethodManager)getApplicationContext().getSystemService(
-								Context.INPUT_METHOD_SERVICE);
+		findViewById(R.id.btn_ok).setOnClickListener(new View.OnClickListener()
+		{
+			@Override
+			public void onClick(View view)
+			{
+				InputMethodManager inputMethodManager = (InputMethodManager) getApplicationContext()
+						.getSystemService(Context.INPUT_METHOD_SERVICE);
 
 				// EditText editText =
 				// (EditText)findViewById(R.id.xxxx);
 				inputMethodManager.hideSoftInputFromWindow(
 						mEmailView.getWindowToken(), 0); // ����
-						retrivev();
-					}
-				});
+				retrivev();
+			}
+		});
 		findViewById(R.id.btn_close).setOnClickListener(
-				new View.OnClickListener() {
+				new View.OnClickListener()
+				{
 					@Override
-					public void onClick(View view) {
+					public void onClick(View view)
+					{
 						finish();
 					}
 				});
 	}
-//
-//	@Override
-//	public boolean onCreateOptionsMenu(Menu menu) {
-//		super.onCreateOptionsMenu(menu);
-//		getMenuInflater().inflate(R.menu.retrieve_password, menu);
-//		return true;
-//	}
+
+	//
+	// @Override
+	// public boolean onCreateOptionsMenu(Menu menu) {
+	// super.onCreateOptionsMenu(menu);
+	// getMenuInflater().inflate(R.menu.retrieve_password, menu);
+	// return true;
+	// }
 
 	/**
 	 * Attempts to sign in or register the account specified by the login form.
 	 * If there are form errors (invalid email, missing fields, etc.), the
 	 * errors are presented and no actual login attempt is made.
 	 */
-	public void retrivev() {
-		if (mAuthTask != null) {
+	public void retrivev()
+	{
+		if (mAuthTask != null)
+		{
 			return;
 		}
 
@@ -136,33 +149,40 @@ public class RetrievePasswordActivity extends Activity {
 		View focusView = null;
 
 		// Check for a valid password.
-		if (TextUtils.isEmpty(m_sUser)) {
+		if (TextUtils.isEmpty(m_sUser))
+		{
 			m_userView.setError(getString(R.string.error_field_required));
 			focusView = m_userView;
 			cancel = true;
-		} 
-//		else if (m_sUser.length() < 4) {
-//			m_userView.setError(getString(R.string.error_invalid_password));
-//			focusView = m_userView;
-//			cancel = true;
-//		}
+		}
+		// else if (m_sUser.length() < 4) {
+		// m_userView.setError(getString(R.string.error_invalid_password));
+		// focusView = m_userView;
+		// cancel = true;
+		// }
 
 		// Check for a valid email address.
-		if (TextUtils.isEmpty(m_sEmail)) {
+		if (TextUtils.isEmpty(m_sEmail))
+		{
 			mEmailView.setError(getString(R.string.error_field_required));
 			focusView = mEmailView;
 			cancel = true;
-		} else if (!m_sEmail.contains("@")) {
+		}
+		else if (!m_sEmail.contains("@"))
+		{
 			mEmailView.setError(getString(R.string.error_invalid_email));
 			focusView = mEmailView;
 			cancel = true;
 		}
 
-		if (cancel) {
+		if (cancel)
+		{
 			// There was an error; don't attempt login and focus the first
 			// form field with an error.
 			focusView.requestFocus();
-		} else {
+		}
+		else
+		{
 			// Show a progress spinner, and kick off a background task to
 			// perform the user login attempt.
 			mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
@@ -176,20 +196,24 @@ public class RetrievePasswordActivity extends Activity {
 	 * Shows the progress UI and hides the login form.
 	 */
 	@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
-	private void showProgress(final boolean show) {
+	private void showProgress(final boolean show)
+	{
 		// On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
 		// for very easy animations. If available, use these APIs to fade-in
 		// the progress spinner.
-		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
+		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
+		{
 			int shortAnimTime = getResources().getInteger(
 					android.R.integer.config_shortAnimTime);
 
 			mLoginStatusView.setVisibility(View.VISIBLE);
 			mLoginStatusView.animate().setDuration(shortAnimTime)
 					.alpha(show ? 1 : 0)
-					.setListener(new AnimatorListenerAdapter() {
+					.setListener(new AnimatorListenerAdapter()
+					{
 						@Override
-						public void onAnimationEnd(Animator animation) {
+						public void onAnimationEnd(Animator animation)
+						{
 							mLoginStatusView.setVisibility(show ? View.VISIBLE
 									: View.GONE);
 						}
@@ -198,14 +222,18 @@ public class RetrievePasswordActivity extends Activity {
 			mLoginFormView.setVisibility(View.VISIBLE);
 			mLoginFormView.animate().setDuration(shortAnimTime)
 					.alpha(show ? 0 : 1)
-					.setListener(new AnimatorListenerAdapter() {
+					.setListener(new AnimatorListenerAdapter()
+					{
 						@Override
-						public void onAnimationEnd(Animator animation) {
+						public void onAnimationEnd(Animator animation)
+						{
 							mLoginFormView.setVisibility(show ? View.GONE
 									: View.VISIBLE);
 						}
 					});
-		} else {
+		}
+		else
+		{
 			// The ViewPropertyAnimator APIs are not available, so simply show
 			// and hide the relevant UI components.
 			mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
@@ -217,22 +245,26 @@ public class RetrievePasswordActivity extends Activity {
 	 * Represents an asynchronous login/registration task used to authenticate
 	 * the user.
 	 */
-	public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
-		int errorcode;
+	public class UserLoginTask extends AsyncTask<Void, Void, Boolean>
+	{
+		int	errorcode;
 
 		@Override
-		protected Boolean doInBackground(Void... params) {
+		protected Boolean doInBackground(Void... params)
+		{
 			errorcode = Network.retrieve_pass(m_sUser, m_sEmail);
 			if (errorcode == Network.RESULT_TRUE)
 				return true;
-			else {
+			else
+			{
 				return false;
 			}
 
 		}
 
 		@Override
-		protected void onPostExecute(final Boolean success) {
+		protected void onPostExecute(final Boolean success)
+		{
 			Log.i("onPostExecute", "entry");
 			mAuthTask = null;
 			showProgress(false);
@@ -241,93 +273,110 @@ public class RetrievePasswordActivity extends Activity {
 			//
 			// }
 
-			if (success) {
-				AlertDialog.Builder builder = new Builder(RetrievePasswordActivity.this);
+			if (success)
+			{
+				AlertDialog.Builder builder = new Builder(
+						RetrievePasswordActivity.this);
 				builder.setMessage("Email has been sent.");
 
 				builder.setTitle("Retrieve successfully!");
 
-				builder.setPositiveButton("Ok", new OnClickListener() {
+				builder.setPositiveButton("Ok", new OnClickListener()
+				{
 
 					@Override
-					public void onClick(DialogInterface dialog, int which) {
+					public void onClick(DialogInterface dialog, int which)
+					{
 						dialog.dismiss();
 
 						RetrievePasswordActivity.this.finish();
 					}
 				});
 
-//				builder.setNegativeButton("取消", new OnClickListener() {
-//
-//					@Override
-//					public void onClick(DialogInterface dialog, int which) {
-//						dialog.dismiss();
-//					}
-//				});
+				// builder.setNegativeButton("取消", new OnClickListener() {
+				//
+				// @Override
+				// public void onClick(DialogInterface dialog, int which) {
+				// dialog.dismiss();
+				// }
+				// });
 
 				builder.create().show();
 
-			} else {
-				switch (errorcode) {
-				case Network.RESULT_NET_NOTAVAILABLE: {
-					Toast toast = Toast.makeText(getApplicationContext(),
-							getText(R.string.msg_connection_none),
-							Toast.LENGTH_LONG);
-					toast.setGravity(Gravity.CENTER, 0, 0);
-					toast.show();
-					return;
-				}
-				case Network.RESULT_NET_ERROR: {
-					Toast toast = Toast.makeText(getApplicationContext(),
-							getText(R.string.msg_net_error), Toast.LENGTH_LONG);
-					toast.setGravity(Gravity.CENTER, 0, 0);
-					toast.show();
-					return;
-				}
-				case Network.RESULT_ERROR:
-				// case Network.RESULT_RESPONSE_NULL:
+			}
+			else
+			{
+				switch (errorcode)
 				{
-					Toast toast = Toast.makeText(getApplicationContext(),
-							getText(R.string.msg_net_resulterror),
-							Toast.LENGTH_LONG);
-					toast.setGravity(Gravity.CENTER, 0, 0);
-					toast.show();
-					return;
-				}
+					case Network.RESULT_NET_NOTAVAILABLE:
+					{
+						Toast toast = Toast.makeText(getApplicationContext(),
+								getText(R.string.msg_connection_none),
+								Toast.LENGTH_LONG);
+						toast.setGravity(Gravity.CENTER, 0, 0);
+						toast.show();
+						return;
+					}
+					case Network.RESULT_NET_ERROR:
+					{
+						Toast toast = Toast.makeText(getApplicationContext(),
+								getText(R.string.msg_net_error),
+								Toast.LENGTH_LONG);
+						toast.setGravity(Gravity.CENTER, 0, 0);
+						toast.show();
+						return;
+					}
+					case Network.RESULT_ERROR:
+					// case Network.RESULT_RESPONSE_NULL:
+					{
+						Toast toast = Toast.makeText(getApplicationContext(),
+								getText(R.string.msg_net_resulterror),
+								Toast.LENGTH_LONG);
+						toast.setGravity(Gravity.CENTER, 0, 0);
+						toast.show();
+						return;
+					}
 
-				case Network.RESULT_FALSE: {
-					AlertDialog.Builder builder = new Builder(RetrievePasswordActivity.this);
-					builder.setMessage("Invalid user name or email.");
+					case Network.RESULT_FALSE:
+					{
+						AlertDialog.Builder builder = new Builder(
+								RetrievePasswordActivity.this);
+						builder.setMessage("Invalid user name or email.");
 
-					builder.setTitle("Retrieve failed");
+						builder.setTitle("Retrieve failed");
 
-					builder.setPositiveButton("Ok", new OnClickListener() {
+						builder.setPositiveButton("Ok", new OnClickListener()
+						{
 
-						@Override
-						public void onClick(DialogInterface dialog, int which) {
-							dialog.dismiss();
+							@Override
+							public void onClick(DialogInterface dialog,
+									int which)
+							{
+								dialog.dismiss();
 
-//							RetrievePasswordActivity.this.finish();
-						}
-					});
-					builder.create().show();
-					return;
+								// RetrievePasswordActivity.this.finish();
+							}
+						});
+						builder.create().show();
+						return;
 
-				}
-				default: {
-					Toast toast = Toast.makeText(getApplicationContext(),
-							"An error occur on server code:" + errorcode,
-							Toast.LENGTH_LONG);
-					toast.setGravity(Gravity.CENTER, 0, 0);
-					toast.show();
-					break;
-				}
+					}
+					default:
+					{
+						Toast toast = Toast.makeText(getApplicationContext(),
+								getText(R.string.msg_net_resulterror) + ":"
+										+ errorcode, Toast.LENGTH_LONG);
+						toast.setGravity(Gravity.CENTER, 0, 0);
+						toast.show();
+						break;
+					}
 				}
 			}
 		}
 
 		@Override
-		protected void onCancelled() {
+		protected void onCancelled()
+		{
 			mAuthTask = null;
 			showProgress(false);
 		}

+ 63 - 0
Apex/src/com/usai/apex/SearchHistoryActivity.java

@@ -0,0 +1,63 @@
+package com.usai.apex;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentTransaction;
+import android.util.Log;
+import android.widget.TabHost;
+
+public class SearchHistoryActivity extends FragmentActivity
+{
+	TabHost	mTabHost;
+
+	@Override
+	protected void onCreate(Bundle savedInstanceState)
+	{
+		Log.d("SearchHistoryActivity", "onCreate");
+
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.activity_apex);
+		// ActionBar bar = getActionBar();
+		// bar.setTitle("");
+		setupTabs();
+
+	}
+
+	private void setupTabs()
+	{
+		mTabHost = (TabHost) this.findViewById(R.id.tabhost);
+
+		mTabHost.setup();
+
+		mTabHost.addTab(mTabHost
+				.newTabSpec(getString(R.string.action_sign_in_short))
+				.setIndicator(getString(R.string.action_sign_in_short))
+				.setContent(R.id.tab1));
+
+		mTabHost.addTab(mTabHost.newTabSpec(getString(R.string.str_tool))
+				.setIndicator(getString(R.string.str_tool))
+				.setContent(R.id.tab2));
+		mTabHost.addTab(mTabHost.newTabSpec(getString(R.string.str_location))
+				.setIndicator(getString(R.string.str_location))
+				.setContent(R.id.tab3));
+
+		Fragment loginFragment = new LoginFragment();
+		Fragment toolsFragment = new ToolsFragment();
+
+		// Add the fragment to the activity, pushing this transaction
+		// on to the back stack.
+
+		FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
+		ft.replace(R.id.tab1, loginFragment);
+		ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
+		ft.addToBackStack("Login");
+
+		ft.replace(R.id.tab2, toolsFragment);
+		ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
+		ft.addToBackStack("Tools");
+
+		ft.commit();
+
+	}
+}

+ 15 - 0
Apex/src/com/usai/apex/SearchListActivity.java

@@ -440,6 +440,21 @@ public class SearchListActivity extends Activity implements
 				// }
 				intent.putExtra("searchParms", parms);
 
+            	
+            	String param = intent.toUri(0);
+            	
+				SQLiteDatabase db = dbUtil.OpenDB(
+						ApexTrackingApplication.get_instance(), null, true);
+				db.execSQL("insert into history(params,user,create_time) values('"
+						
+						+ param
+						+ "','"
+						+ ApexTrackingApplication.get_user()
+						+ "',"
+						+ System.currentTimeMillis() + ")");
+				dbUtil.CloseDB(db);           				
+				
+				
 				startActivity(intent);
 
 				break;

+ 81 - 11
Apex/src/com/usai/apex/ToolsFragment.java

@@ -1,14 +1,19 @@
 package com.usai.apex;
 
+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.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;
@@ -18,6 +23,52 @@ import android.widget.SimpleAdapter;
 
 public class ToolsFragment extends ListFragment
 {
+	private void delShortcut()
+	{
+		Intent shortcut = new Intent(
+				"com.android.launcher.action.UNINSTALL_SHORTCUT");
+
+		// 快捷方式的名称
+		shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,
+				getString(R.string.app_name));
+
+		// 指定当前的Activity为快捷方式启动的对象: 如 com.everest.video.VideoPlayer
+		// 注意: ComponentName的第二个参数必须是完整的类名(包名+类名),否则无法删除快捷方式
+		String appClass = getActivity().getPackageName() + "."
+				+ getActivity().getLocalClassName();
+		ComponentName comp = new ComponentName(getActivity().getPackageName(),
+				appClass);
+		shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(
+				Intent.ACTION_MAIN).setComponent(comp));
+
+		getActivity().sendBroadcast(shortcut);
+
+	}
+
+	private void addShortcut()
+	{
+		Intent shortcut = new Intent(
+				"com.android.launcher.action.INSTALL_SHORTCUT");
+
+		// 快捷方式的名称
+		shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,
+				getString(R.string.app_name));
+		shortcut.putExtra("duplicate", false); // 不允许重复创建
+
+		// 指定当前的Activity为快捷方式启动的对象: 如 com.everest.video.VideoPlayer
+		// 注意: ComponentName的第二个参数必须加上点号(.),否则快捷方式无法启动相应程序
+		ComponentName comp = new ComponentName(getActivity().getPackageName(),
+				"." + getActivity().getLocalClassName());
+		shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(
+				Intent.ACTION_MAIN).setComponent(comp));
+		// 快捷方式的图标
+		ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(
+				getActivity(), R.drawable.ic_launcher);
+		shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);
+
+		getActivity().sendBroadcast(shortcut);
+	}
+
 	// @Override
 	// public View onCreateView(LayoutInflater inflater, ViewGroup container,
 	// Bundle savedInstanceState)
@@ -43,7 +94,11 @@ public class ToolsFragment extends ListFragment
 		map.put("info", "google 2");
 		map.put("img", R.drawable.ic_launcher);
 		list.add(map);
-
+		map = new HashMap<String, Object>();
+		map.put("title", "About");
+		map.put("info", "google 2");
+		map.put("img", R.drawable.ic_launcher);
+		list.add(map);
 		return list;
 	}
 
@@ -65,17 +120,32 @@ public class ToolsFragment extends ListFragment
 		Intent intent = new Intent();
 		switch (position)
 		{
-		case 1:
-		
-			intent.setClass(getActivity(), AnnouncementActivity.class);
-			intent.putExtra("module_name", "Announcements");
-			break;
-		case 0:
-			intent.setClass(getActivity(), AnnouncementActivity.class);
-			intent.putExtra("module_name", "Market News");
-			break;
+			case 0:
+			{
+				addShortcut();
+
+				// intent.setClass(getActivity(), AnnouncementActivity.class);
+				// intent.putExtra("module_name", "Market News");
+				//
+				//
+
+				break;
+			}
+			case 1:
+			{
+				delShortcut();
+
+				// intent.setClass(getActivity(), AnnouncementActivity.class);
+				// intent.putExtra("module_name", "Announcements");
+				break;
+			}
+			case 2:
+
+				intent.setClass(getActivity(), AboutActivity.class);
+				// intent.putExtra("module_name", "Announcements");
+				break;
 		}
-		startActivity(intent);
+		// startActivity(intent);
 
 	}
 }

+ 146 - 19
Apex/src/com/usai/util/Network.java

@@ -44,9 +44,12 @@ import org.json.JSONException;
 import org.json.JSONObject;
 
 import com.usai.apex.ApexTrackingApplication;
+import com.usai.apex.CustomizeFieldsActivity.fieldedit;
+
 import android.content.Context;
 import android.content.SharedPreferences.Editor;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteStatement;
 import android.net.ConnectivityManager;
@@ -75,8 +78,8 @@ public class Network
 	public static int			AP_USER_NOT_EXIST				= 3;
 	public static int			AP_SESSION_EXPIRED				= 4;
 
-	public static int			AP_UPLOAD_SUCCESS				= 4;
-	public static int			AP_UPLOAD_FAIL					= 5;
+	public static int			AP_MESSAGE_NEW					= 5;
+	public static int			AP_MESSAGE_NONE					= 6;
 	//
 	public static final int		RESULT_FALSE					= 0;
 	public static final int		RESULT_TRUE						= -1;
@@ -640,31 +643,151 @@ public class Network
 		// return RESULT_ERROR;
 	}
 
-	public static String check_push()
+	public static String get_push(String e_id,String s_id,int limit,int offset)
 	{
-		String TAG = "net_dbg@check_push";
+		String TAG = "net_dbg@get_push";
 		Bundle parms = new Bundle();
 		parms.putString("action", "handset_search");
+		parms.putString("e_id", e_id);
+		parms.putString("s_id", s_id);
+		parms.putString("limit", limit+"");
+		parms.putString("offset", offset+"");
+		parms.putString("action_type", "detail");
 		parms.putString("module_name", "Pull Message");
 		parms.putString("uuid", commonUtil.getDUID());
 		String sessionid = ApexTrackingApplication.get_sessionid();
-		if (TextUtils.isEmpty(sessionid))
-		{	
-	
-			Log.d(TAG, "no sessionid return!");
+//		if (TextUtils.isEmpty(sessionid))
+//		{
+//
+//			Log.d(TAG, "no sessionid return!");
+//			return null;
+//
+//		}
+		String user = ApexTrackingApplication.get_user();
+//		if (TextUtils.isEmpty(user))
+//		{
+//
+//			Log.d(TAG, "no user name return!");
+//			return null;
+//
+//		}
+		parms.putString("sessionid", sessionid);
+		parms.putString("user", user);
+//		SQLiteDatabase db = dbUtil.OpenDB(ApexTrackingApplication.get_instance(), null, false);
+//		Cursor cursor = db.query("push_message", new String[] {"MAX(e_id)"}, "user = '"+ApexTrackingApplication.get_user()+"'", null, null, null,
+//				null, null);
+//		if (cursor.moveToNext())
+//		{
+//			String maxid = cursor.getString(0);
+//			if(!TextUtils.isEmpty(maxid))
+//				parms.putString("id", maxid);
+//		}
+//		dbUtil.CloseCursor(cursor);
+//		dbUtil.CloseDB(db);
+		
+		String jstr = getJson(Network.URL_PUSH, parms);
+		if (jstr == null || jstr.length() <= 0)
+		{
+			Log.d(TAG, "json is wrong");
 			return null;
-			
 		}
+		JSONObject jsobj;
+		//
+		// array = new JSONArray(json);
+		try
+		{
+			jsobj = new JSONObject(jstr);
+			if (jsobj.length() > 0)
+			{
+				int iresult = jsobj.getInt("result");
+				if (iresult == Network.AP_SESSION_EXPIRED)
+				{
+					String pass;
+
+					pass = ApexTrackingApplication.get_pass();
+					Network.get_Auth(user, pass);
+					jstr = getJson(Network.URL_REQUEST_RECORDS, parms);
+					jsobj = new JSONObject(jstr);
+					iresult = jsobj.getInt("result");
+				}
+				if (iresult != Network.AP_MESSAGE_NEW)
+				{
+					// session expired
+					Log.d(TAG,
+							"DOSE NOT GET NEW MESSAGE CODE="
+									+ jsobj.getInt("result"));
+					return null;
+					// if (get_Auth(name, password) == RESULT_TRUE)
+					// {
+					// return get_records(name, password, parms);
+					//
+					// }
+					// else
+					// {
+					//
+					// Log.d(TAG,
+					// "USER NOT AUTHORIZED CODE="
+					// + jsobj.getInt("result"));
+					// return null;
+					// }
+				}
+				else
+				{
+					return jstr;
+				}
+			}
+			else
+			{
+				Log.d(TAG, "json is wrong");
+				return null;
+			}
+		}
+		catch (JSONException e)
+		{
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return null;
+
+		// return RESULT_ERROR;
+	}	
+	public static String check_push()
+	{
+		String TAG = "net_dbg@check_push";
+		Bundle parms = new Bundle();
+		parms.putString("action", "handset_search");
+		parms.putString("module_name", "Pull Message");
+		parms.putString("uuid", commonUtil.getDUID());
+		String sessionid = ApexTrackingApplication.get_sessionid();
+//		if (TextUtils.isEmpty(sessionid))
+//		{
+//
+//			Log.d(TAG, "no sessionid return!");
+//			return null;
+//
+//		}
 		String user = ApexTrackingApplication.get_user();
 		if (TextUtils.isEmpty(user))
-		{	
-			
+		{
+
 			Log.d(TAG, "no user name return!");
 			return null;
-			
+
 		}
 		parms.putString("sessionid", sessionid);
 		parms.putString("user", user);
+		SQLiteDatabase db = dbUtil.OpenDB(ApexTrackingApplication.get_instance(), null, false);
+		Cursor cursor = db.query("push_message", new String[] {"MAX(e_id)"}, "user = '"+ApexTrackingApplication.get_user()+"'", null, null, null,
+				null, null);
+		if (cursor.moveToNext())
+		{
+			String maxid = cursor.getString(0);
+			if(!TextUtils.isEmpty(maxid))
+				parms.putString("id", maxid);
+		}
+		dbUtil.CloseCursor(cursor);
+		dbUtil.CloseDB(db);
+		
 		String jstr = getJson(Network.URL_PUSH, parms);
 		if (jstr == null || jstr.length() <= 0)
 		{
@@ -682,7 +805,7 @@ public class Network
 				int iresult = jsobj.getInt("result");
 				if (iresult == Network.AP_SESSION_EXPIRED)
 				{
-					String  pass;
+					String pass;
 
 					pass = ApexTrackingApplication.get_pass();
 					Network.get_Auth(user, pass);
@@ -690,11 +813,11 @@ public class Network
 					jsobj = new JSONObject(jstr);
 					iresult = jsobj.getInt("result");
 				}
-				if (iresult != Network.AP_USER_AUTH)
+				if (iresult != Network.AP_MESSAGE_NEW)
 				{
 					// session expired
 					Log.d(TAG,
-							"USER NOT AUTHORIZED CODE="
+							"DOSE NOT GET NEW MESSAGE CODE="
 									+ jsobj.getInt("result"));
 					return null;
 					// if (get_Auth(name, password) == RESULT_TRUE)
@@ -858,6 +981,7 @@ public class Network
 				// ;
 				if (jsobj.getInt("result") != Network.AP_USER_AUTH)
 				{
+					ApexTrackingApplication.logout();
 					// user not authorized return
 					Log.d(TAG,
 							"USER NOT AUTHORIZED CODE="
@@ -875,10 +999,13 @@ public class Network
 				// id
 				// on
 				// server;
-				ApexTrackingApplication.put_sessionid(objheader
-						.getString("sessionid"));
-				ApexTrackingApplication.put_user(user);
-				ApexTrackingApplication.put_password(pass);
+//				ApexTrackingApplication.put_sessionid(objheader
+//						.getString("sessionid"));
+//				ApexTrackingApplication.put_user(user);
+//				ApexTrackingApplication.put_password(pass);
+//				ApexTrackingApplication.put_authorization(true);
+				ApexTrackingApplication.login(objheader
+						.getString("sessionid"),user,pass);
 				Log.d(TAG, "sessionid=" + objheader.getString("sessionid"));
 				// JSONObject objupdate = array.getJSONObject(3); // whether
 				// need

+ 14 - 4
Apex/src/com/usai/util/SqlOpenHelper.java

@@ -62,10 +62,20 @@ public class SqlOpenHelper extends SQLiteOpenHelper{
 	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 		Log.d("DB upgrade", "from "+oldVersion + " to "+newVersion);
 		db.execSQL("CREATE TABLE push_message ("
-		+ "_id INTEGER PRIMARY KEY," + "messageid VARCHAR(20),"
-		+ "message VARCHAR(20)," + "h_time timestamp,"
-		+ "user VARCHAR(20),"+"read BOOLEAN)");
-		// TODO Auto-generated method stub
+				+ "_id INTEGER PRIMARY KEY," + "s_id VARCHAR(20),"
+				+ "e_id VARCHAR(20)," + "msgcount INTEGER,"
+				+ "message VARCHAR(20)," + "h_time timestamp,"+ "create_time timestamp,"
+				+ "user VARCHAR(20)," + "read BOOLEAN)");
+		db.execSQL("CREATE TABLE favorites ("
+				+ "_id INTEGER PRIMARY KEY," + "name VARCHAR(20),"
+				+ "action VARCHAR(20)," + "module_name VARCHAR(20),"
+				+ "detail_id VARCHAR(20)," + "action_type VARCHAR(20),"
+				+ "create_time timestamp," + "user VARCHAR(20))");
+		db.execSQL("CREATE TABLE history ("
+				+ "_id INTEGER PRIMARY KEY," + "name VARCHAR(20),"
+				+ "action VARCHAR(20)," + "module_name VARCHAR(20),"
+				+ "criterion VARCHAR(20)," + "create_time timestamp,"
+				+ "user VARCHAR(20))");
 		
 	}
 

+ 35 - 20
Apex/src/com/usai/util/dbUtil.java

@@ -13,8 +13,7 @@ import android.util.Log;
 public class dbUtil
 {
 
-	private static final String[] FIELD_ID = { "_id" };
-
+	private static final String[]	FIELD_ID	= { "_id" };
 
 	public static boolean isContentExist(Context context, Uri uri, String where)
 	{
@@ -58,7 +57,7 @@ public class dbUtil
 	{
 
 		SqlOpenHelper dbHelper = new SqlOpenHelper(context, "apex.db", factory,
-				6);
+				2);
 		dbHelper.addInitSQL("create table users (" + "_id INTEGER PRIMARY KEY,"
 				+ "name varchar(20)," + "pass varchar(20))");
 
@@ -89,14 +88,27 @@ public class dbUtil
 				+ "_id INTEGER PRIMARY KEY," + "h_val VARCHAR(20),"
 				+ "h_field VARCHAR(20)," + "h_time timestamp,"
 				+ "user VARCHAR(20))");
-		
-		
-		//new table must create in onupgrade function too;
-		
+
+		// new table must create in onupgrade function too;
+
 		dbHelper.addInitSQL("CREATE TABLE push_message ("
-				+ "_id INTEGER PRIMARY KEY," + "messageid VARCHAR(20),"
+				+ "_id INTEGER PRIMARY KEY," + "s_id VARCHAR(20),"
+				+ "e_id VARCHAR(20)," + "msgcount INTEGER,"
 				+ "message VARCHAR(20)," + "h_time timestamp,"
-				+ "user VARCHAR(20),"+"read BOOLEAN)");
+				+ "create_time timestamp," + "user VARCHAR(20),"
+				+ "read BOOLEAN)");
+
+		dbHelper.addInitSQL("CREATE TABLE favorites ("
+				+ "_id INTEGER PRIMARY KEY," + "name VARCHAR(20),"
+				+ "params VARCHAR(20)," + "action VARCHAR(20),"
+				+ "module_name VARCHAR(20)," + "detail_id VARCHAR(20),"
+				+ "action_type VARCHAR(20)," + "create_time timestamp,"
+				+ "user VARCHAR(20))");
+		dbHelper.addInitSQL("CREATE TABLE history ("
+				+ "_id INTEGER PRIMARY KEY," + "name VARCHAR(20),"
+				+ "params VARCHAR(20)," + "action VARCHAR(20),"
+				+ "module_name VARCHAR(20)," + "criterion VARCHAR(20),"
+				+ "create_time timestamp," + "user VARCHAR(20))");
 		// dbHelper.addInitSQL("create table pics (" +
 		// "_id INTEGER PRIMARY KEY,"
 		// + "picker varchar(20)," + "err_code INTEGER ,"
@@ -125,7 +137,7 @@ public class dbUtil
 		if (to == null)
 			to = source.getColumnNames();
 
-		if (from.length != to.length)// 瀛楁鏁颁笉鍖归厤
+		if (from.length != to.length)
 			return ret;
 
 		while (source.moveToNext())
@@ -249,13 +261,14 @@ public class dbUtil
 		CloseDB(db);
 		return ret;
 	}
-	public static int get_count(SQLiteDatabase db,String table,String where)
+
+	public static int get_count(SQLiteDatabase db, String table, String where)
 	{
-		int ret=0;
-		Cursor cursor = db.query(table,
-				new String[] { "count(*)" }, where,
+		int ret = 0;
+		Cursor cursor = db.query(table, new String[] { "count(*)" }, where,
 				null, null, null, null, null);
-		if (cursor.moveToNext()) {
+		if (cursor.moveToNext())
+		{
 			ret = cursor.getInt(0);
 		}
 
@@ -263,19 +276,21 @@ public class dbUtil
 		return ret;
 	}
 
-	public static int get_recordid(SQLiteDatabase db, String table, String where )
+	public static int get_recordid(SQLiteDatabase db, String table, String where)
 	{
-		return get_recordid(db,table,where,null);
+		return get_recordid(db, table, where, null);
 	}
-	public static int get_recordid(SQLiteDatabase db, String table, String where ,String Orderby)
+
+	public static int get_recordid(SQLiteDatabase db, String table,
+			String where, String Orderby)
 	{
 		int ret = -1;
 		Cursor cursor = null;
 		try
 		{
 
-			cursor = db.query(table, FIELD_ID, where, null, null, null, Orderby,
-					null);
+			cursor = db.query(table, FIELD_ID, where, null, null, null,
+					Orderby, null);
 			if (cursor.moveToNext())
 				ret = cursor.getInt(0);
 			else