Sfoglia il codice sorgente

功能提交!!

Arison 9 anni fa
parent
commit
f886ca6bcf
80 ha cambiato i file con 2320 aggiunte e 746 eliminazioni
  1. 5 2
      WeiChat/build.gradle
  2. 51 59
      WeiChat/src/main/AndroidManifest.xml
  3. 209 204
      WeiChat/src/main/java/com/xzjmyk/pm/activity/AppConfig.java
  4. 34 7
      WeiChat/src/main/java/com/xzjmyk/pm/activity/adapter/FriendSortAdapter.java
  5. 213 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/adapter/UUFriendSortAdapter.java
  6. 34 34
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/MainActivity.java
  7. 3 3
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/SplashActivity.java
  8. 1 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/account/DataDownloadActivity.java
  9. 22 19
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/BaseInfoActivity.java
  10. 2 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/CompanyContactsActivity.java
  11. 5 5
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/MyFriendActivity.java
  12. 36 34
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/WebViewCommActivity.java
  13. 7 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/message/ProcessMsgActivity.java
  14. 7 5
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/AddMeetTaskActivity.java
  15. 25 10
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/AlarmaActivity.java
  16. 3 3
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/LocationMapActivity.java
  17. 1 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/MeetDetailsActivity.java
  18. 24 2
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/MeetingActivity.java
  19. 92 50
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/WorkDailyAddActivity.java
  20. 38 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/adapter/SubscriptionAdapter.java
  21. 14 14
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/fragment/ContactFragment.java
  22. 0 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/net/ViewUtil.java
  23. 17 5
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/CreateRoomUtil.java
  24. 11 3
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/RoomImageUtil.java
  25. 44 13
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/alarm/AlarmReceiver.java
  26. 53 9
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/alarm/AlarmService.java
  27. 22 2
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/alarm/NotificationManage.java
  28. 96 60
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/alarm/ReckonAlarmTimeUtil.java
  29. 3 5
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/groupchat/GroupChatFragment.java
  30. 14 13
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/me/MeFragment.java
  31. 0 2
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/message/MessageFragment.java
  32. 40 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/message/Subscription2Activity.java
  33. 8 2
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/message/SubscriptionActivity.java
  34. 10 3
      WeiChat/src/main/java/com/xzjmyk/pm/activity/util/BaiduMapUtil.java
  35. 0 26
      WeiChat/src/main/java/com/xzjmyk/pm/activity/util/CalculateUtil.java
  36. 0 109
      WeiChat/src/main/java/com/xzjmyk/pm/activity/util/JsonUtils.java
  37. 6 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/util/PreferenceUtils.java
  38. 22 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/view/MostHeightLinearLayout.java
  39. 9 7
      WeiChat/src/main/java/com/xzjmyk/pm/activity/xmpp/CoreService.java
  40. BIN
      WeiChat/src/main/jniLibs/armeabi-v7a/libbdpush_V2_7.so
  41. BIN
      WeiChat/src/main/jniLibs/armeabi/libbdpush_V2_7.so
  42. BIN
      WeiChat/src/main/jniLibs/mips/libbdpush_V2_7.so
  43. BIN
      WeiChat/src/main/jniLibs/mips64/libbdpush_V2_7.so
  44. BIN
      WeiChat/src/main/jniLibs/pushservice-5.3.0.99.jar
  45. BIN
      WeiChat/src/main/jniLibs/x86/libbdpush_V2_7.so
  46. BIN
      WeiChat/src/main/jniLibs/x86_64/libbdpush_V2_7.so
  47. 9 8
      WeiChat/src/main/res/layout/act_staff_query_list.xml
  48. 1 1
      WeiChat/src/main/res/layout/activity_add_work_daily.xml
  49. 13 0
      WeiChat/src/main/res/layout/activity_subscription2.xml
  50. 17 13
      WeiChat/src/main/res/layout/bigimage_subscription.xml
  51. 12 4
      WeiChat/src/main/res/layout/fragment_contact.xml
  52. 43 0
      WeiChat/src/main/res/layout/fragment_contact_friend.xml
  53. 12 2
      WeiChat/src/main/res/layout/fragment_me.xml
  54. 22 0
      WeiChat/src/main/res/layout/layout_head.xml
  55. 1 0
      WeiChat/src/main/res/values/strings.xml
  56. 1 0
      library-refreshlayout/.gitignore
  57. 23 0
      library-refreshlayout/build.gradle
  58. 3 0
      library-refreshlayout/gradle.properties
  59. 17 0
      library-refreshlayout/proguard-rules.pro
  60. 1 0
      library-refreshlayout/src/main/AndroidManifest.xml
  61. 425 0
      library-refreshlayout/src/main/java/com/yalantis/phoenix/PullToRefreshView.java
  62. 81 0
      library-refreshlayout/src/main/java/com/yalantis/phoenix/refresh_view/BaseRefreshView.java
  63. 333 0
      library-refreshlayout/src/main/java/com/yalantis/phoenix/refresh_view/SunRefreshView.java
  64. 101 0
      library-refreshlayout/src/main/java/com/yalantis/phoenix/util/Logger.java
  65. 12 0
      library-refreshlayout/src/main/java/com/yalantis/phoenix/util/Utils.java
  66. BIN
      library-refreshlayout/src/main/res/drawable-hdpi/buildings.png
  67. BIN
      library-refreshlayout/src/main/res/drawable-hdpi/sky.png
  68. BIN
      library-refreshlayout/src/main/res/drawable-hdpi/sun.png
  69. BIN
      library-refreshlayout/src/main/res/drawable-mdpi/buildings.png
  70. BIN
      library-refreshlayout/src/main/res/drawable-mdpi/sky.png
  71. BIN
      library-refreshlayout/src/main/res/drawable-mdpi/sun.png
  72. BIN
      library-refreshlayout/src/main/res/drawable-xhdpi/buildings.png
  73. BIN
      library-refreshlayout/src/main/res/drawable-xhdpi/sky.png
  74. BIN
      library-refreshlayout/src/main/res/drawable-xhdpi/sun.png
  75. BIN
      library-refreshlayout/src/main/res/drawable-xxhdpi/buildings.png
  76. BIN
      library-refreshlayout/src/main/res/drawable-xxhdpi/sky.png
  77. BIN
      library-refreshlayout/src/main/res/drawable-xxhdpi/sun.png
  78. 8 0
      library-refreshlayout/src/main/res/values/attrs.xml
  79. 3 3
      pullToRefershLibraryMy/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshBase.java
  80. 1 1
      settings.gradle

+ 5 - 2
WeiChat/build.gradle

@@ -13,7 +13,7 @@ android {
     }
     signingConfigs {
         config {
-            storeFile file('C:/Users/Arison/Desktop/applicationsignname[20150409]')
+            storeFile file('D:/config/applicationsignname[20150409]')
             storePassword '13237658359'
             keyAlias 'jie-20150409'
             keyPassword '13237658359'
@@ -125,5 +125,8 @@ dependencies {
     releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
     debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
     androidTestCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
-    compile files('libs/pushservice-4.5.5.77.jar')
+//    compile files('libs/pushservice-4.5.5.77.jar')
+    compile 'se.emilsjolander:stickylistheaders:2.7.0'
+    compile project(':library-refreshlayout')
+    compile files('src/main/jniLibs/pushservice-5.3.0.99.jar')
 }

+ 51 - 59
WeiChat/src/main/AndroidManifest.xml

@@ -3,7 +3,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     package="com.xzjmyk.pm.activity"
     android:versionCode="71"
-    android:versionName="5.5.7" >
+    android:versionName="5.5.7">
 
     <uses-sdk
         android:minSdkVersion="11"
@@ -61,7 +61,6 @@
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.VIBRATE" />
 
-    <!-- Push service 运行需要的权限 -->
     <!-- Push service 运行需要的权限 -->
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
@@ -70,21 +69,21 @@
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.VIBRATE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
-    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
-    <!-- 富媒体需要声明的权限 -->
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <!-- 富媒体需要声明的权限 -->
+    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
+    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
     <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
 
-    <!-- 适配Android N系统必需的ContentProvider写权限声明,写权限包含应用包名 -->
-    <!-- <uses-permission android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.baidu.push.example" /> -->
-    <!-- <permission -->
-    <!-- android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.baidu.push.example" -->
-    <!-- android:protectionLevel="normal"> -->
-    <!-- </permission> -->
 
+    <!-- 适配Android N系统必需的ContentProvider写权限声明,写权限包含应用包名-->
+    <!--<uses-permission android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.baidu.push.example" />-->
+    <!--<permission-->
+        <!--android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.baidu.push.example"-->
+        <!--android:protectionLevel="normal">-->
+    <!--</permission>-->
 
     <!-- 百度自动更新 -->
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -116,14 +115,14 @@
         android:icon="@drawable/uuu"
         android:label="@string/app_name"
         android:largeHeap="true"
-        android:theme="@style/AppTheme" >
+        android:theme="@style/AppTheme">
         <meta-data
             android:name="UMENG_CHANNEL"
             android:value="baidu" />
         <!-- 启动页面 -->
         <activity
             android:name=".ui.SplashActivity"
-            android:theme="@style/SplashTheme" >
+            android:theme="@style/SplashTheme">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
@@ -132,10 +131,10 @@
                 <action android:name="cat.ereza.customactivityoncrash.RESTART" />
             </intent-filter>
         </activity>
-        <!-- 异常跳转页面 -->
+        <!--异常跳转页面-->
         <activity
             android:name=".CustomCrashActivity"
-            android:process=":error_activity" >
+            android:process=":error_activity">
             <intent-filter>
                 <action android:name="cat.ereza.customactivityoncrash.ERROR" />
             </intent-filter>
@@ -317,17 +316,18 @@
             android:enabled="true"
             android:process=":remote" />
 
+        <!-- 正式apikey -->
         <meta-data
             android:name="com.baidu.lbsapi.API_KEY"
             android:value="KxANrz9HRWVqGGCm2cN8mXarpW0bBuYA" />
+
         <!-- 文件选择的activity -->
         <activity
             android:name="com.ipaulpro.afilechooser.FileChooserActivity"
-            android:enabled="@bool/use_activity"
             android:exported="true"
             android:icon="@drawable/ic_chooser"
             android:label="@string/choose_file"
-            android:theme="@style/ChooserTheme" >
+            android:theme="@style/ChooserTheme">
             <intent-filter>
                 <action android:name="android.intent.action.GET_CONTENT" />
 
@@ -344,13 +344,13 @@
             android:enabled="@bool/use_provider"
             android:exported="true"
             android:grantUriPermissions="true"
-            android:permission="android.permission.MANAGE_DOCUMENTS" >
+            android:permission="android.permission.MANAGE_DOCUMENTS">
             <intent-filter>
                 <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
             </intent-filter>
         </provider>
 
-        <receiver android:name=".broadcast.ScrenLockedBroadCastReceiver" >
+        <receiver android:name=".broadcast.ScrenLockedBroadCastReceiver">
             <intent-filter>
                 <action android:name="android.intent.action.SCREEN_OFF" />
                 <action android:name="android.intent.action.SCREEN_ON" />
@@ -358,7 +358,7 @@
         </receiver>
         <!-- oA模块提醒功能本地推送 -->
         <receiver android:name=".ui.erp.util.alarm.AlarmReceiver" />
-
+        
         <activity
             android:name=".ui.message.InstantMessageActivity"
             android:launchMode="singleTask"
@@ -378,8 +378,7 @@
         <!-- baidu  push service start -->
         <!-- 用于接收系统消息以保证PushService正常运行 -->
         <!-- push富媒体,使用富媒体推送必须声明 -->
-        <!--
-        <activity
+     <!--   <activity
             android:name="com.baidu.android.pushservice.richmedia.MediaViewActivity"
             android:configChanges="orientation|keyboardHidden"
             android:label="MediaViewActivity" >
@@ -389,14 +388,12 @@
             android:configChanges="orientation|keyboardHidden"
             android:label="MediaListActivity"
             android:launchMode="singleTask" >
-        </activity>
-        -->
+        </activity>-->
         <!-- push富媒体结束 -->
 
-
         <!-- push应用定义消息receiver声明 -->
         <receiver android:name=".ui.PushNetMessageReceiver" >
-            <intent-filter android:priority="1000" >
+            <intent-filter android:priority="1000">
 
                 <!-- 接收push消息 -->
                 <action android:name="com.baidu.android.pushservice.action.MESSAGE" />
@@ -410,7 +407,7 @@
         <receiver
             android:name="com.baidu.android.pushservice.PushServiceReceiver"
             android:process=":bdservice_v1" >
-            <intent-filter android:priority="1000" >
+            <intent-filter android:priority="1000">
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                 <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
@@ -425,22 +422,25 @@
         <receiver
             android:name="com.baidu.android.pushservice.RegistrationReceiver"
             android:process=":bdservice_v1" >
-            <intent-filter android:priority="1000" >
+            <intent-filter android:priority="1000">
                 <action android:name="com.baidu.android.pushservice.action.METHOD" />
                 <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
             </intent-filter>
             <intent-filter>
-                <action android:name="android.intent.action.PACKAGE_REMOVED" />
-
-                <data android:scheme="package" />
+                <action android:name="com.xzjmyk.pm.activity.ui.erp.util.alarm.AlarmReceiver" />
+                <action android:name="OUTOFF_WORK_ACTION" />
+                <action android:name="AUTO_SIGNIN_ACTION" />
+                <action android:name="WORK_ALARM_ACTION" />
+                <action android:name="OFFWORK_ALARM_ACTION" />
             </intent-filter>
         </receiver>
 
+
         <service
             android:name="com.baidu.android.pushservice.PushService"
             android:exported="true"
             android:process=":bdservice_v1" >
-            <intent-filter android:priority="1000" >
+            <intent-filter android:priority="1000">
                 <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
             </intent-filter>
         </service>
@@ -448,16 +448,13 @@
             android:name="com.baidu.android.pushservice.CommandService"
             android:exported="true" />
 
-        <!-- 适配Android N系统必需的ContentProvider声明,写权限包含应用包名 -->
-        <!--
-            <provider
+        <!-- 适配Android N系统必需的ContentProvider声明,写权限包含应用包名-->
+       <!-- <provider
             android:name="com.baidu.android.pushservice.PushInfoProvider"
             android:authorities="com.baidu.push.example.bdpush"
             android:writePermission="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.baidu.push.example"
             android:protectionLevel = "signature"
-            android:exported="true" />
-        -->
-
+            android:exported="true" />-->
 
         <!-- 在百度开发者中心查询应用的API Key -->
         <meta-data
@@ -473,26 +470,26 @@
             </intent-filter>
         </activity>
         -->
-        <activity android:name=".ui.message.SelectCardActivity" >
+        <activity android:name=".ui.message.SelectCardActivity">
             <intent-filter>
                 <action android:name="com.xzjmyk.pm.activity.ui.message.SelectCardActivity" />
             </intent-filter>
         </activity>
 
         <!-- 百度 -->
-        <meta-data
+       <meta-data
             android:name="BDAPPID"
             android:value="7178311" />
         <meta-data
             android:name="BDAPPKEY"
             android:value="EmEVqG9NiKchcSbkoGkiyG2F2rp8YNmf" />
-        <!-- <meta-data -->
-        <!-- android:name="BDAPPID" -->
-        <!-- android:value="8037149" /> -->
-        <!-- <meta-data -->
-        <!-- android:name="BDAPPKEY" -->
-        <!-- android:value="GMZFDGbbchdQQXjpabX38rTlychRGnEF" /> -->
-
+        <!--<meta-data-->
+            <!--android:name="BDAPPID"-->
+            <!--android:value="8037149" />-->
+        <!--<meta-data-->
+            <!--android:name="BDAPPKEY"-->
+            <!--android:value="GMZFDGbbchdQQXjpabX38rTlychRGnEF" />-->
+ 
         <service
             android:name="com.baidu.location.f"
             android:enabled="true"
@@ -507,7 +504,7 @@
 
         <receiver
             android:name="com.baidu.autoupdatesdk.receiver.BDBroadcastReceiver"
-            android:exported="false" >
+            android:exported="false">
             <intent-filter>
                 <action android:name="com.baidu.autoupdatesdk.ACTION_NEW_UPDATE" />
                 <action android:name="com.baidu.autoupdatesdk.ACTION_DOWNLOAD_COMPLETE" />
@@ -695,7 +692,7 @@
         <!-- umeng api key -->
         <meta-data
             android:name="UMENG_APPKEY"
-            android:value="57ea27bb67e58e088c003bbf" />
+            android:value="57ea27bb67e58e088c003bbf"></meta-data>
         <!-- weixin -->
         <activity
             android:name=".wxapi.WXEntryActivity"
@@ -707,7 +704,7 @@
         <activity
             android:name="com.tencent.tauth.AuthActivity"
             android:launchMode="singleTask"
-            android:noHistory="true" >
+            android:noHistory="true">
             <intent-filter>
                 <action android:name="android.intent.action.VIEW" />
 
@@ -725,7 +722,7 @@
         <activity
             android:name=".WBShareActivity"
             android:configChanges="keyboardHidden|orientation"
-            android:screenOrientation="portrait" >
+            android:screenOrientation="portrait">
             <intent-filter>
                 <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
 
@@ -757,13 +754,8 @@
         <service
             android:name=".ui.erp.util.alarm.AlarmService"
             android:enabled="true"
-            android:exported="true" />
-
-        <activity
-            android:name=".ui.erp.activity.form.DataFormDetailActivity"
-            />
-        <activity android:name=".ui.erp.activity.form.DataFormControllActivity" >
-        </activity>
+            android:exported="true"></service>
+        <activity android:name=".ui.erp.activity.form.DataFormDetailActivity"></activity>
     </application>
 
-</manifest>
+</manifest>

+ 209 - 204
WeiChat/src/main/java/com/xzjmyk/pm/activity/AppConfig.java

@@ -5,235 +5,240 @@ import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.text.TextUtils;
 import android.util.Log;
+
 import com.xzjmyk.pm.activity.bean.ConfigBean;
 
 public class AppConfig {
-	public static final String TAG = "roamer";
-	public static final boolean DEBUG = true;
-
-	public final static String AUTO_SIGNIN_ACTION = "AUTO_SIGNIN_ACTION";//自动打卡action
-	public final static String WORK_ALARM_ACTION = "WORK_ALARM_ACTION";//上班提醒action
-	public final static String OFFWORK_ALARM_ACTION = "OFFWORK_ALARM_ACTION";//下班提醒action
-	public final static String ALARMA_CLICK = "ALARMA_CLICK";//判断是否选中提醒
-	public final static String AUTO_SIGNIN = "AUTO_SIGNIN";//判断是否选中
-
-	/* 应用程序包名 */
-	public static final String sPackageName = "com.xzjmyk.pm.activity";
-
-	/* 请求配置的接口 */
-	public static final String CONFIG_URL = "http://113.105.74.140:8092/config";
-	//public static final String CONFIG_ URL = "http://192.168.253.155:8092/config";
-	/* 分页的Size */
-	public static final int PAGE_SIZE = 500;
-
-	/* 基本地址 */
-	public String apiUrl;// Api 的服务器地址
-	public String uploadUrl;// 上传 的服务器地址
-	public String downloadAvatarUrl;// 头像下载地址
-	public String XMPPHost;// Xmpp 服务器地址
-	public String XMPPDomain;// Xmpp群聊地址
-	public int XMPP_PORT = 5222;
-	public String help_url;// 帮助页面的地址
+    public static final String TAG = "roamer";
+    public static final boolean DEBUG = true;
+
+    public final static String AUTO_SIGNIN_ACTION = "AUTO_SIGNIN_ACTION";//自动打卡action
+    public final static String WORK_ALARM_ACTION = "WORK_ALARM_ACTION";//上班提醒action
+    public final static String OFFWORK_ALARM_ACTION = "OFFWORK_ALARM_ACTION";//下班提醒action
+    public final static String OUTOFF_WORK_ACTION = "OUTOFF_WORK_ACTION";//离开办公地点提醒
+    public final static String NOT_TIME_IN_SIGNIN = "NOT_TIME_IN_SIGNIN";//该班次无法判定
+    public final static String ALARMA_CLICK = "ALARMA_CLICK";//判断是否选中提醒
+    public final static String AUTO_SIGNIN = "AUTO_SIGNIN";//判断是否选中
+
+    /* 应用程序包名 */
+    public static final String sPackageName = "com.xzjmyk.pm.activity";
+
+    /* 请求配置的接口 */
+    public static final String CONFIG_URL = "http://113.105.74.140:8092/config";
+    //public static final String CONFIG_ URL = "http://192.168.253.155:8092/config";
+    /* 分页的Size */
+    public static final int PAGE_SIZE = 500;
+
+    /* 基本地址 */
+    public String apiUrl;// Api 的服务器地址
+    public String uploadUrl;// 上传 的服务器地址
+    public String downloadAvatarUrl;// 头像下载地址
+    public String XMPPHost;// Xmpp 服务器地址
+    public String XMPPDomain;// Xmpp群聊地址
+    public int XMPP_PORT = 5222;
+    public String help_url;// 帮助页面的地址
     public String MeetingHost;//音视频地址
-	
-	/* Api地址--》衍生地址 */
-	/* 注册登录 */
-	public String USER_REGISTER;// 注册
-	public String VERIFY_TELEPHONE;// 验证手机号有没有被注册
-	public String USER_LOGIN;// 登陆
-	public String SEND_AUTH_CODE;// 获取手机验证码
-	public String USER_LOGIN_AUTO;// 检测Token是否过期 0未更换 1更换过
-	public String USER_PASSWORD_RESET;// 用户重置密码
-
-	/* 用户 */
-	public String USER_UPDATE;// 用户资料修改
-	public String USER_GET_URL;// 获取用户资料,更新本地数据的接口
-	public String USER_PHOTO_LIST;// 获取相册列表
-	public String USER_QUERY;// 查询用户列表
-	public String USER_NEAR;//查询搜索列表
-	/* 附近 */
-	public String NEARBY_USER;// 获取附近的用户
-
-	/* 商务圈 */
-	public String USER_CIRCLE_MESSAGE;// 获取某个人的商务圈消息
-	public String DOWNLOAD_CIRCLE_MESSAGE;// 下载商务圈消息
-
-	/* 好友 */
-	public String FRIENDS_ATTENTION_LIST;// 获取关注列表
-	public String FRIENDS_REMARK;// 备注好友
-	public String FRIENDS_BLACKLIST_ADD;// 拉黑
-	public String FRIENDS_ATTENTION_DELETE;// 取消关注
-	public String FRIENDS_DELETE;// 删除好友
-	public String FRIENDS_ATTENTION_ADD;// 加关注
-	public String FRIENDS_BLACKLIST_DELETE;// 取消拉黑
-
-	/* 群聊 */
-	public String ROOM_ADD;// 创建群组
-	public String ROOM_DELETE;// 删除群组----   删除
-	public String ROOM_UPDATE;// 设置群组
-	public String ROOM_GET;// 获取群组
-	public String ROOM_LIST;// 获取群组列表
-	public String ROOM_MEMBER_UPDATE;// 设置群员
-	public String ROOM_MEMBER_DELETE;// 删除成员-----   退出群聊
-	public String ROOM_MEMBER_GET;// 获取成员
-	public String ROOM_MEMBER_LIST;// 获取成员列表
-	public String ROOM_LIST_HIS;// 获取某个用户已经加入的房间列表
-	public String ROOM_JOIN;// 加入房间
-	/* 商务圈 */
-	public String MSG_ADD_URL;// 发布一条公共消息的接口
-	public String MSG_LIST;// 获取公共消息的接口
-	public String MSG_USER_LIST;// 获取某个用户的最新公共消息
-	public String MSG_GETS;// 根据IDS批量获取公共消息的接口(我的商务圈使用)
-	public String MSG_GET;// 根据ID获取公共消息
-	public String CIRCLE_MSG_DELETE;// 删除一条商务圈消息
-	public String MSG_PRAISE_ADD;// 赞
-	public String MSG_PRAISE_DELETE;// 取消赞
-	public String CIRCLE_MSG_LATEST;// 获取人才榜最新消息
-	public String CIRCLE_MSG_HOT;// 最热人才榜
-	public String MSG_COMMENT_ADD;// 增加一条评论
-	public String MSG_COMMENT_DELETE;// 删除一条评论
-	public String MSG_COMMENT_LIST;// 获取评论列表
-	/* 上传 的服务器地址--》衍生地址 */
-	public String UPLOAD_URL;// 上传图片接口
-	public String AVATAR_UPLOAD_URL;// 上传头像接口
-	
-	public String UPLOAD_CHANDLD_URL;
-
-	/* 头像下载地址--》衍生地址 */
-	public String AVATAR_ORIGINAL_PREFIX;// 头像原图前缀地址
-	public String AVATAR_THUMB_PREFIX;// 头像缩略图前缀地址
-
-	/** 会改变的配置 **/
-	public static AppConfig initConfig(Context context, ConfigBean configBean) {
-		if (configBean == null) {// 即时从服务器上获取匹配信息失败,也要new一个空的configBean传进来
-			configBean = new ConfigBean();
-		}
-		SharedPreferences configSharePre = context.getSharedPreferences("app_config", Context.MODE_PRIVATE);
-		Editor editor = configSharePre.edit();
+
+    /* Api地址--》衍生地址 */
+    /* 注册登录 */
+    public String USER_REGISTER;// 注册
+    public String VERIFY_TELEPHONE;// 验证手机号有没有被注册
+    public String USER_LOGIN;// 登陆
+    public String SEND_AUTH_CODE;// 获取手机验证码
+    public String USER_LOGIN_AUTO;// 检测Token是否过期 0未更换 1更换过
+    public String USER_PASSWORD_RESET;// 用户重置密码
+
+    /* 用户 */
+    public String USER_UPDATE;// 用户资料修改
+    public String USER_GET_URL;// 获取用户资料,更新本地数据的接口
+    public String USER_PHOTO_LIST;// 获取相册列表
+    public String USER_QUERY;// 查询用户列表
+    public String USER_NEAR;//查询搜索列表
+    /* 附近 */
+    public String NEARBY_USER;// 获取附近的用户
+
+    /* 商务圈 */
+    public String USER_CIRCLE_MESSAGE;// 获取某个人的商务圈消息
+    public String DOWNLOAD_CIRCLE_MESSAGE;// 下载商务圈消息
+
+    /* 好友 */
+    public String FRIENDS_ATTENTION_LIST;// 获取关注列表
+    public String FRIENDS_REMARK;// 备注好友
+    public String FRIENDS_BLACKLIST_ADD;// 拉黑
+    public String FRIENDS_ATTENTION_DELETE;// 取消关注
+    public String FRIENDS_DELETE;// 删除好友
+    public String FRIENDS_ATTENTION_ADD;// 加关注
+    public String FRIENDS_BLACKLIST_DELETE;// 取消拉黑
+
+    /* 群聊 */
+    public String ROOM_ADD;// 创建群组
+    public String ROOM_DELETE;// 删除群组----   删除
+    public String ROOM_UPDATE;// 设置群组
+    public String ROOM_GET;// 获取群组
+    public String ROOM_LIST;// 获取群组列表
+    public String ROOM_MEMBER_UPDATE;// 设置群员
+    public String ROOM_MEMBER_DELETE;// 删除成员-----   退出群聊
+    public String ROOM_MEMBER_GET;// 获取成员
+    public String ROOM_MEMBER_LIST;// 获取成员列表
+    public String ROOM_LIST_HIS;// 获取某个用户已经加入的房间列表
+    public String ROOM_JOIN;// 加入房间
+    /* 商务圈 */
+    public String MSG_ADD_URL;// 发布一条公共消息的接口
+    public String MSG_LIST;// 获取公共消息的接口
+    public String MSG_USER_LIST;// 获取某个用户的最新公共消息
+    public String MSG_GETS;// 根据IDS批量获取公共消息的接口(我的商务圈使用)
+    public String MSG_GET;// 根据ID获取公共消息
+    public String CIRCLE_MSG_DELETE;// 删除一条商务圈消息
+    public String MSG_PRAISE_ADD;// 赞
+    public String MSG_PRAISE_DELETE;// 取消赞
+    public String CIRCLE_MSG_LATEST;// 获取人才榜最新消息
+    public String CIRCLE_MSG_HOT;// 最热人才榜
+    public String MSG_COMMENT_ADD;// 增加一条评论
+    public String MSG_COMMENT_DELETE;// 删除一条评论
+    public String MSG_COMMENT_LIST;// 获取评论列表
+    /* 上传 的服务器地址--》衍生地址 */
+    public String UPLOAD_URL;// 上传图片接口
+    public String AVATAR_UPLOAD_URL;// 上传头像接口
+
+    public String UPLOAD_CHANDLD_URL;
+
+    /* 头像下载地址--》衍生地址 */
+    public String AVATAR_ORIGINAL_PREFIX;// 头像原图前缀地址
+    public String AVATAR_THUMB_PREFIX;// 头像缩略图前缀地址
+
+    /**
+     * 会改变的配置
+     **/
+    public static AppConfig initConfig(Context context, ConfigBean configBean) {
+        if (configBean == null) {// 即时从服务器上获取匹配信息失败,也要new一个空的configBean传进来
+            configBean = new ConfigBean();
+        }
+        SharedPreferences configSharePre = context.getSharedPreferences("app_config", Context.MODE_PRIVATE);
+        Editor editor = configSharePre.edit();
 		/* 1、Api 的服务器地址 */
-		String apiUrl = configBean.getApiUrl();
-		Log.d("wang", "apiUrl initConfig" + apiUrl);
-		if (TextUtils.isEmpty(apiUrl)) {
-			apiUrl = configSharePre.getString("apiUrl", "http://192.168.1.240/api/v1/");
-		} else {
-			editor.putString("apiUrl", apiUrl);
-		}
+        String apiUrl = configBean.getApiUrl();
+        Log.d("wang", "apiUrl initConfig" + apiUrl);
+        if (TextUtils.isEmpty(apiUrl)) {
+            apiUrl = configSharePre.getString("apiUrl", "http://192.168.1.240/api/v1/");
+        } else {
+            editor.putString("apiUrl", apiUrl);
+        }
 
 		/* 2、上传 的服务器地址 */
-		String uploadUrl = configBean.getUploadUrl();
-		if (TextUtils.isEmpty(uploadUrl)) {
-			uploadUrl = configSharePre.getString("uploadUrl", "http://192.168.1.240/");
-		} else {
-			editor.putString("uploadUrl", uploadUrl);
-		}
+        String uploadUrl = configBean.getUploadUrl();
+        if (TextUtils.isEmpty(uploadUrl)) {
+            uploadUrl = configSharePre.getString("uploadUrl", "http://192.168.1.240/");
+        } else {
+            editor.putString("uploadUrl", uploadUrl);
+        }
 
 		/* 3、头像下载地址 */
-		String downloadAvatarUrl = configBean.getDownloadAvatarUrl();
-		if (TextUtils.isEmpty(downloadAvatarUrl)) {
-			downloadAvatarUrl = configSharePre.getString("downloadAvatarUrl", "http://192.168.1.240/");
-		} else {
-			editor.putString("downloadAvatarUrl", downloadAvatarUrl);
-		}
+        String downloadAvatarUrl = configBean.getDownloadAvatarUrl();
+        if (TextUtils.isEmpty(downloadAvatarUrl)) {
+            downloadAvatarUrl = configSharePre.getString("downloadAvatarUrl", "http://192.168.1.240/");
+        } else {
+            editor.putString("downloadAvatarUrl", downloadAvatarUrl);
+        }
 
 		/* 4、Xmpp 服务器IP地址 */
-		String XMPPHost = configBean.getXMPPHost();
-		if (TextUtils.isEmpty(XMPPHost)) {
-			XMPPHost = configSharePre.getString("XMPPHost", "121.37.30.15");
-		} else {
-			editor.putString("XMPPHost", XMPPHost);
-		}
+        String XMPPHost = configBean.getXMPPHost();
+        if (TextUtils.isEmpty(XMPPHost)) {
+            XMPPHost = configSharePre.getString("XMPPHost", "121.37.30.15");
+        } else {
+            editor.putString("XMPPHost", XMPPHost);
+        }
 		/* 5、Xmpp 服务器域名 */
-		String XMPPDomain = configBean.getXMPPDomain();
-		if (TextUtils.isEmpty(XMPPDomain)) {
-			XMPPDomain = configSharePre.getString("XMPPDomain", "www.youjob.co");
-		} else {
-			editor.putString("XMPPDomain", XMPPDomain);
-		}
-		editor.commit();
+        String XMPPDomain = configBean.getXMPPDomain();
+        if (TextUtils.isEmpty(XMPPDomain)) {
+            XMPPDomain = configSharePre.getString("XMPPDomain", "www.youjob.co");
+        } else {
+            editor.putString("XMPPDomain", XMPPDomain);
+        }
+        editor.commit();
 
 		/* 赋值给AppConfig对象 */
-		AppConfig config = new AppConfig();
-		config.apiUrl = apiUrl;
-		config.uploadUrl = uploadUrl;
-		config.downloadAvatarUrl = downloadAvatarUrl;
-		config.XMPPHost = XMPPDomain;// 直接使用域名,不使用IP,IP连接会出现问题,第一次连接Xmpp会发出连接异常关闭的错误,具体原因未知
-		config.XMPPDomain = XMPPDomain;
-		config.help_url = configBean.getHelpURL();// help_url没有缓存
-		config.MeetingHost=configBean.getMeetingHost();
-		initApiUrls(config);// apiUrl
-		initOthersUrls(config);
-		return config;
-	}
-
-	private static void initApiUrls(AppConfig config) {
-		String apiUrl = config.apiUrl;
+        AppConfig config = new AppConfig();
+        config.apiUrl = apiUrl;
+        config.uploadUrl = uploadUrl;
+        config.downloadAvatarUrl = downloadAvatarUrl;
+        config.XMPPHost = XMPPDomain;// 直接使用域名,不使用IP,IP连接会出现问题,第一次连接Xmpp会发出连接异常关闭的错误,具体原因未知
+        config.XMPPDomain = XMPPDomain;
+        config.help_url = configBean.getHelpURL();// help_url没有缓存
+        config.MeetingHost = configBean.getMeetingHost();
+        initApiUrls(config);// apiUrl
+        initOthersUrls(config);
+        return config;
+    }
+
+    private static void initApiUrls(AppConfig config) {
+        String apiUrl = config.apiUrl;
 		/* 登陆注册 */
-		config.USER_REGISTER = apiUrl + "user/register";// 注册
-		config.VERIFY_TELEPHONE = apiUrl + "verify/telephone";// 验证手机号有没有被注册
-		config.USER_LOGIN = apiUrl + "user/login";// 登陆
-		config.SEND_AUTH_CODE = apiUrl + "basic/randcode/sendSms";// 获取手机验证码
-		config.USER_LOGIN_AUTO = apiUrl + "user/login/auto";// 检测Token是否过期
-		config.USER_PASSWORD_RESET = apiUrl + "user/password/reset";// 用户重置密码
+        config.USER_REGISTER = apiUrl + "user/register";// 注册
+        config.VERIFY_TELEPHONE = apiUrl + "verify/telephone";// 验证手机号有没有被注册
+        config.USER_LOGIN = apiUrl + "user/login";// 登陆
+        config.SEND_AUTH_CODE = apiUrl + "basic/randcode/sendSms";// 获取手机验证码
+        config.USER_LOGIN_AUTO = apiUrl + "user/login/auto";// 检测Token是否过期
+        config.USER_PASSWORD_RESET = apiUrl + "user/password/reset";// 用户重置密码
 		/* 用户 */
-		config.USER_UPDATE = apiUrl + "user/update";// 用户资料修改
-		config.USER_GET_URL = apiUrl + "user/get";// 获取用户资料,更新本地数据的接口
-		config.USER_PHOTO_LIST = apiUrl + "user/photo/list";// 获取相册列表
-		config.USER_QUERY = apiUrl + "user/query";// 查询用户列表
+        config.USER_UPDATE = apiUrl + "user/update";// 用户资料修改
+        config.USER_GET_URL = apiUrl + "user/get";// 获取用户资料,更新本地数据的接口
+        config.USER_PHOTO_LIST = apiUrl + "user/photo/list";// 获取相册列表
+        config.USER_QUERY = apiUrl + "user/query";// 查询用户列表
 
-		config.USER_NEAR = apiUrl + "nearby/user";//查询搜索列表
+        config.USER_NEAR = apiUrl + "nearby/user";//查询搜索列表
 
 		/* 附近 */
-		config.NEARBY_USER = apiUrl + "nearby/user";// 获取附近的用户
+        config.NEARBY_USER = apiUrl + "nearby/user";// 获取附近的用户
 
 		/* 商务圈 */
-		config.USER_CIRCLE_MESSAGE = apiUrl + "b/circle/msg/user/ids";// 获取某个人的商务圈消息
-		config.DOWNLOAD_CIRCLE_MESSAGE = apiUrl + "b/circle/msg/ids";// 下载商务圈消息
+        config.USER_CIRCLE_MESSAGE = apiUrl + "b/circle/msg/user/ids";// 获取某个人的商务圈消息
+        config.DOWNLOAD_CIRCLE_MESSAGE = apiUrl + "b/circle/msg/ids";// 下载商务圈消息
 
 		/* 好友 */
-		config.FRIENDS_ATTENTION_LIST = apiUrl + "friends/attention/list";// 获取关注列表
-		config.FRIENDS_REMARK = apiUrl + "friends/remark";// 备注好友
-		config.FRIENDS_BLACKLIST_ADD = apiUrl + "friends/blacklist/add";// 拉黑
-		config.FRIENDS_ATTENTION_DELETE = apiUrl + "friends/attention/delete";// 取消关注
-		config.FRIENDS_DELETE = apiUrl + "friends/delete";// 删除好友
-		config.FRIENDS_ATTENTION_ADD = apiUrl + "friends/attention/add";// 加关注
-		config.FRIENDS_BLACKLIST_DELETE = apiUrl + "friends/blacklist/delete";// 取消拉黑
+        config.FRIENDS_ATTENTION_LIST = apiUrl + "friends/attention/list";// 获取关注列表
+        config.FRIENDS_REMARK = apiUrl + "friends/remark";// 备注好友
+        config.FRIENDS_BLACKLIST_ADD = apiUrl + "friends/blacklist/add";// 拉黑
+        config.FRIENDS_ATTENTION_DELETE = apiUrl + "friends/attention/delete";// 取消关注
+        config.FRIENDS_DELETE = apiUrl + "friends/delete";// 删除好友
+        config.FRIENDS_ATTENTION_ADD = apiUrl + "friends/attention/add";// 加关注
+        config.FRIENDS_BLACKLIST_DELETE = apiUrl + "friends/blacklist/delete";// 取消拉黑
 
 		/* 群聊 */
-		config.ROOM_ADD = apiUrl + "room/add";// 创建群组
-		config.ROOM_DELETE = apiUrl + "room/delete";// 删除群组
-		config.ROOM_UPDATE = apiUrl + "room/update";// 设置群组
-		config.ROOM_GET = apiUrl + "room/get";// 获取群组
-		config.ROOM_LIST = apiUrl + "room/list";// 获取群组列表
-		config.ROOM_MEMBER_UPDATE = apiUrl + "room/member/update";// 设置群员
-		config.ROOM_MEMBER_DELETE = apiUrl + "room/member/delete";// 删除成员
-		config.ROOM_MEMBER_GET = apiUrl + "room/member/get";// 获取成员
-		config.ROOM_MEMBER_LIST = apiUrl + "room/member/list";// 获取成员列表
-		config.ROOM_LIST_HIS = apiUrl + "/room/list/his";// 获取某个用户已加入的房间列表
-		config.ROOM_JOIN = apiUrl + "/room/join";// 加入房间
+        config.ROOM_ADD = apiUrl + "room/add";// 创建群组
+        config.ROOM_DELETE = apiUrl + "room/delete";// 删除群组
+        config.ROOM_UPDATE = apiUrl + "room/update";// 设置群组
+        config.ROOM_GET = apiUrl + "room/get";// 获取群组
+        config.ROOM_LIST = apiUrl + "room/list";// 获取群组列表
+        config.ROOM_MEMBER_UPDATE = apiUrl + "room/member/update";// 设置群员
+        config.ROOM_MEMBER_DELETE = apiUrl + "room/member/delete";// 删除成员
+        config.ROOM_MEMBER_GET = apiUrl + "room/member/get";// 获取成员
+        config.ROOM_MEMBER_LIST = apiUrl + "room/member/list";// 获取成员列表
+        config.ROOM_LIST_HIS = apiUrl + "/room/list/his";// 获取某个用户已加入的房间列表
+        config.ROOM_JOIN = apiUrl + "/room/join";// 加入房间
 
 		/* 商务圈 */
-		config.MSG_ADD_URL = apiUrl + "b/circle/msg/add";// 发布一条公共消息的接口
-		config.MSG_LIST = apiUrl + "b/circle/msg/list";// 获取公共消息的接口
-		config.MSG_USER_LIST = apiUrl + "b/circle/msg/user";// 获取某个用户的最新公共消息
-		config.MSG_GETS = apiUrl + "b/circle/msg/gets";// 根据IDS批量获取公共消息的接口(我的商务圈使用)
-		config.MSG_GET = apiUrl + "b/circle/msg/get";// 根据ID获取公共消息
-		config.CIRCLE_MSG_DELETE = apiUrl + "b/circle/msg/delete";// 删除一条商务圈消息
-		config.MSG_PRAISE_ADD = apiUrl + "b/circle/msg/praise/add";// 赞
-		config.MSG_PRAISE_DELETE = apiUrl + "b/circle/msg/praise/delete";// 取消赞
-		config.CIRCLE_MSG_LATEST = apiUrl + "b/circle/msg/latest";// 最新人才榜
-		config.CIRCLE_MSG_HOT = apiUrl + "b/circle/msg/hot";// 最热人才榜
-		config.MSG_COMMENT_ADD = apiUrl + "b/circle/msg/comment/add";// 增加一条评论
-		config.MSG_COMMENT_DELETE = apiUrl + "b/circle/msg/comment/delete";// 删除一条评论
-		config.MSG_COMMENT_LIST = apiUrl + "b/circle/msg/comment/list";// 删除一条评论
-
-	}
-
-	private static void initOthersUrls(AppConfig config) {
-		// uploadUrl
-		config.UPLOAD_URL = config.uploadUrl + "upload/UploadServlet";// 上传图片接口
-		config.AVATAR_UPLOAD_URL = config.uploadUrl + "upload/UploadAvatarServlet";// 上传头像接口
-		// downloadAvatarUrl
-		config.AVATAR_ORIGINAL_PREFIX = config.downloadAvatarUrl + "avatar/o";// 头像原图前缀地址
-		config.AVATAR_THUMB_PREFIX = config.downloadAvatarUrl + "avatar/t";// 头像缩略图前缀地址
-	}
+        config.MSG_ADD_URL = apiUrl + "b/circle/msg/add";// 发布一条公共消息的接口
+        config.MSG_LIST = apiUrl + "b/circle/msg/list";// 获取公共消息的接口
+        config.MSG_USER_LIST = apiUrl + "b/circle/msg/user";// 获取某个用户的最新公共消息
+        config.MSG_GETS = apiUrl + "b/circle/msg/gets";// 根据IDS批量获取公共消息的接口(我的商务圈使用)
+        config.MSG_GET = apiUrl + "b/circle/msg/get";// 根据ID获取公共消息
+        config.CIRCLE_MSG_DELETE = apiUrl + "b/circle/msg/delete";// 删除一条商务圈消息
+        config.MSG_PRAISE_ADD = apiUrl + "b/circle/msg/praise/add";// 赞
+        config.MSG_PRAISE_DELETE = apiUrl + "b/circle/msg/praise/delete";// 取消赞
+        config.CIRCLE_MSG_LATEST = apiUrl + "b/circle/msg/latest";// 最新人才榜
+        config.CIRCLE_MSG_HOT = apiUrl + "b/circle/msg/hot";// 最热人才榜
+        config.MSG_COMMENT_ADD = apiUrl + "b/circle/msg/comment/add";// 增加一条评论
+        config.MSG_COMMENT_DELETE = apiUrl + "b/circle/msg/comment/delete";// 删除一条评论
+        config.MSG_COMMENT_LIST = apiUrl + "b/circle/msg/comment/list";// 删除一条评论
+
+    }
+
+    private static void initOthersUrls(AppConfig config) {
+        // uploadUrl
+        config.UPLOAD_URL = config.uploadUrl + "upload/UploadServlet";// 上传图片接口
+        config.AVATAR_UPLOAD_URL = config.uploadUrl + "upload/UploadAvatarServlet";// 上传头像接口
+        // downloadAvatarUrl
+        config.AVATAR_ORIGINAL_PREFIX = config.downloadAvatarUrl + "avatar/o";// 头像原图前缀地址
+        config.AVATAR_THUMB_PREFIX = config.downloadAvatarUrl + "avatar/t";// 头像缩略图前缀地址
+    }
 }

+ 34 - 7
WeiChat/src/main/java/com/xzjmyk/pm/activity/adapter/FriendSortAdapter.java

@@ -27,7 +27,9 @@ import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class FriendSortAdapter extends BaseAdapter implements SectionIndexer {
+import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
+
+public class FriendSortAdapter extends BaseAdapter implements SectionIndexer,StickyListHeadersAdapter {
 
     private Context mContext;
     private List<BaseSortModel<Friend>> mSortFriends;
@@ -90,12 +92,12 @@ public class FriendSortAdapter extends BaseAdapter implements SectionIndexer {
             holder = (ViewHolder) convertView.getTag();
         }
         // 如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现
-        if (position == getPositionForSection(section)) {
-            holder.tag_tv.setVisibility(View.VISIBLE);
-            holder.tag_tv.setText(mSortFriends.get(position).getFirstLetter());
-        } else {
-            holder.tag_tv.setVisibility(View.GONE);
-        }
+//        if (position == getPositionForSection(section)) {
+//            holder.tag_tv.setVisibility(View.VISIBLE);
+//            holder.tag_tv.setText(mSortFriends.get(position).getFirstLetter());
+//        } else {
+//            holder.tag_tv.setVisibility(View.GONE);
+//        }
         Friend friend = mSortFriends.get(position).getBean();
         final String phone = friend.getPhone();
         if (!StringUtils.isEmpty(phone)) {
@@ -202,6 +204,31 @@ public class FriendSortAdapter extends BaseAdapter implements SectionIndexer {
         return null;
     }
 
+    @Override
+    public View getHeaderView(int position, View convertView, ViewGroup parent) {
+        HeaderViewHolder viewHolder = null;
+        if (convertView == null){
+            convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_head,parent,false);
+            viewHolder = new HeaderViewHolder();
+            viewHolder.cityLetterTextView = (TextView) convertView.findViewById(R.id.head);
+            convertView.setTag(viewHolder);
+        }else {
+            viewHolder = (HeaderViewHolder) convertView.getTag();
+        }
+        viewHolder.cityLetterTextView.setText(mSortFriends.get(position).getFirstLetter());
+
+        return convertView;
+    }
+
+    @Override
+    public long getHeaderId(int position) {
+        return mSortFriends.get(position).getFirstLetter().charAt(0);
+    }
+
+    class HeaderViewHolder{
+        TextView cityLetterTextView;
+    }
+
     class ViewHolder {
         TextView tag_tv;
         ImageView header_img;

+ 213 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/adapter/UUFriendSortAdapter.java

@@ -0,0 +1,213 @@
+package com.xzjmyk.pm.activity.adapter;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.SectionIndexer;
+import android.widget.TextView;
+
+import com.xzjmyk.pm.activity.R;
+import com.xzjmyk.pm.activity.bean.Friend;
+import com.xzjmyk.pm.activity.helper.AvatarHelper;
+import com.xzjmyk.pm.activity.sortlist.BaseSortModel;
+import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
+import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
+import com.xzjmyk.pm.activity.ui.erp.view.SelectPicPopupWindow;
+import com.xzjmyk.pm.activity.view.crouton.Crouton;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class UUFriendSortAdapter extends BaseAdapter implements SectionIndexer {
+
+    private Context mContext;
+    private List<BaseSortModel<Friend>> mSortFriends;
+    private boolean isRefeshed;
+    private Map<Integer, String> isLog;
+
+
+    public UUFriendSortAdapter(Context context, List<BaseSortModel<Friend>> sortFriends) {
+        mContext = context;
+        mSortFriends = (sortFriends == null ? new ArrayList<BaseSortModel<Friend>>() : sortFriends);
+        isLog = new HashMap<>();
+    }
+
+    public void setData(List<BaseSortModel<Friend>> sortFriends) {
+        this.mSortFriends = (sortFriends == null ? new ArrayList<BaseSortModel<Friend>>() : sortFriends);
+        notifyDataSetChanged();
+    }
+
+    public List<BaseSortModel<Friend>> getmSortFriends() {
+        return mSortFriends;
+    }
+
+    public void setisRefeshed(boolean isRefeshed) {
+        this.isRefeshed = isRefeshed;
+        isLog.clear();
+    }
+
+    @Override
+    public int getCount() {
+        return mSortFriends.size();
+    }
+
+    @Override
+    public Object getItem(int position) {
+        return position;
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        ViewHolder holder = null;
+        // 根据position获取分类的首字母的Char ascii值
+        int section = getSectionForPosition(position);
+        if (convertView == null) {
+            holder = new ViewHolder();
+            convertView = LayoutInflater.from(mContext).inflate(R.layout.contact_item, parent, false);
+            holder.header_img = (ImageView) convertView.findViewById(R.id.header_img);
+            holder.phone_img = (ImageView) convertView.findViewById(R.id.phone_img);
+            holder.tag_tv = (TextView) convertView.findViewById(R.id.tag_tv);
+            holder.name_tv = (TextView) convertView.findViewById(R.id.name_tv);
+            holder.sub_tv = (TextView) convertView.findViewById(R.id.sub_tv);
+            holder.time_tv = (TextView) convertView.findViewById(R.id.time_tv);
+            convertView.setTag(holder);
+        } else {
+            holder = (ViewHolder) convertView.getTag();
+        }
+        // 如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现
+        if (position == getPositionForSection(section)) {
+            holder.tag_tv.setVisibility(View.VISIBLE);
+            holder.tag_tv.setText(mSortFriends.get(position).getFirstLetter());
+        } else {
+            holder.tag_tv.setVisibility(View.GONE);
+        }
+        Friend friend = mSortFriends.get(position).getBean();
+        final String phone = friend.getPhone();
+        if (!StringUtils.isEmpty(phone)) {
+            String check = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
+            Pattern regex = Pattern.compile(check);
+            Matcher matcher = regex.matcher(phone.toString());
+            if (matcher.matches()) {
+                holder.phone_img.setVisibility(View.VISIBLE);
+            } else {
+                holder.phone_img.setVisibility(View.GONE);
+            }
+        }
+        //TODO 没有控制好,先屏蔽
+        if (friend.getTimeSend() != 0) holder.time_tv.setText("");
+        else holder.time_tv.setText("");
+        /*头像*/
+        if (friend.getRoomFlag() == 0) {// 这是单个人
+            if (friend.getUserId().equals(Friend.ID_SYSTEM_MESSAGE)) {// 系统消息的头像
+                holder.header_img.setImageResource(R.drawable.im_notice);
+            } else if (friend.getUserId().equals(Friend.ID_NEW_FRIEND_MESSAGE)) {// 新朋友的头像
+                holder.header_img.setImageResource(R.drawable.im_new_friends);
+            } else if (Integer.valueOf(friend.getUserId()) == 0) {
+                holder.header_img.setImageResource(R.drawable.avatar_normal);
+            } else {// 其他
+                if (isRefeshed) {
+                    AvatarHelper.getInstance().display(friend.getUserId(), holder.header_img, true, true);//设定为每次刷新都会去删除缓存重新获取数据
+                    isRefeshed = false;
+                } else {
+                    AvatarHelper.getInstance().displayAvatar(friend.getUserId(), holder.header_img, true);//不会删除缓存
+                }
+            }
+        } else {// 这是1个房间
+            if (TextUtils.isEmpty(friend.getRoomCreateUserId())) {
+                holder.header_img.setImageResource(R.drawable.avatar_normal);
+            } else {
+                AvatarHelper.getInstance().displayAvatar(friend.getRoomCreateUserId(), holder.header_img, true);// 目前在备注名放房间的创建者Id
+            }
+        }
+        /*昵称*/
+        String name = friend.getShowName();
+        holder.name_tv.setText(name);
+        /*个性签名*/
+        holder.sub_tv.setText((StringUtils.isEmpty(friend.getDepart()) ? "" : (friend.getDepart() + ">"))
+                + " " + (StringUtils.isEmpty(friend.getPosition()) ? "" : friend.getPosition()));
+        final View finalConvertView = convertView;
+        holder.phone_img.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (!StringUtils.isEmpty(phone)) {
+                    String check = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
+                    Pattern regex = Pattern.compile(check);
+                    Matcher matcher = regex.matcher(phone.toString());
+                    if (matcher.matches()) {
+//                        selectByPhone(phone, finalConvertView);
+                        CommonUtil.phoneAction(mContext,phone);
+                    } else {
+                        Crouton.makeText(mContext, R.string.not_format_phone);
+                    }
+                } else {
+                    Crouton.makeText(mContext, R.string.not_phone);
+                }
+            }
+        });
+        return convertView;
+    }
+
+    private void selectByPhone(String phone, View v) {
+        SelectPicPopupWindow menuWindow = new SelectPicPopupWindow(mContext, phone, new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+
+            }
+        });
+
+        //显示窗口
+        menuWindow.showAtLocation(v, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置
+    }
+
+   
+
+    /**
+     * 根据ListView的当前位置获取分类的首字母的Char ascii值
+     */
+    public int getSectionForPosition(int position) {
+        return mSortFriends.get(position).getFirstLetter().charAt(0);
+    }
+
+    /**
+     * 根据分类的首字母的Char ascii值获取其第一次出现该首字母的位置
+     */
+    public int getPositionForSection(int section) {
+        for (int i = 0; i < getCount(); i++) {
+            String sortStr = mSortFriends.get(i).getFirstLetter();
+            char firstChar = sortStr.toUpperCase().charAt(0);
+            if (firstChar == section) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    @Override
+    public Object[] getSections() {
+        return null;
+    }
+
+    class ViewHolder {
+        TextView tag_tv;
+        ImageView header_img;
+        TextView name_tv;
+        TextView sub_tv;
+        TextView time_tv;
+        ImageView phone_img;
+    }
+}

+ 34 - 34
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/MainActivity.java

@@ -44,6 +44,7 @@ import com.xzjmyk.pm.activity.ui.circle.BusinessCircleFragment;
 import com.xzjmyk.pm.activity.ui.erp.fragment.ContactFragment;
 import com.xzjmyk.pm.activity.ui.erp.fragment.WorksFragment;
 import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
+import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
 import com.xzjmyk.pm.activity.ui.erp.util.alarm.AlarmService;
 import com.xzjmyk.pm.activity.ui.find.MyFriendFragment;
 import com.xzjmyk.pm.activity.ui.groupchat.GroupChatFragment;
@@ -78,11 +79,7 @@ import java.util.List;
  */
 public class MainActivity extends BaseActivity implements NetWorkObservable.NetWorkObserver, AuthStateListener {
     public static String HASHCODE = "MainActivity";
-    public static final String TIME_MAIN = "TIMEMAIN";
-    public static long timeMin = -1;
     public static boolean isUnReadWork;   //判断我的空间是否有新内容
-    public final static int SIP_SERVER_PORT = 5060;// 端口
-    public final static String EXTRAT_SIP_SESSION_ID = "SipSession";
     private static final String TAG_MESSAGE = "message";
     private static final String TAG_MY = "myfriend";
     private static final String TAG_NEARBY = "nearby";
@@ -222,7 +219,6 @@ public class MainActivity extends BaseActivity implements NetWorkObservable.NetW
                 }
                 changeFragment(mMeFragment, TAG_ME);//我
                 getSupportActionBar().setTitle(R.string.me);
-                unWorkReadTV.setVisibility(View.GONE);
             }
         }
     };
@@ -238,6 +234,7 @@ public class MainActivity extends BaseActivity implements NetWorkObservable.NetW
         }
         HashMap<String, String> params = new HashMap<String, String>();
         params.put("access_token", MyApplication.getInstance().mAccessToken);
+        params.put("pageSize", "1");
         StringJsonArrayRequest<CircleMessage> request = new StringJsonArrayRequest<CircleMessage>(
                 config.MSG_LIST, new Response.ErrorListener() {
             @Override
@@ -248,33 +245,22 @@ public class MainActivity extends BaseActivity implements NetWorkObservable.NetW
             public void onResponse(ArrayResult<CircleMessage> result) {
                 boolean success = Result.defaultParser(ct, result, false);
                 if (success) {
-                    List<CircleMessage> datas = result.getData();
-                    if (datas != null && datas.size() > 0) { // 没有更多数据
-                        CircleMessage data = datas.get(0);
-                        long newTime = data.getTime();  //获取最新时间
-                        long oldTime = PreferenceUtils.getLong(mContext, TIME_MAIN); //获取以前时间
-                        if (newTime > oldTime) {//当有新消息
-                            if (!data.getUserId().equals(MyApplication.getInstance().mLoginUser.getUserId())) {
-                                unWorkReadTV.setVisibility(View.VISIBLE);
-                                if (mMeFragment != null)
-                                    mMeFragment.setChangerRemain(false);
-                                timeMin = newTime;
-                                isUnReadWork = true;
-                            } else {
-                                PreferenceUtils.putLong(ct, TIME_MAIN, newTime); //获取以前时间
-                            }
+                    //获取到数据
+                    try {
+                        List<CircleMessage> datas = result.getData();
+                        if (ListUtils.isEmpty(datas)) return;
+                        long time = datas.get(0).getTime();
+                        String userId = datas.get(0).getUserId();
+                        Long oldTime = PreferenceUtils.getLong("TIMEMAIN", -1);
+                        if (!userId.equals(MyApplication.getInstance().mLoginUser.getUserId()) && oldTime < time) {
+                            setShowUnRead(true);
                         } else {
-                            unWorkReadTV.setVisibility(View.GONE);
-                            isUnReadWork = false;
+                            setShowUnRead(false);
                         }
-                    } else {
-                        unWorkReadTV.setVisibility(View.GONE);
-                        isUnReadWork = false;
+                    } catch (Exception e) {
                     }
-
                 } else {
-                    unWorkReadTV.setVisibility(View.GONE);
-                    isUnReadWork = false;
+                    setShowUnRead(false);
                 }
             }
         }, CircleMessage.class, params);
@@ -284,6 +270,19 @@ public class MainActivity extends BaseActivity implements NetWorkObservable.NetW
         mFastVolley.addDefaultRequest(HASHCODE, request);
     }
 
+
+    private void setShowUnRead(boolean isUnRead) {
+        isUnReadWork = isUnRead;
+        if (isUnRead) {
+            unWorkReadTV.setVisibility(View.VISIBLE);
+        } else {
+            unWorkReadTV.setVisibility(View.GONE);
+        }
+        if (mMeFragment == null) return;
+        mMeFragment.setChangerRemain(!isUnRead);
+
+    }
+
     /***********************
      * 未读数量的更新功能
      *****************/
@@ -399,17 +398,18 @@ public class MainActivity extends BaseActivity implements NetWorkObservable.NetW
         SIP_SERVER_HOST = host == null ? "120.24.211.24" : host;
         Log.i("wang", "token:" + MyApplication.getInstance().mAccessToken);
         Log.i("wang", "usId:" + MyApplication.getInstance().mLoginUser.getUserId());
-        Log.i("wang", "usId:" +  CommonUtil.getMetaValue(this, "api_key"));
+        Log.i("wang", "usId:" + CommonUtil.getMetaValue(this, "api_key"));
         //TODO 百度开始推送
         PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY,
-                CommonUtil.getMetaValue(this,"api_key"));
-        
-        
+                CommonUtil.getMetaValue(this, "api_key"));
+
+
         int isPush = PreferenceUtils.getInt(MyApplication.getInstance(), MainActivity.BAIDU_PUSH);
         if (isPush == 0) {
             PushManager.stopWork(this);
         }
-        
+        //TODO 发布版本关闭
+        startService(new Intent(this, AlarmService.class));
         mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
         if (savedInstanceState != null) {
             restoreState(savedInstanceState);
@@ -417,7 +417,7 @@ public class MainActivity extends BaseActivity implements NetWorkObservable.NetW
         initView(savedInstanceState);//---
         // 注册网络改变回调
         MyApplication.getInstance().registerNetWorkObserver(this);
-        //更新版本
+        //更新版本已升级到最新版本
         updateVersion();
         // 绑定监听
         ListenerManager.getInstance().addAuthStateChangeListener(this);

+ 3 - 3
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/SplashActivity.java

@@ -74,9 +74,9 @@ public class SplashActivity extends BaseActivity {
             }
         });
         mSelectLv.setVisibility(View.INVISIBLE);
-        AlarmManage manage = new AlarmManage();
-        manage.setSigninAlarm(this);
-        LogUtil.d("ononCreate()");
+        //TODO gongpengming 先关闭
+//        AlarmManage manage = new AlarmManage();
+//        manage.setSigninAlarm(this);
         initConfig();// 初始化配置
         
 

+ 1 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/account/DataDownloadActivity.java

@@ -295,7 +295,7 @@ public class DataDownloadActivity extends BaseActivity {
         }, new StringJsonArrayRequest.Listener<AttentionUser>() {
             @Override
             public void onResponse(ArrayResult<AttentionUser> result) {
-                boolean success = Result.defaultParser(mContext, result, true);
+                boolean success = Result.defaultParser(mContext, result, false);
                 Log.i("DataDownload", "我的关注:" + JSON.toJSONString(result));
                 Log.i("DataDownload", "success:" + success);
                 //服务器此处返回用户不存在,理论上是不能去掉success判断的

+ 22 - 19
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/BaseInfoActivity.java

@@ -66,6 +66,8 @@ import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.List;
 
+import static com.xzjmyk.pm.activity.R.id.me_nickname_tv;
+
 /**
  * 个人资料页面
  */
@@ -73,7 +75,7 @@ public class BaseInfoActivity extends BaseActivity implements View.OnClickListen
 
     @ViewInject(R.id.me_heard_tv)
     private ImageView iv_headImage;
-    @ViewInject(R.id.me_nickname_tv)
+    @ViewInject(me_nickname_tv)
     private TextView tv_nickname;
     @ViewInject(R.id.me_sex_tv)
     private TextView tv_sex;
@@ -152,6 +154,7 @@ public class BaseInfoActivity extends BaseActivity implements View.OnClickListen
 
     public void initData() {
         // clone一份临时数据,用来存数变化的值,返回的时候对比有无变化
+        tv_nickname.setText(MyApplication.getInstance().mLoginUser.getNickName());
         try {
             mTempData = (User) mUser.clone();
         } catch (CloneNotSupportedException e) {
@@ -173,10 +176,10 @@ public class BaseInfoActivity extends BaseActivity implements View.OnClickListen
         String whichsys = CommonUtil.getSharedPreferences(this, "erp_master");
         List<EmployeesEntity> entities = dbManager.select_getEmployee(new String[]{userId, whichsys}, "em_imid=? and whichsys=?");
         if (ListUtils.isEmpty(entities)) {
-            tv_nickname.setText(mTempData.getNickName());
+//            tv_nickname.setText(mTempData.getNickName());
             mNickname = mTempData.getNickName();
         } else {
-            tv_nickname.setText(entities.get(0).getEM_NAME());
+//            tv_nickname.setText(entities.get(0).getEM_NAME());
             tv_name.setText(entities.get(0).getEM_NAME());
             tv_tel.setText(mTempData.getTelephone());
             tv_depart.setText(entities.get(0).getEM_DEFAULTORNAME());
@@ -184,14 +187,14 @@ public class BaseInfoActivity extends BaseActivity implements View.OnClickListen
             mNickname = entities.get(0).getEM_NAME();
         }
         // mNameEdit.setText(mTempData.getNickName());
-      
-        if(!StringUtils.isEmpty(Area.getCityAreaString(0, mTempData.getAreaId()))){
+
+        if (!StringUtils.isEmpty(Area.getCityAreaString(0, mTempData.getAreaId()))) {
             tv_address.setText(Area.getProvinceCityString(mTempData.getProvinceId(), mTempData.getCityId())
                     + "-" + Area.getCityAreaString(0, mTempData.getAreaId()));
-        }else{
+        } else {
             tv_address.setText(Area.getProvinceCityString(mTempData.getProvinceId(), mTempData.getCityId()));
         }
-        if (Area.getProvinceCityString(mTempData.getProvinceId(), mTempData.getCityId()).contains("海外")){
+        if (Area.getProvinceCityString(mTempData.getProvinceId(), mTempData.getCityId()).contains("海外")) {
             tv_address.setText("海外");
         }
         AvatarHelper.getInstance().displayAvatar(mTempData.getUserId(), iv_headImage, true);
@@ -304,12 +307,12 @@ public class BaseInfoActivity extends BaseActivity implements View.OnClickListen
             public void onDateTimePicked(String year, String month, String day, String hour, String minute) {
                 Log.i(TAG, "onDateTimePicked:" + year + "-" + month + "-" + day + " " + hour + ":" + minute + ":00");
                 GregorianCalendar calendar = new GregorianCalendar(Integer.parseInt(year), Integer.parseInt(month) - 1, Integer.parseInt(day));
-              
+
                 long currentTime = System.currentTimeMillis() / 1000;
                 long birthdayTime = calendar.getTime().getTime() / 1000;
                 if (birthdayTime > currentTime) {
                     ToastUtil.showToast(mContext, "亲!您的出生日期已经超过现在了哦!");
-                }else{
+                } else {
                     mTempData.setBirthday(TimeUtils.getSpecialBeginTime(tv_birthday, calendar.getTime().getTime() / 1000));
                     updateData();
                 }
@@ -387,13 +390,13 @@ public class BaseInfoActivity extends BaseActivity implements View.OnClickListen
                 // String country_name = data.getStringExtra(Constant.EXTRA_COUNTRY_NAME);
                 String province_name = data.getStringExtra(SelectAreaActivity.EXTRA_PROVINCE_NAME);
                 String city_name = data.getStringExtra(SelectAreaActivity.EXTRA_CITY_NAME);
-                String county_name=data.getStringExtra(SelectAreaActivity.EXTRA_COUNTY_NAME);
-                if (StringUtils.isEmpty(county_name)){
+                String county_name = data.getStringExtra(SelectAreaActivity.EXTRA_COUNTY_NAME);
+                if (StringUtils.isEmpty(county_name)) {
                     tv_address.setText(province_name + "-" + city_name);
-                }else{
-                    tv_address.setText(province_name + "-" + city_name+"-"+county_name);
+                } else {
+                    tv_address.setText(province_name + "-" + city_name + "-" + county_name);
                 }
-                if ("海外".equals(province_name)){
+                if ("海外".equals(province_name)) {
                     tv_address.setText(province_name);
                 }
                 LogUtil.d("省:" + provinceId + "市:" + cityId + "县:" + countryId);
@@ -401,13 +404,13 @@ public class BaseInfoActivity extends BaseActivity implements View.OnClickListen
                 mTempData.setProvinceId(provinceId);
                 mTempData.setCityId(cityId);
                 mTempData.setAreaId(countyId);
-                
+
                 updateData();//更新数据
             }
         } else if (requestCode == UPDATE_NICKNAME && data != null) {
             mNickname = data.getStringExtra("newnickname");
             if (mNickname != null) {
-                tv_nickname.setText(mNickname);
+//                tv_nickname.setText(mNickname);
                 mTempData.setNickName(mNickname);
                 updateData();
             }
@@ -464,7 +467,7 @@ public class BaseInfoActivity extends BaseActivity implements View.OnClickListen
         StringJsonObjectRequest<Void> request = new StringJsonObjectRequest<Void>(mConfig.USER_UPDATE, new Response.ErrorListener() {
             @Override
             public void onErrorResponse(VolleyError arg0) {
-                Log.i("gongepngming","arg0="+arg0.getMessage());
+                Log.i("gongepngming", "arg0=" + arg0.getMessage());
                 ProgressDialogUtil.dismiss(mProgressDialog);
                 ToastUtil.showErrorNet(BaseInfoActivity.this);
             }
@@ -563,8 +566,8 @@ public class BaseInfoActivity extends BaseActivity implements View.OnClickListen
                     BaseInfoActivity.this.sendBroadcast(intent);
                     AvatarHelper.getInstance().deleteAvatar(loginUserId);
                     ToastUtil.showToast(BaseInfoActivity.this, R.string.upload_avatar_success);
-                    mCurrentFile=null;
-                    mProgressDialog=null;
+                    mCurrentFile = null;
+                    mProgressDialog = null;
                 } else {
                     ToastUtil.showToast(BaseInfoActivity.this, R.string.upload_avatar_failed);
                 }

+ 2 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/CompanyContactsActivity.java

@@ -118,7 +118,7 @@ public class CompanyContactsActivity extends BaseActivity {
     private final int LOAD_SUCCESS_EMPLOYEE = 4;
     private final int LOAD_SUCCESS_EMPLOYEEINFO = 3;
     private Handler mHandler = new Handler() {
-        public void handleMessage( Message msg) {
+        public void handleMessage(Message msg) {
             HrorgsEntity hEntity;
             switch (msg.what) {
                 case UPDATE_CHANGE_MASTER:
@@ -144,6 +144,7 @@ public class CompanyContactsActivity extends BaseActivity {
                     List<HrorgsEntity> hrorgsEntities = JSON.parseArray(jsonobject.getString("hrorgs"), HrorgsEntity.class);
                     List<EmployeesEntity> employeesEntities = JSON.parseArray(jsonobject.getString("employees"), EmployeesEntity.class);
                     master = CommonUtil.getSharedPreferences(ct, "erp_master");
+                    if (manager == null || !manager.getDb().isOpen()) return;
                     HrorgsEntity hrEntity = manager.select_getRootData(new String[]{master}, "whichsys=?");
                     boolean isFristLoad = true;//是否第一次加载
                     if (hrEntity != null) {

+ 5 - 5
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/MyFriendActivity.java

@@ -21,7 +21,7 @@ import com.handmark.pulltorefresh.library.PullToRefreshListView;
 import com.xzjmyk.pm.activity.AppConstant;
 import com.xzjmyk.pm.activity.MyApplication;
 import com.xzjmyk.pm.activity.R;
-import com.xzjmyk.pm.activity.adapter.FriendSortAdapter;
+import com.xzjmyk.pm.activity.adapter.UUFriendSortAdapter;
 import com.xzjmyk.pm.activity.bean.AttentionUser;
 import com.xzjmyk.pm.activity.bean.Friend;
 import com.xzjmyk.pm.activity.db.dao.FriendDao;
@@ -62,7 +62,7 @@ public class MyFriendActivity extends BaseActivity {
     private List<BaseSortModel<Friend>> mSortFriends;
     private List<BaseSortModel<Friend>> allFriends;
     private BaseComparator<Friend> mBaseComparator;
-    private FriendSortAdapter mAdapter;
+    private UUFriendSortAdapter mAdapter;
     private String mLoginUserId;
     private Handler mHandler = new Handler();
     private boolean mNeedUpdate = true;
@@ -73,7 +73,7 @@ public class MyFriendActivity extends BaseActivity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.fragment_contact);
+        setContentView(R.layout.fragment_contact_friend);
         isPeculiar = getIntent().getBooleanExtra("isPeculiar", false);
         if (isPeculiar)
             getSupportActionBar().setTitle("常用联系人");
@@ -141,7 +141,7 @@ public class MyFriendActivity extends BaseActivity {
                     mPullToRefreshListView.getRefreshableView().setSelection(position + count);
                 }
                 if ("↑".equals(s)) {
-                    mPullToRefreshListView.getRefreshableView().setSelection(1);
+                    mPullToRefreshListView.getRefreshableView().setSelection(0);
                 }
             }
 
@@ -151,7 +151,7 @@ public class MyFriendActivity extends BaseActivity {
             }
         });
         setHeaderView();
-        mAdapter = new FriendSortAdapter(MyFriendActivity.this, mSortFriends);
+        mAdapter = new UUFriendSortAdapter(MyFriendActivity.this, mSortFriends);
         mPullToRefreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_START);
         mPullToRefreshListView.getRefreshableView().setAdapter(mAdapter);
         mPullToRefreshListView.setAdapter(mAdapter);

+ 36 - 34
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/WebViewCommActivity.java

@@ -6,6 +6,7 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
@@ -67,7 +68,7 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
     private TextView mNextTv;
     private List<Object> mReadSubs;
 
-    private  Handler hander = new Handler() {
+    private Handler hander = new Handler() {
         @Override
         public void handleMessage(Message msg) {
             if (msg.what == reCode) {
@@ -76,11 +77,12 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
                 try {
                     JSONObject jsonObject = new JSONObject(result);
                     boolean success = JSON.parseObject(result).getBoolean("success");
+
                     if (success) {
                         if (!jsonObject.isNull("sessionId")) {
                             CommonUtil.setSharedPreferences(WebViewCommActivity.this, "sessionId", jsonObject.getString("sessionId"));
                         }
-                        doNextLoadURL();  //不敢加  当第一次加载出现错误登录erp然后进行第二次登录操作后再次加载操作
+                        doNextLoadURL();
                     }
                 } catch (JSONException e) {
                     e.printStackTrace();
@@ -95,9 +97,9 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
         } else {
             clearCookie();
         }
-        Map<String,String> headers=new HashMap<>();
-        headers.put("clientType","uas client");
-        webView.getRefreshableView().loadUrl(url,headers);
+        Map<String, String> headers = new HashMap<>();
+        headers.put("clientType", "uas client");
+        webView.getRefreshableView().loadUrl(url, headers);
     }
 
     @SuppressLint("SetJavaScriptEnabled")
@@ -120,24 +122,24 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
         String StartApp = intent.getStringExtra("isStartApp");//参数账套
 
         mSubsAct = intent.getStringExtra("subsact");
-        mPosition = intent.getIntExtra("position",-1);
+        mPosition = intent.getIntExtra("position", -1);
         mSubscriptionMessages = (ArrayList<SubscriptionMessage>) intent.getSerializableExtra("subsdata");
 
-        if (mSubsAct != null && mSubsAct.equals("subsDetail")){
-            url = mSubsurl  + "?numId=" + mSubscriptionMessages.get(mPosition).getNUM_ID_()
+        if (mSubsAct != null && mSubsAct.equals("subsDetail")) {
+            url = mSubsurl + "?numId=" + mSubscriptionMessages.get(mPosition).getNUM_ID_()
                     + "&mainId=" + mSubscriptionMessages.get(mPosition).getINSTANCE_ID_()
                     + "&insId=" + mSubscriptionMessages.get(mPosition).getID_()
                     + "&title=" + mSubscriptionMessages.get(mPosition).getTITLE_();
-            if (mSubscriptionMessages.size() == 1){
+            if (mSubscriptionMessages.size() == 1) {
                 mPreTv.setVisibility(View.GONE);
                 mNextTv.setVisibility(View.GONE);
-            }else if (mPosition == 0){
+            } else if (mPosition == 0) {
                 mPreTv.setVisibility(View.GONE);
                 mNextTv.setVisibility(View.VISIBLE);
-            }else if (mPosition == mSubscriptionMessages.size() - 1){
+            } else if (mPosition == mSubscriptionMessages.size() - 1) {
                 mPreTv.setVisibility(View.VISIBLE);
                 mNextTv.setVisibility(View.GONE);
-            }else {
+            } else {
                 mPreTv.setVisibility(View.VISIBLE);
                 mNextTv.setVisibility(View.VISIBLE);
             }
@@ -168,13 +170,13 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
                 login(this);
         }
         webView.getRefreshableView().getSettings().setJavaScriptEnabled(true);
-      //  webView.getRefreshableView().getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); //设置 缓存模式
+        //  webView.getRefreshableView().getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); //设置 缓存模式
         webView.getRefreshableView().getSettings().setDomStorageEnabled(true);
         webView.getRefreshableView().getSettings().setDatabaseEnabled(true);
         webView.getRefreshableView().getSettings().setAppCacheEnabled(true);
         // 修改ua使得web端正确判断
-        
-        String ua =  webView.getRefreshableView().getSettings().getUserAgentString();
+
+        String ua = webView.getRefreshableView().getSettings().getUserAgentString();
         webView.getRefreshableView().getSettings().setUserAgentString(ua + " uasClient");
 
         if (isCookie) {
@@ -182,10 +184,10 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
         } else {
             clearCookie();
         }
-        Map<String,String> headers=new HashMap<>();
-        headers.put("client-name","uasClient");
-      //  url="http://192.168.253.132:9090/platform-b2c/?client=true";
-        webView.getRefreshableView().loadUrl(url,headers);
+        Map<String, String> headers = new HashMap<>();
+        headers.put("client-name", "uasClient");
+        //  url="http://192.168.253.132:9090/platform-b2c/?client=true";
+        webView.getRefreshableView().loadUrl(url, headers);
         webView.getRefreshableView().setWebViewClient(new WebViewClient() {
             @Override
             public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
@@ -230,7 +232,7 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
 
     @Override
     public void onClick(View v) {
-        switch (v.getId()){
+        switch (v.getId()) {
             case R.id.web_previous_tv:
                 mPosition--;
                 break;
@@ -238,34 +240,34 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
                 mPosition++;
                 break;
         }
-        if (mSubscriptionMessages != null){
+        if (mSubscriptionMessages != null) {
             mReadSubs.add(mPosition);
             getSupportActionBar().setTitle(mSubscriptionMessages.get(mPosition).getTITLE_());
-            if (mPosition == 0){
+            if (mPosition == 0) {
                 mPreTv.setVisibility(View.GONE);
                 mNextTv.setVisibility(View.VISIBLE);
-            }else if (mPosition == mSubscriptionMessages.size() - 1){
+            } else if (mPosition == mSubscriptionMessages.size() - 1) {
                 mPreTv.setVisibility(View.VISIBLE);
                 mNextTv.setVisibility(View.GONE);
-            }else {
+            } else {
                 mPreTv.setVisibility(View.VISIBLE);
                 mNextTv.setVisibility(View.VISIBLE);
             }
-            url = mSubsurl  + "?numId=" + mSubscriptionMessages.get(mPosition).getNUM_ID_()
+            url = mSubsurl + "?numId=" + mSubscriptionMessages.get(mPosition).getNUM_ID_()
                     + "&mainId=" + mSubscriptionMessages.get(mPosition).getINSTANCE_ID_()
                     + "&insId=" + mSubscriptionMessages.get(mPosition).getID_()
                     + "&title=" + mSubscriptionMessages.get(mPosition).getTITLE_();
-            Map<String,String> headers=new HashMap<>();
-            headers.put("client-name","uasClient");
-            webView.getRefreshableView().loadUrl(url,headers);
+            Map<String, String> headers = new HashMap<>();
+            headers.put("client-name", "uasClient");
+            webView.getRefreshableView().loadUrl(url, headers);
         }
     }
 
     @Override
     protected void onPause() {
         super.onPause();
-        if (!mReadSubs.isEmpty()){
-            List<Integer> singleElement = (List)CommonUtil.getSingleElement(mReadSubs);
+        if (!mReadSubs.isEmpty()) {
+            List<Integer> singleElement = (List) CommonUtil.getSingleElement(mReadSubs);
             ArrayList<Integer> readIntegers = new ArrayList<>();
             readIntegers.addAll(singleElement);
             Intent intent = new Intent();
@@ -326,15 +328,15 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
     }
 
     private void login(Context context) {
-        ViewUtil.ct = this;
+        ViewUtil.ct = MyApplication.getInstance();
         ViewUtil.LoginERPTask(this, hander, reCode);
         PreferenceUtils.putLong(context, TIME, System.currentTimeMillis());
     }
 
     @Override
     public void onBackPressed() {
-        if (!mReadSubs.isEmpty()){
-            List<Integer> singleElement = (List)CommonUtil.getSingleElement(mReadSubs);
+        if (!mReadSubs.isEmpty()) {
+            List<Integer> singleElement = (List) CommonUtil.getSingleElement(mReadSubs);
             ArrayList<Integer> readIntegers = new ArrayList<>();
             readIntegers.addAll(singleElement);
             Intent intent = new Intent();
@@ -369,7 +371,7 @@ public class WebViewCommActivity extends BaseActivity implements View.OnClickLis
                         SHARE_MEDIA.WEIXIN_FAVORITE,
                         SHARE_MEDIA.MORE)
                         .withTitle(getSupportActionBar().getTitle().toString())
-                        .withText("UU互联 Android客户端"+ DeviceInfoUtil.getVersionName(mContext))
+                        .withText("UU互联 Android客户端" + DeviceInfoUtil.getVersionName(mContext))
                         .withMedia(new UMImage(activity, "http://img.my.csdn.net/uploads/201609/30/1475204542_1365.png"))
                         .withTargetUrl(url)
                         .setCallback(CommonUtil.umShareListener)

+ 7 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/message/ProcessMsgActivity.java

@@ -352,6 +352,13 @@ public class ProcessMsgActivity extends BaseActivity implements View.OnClickList
     }
 
 
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mList.setRefreshing(true);
+        
+    }
+
     public class ProcessAdapter extends BaseAdapter implements Filterable {
 
         private Context ct;

+ 7 - 5
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/AddMeetTaskActivity.java

@@ -104,6 +104,8 @@ public class AddMeetTaskActivity extends BaseActivity {
                 }, 1000);
             else
                 loadNetData();
+        } else if (requestCode == 0x21 && resultCode == 0x20) {
+            loadNetData();
         }
     }
 
@@ -126,11 +128,11 @@ public class AddMeetTaskActivity extends BaseActivity {
                 intent.putExtra("taskemcode", object.containsKey("recorder") ? object.getString("recorder") : null);//发起人
                 intent.putExtra("tasktime", object.containsKey("ra_startdate") ? object.getString("ra_startdate") : null);//发起时间
                 intent.putExtra("endtime", object.containsKey("ra_enddate") ? object.getString("ra_enddate") : null);
-                intent.putExtra("performer", object.containsKey("resourcename") ? object.getString("resourcename") : "未填写");//处理人编号
-                intent.putExtra("taskcode", object.containsKey("taskcode") ? object.getString("taskcode") : null);//处理人编号
+                intent.putExtra("performer", object.containsKey("resourcename") ? object.getString("resourcename") : "未填写");//处理人名字
+                intent.putExtra("taskcode", object.containsKey("ra_resourcecode") ? object.getString("ra_resourcecode") : null);//处理人编号
                 intent.putExtra("ra_taskid", object.containsKey("ra_taskid") ? object.getString("ra_taskid") : null);//取回复内容id
                 intent.putExtra("taskid", object.containsKey("ra_id") ? object.getString("ra_id") : null);//编号
-                startActivity(intent);
+                startActivityForResult(intent, 0x21);
             }
         });
         loadNetData();
@@ -219,8 +221,8 @@ public class AddMeetTaskActivity extends BaseActivity {
             holder.name_tv.setText(object.containsKey("recorder") ? object.getString("recorder") : "");
             holder.theme_tv.setText(object.containsKey("description") ? object.getString("description") : "");
             holder.status_tv.setText(object.containsKey("ra_status") ? object.getString("ra_status") : "进行中");
-            holder.headler_tv.setText("执行人:" + (object.containsKey("resourcename") ? object.getString("resourcename") : "无"));
-            String name = object.containsKey("resourcename") ? object.getString("resourcename") : "";
+            String name = object.containsKey("ra_resourcename") ? object.getString("ra_resourcename") : "";
+            holder.headler_tv.setText("执行人:" + (StringUtils.isEmpty(name) ? "无" : name));
             if (name != null && name.length() > 0) {
                 String str = name.substring(0, 1);
                 holder.head_img.setText(str == null ? "" : str);

+ 25 - 10
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/AlarmaActivity.java

@@ -10,12 +10,13 @@ import android.widget.TextView;
 
 import com.lidroid.xutils.ViewUtils;
 import com.lidroid.xutils.view.annotation.ViewInject;
+import com.xzjmyk.pm.activity.MyApplication;
 import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.bean.oa.SelectBean;
 import com.xzjmyk.pm.activity.ui.base.BaseActivity;
 import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
 import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
-import com.xzjmyk.pm.activity.ui.erp.util.alarm.AlarmManage;
+import com.xzjmyk.pm.activity.ui.erp.util.alarm.AlarmService;
 import com.xzjmyk.pm.activity.ui.erp.view.SwitchView;
 
 import java.util.ArrayList;
@@ -43,7 +44,8 @@ public class AlarmaActivity extends BaseActivity implements View.OnClickListener
     private RelativeLayout alar_rl;
     private boolean isAlarm;//判断是否为提醒
     private boolean isAuto;//判断是否为自动
-    private AlarmManage manage;
+    //TODO 关闭
+//    private AlarmManage manage;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -59,8 +61,9 @@ public class AlarmaActivity extends BaseActivity implements View.OnClickListener
         isalarma_sw.setChecked(isAlarm);
         auto_signin_sw.setChecked(isAuto);
         setTextColor(isAlarm);
-        manage = new AlarmManage();
-        manage.setSigninAlarm(ct);
+        //TODO
+//        manage = new AlarmManage();
+//        manage.setSigninAlarm(ct);
         tv_alar.setOnClickListener(this);
         tv_ualar.setOnClickListener(this);
         isalarma_sw.setOnCheckedChangeListener(this);
@@ -72,6 +75,16 @@ public class AlarmaActivity extends BaseActivity implements View.OnClickListener
 
     }
 
+    @Override
+    protected void onStop() {
+        //TODO
+        startService();
+        super.onStop();
+    }
+
+    private void startService() {
+        startService(new Intent(MyApplication.getInstance(), AlarmService.class));
+    }
 
     @Override
     public void onClick(View view) {
@@ -120,9 +133,10 @@ public class AlarmaActivity extends BaseActivity implements View.OnClickListener
                 CommonUtil.setSharedPreferences(ct, AUTO_SIGNIN, isChecked);
                 break;
         }
-        if (manage == null)
-            manage = new AlarmManage();
-        manage.setSigninAlarm(ct);
+//        TODO
+//        if (manage == null)
+//            manage = new AlarmManage();
+//        manage.setSigninAlarm(ct);
     }
 
     @Override
@@ -141,9 +155,10 @@ public class AlarmaActivity extends BaseActivity implements View.OnClickListener
                 CommonUtil.setSharedPreferences(ct, "ALARM_WORK_TIME", getNumByString(name));
             }
             if (requestCode == 0x21 || requestCode == 0x22) {
-                if (manage == null)
-                    manage = new AlarmManage();
-                manage.setSigninAlarm(ct);
+//      TODO
+//                if (manage == null)
+//                    manage = new AlarmManage();
+//                manage.setSigninAlarm(ct);
             }
         }
     }

+ 3 - 3
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/LocationMapActivity.java

@@ -58,7 +58,7 @@ public class LocationMapActivity extends BaseActivity implements OnGetPoiSearchR
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_map_location);
         location = getIntent().getIntExtra("data", 500);
-        choose_addr =  getIntent().getStringExtra("choose_addr");
+        choose_addr = getIntent().getStringExtra("choose_addr");
         init();
         initView();
         BaiduMapUtil.getInstence().getNearInfo(location, 0, point, mPoiSearch, "公司", new BaiduMapUtil.OnNeerPoiListener() {
@@ -118,7 +118,7 @@ public class LocationMapActivity extends BaseActivity implements OnGetPoiSearchR
             if (listData != null && listData.size() > 0) {
                 listData.add(0, myPoInfo);
 
-               // for (int i=0;i<listData.size();i++)
+                // for (int i=0;i<listData.size();i++)
                 adapter.notifyDataSetChanged();
             }
 
@@ -134,7 +134,7 @@ public class LocationMapActivity extends BaseActivity implements OnGetPoiSearchR
         myPoInfo = new PoiInfo();
         myPoInfo.location = point;
         myPoInfo.address = locationHelper.getAddress();
-        myPoInfo.name = addr == null ? (StringUtils.isEmpty(addr2) ? "我的位置" : addr2) : addr;
+        myPoInfo.name = StringUtils.isEmpty(addr) ? (StringUtils.isEmpty(addr2) ? "我的位置" : addr2) : addr;
     }
 
     @Override

+ 1 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/MeetDetailsActivity.java

@@ -366,7 +366,7 @@ public class MeetDetailsActivity extends BaseActivity implements View.OnClickLis
             case R.id.click_btn:
                 if (isPlay) {
                     if ("已结束".equals(status_tv.getText().toString().trim())) {
-                        ToastUtil.showToast(ct, "会议已经结束,不能签到");
+                        ToastUtil.showToast(ct, "会议已经结束,不能签到");
                     } else {
                         doNetSubmit(SIGNNIN);
                     }

+ 24 - 2
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/MeetingActivity.java

@@ -270,7 +270,28 @@ public class MeetingActivity extends BaseActivity {
             } else {
                 viewholder = (ViewHolder) view.getTag();
             }
-            bindData(viewholder, i);
+            //当系统时间<开始时间 会议状态为未开始,
+            // 当会议开始时间<系统时间会议状态为进行中,当会议发起人点击结束会议按钮,
+            // 状态更新为已结束,否则即使超过会议结束时间状态也是进行中
+            String str = entities.get(i).getMa_stage();
+            if (str == null || str.trim().length() <= 0) {
+                if (TimeUtils.f_str_2_long(entities.get(i).getMa_starttime()) > System.currentTimeMillis())
+                    str = "未开始";
+                else
+                    str = "进行中";
+            }
+            entities.get(i).setMa_stage(str);
+            viewholder.oa_meeting_status_tv.setText(entities.get(i).getMa_stage());
+            long startLong = TimeUtils.f_str_2_long(entities.get(i).getMa_starttime());
+            long endLong = TimeUtils.f_str_2_long(entities.get(i).getMa_endtime());
+            viewholder.oa_meeting_start.setText(TimeUtils.long2str(startLong, "MM月dd日"));
+            viewholder.oa_meeting_end.setText(TimeUtils.long2str(endLong, "MM月dd日"));
+            viewholder.oa_meeting_start_date.setText(TimeUtils.long2str(startLong, "HH:mm"));
+            viewholder.oa_meeting_end_date.setText(TimeUtils.long2str(endLong, "HH:mm"));
+            viewholder.oa_meeting_name_tv.setText(entities.get(i).getMa_theme());
+            viewholder.oa_meeting_addr_tv.setText(entities.get(i).getMa_mrname());
+            viewholder.oa_meeting_user_tv.setText(entities.get(i).getMa_recorder());
+            viewholder.oa_meeting_tag_tv.setText(StringUtils.isEmpty(entities.get(i).getMa_type()) ? "未填写" : entities.get(i).getMa_type());
             return view;
         }
 
@@ -297,8 +318,9 @@ public class MeetingActivity extends BaseActivity {
             viewholder.oa_meeting_name_tv.setText(entity.getMa_theme());
             viewholder.oa_meeting_addr_tv.setText(entity.getMa_mrname());
             viewholder.oa_meeting_user_tv.setText(entity.getMa_recorder());
-            if (entity.getMa_tag() == null || entity.getMa_tag().length() <= 0) return;
             viewholder.oa_meeting_tag_tv.setText(StringUtils.isEmpty(entity.getMa_type()) ? "未填写" : entity.getMa_type());
+
+            if (entity.getMa_tag() == null || entity.getMa_tag().length() <= 0) return;
         }
 
         class ViewHolder {

+ 92 - 50
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/WorkDailyAddActivity.java

@@ -6,20 +6,16 @@ import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
 import android.support.v7.app.AlertDialog;
-import android.text.Editable;
-import android.text.TextWatcher;
 import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
-import android.widget.Button;
 import android.widget.EditText;
 import android.widget.ImageView;
 import android.widget.Toast;
 
 import com.alibaba.fastjson.JSON;
-import com.andreabaccega.widget.FormEditText;
 import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.ui.base.BaseActivity;
 import com.xzjmyk.pm.activity.ui.circle.SendShuoshuoActivity;
@@ -86,11 +82,13 @@ public class WorkDailyAddActivity extends BaseActivity implements View.OnTouchLi
             }
         }
     };
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         initView();
     }
+
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         getMenuInflater().inflate(R.menu.menu_list, menu);
@@ -105,17 +103,16 @@ public class WorkDailyAddActivity extends BaseActivity implements View.OnTouchLi
         }
         return super.onOptionsItemSelected(item);
     }
-   public void  initView(){
-       setContentView(R.layout.activity_add_work_daily);
-       getSupportActionBar().setTitle("工作日报");
 
-       add_summary = (EditText) findViewById(R.id.add_work_daily_summary_et);
-       add_plan = (EditText) findViewById(R.id.add_work_daily_plan_et);
-       add_experience = (EditText) findViewById(R.id.add_work_daily_experience_et);
-       add_submit = (ImageView) findViewById(R.id.add_work_daily_submit_iv);
-       share_experience = (ImageView) findViewById(R.id.add_work_daily_sharing_experience_im);
+    public void initView() {
+        setContentView(R.layout.activity_add_work_daily);
+        getSupportActionBar().setTitle("工作日报");
+        add_summary = (EditText) findViewById(R.id.add_work_daily_summary_et);
+        add_plan = (EditText) findViewById(R.id.add_work_daily_plan_et);
+        add_experience = (EditText) findViewById(R.id.add_work_daily_experience_et);
+        add_submit = (ImageView) findViewById(R.id.add_work_daily_submit_iv);
+        share_experience = (ImageView) findViewById(R.id.add_work_daily_sharing_experience_im);
 /*
-
        //工作总结不为空及字数限制提醒
        add_summary.addTextChangedListener(new TextWatcher() {
            @Override
@@ -159,42 +156,42 @@ public class WorkDailyAddActivity extends BaseActivity implements View.OnTouchLi
        });
 */
 
-       add_submit.setOnClickListener(new View.OnClickListener() {
-           @Override
-           public void onClick(View v) {
-             //  if(add_summary.testValidity()){
-                   sendAble();
-           //    }
-           }
-       });
-       share_experience.setOnClickListener(new View.OnClickListener() {
-           @Override
-           public void onClick(View v) {
-               if(StringUtils.isEmpty(add_experience.getText().toString())){
-                   ToastMessage("请先填写工作心得再分享");
-               }else{
-                   new android.app.AlertDialog
-                           .Builder(mContext)
-                           .setTitle("温馨提示")
-                           .setMessage("你将进行工作心得分享至朋友圈操作,是否继续?")
-                           .setNegativeButton("取消",null)
+        add_submit.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                //  if(add_summary.testValidity()){
+                sendAble();
+                //    }
+            }
+        });
+        share_experience.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (StringUtils.isEmpty(add_experience.getText().toString())) {
+                    ToastMessage("请先填写工作心得再分享");
+                } else {
+                    new android.app.AlertDialog
+                            .Builder(mContext)
+                            .setTitle("温馨提示")
+                            .setMessage("你将进行工作心得分享至朋友圈操作,是否继续?")
+                            .setNegativeButton("取消", null)
 
-                           .setPositiveButton("确定", new DialogInterface.OnClickListener() {
-                               @Override
-                               public void onClick(DialogInterface dialog, int which) {
-                                   Intent intent = new Intent(WorkDailyAddActivity.this, SendShuoshuoActivity.class);
-                                   intent.putExtra("Experience",add_experience.getText().toString());
-                                   intent.putExtra("type", 0);
-                                   startActivity(intent);
-                               }
-                           }).show();
-               }
-           }
-       });
+                            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
+                                @Override
+                                public void onClick(DialogInterface dialog, int which) {
+                                    Intent intent = new Intent(WorkDailyAddActivity.this, SendShuoshuoActivity.class);
+                                    intent.putExtra("Experience", add_experience.getText().toString());
+                                    intent.putExtra("type", 0);
+                                    startActivity(intent);
+                                }
+                            }).show();
+                }
+            }
+        });
 
     }
 
-    private  void showsubmitDialog() {
+    private void showsubmitDialog() {
         new AlertDialog
                 .Builder(mContext)
                 .setTitle("温馨提示")
@@ -207,6 +204,7 @@ public class WorkDailyAddActivity extends BaseActivity implements View.OnTouchLi
                     }
                 }).show();
     }
+
     private void sendAble() {
         StringBuilder builder = new StringBuilder();
         if (!StringUtils.isEmpty(add_summary.getText().toString())) {
@@ -228,20 +226,23 @@ public class WorkDailyAddActivity extends BaseActivity implements View.OnTouchLi
         showsubmitDialog();
     }
 
-    private void sendWorkDailyByErp(String s1,String s2,String s3) {
+    private void sendWorkDailyByErp(String s1, String s2, String s3) {
+        s1= string2Json(s1);
+        s2= string2Json(s2);
+        s3= string2Json(s3);
         String url = CommonUtil.getSharedPreferences(ct, "erp_baseurl") + "mobile/addWorkReport.action";
         Map<String, Object> formStoreMap = new HashMap<>();
         formStoreMap.put("wd_empcode", CommonUtil.getSharedPreferences(ct, "erp_username"));
         formStoreMap.put("wd_comment", s1);
         formStoreMap.put("wd_plan", s2);
         formStoreMap.put("wd_experience", s3);
-        String formStore = StringUtils.mapToJson(formStoreMap);        HashMap<String, Object> params = new HashMap<>();
+        String formStore = StringUtils.mapToJson(formStoreMap);
+        HashMap<String, Object> params = new HashMap<>();
         params.put("caller", "WorkDaily");
         params.put("formStore", formStore);
         LinkedHashMap<String, Object> headers = new LinkedHashMap<>();
         headers.put("Cookie", "JSESSIONID=" + CommonUtil.getSharedPreferences(ct, "sessionId"));
         ViewUtil.httpSendRequest(this, url, params, handler, headers, 0x12, null, null, "get");
-
         Log.i("handleMessage: ", formStore);
     }
 
@@ -249,8 +250,8 @@ public class WorkDailyAddActivity extends BaseActivity implements View.OnTouchLi
     public boolean onTouch(View v, MotionEvent event) {
         //触摸的是EditText并且当前EditText可以滚动则将事件交给EditText处理;否则将事件交由其父类处理
         if ((v.getId() == R.id.add_work_daily_summary_et && CommonUtil.canVerticalScroll(add_summary))
-                ||(v.getId() == R.id.add_work_daily_experience_et && CommonUtil.canVerticalScroll(add_experience))
-                ||(v.getId() == R.id.add_work_daily_plan_et && CommonUtil.canVerticalScroll(add_plan))){
+                || (v.getId() == R.id.add_work_daily_experience_et && CommonUtil.canVerticalScroll(add_experience))
+                || (v.getId() == R.id.add_work_daily_plan_et && CommonUtil.canVerticalScroll(add_plan))) {
             v.getParent().requestDisallowInterceptTouchEvent(true);
             if (event.getAction() == MotionEvent.ACTION_UP) {
                 v.getParent().requestDisallowInterceptTouchEvent(false);
@@ -258,4 +259,45 @@ public class WorkDailyAddActivity extends BaseActivity implements View.OnTouchLi
         }
         return false;
     }
+
+    /**
+     * JSON字符串特殊字符处理,比如:“\A1;1300”
+     * @param s
+     * @return String
+     */
+    public String string2Json(String s) {
+        StringBuffer sb = new StringBuffer();
+        for (int i=0; i<s.length(); i++) {
+            char c = s.charAt(i);
+            switch (c){
+                case '\"':
+                    sb.append("\\\"");
+                    break;
+                case '\\':
+                    sb.append("\\\\");
+                    break;
+                case '/':
+                    sb.append("\\/");
+                    break;
+                case '\b':
+                    sb.append("\\b");
+                    break;
+                case '\f':
+                    sb.append("\\f");
+                    break;
+                case '\n':
+                    sb.append("\\n");
+                    break;
+                case '\r':
+                    sb.append("\\r");
+                    break;
+                case '\t':
+                    sb.append("\\t");
+                    break;
+                default:
+                    sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
 }

+ 38 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/adapter/SubscriptionAdapter.java

@@ -0,0 +1,38 @@
+package com.xzjmyk.pm.activity.ui.erp.adapter;
+
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Created by Bitliker on 2016/11/16.
+ */
+
+public class SubscriptionAdapter extends RecyclerView.Adapter<SubscriptionAdapter.SubViewHolder> {
+
+
+    @Override
+    public SubViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        return null;
+    }
+
+    @Override
+    public void onBindViewHolder(SubViewHolder holder, int position) {
+
+    }
+
+    @Override
+    public int getItemCount() {
+        return 0;
+    }
+
+    class SubViewHolder extends RecyclerView.ViewHolder{
+
+        public SubViewHolder(View itemView) {
+            super(itemView);
+        }
+    }
+
+
+
+}

+ 14 - 14
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/fragment/ContactFragment.java

@@ -16,13 +16,10 @@ import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.widget.AdapterView;
-import android.widget.ListView;
 import android.widget.TextView;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.handmark.pulltorefresh.library.PullToRefreshBase;
-import com.handmark.pulltorefresh.library.PullToRefreshListView;
 import com.lidroid.xutils.ViewUtils;
 import com.lidroid.xutils.view.annotation.ViewInject;
 import com.xzjmyk.pm.activity.AppConstant;
@@ -53,6 +50,7 @@ import com.xzjmyk.pm.activity.ui.message.NewFriendActivity;
 import com.xzjmyk.pm.activity.ui.nearby.UserSearchActivity;
 import com.xzjmyk.pm.activity.ui.tool.ThreadPool;
 import com.xzjmyk.pm.activity.view.ClearEditText;
+import com.yalantis.phoenix.PullToRefreshView;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -65,6 +63,8 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
+
 
 /**
  * Created by pengminggong on 2016/10/12.
@@ -75,7 +75,7 @@ public class ContactFragment extends EasyFragment implements View.OnClickListene
     @ViewInject(R.id.text_dialog)
     private TextView text_dialog;
     @ViewInject(R.id.pull_refresh_list)
-    private PullToRefreshListView refreshListView;
+    private StickyListHeadersListView refreshListView;
     private FriendSortAdapter adapter;
     private DBManager manager;
     private String loginUserId;
@@ -84,7 +84,8 @@ public class ContactFragment extends EasyFragment implements View.OnClickListene
     private BaseComparator comparator;
     private ClearEditText search_edit;
     private CustomProgressDialog mcProgressDialog;
-
+    @ViewInject(R.id.contact_ptrv)
+    private PullToRefreshView mPullToRefreshView;
     private Handler handler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
@@ -159,11 +160,11 @@ public class ContactFragment extends EasyFragment implements View.OnClickListene
                 // 该字母首次出现的位置
                 int position = adapter.getPositionForSection(s.charAt(0));
                 if (position != -1) {
-                    int count = refreshListView.getRefreshableView().getHeaderViewsCount();
-                    refreshListView.getRefreshableView().setSelection(position + count);
+                    int count = refreshListView.getHeaderViewsCount();
+                    refreshListView.setSelection(position + count);
                 }
                 if ("↑".equals(s)) {
-                    refreshListView.getRefreshableView().setSelection(1);
+                    refreshListView.setSelection(0);
                 }
             }
 
@@ -171,9 +172,9 @@ public class ContactFragment extends EasyFragment implements View.OnClickListene
             public void onTouchingUp() {
             }
         });
-        refreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {
+        mPullToRefreshView.setOnRefreshListener(new PullToRefreshView.OnRefreshListener() {
             @Override
-            public void onRefresh(PullToRefreshBase<ListView> refreshView) {
+            public void onRefresh() {
                 loadDataInThread();
             }
         });
@@ -216,10 +217,9 @@ public class ContactFragment extends EasyFragment implements View.OnClickListene
         comparator = new BaseComparator();
         loginUserId = MyApplication.getInstance().mLoginUser.getUserId();
         setHeaderView();
-        refreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_START);
         sidebar.setTextView(text_dialog);
         adapter = new FriendSortAdapter(ct, showDatas);
-        refreshListView.getRefreshableView().setAdapter(adapter);
+        refreshListView.setAdapter(adapter);
         loadDataInThread();
         mcProgressDialog.show();
     }
@@ -227,7 +227,7 @@ public class ContactFragment extends EasyFragment implements View.OnClickListene
     /*设置头文件*/
     private void setHeaderView() {
         View headview = LayoutInflater.from(ct).inflate(R.layout.header_fragment_contact, null);
-        refreshListView.getRefreshableView().addHeaderView(headview);
+        refreshListView.addHeaderView(headview);
         search_edit = (ClearEditText) headview.findViewById(R.id.search_edit);
         headview.findViewById(R.id.company).setOnClickListener(this);//企业结构
         headview.findViewById(R.id.group).setOnClickListener(this);//商务群
@@ -408,7 +408,7 @@ public class ContactFragment extends EasyFragment implements View.OnClickListene
             @Override
             public void run() {
                 adapter.setData(showDatas);
-                refreshListView.onRefreshComplete();
+                mPullToRefreshView.setRefreshing(false);
                 if (mcProgressDialog.isShowing())
                     mcProgressDialog.dismiss();
             }

+ 0 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/net/ViewUtil.java

@@ -844,7 +844,6 @@ public class ViewUtil {
             }
         });
 
-
     }
 
     // 登录ERP

+ 17 - 5
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/CreateRoomUtil.java

@@ -5,6 +5,7 @@ import android.content.Context;
 import android.content.ServiceConnection;
 import android.os.IBinder;
 import android.text.TextUtils;
+import android.util.Log;
 
 import com.alibaba.fastjson.JSON;
 import com.android.volley.Response;
@@ -142,12 +143,18 @@ public class CreateRoomUtil {
                     }
                 }, new StringJsonObjectRequest.Listener<MucRoom>() {
             @Override
-            public void onResponse(ObjectResult<MucRoom> result) {
+            public void onResponse(final ObjectResult<MucRoom> result) {
                 boolean parserResult = Result.defaultParser(context, result, true);
                 if (parserResult && result.getData() != null) {
                     list.add(0, MyApplication.getInstance().mLoginUser.getUserId());
-                    RoomImageUtil.getInstance().uploadAvatar(context, list, roomJid);//上传头像
-                    joinRoom(context, result.getData());
+                    RoomImageUtil.getInstance().uploadAvatar(context, list, roomJid, new RoomImageUtil.UpImageListener() {
+                        @Override
+                        public void callBack(boolean isOk, String id) {
+                            joinRoom(context, result.getData(), id);
+                        }
+                    });//上传头像
+                    //TODO 先关闭
+
 
                 }
             }
@@ -162,7 +169,7 @@ public class CreateRoomUtil {
      * @param context
      * @param room    群对象
      */
-    private void joinRoom(final Context context, final MucRoom room) {
+    private void joinRoom(final Context context, final MucRoom room, final String id) {
         final String loginUserId = MyApplication.getInstance().mLoginUser.getUserId();
         AppConfig mConfig = MyApplication.getInstance().getConfig();
         HashMap<String, String> params = new HashMap<String, String>();
@@ -186,15 +193,19 @@ public class CreateRoomUtil {
                     Friend friend = new Friend();// 将房间也存为好友
                     friend.setOwnerId(loginUserId);
                     friend.setUserId(room.getJid());
+                    if (StringUtils.isEmpty(id))
+                        friend.setRoomCreateUserId(room.getUserId());
+                    else
+                        friend.setRoomCreateUserId(id);
                     friend.setNickName(room.getName());
                     friend.setDescription(room.getDesc());
                     friend.setRoomFlag(1);
                     friend.setRoomId(room.getId());
-                    friend.setRoomCreateUserId(room.getUserId());
                     // timeSend作为取群聊离线消息的标志,所以要在这里设置一个初始值
                     friend.setTimeSend(TimeUtils.sk_time_current_time());
                     friend.setStatus(Friend.STATUS_FRIEND);
                     FriendDao.getInstance().createOrUpdateFriend(friend);//创建或者更新好友...
+                    List<Friend> rooms = FriendDao.getInstance().getAllRooms(loginUserId);
 //                    sendMucChatMessage();//发送一条信息到群里去
                     result(true, roomJid);
                 } else {
@@ -205,6 +216,7 @@ public class CreateRoomUtil {
         MyApplication.getInstance().getFastVolley().addDefaultRequest(TAG, request);
     }
 
+    //建群后发送消息
     private void sendMucChatMessage() {
         ChatMessage message = new ChatMessage();
         message.setType(XmppMessage.TYPE_TEXT);

+ 11 - 3
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/RoomImageUtil.java

@@ -57,6 +57,7 @@ public class RoomImageUtil {
 
         }
     };
+    private UpImageListener listener;
 
     private RoomImageUtil() {
     }
@@ -77,8 +78,9 @@ public class RoomImageUtil {
      * @param inviteUsers 群id列表
      * @param mRoomJid    群id
      */
-    public void uploadAvatar(final Context context, final List<String> inviteUsers, final String mRoomJid) {
+    public void uploadAvatar(final Context context, final List<String> inviteUsers, final String mRoomJid, UpImageListener listener) {
         this.context = context;
+        this.listener = listener;
         ThreadPool.getThreadPool().addTask(new Runnable() {
             @Override
             public void run() {
@@ -154,6 +156,8 @@ public class RoomImageUtil {
                         success = true;
                     }
                 }
+                if (listener != null)
+                    listener.callBack(true, photoId);
                 if (success) {
                     ToastUtil.showToast(context, R.string.upload_avatar_success);
                     //更新服务器
@@ -166,6 +170,8 @@ public class RoomImageUtil {
             @Override
             public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
                 ToastUtil.showToast(context, R.string.upload_avatar_failed);
+                if (listener != null)
+                    listener.callBack(true, null);
             }
         });
     }
@@ -193,7 +199,7 @@ public class RoomImageUtil {
                 new StringJsonObjectRequest.Listener<String>() {
                     @Override
                     public void onResponse(ObjectResult<String> result) {
-                        Log.i("Arison", "更新头像id result:" + result.getResultData());
+                        Log.i("gongpengming", "上传头像成功" + result.getData());
                     }
                 }, String.class, params, true);
         mRequest.setTag(requestTag);
@@ -237,5 +243,7 @@ public class RoomImageUtil {
         return file;
     }
 
-
+    public interface UpImageListener {
+        void callBack(boolean isOk, String id);
+    }
 }

+ 44 - 13
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/alarm/AlarmReceiver.java

@@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.xzjmyk.pm.activity.BdLocationHelper;
 import com.xzjmyk.pm.activity.MyApplication;
+import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.bean.oa.SigninBean;
 import com.xzjmyk.pm.activity.db.dao.SigninDao;
 import com.xzjmyk.pm.activity.ui.erp.activity.oa.SigninActivity;
@@ -29,7 +30,9 @@ import java.util.Map;
 
 import static com.alibaba.fastjson.JSON.parseObject;
 import static com.xzjmyk.pm.activity.AppConfig.AUTO_SIGNIN_ACTION;
+import static com.xzjmyk.pm.activity.AppConfig.NOT_TIME_IN_SIGNIN;
 import static com.xzjmyk.pm.activity.AppConfig.OFFWORK_ALARM_ACTION;
+import static com.xzjmyk.pm.activity.AppConfig.OUTOFF_WORK_ACTION;
 import static com.xzjmyk.pm.activity.AppConfig.WORK_ALARM_ACTION;
 import static com.xzjmyk.pm.activity.ui.erp.net.ViewUtil.ct;
 
@@ -52,26 +55,59 @@ public class AlarmReceiver extends BroadcastReceiver {
             AutoSignin(context);
         } else if (WORK_ALARM_ACTION.equals(action)) {//上班提醒
             //TODO 判断是否打卡了
-            if (!isSigninOk(context, true))
+            if (!isSigninOk(true))
                 notificationManage.sendNotification(context, "请按时上班打卡", SigninActivity.class);
         } else if (OFFWORK_ALARM_ACTION.equals(action)) {//下班提醒
             //TODO 判断是否打卡了
-            if (!isSigninOk(context, false))
+            if (!isSigninOk(false))
                 notificationManage.sendNotification(context, "请按时下班打卡", SigninActivity.class);
-        } else {
-            AutoSignin(context);
+        } else if (OUTOFF_WORK_ACTION.equals(action)) {
+            showOutoffWork();
+        } else if (NOT_TIME_IN_SIGNIN.equals(action)) {
+        } else
+            return;
+        new Handler().postAtTime(new Runnable() {
+            @Override
+            public void run() {
+//                AlarmManage manage = new AlarmManage();
+//                manage.setSigninAlarm(MyApplication.getInstance());
+                MyApplication.getInstance().startService(new Intent(MyApplication.getInstance(), AlarmService.class));
+            }
+        }, 10000);
+    }
+
+    //提示离开工作区
+    private void showOutoffWork() {
+        try {
+            BdLocationHelper helper = MyApplication.getInstance().getBdLocationHelper();
+            final int comDistance = CommonUtil.getSharedPreferencesInt(ct, "distance", 0);
+            if (comDistance < Float.valueOf(BaiduMapUtil.getInstence().getDistance())) {//规定地址<实际地址  不符合  重新请求定位
+                helper.requestLocation();
+                helper.setListener(new BdLocationHelper.OnBaiduResultListener() {
+                    @Override
+                    public void result(boolean isOk) {
+                        if (comDistance < Float.valueOf(BaiduMapUtil.getInstence().getDistance())) {//重新定位还不符合
+                            NotificationManage notificationManage = new NotificationManage();
+                            notificationManage.sendNotification(MyApplication.getInstance(),
+                                    R.string.outoff_work, SigninActivity.class);
+                        }
+                    }
+                });
+            }
+        } catch (Exception e) {
+
         }
+
     }
 
 
     /**
      * 判断是否已经打卡了
      *
-     * @param ct
      * @param isU 是否是上班
      * @return 已经打卡成功
      */
-    private boolean isSigninOk(Context ct, boolean isU) {
+    private boolean isSigninOk(boolean isU) {
         List<SigninBean> beans = dao.queryByEmcode();
         if (ListUtils.isEmpty(beans)) return false;
         String thisTime = TimeUtils.long2str(System.currentTimeMillis(), "HH:mm");
@@ -233,13 +269,6 @@ public class AlarmReceiver extends BroadcastReceiver {
         else
             bean.setOffSignin(time);
         dao.updateByBrean(bean);
-        new Handler().postAtTime(new Runnable() {//延迟两秒
-            @Override
-            public void run() {
-                AlarmManage manage = new AlarmManage();
-                manage.setSigninAlarm(MyApplication.getInstance());
-            }
-        }, 5000);
         NotificationManage notificationManage = new NotificationManage();
         notificationManage.sendNotification(MyApplication.getInstance(), "系统已为你自动打卡成功", SigninActivity.class);
     }
@@ -248,4 +277,6 @@ public class AlarmReceiver extends BroadcastReceiver {
     private String clearDay(String time) {
         return TimeUtils.long2str(TimeUtils.f_str_2_long(time), "HH:mm");
     }
+
+
 }

+ 53 - 9
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/alarm/AlarmService.java

@@ -12,8 +12,19 @@ import java.util.Map;
 import java.util.Timer;
 import java.util.TimerTask;
 
+import static com.xzjmyk.pm.activity.AppConfig.AUTO_SIGNIN_ACTION;
+import static com.xzjmyk.pm.activity.AppConfig.NOT_TIME_IN_SIGNIN;
+import static com.xzjmyk.pm.activity.AppConfig.OFFWORK_ALARM_ACTION;
+import static com.xzjmyk.pm.activity.AppConfig.OUTOFF_WORK_ACTION;
+import static com.xzjmyk.pm.activity.AppConfig.WORK_ALARM_ACTION;
+
 
 public class AlarmService extends Service {
+
+    private String action = null;
+    private Timer timer;
+
+
     @Override
     public IBinder onBind(Intent intent) {
         return null;
@@ -21,18 +32,27 @@ public class AlarmService extends Service {
 
     @Override
     public void onCreate() {//第一次进来
+        Log.i("gongpengming", "onCreate");
         super.onCreate();
     }
 
+
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {//每次启动服务
-        Log.i("gongpengmingss", "onStartCommand");
-        alarm();
+        Log.i("gongpengming", "onStartCommand");
+        try {
+            alarm();
+        } catch (Exception e) {
+            Log.i("gongpengmming", "e=" + e.getMessage());
+        }
         return super.onStartCommand(intent, flags, startId);
     }
 
     @Override
     public void onDestroy() {//服务关闭
+        Intent localIntent = new Intent();
+        localIntent.setClass(this, AlarmService.class);  //销毁时重新启动Service
+        this.startService(localIntent);
         super.onDestroy();
     }
 
@@ -41,19 +61,43 @@ public class AlarmService extends Service {
         super.onLowMemory();
     }
 
-    public void alarm() {
+    public void alarm() throws Exception {
         ReckonAlarmTimeUtil util = new ReckonAlarmTimeUtil();
-        Map<String, Number> map = util.reckoAlarmAndAuto(getApplicationContext());
+        Map<String, Number> map = util.reckoAlarmAndAuto();//获取提醒时间
         if (map == null) return;
-        long time = (long) map.get("time");
-        int type = (int) map.get("type");
+        long time = (long) (map.containsKey("time") ? map.get("time") : 0);
+        int type = (int) (map.containsKey("type") ? map.get("type") : 0);//1 自动打卡 2.上班提醒  3.下班提醒 4.上班时间
         if (time == 0) return;
-        Log.i("gongpengming", TimeUtils.f_long_2_str(time));
-        Timer timer = new Timer();
+        switch (type) {
+            case 1:
+                action = AUTO_SIGNIN_ACTION;
+                break;
+            case 2:
+                action = WORK_ALARM_ACTION;
+                break;
+            case 3:
+                action = OFFWORK_ALARM_ACTION;
+                break;
+            case 4:
+                action = OUTOFF_WORK_ACTION;
+                break;
+            default:
+                action = NOT_TIME_IN_SIGNIN;
+                break;
+        }
+        try {
+            Log.i("gongpengming", "时间为=" + TimeUtils.f_long_2_str(time));
+            Log.i("gongpengming", "action=" + action);
+        } catch (Exception e) {
+            Log.i("gongpengming", "e=" + e.getMessage());
+        }
+        timer = new Timer();
         timer.schedule(new TimerTask() {
             @Override
             public void run() {
-                Log.i("gongpengming", "进来了");
+                Intent intent = new Intent(action);
+                sendBroadcast(intent);
+                timer.cancel();
             }
         }, new Date(time));
     }

+ 22 - 2
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/alarm/NotificationManage.java

@@ -6,8 +6,10 @@ import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.support.v7.app.NotificationCompat;
 
+import com.xzjmyk.pm.activity.MyApplication;
 import com.xzjmyk.pm.activity.R;
 
 /**
@@ -15,6 +17,7 @@ import com.xzjmyk.pm.activity.R;
  * Created by pengminggong on 2016/10/27.
  */
 public class NotificationManage {
+    private long minutes2time = 2 * 60000;
 
     /**
      * 显示通知栏
@@ -42,7 +45,24 @@ public class NotificationManage {
     public void sendNotification(Context context, Class<? extends Activity> clazz) {
         sendNotification(context, R.drawable.uuu, "提醒", "提醒", clazz);
     }
-    public void sendNotification(Context context,String action, Class<? extends Activity> clazz) {
-        sendNotification(context, R.drawable.uuu, "提醒", action, clazz);
+    public void sendNotification(Context context, int action, Class<? extends Activity> clazz) {
+        SharedPreferences sharePrefer = MyApplication.getInstance().getSharedPreferences("SIGNIN", Context.MODE_APPEND);
+        long oldTime = sharePrefer.getLong("SIGNIN_TIME", -1);
+        if (System.currentTimeMillis() - oldTime > minutes2time) {//如果当前时间大于上次时间2分钟
+            sharePrefer.edit().putLong("SIGNIN_TIME", System.currentTimeMillis());
+            sendNotification(context, R.drawable.uuu, "提醒", context.getResources().getString(action), clazz);
+        } else {
+            //无效
+        }
+    }
+    public void sendNotification(Context context, String action, Class<? extends Activity> clazz) {
+        SharedPreferences sharePrefer = MyApplication.getInstance().getSharedPreferences("SIGNIN", Context.MODE_APPEND);
+        long oldTime = sharePrefer.getLong("SIGNIN_TIME", -1);
+        if (System.currentTimeMillis() - oldTime > minutes2time) {//如果当前时间大于上次时间2分钟
+            sharePrefer.edit().putLong("SIGNIN_TIME", System.currentTimeMillis());
+            sendNotification(context, R.drawable.uuu, "提醒", action, clazz);
+        } else {
+            //无效
+        }
     }
 }

+ 96 - 60
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/alarm/ReckonAlarmTimeUtil.java

@@ -2,6 +2,7 @@ package com.xzjmyk.pm.activity.ui.erp.util.alarm;
 
 import android.content.Context;
 
+import com.xzjmyk.pm.activity.MyApplication;
 import com.xzjmyk.pm.activity.bean.oa.SigninBean;
 import com.xzjmyk.pm.activity.db.dao.SigninDao;
 import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
@@ -17,40 +18,100 @@ import static com.xzjmyk.pm.activity.AppConfig.ALARMA_CLICK;
 import static com.xzjmyk.pm.activity.AppConfig.AUTO_SIGNIN;
 
 /**
+ * 计算提醒时间
  * Created by pengminggong on 2016/11/10.
  */
-
 public class ReckonAlarmTimeUtil {
-
-
-    public Map<String, Number> reckoAlarmAndAuto(Context ct) {
+    private final long TIME_30 = 30 * 1000 * 60;//30分钟
+    private final long TIME_DAY = 24 * 60 * 1000 * 60;//一天时间戳
+    private boolean isToday = true;
+
+    /**
+     * @return map<String,Number> map
+     * type  1.自动打卡 2.上班提醒  3.下班提醒  4.远离办公地点
+     * time  提醒时间
+     */
+    public Map<String, Number> reckoAlarmAndAuto() {
+        Context ct = MyApplication.getInstance();
         boolean isAlarm = CommonUtil.getSharedPreferencesBoolean(ct, ALARMA_CLICK, false);//是否自动打卡
         boolean isAuto = CommonUtil.getSharedPreferencesBoolean(ct, AUTO_SIGNIN, false);//是否提醒
-        if (!isAlarm && !isAuto) {
-            return null;
-        }
+        if (!isAlarm && !isAuto) return null;
+        SigninBean bean = getNextSignin(ct);
+        if (bean == null) return null;
         Map<String, Number> map = new HashMap<>();
-        if (isAuto) {
-            map.put("type", 1);
-            long time = nextAuto(ct);
-            map.put("time", time);
-            return map;
-        } else if (isAlarm) {
-            nextAlarm(ct, map);
-            return map;
+        Map<String, Number> chche = new HashMap<>();
+        long minTime = 0;
+
+        if (isAuto) {//自动打卡
+            minTime = nextAuto(bean);
+            if (minTime != 0) {
+                chche.put("type", 1);
+                chche.put("time", minTime);
+            } else {
+                chche.put("type", 5);
+                minTime = getTimeByHHmm(bean.getEndTime());
+                chche.put("time", minTime);
+            }
+        } else if (isAlarm) {//当有自动签到时候不计算系统功能
+            chche = nextAlarm(ct, bean);
+            if (chche != null)
+                minTime = chche.containsKey("time") ? (long) chche.get("time") : 0;
+            else {
+                chche = new HashMap<>();
+                chche.put("type", 5);
+                minTime = getTimeByHHmm(bean.getEndTime());
+                chche.put("time", minTime);
+            }
         }
-        return null;
+        //如果30分钟后小于。。。或当minTime为0时候,显示所有时间都不符合
+        if (System.currentTimeMillis() > getTimeByHHmm(bean.getWorkTime()) && System.currentTimeMillis() < getTimeByHHmm(bean.getOffTime())
+                && (minTime == 0 || (isToday && System.currentTimeMillis() + TIME_30 < minTime))
+                ) {//当前时间在上班时间内(上班之后下班之前) 而且符合提醒
+            map.put("type", 4);
+            map.put("time", System.currentTimeMillis() + TIME_30);
+        } else {
+            map = chche;
+        }
+        return map;
+    }
+
+    /**
+     * 获取当前时间对应的下一个班次
+     *
+     * @param ct
+     * @return
+     */
+    private SigninBean getNextSignin(Context ct) {
+        SigninDao dao = new SigninDao(ct);
+        List<SigninBean> list = dao.queryByEmcode();//获取所有班次
+        if (ListUtils.isEmpty(list)) return null;
+        long endTime = 0;
+        SigninBean minSignin = null;
+        for (SigninBean e : list) {
+            endTime = getTimeByHHmm(StringUtils.isEmpty(e.getEndTime()) ? e.getOffTime() : e.getEndTime());
+            if (System.currentTimeMillis() < endTime) {//当前时间在该班次结束之前
+                return e;
+            }
+            if (minSignin == null) minSignin = e;
+            else if (StringUtils.isEmpty(minSignin.getWorkTime()) && StringUtils.isEmpty(minSignin.getWorkTime()) &&
+                    minSignin.getWorkTime().compareTo(e.getWorkTime()) > 0) minSignin = e;
+        }//当天班次无存在符合时间点
+        isToday = false;
+        return minSignin;
     }
 
+
     //获取下一个自动打卡时间
-    private long nextAuto(Context ct) {
-        SigninBean bean = frontOfSignin(ct);
+    private long nextAuto(SigninBean bean) {
         if (bean == null) return 0;
+        //如果不是今天 是明天
+        if (!isToday)
+            return getTimeByHHmm(bean.getWorkTime()) + TIME_DAY;
         long time = 0;
         long autoTime = -1;
         //上班
         time = getTimeByHHmm(bean.getWorkTime());
-        if (time != 0 && System.currentTimeMillis() < time) {//当前时间小于上班时间
+        if (StringUtils.isEmpty(bean.getWorkSignin()) && time != 0 && System.currentTimeMillis() < time) {//当前时间小于上班时间
             for (int i = 10; i >= 0; i -= 2) {
                 autoTime = time - i * 60000;//上班自动打卡时间
                 if (System.currentTimeMillis() < autoTime) {//当前时间小于自动打卡时间
@@ -60,7 +121,7 @@ public class ReckonAlarmTimeUtil {
         }
         //下班
         time = getTimeByHHmm(bean.getOffTime());
-        if (time != 0 && System.currentTimeMillis() < (time + 12 * 60000)) {
+        if (StringUtils.isEmpty(bean.getOffSignin()) && time != 0 && System.currentTimeMillis() < (time + 12 * 60000)) {
             for (int i = 4; i <= 12; i += 2) {
                 autoTime = time + i * 60000;//下班自动打卡时间
                 if (System.currentTimeMillis() < autoTime) {
@@ -72,61 +133,36 @@ public class ReckonAlarmTimeUtil {
     }
 
     //获取下一个提醒时间
-    private long nextAlarm(Context ct, Map<String, Number> map) {
+    private Map<String, Number> nextAlarm(Context ct, SigninBean bean) {
         int u = CommonUtil.getSharedPreferencesInt(ct, "ALARM_WORK_TIME", 5);//上班提前xx分钟
         int d = CommonUtil.getSharedPreferencesInt(ct, "ALARM_OFFWORK_TIME", 5);//下班延迟xx分钟
-        SigninBean bean = frontOfAlarm(ct, d);
-        if (bean == null) return 0;
+        Map<String, Number> map = new HashMap<>();
+        if (bean == null) return null;
+        if (!isToday) {//非今天
+            map.put("type", 2);
+            map.put("time", getTimeByHHmm(bean.getWorkTime()) + u * 60000);
+            return map;
+        }
         //上班
         long time = getTimeByHHmm(bean.getWorkTime()) - u * 60000;
-        if (time > 0 && System.currentTimeMillis() < time) {//当前时间小于提醒时间
+        if (StringUtils.isEmpty(bean.getWorkSignin()) && time > 0 && System.currentTimeMillis() < time) {//当前时间小于提醒时间
             map.put("type", 2);
             map.put("time", time);
-            return time;
+            return map;
         }
+
         //下班
         time = getTimeByHHmm(bean.getOffTime()) + d * 60000;
-        if (time > 0 && System.currentTimeMillis() < time) {
+        if (StringUtils.isEmpty(bean.getOffSignin()) && time > 0 && System.currentTimeMillis() < time) {
             map.put("type", 3);
             map.put("time", time);
-            return time;
-        }
-        return 0;
-    }
-
-
-    //获取当前时间在那个班次之前,判断下班提醒时间
-    private SigninBean frontOfAlarm(Context ct, int offMin) {
-        SigninDao dao = new SigninDao(ct);
-        List<SigninBean> beans = dao.queryByEmcode();
-        if (ListUtils.isEmpty(beans)) return null;
-        for (SigninBean bean : beans) {
-            //当前时间在下班打卡时间之前
-            if (!StringUtils.isEmpty(bean.getOffTime()) && System.currentTimeMillis() < (getTimeByHHmm(bean.getOffTime()) + offMin * 60000)) {
-                return bean;
-            }
+            return map;
         }
+        //1.两个都有签到了
+        //2.时间不在范围内
         return null;
     }
 
-    //获取当前时间在那个班次之前,只判断下班后 12分钟之前
-    private SigninBean frontOfSignin(Context ct) {
-        SigninDao dao = new SigninDao(ct);
-        return frontOfSignin(dao.queryByEmcode());
-    }
-
-
-    private SigninBean frontOfSignin(List<SigninBean> beans) {
-        if (ListUtils.isEmpty(beans)) return null;
-        //获取当前时间往后的12分钟
-        for (SigninBean bean : beans) {
-            //下班时间不为空且当前时间在下班后12分钟之前,判断为属于这个时间
-            if (!StringUtils.isEmpty(bean.getOffTime()) && System.currentTimeMillis() < (getTimeByHHmm(bean.getOffTime()) + 12 * 60000)) {
-                return bean;
-            }
-        }
-        return null;
-    }
 
     /*通过时分获取当天改时间时间戳*/
     private long getTimeByHHmm(String time) {

+ 3 - 5
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/groupchat/GroupChatFragment.java

@@ -36,7 +36,6 @@ import com.xzjmyk.pm.activity.ui.base.BaseActivity;
 import com.xzjmyk.pm.activity.ui.base.EasyFragment;
 import com.xzjmyk.pm.activity.ui.erp.activity.CommonFragmentActivity;
 import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
-import com.xzjmyk.pm.activity.ui.erp.view.EmptyLayout;
 import com.xzjmyk.pm.activity.ui.message.MucChatActivity;
 import com.xzjmyk.pm.activity.util.ProgressDialogUtil;
 import com.xzjmyk.pm.activity.util.TimeUtils;
@@ -73,7 +72,7 @@ public class GroupChatFragment extends EasyFragment {
     private int imStatus;
 
     public GroupChatFragment() {
-        mMucRooms = new ArrayList<MucRoom>();
+        mMucRooms = new ArrayList<>();
 
         mAdapter = new MucRoomAdapter();
     }
@@ -216,12 +215,11 @@ public class GroupChatFragment extends EasyFragment {
                     friend.setDescription(room.getDesc());
                     friend.setRoomFlag(1);
                     friend.setRoomId(room.getId());
-                    friend.setRoomCreateUserId(room.getUserId());
+                    friend.setRoomCreateUserId(StringUtils.isEmpty(room.getSubject()) ? room.getUserId() : room.getSubject());
                     // timeSend作为取群聊离线消息的标志,所以要在这里设置一个初始值
                     friend.setTimeSend(TimeUtils.sk_time_current_time());
                     friend.setStatus(Friend.STATUS_FRIEND);
-                    FriendDao.getInstance()
-                            .createOrUpdateFriend(friend);//创建或者更新好友...
+                    FriendDao.getInstance().createOrUpdateFriend(friend);//创建或者更新好友...
 
                     interMucChat(room.getJid(), room.getName());
                 }

+ 14 - 13
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/me/MeFragment.java

@@ -47,7 +47,6 @@ import com.xzjmyk.pm.activity.ui.erp.util.JsonValidator;
 import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
 import com.xzjmyk.pm.activity.ui.erp.util.ViewUtil;
 import com.xzjmyk.pm.activity.ui.erp.view.MasterDialog;
-import com.xzjmyk.pm.activity.ui.erp.view.SelectPicPopupWindow;
 import com.xzjmyk.pm.activity.ui.tool.SingleImagePreviewActivity;
 import com.xzjmyk.pm.activity.util.PreferenceUtils;
 import com.xzjmyk.pm.activity.util.ToastUtil;
@@ -99,7 +98,7 @@ public class MeFragment extends EasyFragment implements View.OnClickListener {
     private Context ct;
     public MasterDialog mDialog;
 
-    private Handler mhandler =  new Handler() {
+    private Handler mhandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
@@ -183,7 +182,6 @@ public class MeFragment extends EasyFragment implements View.OnClickListener {
             }
         }
     };
-    private SelectPicPopupWindow menuWindow;
 
     public MeFragment() {
     }
@@ -212,7 +210,12 @@ public class MeFragment extends EasyFragment implements View.OnClickListener {
         if (createView) {
             setHasOptionsMenu(true);
             initView();
-            iv_remain.setVisibility(MainActivity.isUnReadWork ? View.GONE : View.VISIBLE);
+            iv_remain.post(new Runnable() {
+                @Override
+                public void run() {
+                    iv_remain.setVisibility(MainActivity.isUnReadWork ? View.VISIBLE : View.GONE);
+                }
+            });
         }
     }
 
@@ -317,10 +320,7 @@ public class MeFragment extends EasyFragment implements View.OnClickListener {
                 MainActivity.isUnReadWork = false;
                 Intent intent = new Intent(getActivity(), BusinessCircleActivity.class);
                 intent.putExtra(AppConstant.EXTRA_CIRCLE_TYPE, AppConstant.CIRCLE_TYPE_MY_BUSINESS);
-                if (MainActivity.timeMin != -1 && MainActivity.timeMin != PreferenceUtils.getLong(getActivity(), MainActivity.TIME_MAIN)) {
-                    PreferenceUtils.putLong(getActivity(), MainActivity.TIME_MAIN, MainActivity.timeMin); //获取以前时间
-                } else {
-                }
+                PreferenceUtils.putLong(getActivity(), "TIMEMAIN", System.currentTimeMillis() / 1000);
                 startActivity(intent);
                 break;
             case R.id.my_space_rl:// 我的空间
@@ -332,8 +332,8 @@ public class MeFragment extends EasyFragment implements View.OnClickListener {
                 startActivity(new Intent(getActivity(), LocalVideoActivity.class));
                 break;
             case R.id.setting_rl:// 设置
-                startActivity(new Intent(getActivity(), DataFormDetailActivity.class));
-               //startActivity(new Intent(getActivity(), SettingActivity.class));
+                //startActivity(new Intent(getActivity(), DataFormDetailActivity.class));
+               startActivity(new Intent(getActivity(), SettingActivity.class));
                 break;
             case R.id.app_scan_code_rl://APP二维码
                 ImageView imageView = new ImageView(getActivity());
@@ -382,14 +382,15 @@ public class MeFragment extends EasyFragment implements View.OnClickListener {
             AvatarHelper.getInstance().displayAvatar(MyApplication.getInstance().mLoginUser.getUserId(), mAvatarImg, true);
             mNickNameTv.setText(MyApplication.getInstance().mLoginUser.getNickName());
         }
-
         if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK && data != null) {
             data.setClass(getActivity(), CaptureResultActivity.class);
             startActivity(data);
         }
+
     }
 
-    public void setChangerRemain(boolean isRead) {//isRead:true 已阅读   false: 未阅读
+    //isRead:true 已阅读   false: 未阅读
+    public void setChangerRemain(boolean isRead) {
         iv_remain.setVisibility(isRead ? View.GONE : View.VISIBLE);
     }
 
@@ -429,7 +430,7 @@ public class MeFragment extends EasyFragment implements View.OnClickListener {
             ViewUtil.httpSendRequest(ct, url, params, mhandler, headers, 2, null, null, "get");
         } else {
             String masterlist = CommonUtil.getSharedPreferences(ct, "erp_masterlist");
-            Log.i("bbb",masterlist);
+            Log.i("bbb", masterlist);
             List<Master> mList = JSON.parseArray(masterlist, Master.class);
             if (CommonUtil.isDialogShowing(mDialog)) {
                 return;

+ 0 - 2
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/message/MessageFragment.java

@@ -535,7 +535,6 @@ public class MessageFragment extends EasyFragment {
             TextView delete_tv = ViewHolder.get(convertView, R.id.delete_tv);
 
             final Friend friend = mFriendList.get(position).getBean();
-
             avatar_img.setBackgroundResource(R.color.gray_light);
             if (friend.getRoomFlag() == 0) {// 这是单个人
 
@@ -547,7 +546,6 @@ public class MessageFragment extends EasyFragment {
                 }
 
             } else {
-
                 if (TextUtils.isEmpty(friend.getRoomCreateUserId())) {
                     avatar_img.setImageResource(R.drawable.qunliao);
                 } else {

+ 40 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/message/Subscription2Activity.java

@@ -0,0 +1,40 @@
+package com.xzjmyk.pm.activity.ui.message;
+
+import android.os.Bundle;
+import android.support.v4.widget.SwipeRefreshLayout;
+
+import com.lidroid.xutils.ViewUtils;
+import com.lidroid.xutils.view.annotation.ViewInject;
+import com.xzjmyk.pm.activity.R;
+import com.xzjmyk.pm.activity.ui.base.BaseActivity;
+
+public class Subscription2Activity extends BaseActivity {
+    @ViewInject(R.id.swiperefresh)
+    private SwipeRefreshLayout swiperefresh;
+    @ViewInject(R.id.recycler)
+    private SwipeRefreshLayout recycler;
+
+//    private long
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_subscription2);
+        ViewUtils.inject(this);
+        init();
+        initView();
+        initEvent();
+    }
+
+    private void initEvent() {
+
+    }
+
+    private void initView() {
+
+    }
+
+    private void init() {
+
+    }
+}

+ 8 - 2
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/message/SubscriptionActivity.java

@@ -21,6 +21,7 @@ import android.widget.TextView;
 import com.alibaba.fastjson.JSON;
 import com.handmark.pulltorefresh.library.PullToRefreshBase;
 import com.handmark.pulltorefresh.library.PullToRefreshListView;
+import com.xzjmyk.pm.activity.MyApplication;
 import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.bean.message.SortSubsrciprion;
 import com.xzjmyk.pm.activity.bean.message.SubscriptionMessage;
@@ -37,6 +38,7 @@ import com.xzjmyk.pm.activity.util.LoadLocalImageUtil;
 import com.xzjmyk.pm.activity.util.TimeUtils;
 import com.xzjmyk.pm.activity.util.ToastUtil;
 import com.xzjmyk.pm.activity.view.MyListView;
+import com.xzjmyk.pm.activity.view.crouton.Style;
 
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -320,6 +322,10 @@ public class SubscriptionActivity extends BaseActivity {
 
     //获取数据
     public void loadNetData(long date) {
+        if (!MyApplication.getInstance().isNetworkActive()) {
+            ViewUtil.ToastMessage(ct, ct.getResources().getString(R.string.networks_out), Style.holoRedLight, 2000);
+            return;
+        }
         //获取网络数据
         String url = baseUrl + "common/desktop/subs/getSubs.action";
         final Map<String, Object> param = new HashMap<>();
@@ -334,7 +340,7 @@ public class SubscriptionActivity extends BaseActivity {
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
-        if (requestCode == REQUEST_SUBS_DETAIL && resultCode == 22 && data != null){
+        if (requestCode == REQUEST_SUBS_DETAIL && resultCode == 22 && data != null) {
             ArrayList<Integer> readSubs = data.getIntegerArrayListExtra("readsubs");
             SortSubsrciprion sortSubsrciprion = sortSubsrciprions.get(mClickPos);
             sortSubsrciprions.remove(mClickPos);
@@ -522,7 +528,7 @@ public class SubscriptionActivity extends BaseActivity {
                     intent_web.putExtra("subsact", "subsDetail");
                     intent_web.putExtra("position", i);
                     intent_web.putExtra("subsdata", beans);
-                    SubscriptionActivity.this.startActivityForResult(intent_web,REQUEST_SUBS_DETAIL);
+                    SubscriptionActivity.this.startActivityForResult(intent_web, REQUEST_SUBS_DETAIL);
 
                     if (bean.getSTATUS_() == 0) {//当点击未读消息
                         SubscriptionDao.getInstance().UpdateStatus(bean.getID_() + "", true);

+ 10 - 3
WeiChat/src/main/java/com/xzjmyk/pm/activity/util/BaiduMapUtil.java

@@ -25,13 +25,18 @@ import com.baidu.mapapi.search.poi.PoiResult;
 import com.baidu.mapapi.search.poi.PoiSearch;
 import com.baidu.mapapi.search.poi.PoiSortType;
 import com.baidu.mapapi.utils.DistanceUtil;
+import com.xzjmyk.pm.activity.BdLocationHelper;
+import com.xzjmyk.pm.activity.MyApplication;
 import com.xzjmyk.pm.activity.R;
+import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
 
 import java.text.DecimalFormat;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 
+import static com.xzjmyk.pm.activity.ui.erp.net.ViewUtil.ct;
+
 /**
  * 百度地图工具类(重复代码过多,放在工具类中)
  * Created by gongpm on 2016/7/15.
@@ -76,9 +81,11 @@ public class BaiduMapUtil {
     }
 
     //计算距离
-    public double getDistanceD(LatLng a, LatLng b) {
-        double distance = DistanceUtil.getDistance(a, b);
-        return distance;
+    public String getDistance() {
+        double companyX = CommonUtil.getSharedPreferencesfloat(ct, "companyX", 0);
+        double companyY = CommonUtil.getSharedPreferencesfloat(ct, "companyY", 0);
+        BdLocationHelper helper= MyApplication.getInstance().getBdLocationHelper();
+        return getDistance(companyX, companyY,  helper.getLatitude(), helper.getLongitude());
     }
 
     public String getDistance(double a1, double a2, double b1, double b2) {

+ 0 - 26
WeiChat/src/main/java/com/xzjmyk/pm/activity/util/CalculateUtil.java

@@ -1,26 +0,0 @@
-package com.xzjmyk.pm.activity.util;
-
-/**
- * Created by gongpm on 2016/7/27.
- * 计算工具类
- */
-public class CalculateUtil {
-    private static CalculateUtil instance;
-
-    private CalculateUtil() {
-    }
-
-    public static CalculateUtil getInstance() {
-        if (instance == null) {
-            synchronized (CalculateUtil.class) {
-                instance = new CalculateUtil();
-            }
-        }
-        return instance;
-    }
-
-
-
-
-
-}

+ 0 - 109
WeiChat/src/main/java/com/xzjmyk/pm/activity/util/JsonUtils.java

@@ -1,109 +0,0 @@
-package com.xzjmyk.pm.activity.util;
-
-import org.json.JSONArray;
-import org.json.JSONObject;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 解析json
- * update gongpm 2016/07/27
- */
-public class JsonUtils {
-
-    /**
-     * 解析List<Map<String,String>>集合
-     *
-     * @param key
-     * @param json
-     * @return
-     */
-    public static List<Map<String, Object>> parseListKeyMaps(String key, String json) {
-        List<Map<String, Object>> list = new ArrayList<>();
-        try {
-            JSONObject jsonObject = new JSONObject(json);
-            JSONArray jsonArray = jsonObject.getJSONArray(key);
-            for (int i = 0; i < jsonArray.length(); i++) {
-                JSONObject jsonObject2 = jsonArray.getJSONObject(i);
-                Map<String, Object> map = new HashMap<>();
-                Iterator<String> iterator = jsonObject2.keys();
-                while (iterator.hasNext()) {
-                    String json_key = iterator.next();
-                    Object json_value = jsonObject2.get(json_key);
-                    if (json_value == null) {
-                        json_value = "";
-                    }
-                    map.put(json_key, json_value);
-                }
-                list.add(map);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return list;
-    }
-
-
-    /**
-     * 解析List<Map<String,String>>集合
-     *
-     * @param
-     * @param json
-     * @return
-     */
-    public static List<Map<String, String>> parseListMaps(String json) {
-        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
-        try {
-            JSONArray jsonArray = new JSONArray(json);
-            for (int i = 0; i < jsonArray.length(); i++) {
-                JSONObject jsonObject2 = jsonArray.getJSONObject(i);
-                Map<String, String> map = new HashMap<String, String>();
-                Iterator<String> iterator = jsonObject2.keys();
-                while (iterator.hasNext()) {
-                    String json_key = iterator.next();
-                    Object json_value = jsonObject2.get(json_key);
-                    if (json_value == null) {
-                        json_value = "";
-                    }
-                    map.put(json_key, "" + json_value);
-                }
-                list.add(map);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return list;
-    }
-
-
-    /**
-     * 解析map 集合
-     *
-     * @param key
-     * @param json
-     * @return
-     */
-    public static HashMap<String, String> parseMaps(String key, String json) {
-        HashMap<String, String> map = new HashMap<String, String>();
-        try {
-            JSONObject jsonObject = new JSONObject(json);
-            String string = jsonObject.getString(key);
-            JSONObject jsonObject2 = new JSONObject(string);
-            Iterator<String> iterator = jsonObject2.keys();
-            while (iterator.hasNext()) {
-                String json_key = iterator.next();
-                Object json_value = jsonObject2.get(json_key);
-                if (json_value == null) {
-                    json_value = "";
-                }
-                map.put(json_key, "" + json_value);
-            }
-        } catch (Exception e) {
-        }
-        return map;
-    }
-}

+ 6 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/util/PreferenceUtils.java

@@ -4,6 +4,8 @@ import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 
+import com.xzjmyk.pm.activity.MyApplication;
+
 /**
  * SharedPreferences存储数据类
  */
@@ -108,6 +110,10 @@ public class PreferenceUtils {
 		SharedPreferences sp = getPreferences(context);
 		return sp.getLong(key, defValue);
 	}
+	public static Long getLong( String key,long defValue){
+		SharedPreferences sp = getPreferences(MyApplication.getInstance());
+		return sp.getLong(key, defValue);
+	}
 	public static Long getLong(Context context,String key){
 		SharedPreferences sp = getPreferences(context);
 		return getLong(context, key, 1l);

+ 22 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/view/MostHeightLinearLayout.java

@@ -0,0 +1,22 @@
+package com.xzjmyk.pm.activity.view;
+
+import android.content.Context;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+/**
+ * Created by Bitliker on 2016/11/16.
+ */
+
+public class MostHeightLinearLayout extends LinearLayoutManager {
+    public MostHeightLinearLayout(Context context) {
+        super(context);
+    }
+
+    @Override
+    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {
+        heightSpec = View.MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, View.MeasureSpec.AT_MOST);//
+        super.onMeasure(recycler, state, widthSpec, heightSpec);
+    }
+}

+ 9 - 7
WeiChat/src/main/java/com/xzjmyk/pm/activity/xmpp/CoreService.java

@@ -4,9 +4,11 @@ import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.Service;
+import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.os.Binder;
 import android.os.IBinder;
 import android.support.v7.app.NotificationCompat;
@@ -35,6 +37,7 @@ public class CoreService extends Service {
     static final String TAG = "Xmpp CoreService";
     private static final Intent SERVICE_INTENT = new Intent();
 
+
     static {
         SERVICE_INTENT.setComponent(new ComponentName("com.xzjmyk.pm.activity",
                 "com.xzjmyk.pm.activity.xmpp.CoreService"));
@@ -70,7 +73,7 @@ public class CoreService extends Service {
     public void notificationMesage(ChatMessage chatMessage) {
         int messageType = chatMessage.getType();
         boolean isNotification = PreferenceUtils.getBoolean(getApplicationContext(), Constants.IS_NOTIFICATION);//进行通知
-        isNotification= CommonUtil.isBackground(getApplicationContext());
+        isNotification = CommonUtil.isBackground(getApplicationContext());
 //        if (!isNotification) {
 //            return;
 //        }
@@ -108,12 +111,12 @@ public class CoreService extends Service {
                 break;
         }
         NotificationManager mNotificationManager = null;
-        if(mNotificationManager==null){
-               mNotificationManager = (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);
+        if (mNotificationManager == null) {
+            mNotificationManager = (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);
         }
         NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
         String userId = chatMessage.getFromUserId();
-        Intent intent = new Intent(getApplicationContext(),MainActivity.class);
+        Intent intent = new Intent(getApplicationContext(), MainActivity.class);
         PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
         mBuilder.setContentIntent(pendingIntent);
         mBuilder.setContentTitle(chatMessage == null ? "新消息" : chatMessage.getFromUserName())//设置通知栏标题
@@ -122,7 +125,7 @@ public class CoreService extends Service {
                 .setTicker("您有一条新的信息..") //通知首次出现在通知栏,带上升动画效果的
                 .setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间
                 .setPriority(Notification.PRIORITY_DEFAULT) //设置该通知优先级
-                 .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消
+                .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消
                 .setOngoing(false)//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
                 .setDefaults(Notification.DEFAULT_ALL)
                 //向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合
@@ -152,6 +155,7 @@ public class CoreService extends Service {
     @Override
     public void onCreate() {
         super.onCreate();
+        IntentFilter filter = new IntentFilter("ALARMSERVICE_DESTROY");
         mSmackAndroid = SmackAndroid.init(this);
         mBinder = new CoreServiceBinder();
         if (CoreService.DEBUG) {
@@ -204,7 +208,6 @@ public class CoreService extends Service {
         if (CoreService.DEBUG) {
             Log.d(CoreService.TAG, "CoreService onDestroy");
         }
-        //		unregisterReceiver(broadcastReceiver);
     }
 
     private void release() {
@@ -212,7 +215,6 @@ public class CoreService extends Service {
             mConnectionManager.release();
             mConnectionManager = null;
         }
-
         mReceiptManager = null;
         mXChatManager = null;
         mXMucChatManager = null;

BIN
WeiChat/src/main/jniLibs/armeabi-v7a/libbdpush_V2_7.so


BIN
WeiChat/src/main/jniLibs/armeabi/libbdpush_V2_7.so


BIN
WeiChat/src/main/jniLibs/mips/libbdpush_V2_7.so


BIN
WeiChat/src/main/jniLibs/mips64/libbdpush_V2_7.so


BIN
WeiChat/src/main/jniLibs/pushservice-5.3.0.99.jar


BIN
WeiChat/src/main/jniLibs/x86/libbdpush_V2_7.so


BIN
WeiChat/src/main/jniLibs/x86_64/libbdpush_V2_7.so


+ 9 - 8
WeiChat/src/main/res/layout/act_staff_query_list.xml

@@ -2,12 +2,14 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true"
     android:orientation="vertical">
 
     <RelativeLayout
-        android:background="@drawable/bg_bar"
         android:layout_width="match_parent"
-        android:layout_height="50dp"
+        android:layout_height="48dp"
+        android:background="@drawable/bg_bar"
         android:orientation="horizontal"
         android:paddingBottom="5dp"
         android:paddingLeft="15dp"
@@ -16,16 +18,15 @@
 
         <com.xzjmyk.pm.activity.view.ClearEditText
             android:id="@+id/edt_search"
-            android:layout_width="fill_parent"
-            android:layout_height="fill_parent"
-            android:layout_centerHorizontal="true"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
             android:background="@drawable/search_input"
             android:drawableLeft="@drawable/search"
             android:drawableRight="@drawable/search_clear"
             android:hint="@string/search"
             android:textColor="@color/dark_grey"
             android:textColorHint="@color/grey"
-            android:textSize="15sp" />
+            android:textSize="15sp"/>
 
     </RelativeLayout>
     <com.xzjmyk.pm.activity.view.SuperSwipeRefreshLayout
@@ -52,7 +53,7 @@
 
                 <HorizontalScrollView
                     android:id="@+id/hv_head_view"
-                    android:layout_width="fill_parent"
+                    android:layout_width="match_parent"
                     android:layout_height="40dip"
                     android:background="#ffffff"
                     android:fadingEdge="none"
@@ -60,7 +61,7 @@
                     android:scrollbars="none">
 
                     <RelativeLayout
-                        android:layout_width="wrap_content"
+                        android:layout_width="match_parent"
                         android:layout_height="match_parent"
                        
                         android:layout_gravity="top">

+ 1 - 1
WeiChat/src/main/res/layout/activity_add_work_daily.xml

@@ -97,7 +97,7 @@
                         android:src="@drawable/icon_share"
                         android:layout_alignParentRight="true"
                         android:layout_marginTop="0dp"
-                        android:layout_marginRight="20dp"
+                        android:layout_marginRight="10dp"
                         android:background="@color/lightskyblue"
                         android:visibility="visible"
                         />

+ 13 - 0
WeiChat/src/main/res/layout/activity_subscription2.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/swiperefresh"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.xzjmyk.pm.activity.ui.message.Subscription2Activity">
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/recycler"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+</android.support.v4.widget.SwipeRefreshLayout>

+ 17 - 13
WeiChat/src/main/res/layout/bigimage_subscription.xml

@@ -8,14 +8,26 @@
         android:id="@+id/small_ll"
         android:layout_width="match_parent"
         android:layout_height="60dp"
+        android:orientation="horizontal"
         android:padding="3dp"
-        android:visibility="gone"
-        android:orientation="horizontal">
+        android:visibility="gone">
+
+        <TextView
+            android:id="@+id/isre_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignTop="@+id/small_img"
+            android:layout_toLeftOf="@+id/small_img"
+            android:maxLines="3"
+            android:padding="8dp"
+            android:textSize="14sp" />
 
         <TextView
             android:id="@+id/small_tv"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:layout_alignParentLeft="true"
+            android:layout_toLeftOf="@id/isre_tv"
             android:maxLines="3"
             android:padding="5dp"
             android:textSize="@dimen/text_main" />
@@ -25,21 +37,13 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
-            android:layout_toLeftOf="@+id/small_img"
+            android:layout_alignParentLeft="true"
+            android:layout_toLeftOf="@id/isre_tv"
             android:ellipsize="end"
             android:lines="1"
             android:padding="4dp"
             android:textSize="@dimen/text_min" />
 
-        <TextView
-            android:id="@+id/isre_tv"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignTop="@+id/small_img"
-            android:layout_toLeftOf="@+id/small_img"
-            android:maxLines="3"
-            android:padding="8dp"
-            android:textSize="14sp" />
 
         <ImageView
             android:id="@+id/small_img"
@@ -90,9 +94,9 @@
             android:id="@+id/big_isre_tv"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
             android:layout_alignParentRight="true"
             android:layout_margin="10dp"
-            android:layout_alignParentBottom="true"
             android:layout_marginBottom="5dp"
             android:textSize="@dimen/text_hine" />
     </RelativeLayout>

+ 12 - 4
WeiChat/src/main/res/layout/fragment_contact.xml

@@ -3,7 +3,7 @@
     android:layout_height="match_parent"
     android:background="@drawable/bg_main">
 
-    <com.handmark.pulltorefresh.library.PullToRefreshListView xmlns:ptr="http://schemas.android.com/apk/res-auto"
+    <!--<com.handmark.pulltorefresh.library.PullToRefreshListView xmlns:ptr="http://schemas.android.com/apk/res-auto"
         android:id="@+id/pull_refresh_list"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
@@ -17,9 +17,17 @@
         ptr:ptrMode="both"
         ptr:ptrOverScroll="false"
         ptr:ptrScrollingWhileRefreshingEnabled="true"
-        ptr:ptrShowIndicator="false" />
-
-
+        ptr:ptrShowIndicator="false"
+        android:visibility="gone"/>-->
+    <com.yalantis.phoenix.PullToRefreshView
+        android:id="@+id/contact_ptrv"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+        <se.emilsjolander.stickylistheaders.StickyListHeadersListView
+            android:id="@+id/pull_refresh_list"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+    </com.yalantis.phoenix.PullToRefreshView>
     <TextView
         android:id="@+id/text_dialog"
         android:layout_width="80.0dip"

+ 43 - 0
WeiChat/src/main/res/layout/fragment_contact_friend.xml

@@ -0,0 +1,43 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@drawable/bg_main">
+
+    <com.handmark.pulltorefresh.library.PullToRefreshListView xmlns:ptr="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/pull_refresh_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:divider="#00000000"
+        android:dividerHeight="0dip"
+        android:listSelector="@android:color/transparent"
+        ptr:ptrAnimationStyle="flip"
+        ptr:ptrDrawableEnd="@drawable/default_ptr_rotate"
+        ptr:ptrDrawableStart="@drawable/default_ptr_flip"
+        ptr:ptrHeaderTextColor="@color/refresh"
+        ptr:ptrMode="both"
+        ptr:ptrOverScroll="false"
+        ptr:ptrScrollingWhileRefreshingEnabled="true"
+        ptr:ptrShowIndicator="false" />
+
+
+    <TextView
+        android:id="@+id/text_dialog"
+        android:layout_width="80.0dip"
+        android:layout_height="80.0dip"
+        android:layout_centerInParent="true"
+        android:layout_gravity="center"
+        android:background="@color/black_trans_99"
+        android:gravity="center"
+        android:textColor="#ffffffff"
+        android:textSize="30.0dip"
+        android:visibility="invisible" />
+
+     <com.xzjmyk.pm.activity.sortlist.SideBar
+        android:id="@+id/sidebar"
+        android:layout_width="30.0dip"
+        android:layout_height="match_parent"
+        android:layout_alignParentRight="true"
+        android:layout_gravity="right|center"
+        android:layout_marginBottom="10dp"
+        android:layout_marginTop="120dp" />
+</RelativeLayout>

+ 12 - 2
WeiChat/src/main/res/layout/fragment_me.xml

@@ -41,14 +41,24 @@
                     android:textColor="@color/text_main"
                     android:textSize="@dimen/text_main" />
 
+                <ImageView
+                    android:id="@id/tag"
+                    android:layout_width="@dimen/next_width"
+                    android:layout_height="@dimen/next_height"
+                    android:layout_alignParentRight="true"
+                    android:layout_centerVertical="true"
+                    android:layout_marginRight="8dp"
+                    android:background="@drawable/oa_next"
+                    android:contentDescription="@string/app_name" />
+
                 <TextView
                     android:id="@+id/phone_number_tv"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_alignParentRight="true"
                     android:layout_centerVertical="true"
+                    android:layout_toLeftOf="@id/tag"
                     android:drawablePadding="10dp"
-                    android:drawableRight="@drawable/oa_next"
+                    android:layout_marginRight="5dp"
                     android:textColor="@color/text_hine"
                     android:textSize="@dimen/text_hine" />
 

+ 22 - 0
WeiChat/src/main/res/layout/layout_head.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.5px"
+        android:background="@color/gray_light"/>
+    <TextView
+        android:id="@+id/head"
+        android:layout_width="match_parent"
+        android:layout_height="30dp"
+        android:background="#faf9f9"
+        android:paddingLeft="10dp"
+        android:gravity="center_vertical"/>
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.5px"
+        android:background="@color/gray_light"/>
+</LinearLayout>

+ 1 - 0
WeiChat/src/main/res/values/strings.xml

@@ -18,6 +18,7 @@
     </string-array>
     <string name="add_summed">请添加工作总结(必填项)!</string>
     <string name="change_mobile_ok">申请变更成功,待系统审批完即可正常打卡!</string>
+    <string name="outoff_work">系统检测到您已离开办公区域</string>
     <string name="submit">提交</string>
     <string name="unoffice"><u>地点微调</u></string>
     <string name="change_mobile">手机变更单</string>

+ 1 - 0
library-refreshlayout/.gitignore

@@ -0,0 +1 @@
+/build

+ 23 - 0
library-refreshlayout/build.gradle

@@ -0,0 +1,23 @@
+apply plugin: 'com.android.library'
+
+android {
+    compileSdkVersion 23
+    buildToolsVersion '23.0.2'
+
+    defaultConfig {
+        minSdkVersion 9
+        targetSdkVersion 23
+        versionCode 8
+        versionName "1.2.3"
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
+
+dependencies {
+    compile fileTree(dir: 'libs', include: ['*.jar'])
+    compile 'com.android.support:support-v4:23.1.1'
+}
+

+ 3 - 0
library-refreshlayout/gradle.properties

@@ -0,0 +1,3 @@
+POM_NAME=Phoenix
+POM_ARTIFACT_ID=phoenix
+POM_PACKAGING=aar

+ 17 - 0
library-refreshlayout/proguard-rules.pro

@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/baoyz/Developer/Android/sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}

+ 1 - 0
library-refreshlayout/src/main/AndroidManifest.xml

@@ -0,0 +1 @@
+<manifest package="com.yalantis.phoenix"/>

+ 425 - 0
library-refreshlayout/src/main/java/com/yalantis/phoenix/PullToRefreshView.java

@@ -0,0 +1,425 @@
+package com.yalantis.phoenix;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.support.annotation.NonNull;
+import android.support.v4.view.MotionEventCompat;
+import android.support.v4.view.ViewCompat;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.animation.Animation;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.Interpolator;
+import android.view.animation.Transformation;
+import android.widget.AbsListView;
+import android.widget.ImageView;
+
+import com.yalantis.phoenix.refresh_view.BaseRefreshView;
+import com.yalantis.phoenix.refresh_view.SunRefreshView;
+import com.yalantis.phoenix.util.Utils;
+
+import java.security.InvalidParameterException;
+
+public class PullToRefreshView extends ViewGroup {
+
+    private static final int DRAG_MAX_DISTANCE = 50;
+    private static final float DRAG_RATE = .5f;
+    private static final float DECELERATE_INTERPOLATION_FACTOR = 2f;
+
+    public static final int STYLE_SUN = 0;
+    public static final int MAX_OFFSET_ANIMATION_DURATION = 700;
+
+    private static final int INVALID_POINTER = -1;
+
+    private View mTarget;
+    private ImageView mRefreshView;
+    private Interpolator mDecelerateInterpolator;
+    private int mTouchSlop;
+    private int mTotalDragDistance;
+    private BaseRefreshView mBaseRefreshView;
+    private float mCurrentDragPercent;
+    private int mCurrentOffsetTop;
+    private boolean mRefreshing;
+    private int mActivePointerId;
+    private boolean mIsBeingDragged;
+    private float mInitialMotionY;
+    private int mFrom;
+    private float mFromDragPercent;
+    private boolean mNotify;
+    private OnRefreshListener mListener;
+
+    private int mTargetPaddingTop;
+    private int mTargetPaddingBottom;
+    private int mTargetPaddingRight;
+    private int mTargetPaddingLeft;
+
+    public PullToRefreshView(Context context) {
+        this(context, null);
+    }
+
+    public PullToRefreshView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RefreshView);
+        final int type = a.getInteger(R.styleable.RefreshView_type, STYLE_SUN);
+        a.recycle();
+
+        mDecelerateInterpolator = new DecelerateInterpolator(DECELERATE_INTERPOLATION_FACTOR);
+        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
+        mTotalDragDistance = Utils.convertDpToPixel(context, DRAG_MAX_DISTANCE);
+
+        mRefreshView = new ImageView(context);
+
+        setRefreshStyle(type);
+
+        addView(mRefreshView);
+
+        setWillNotDraw(false);
+        ViewCompat.setChildrenDrawingOrderEnabled(this, true);
+    }
+
+    public void setRefreshStyle(int type) {
+        setRefreshing(false);
+        switch (type) {
+            case STYLE_SUN:
+                mBaseRefreshView = new SunRefreshView(getContext(), this);
+                break;
+            default:
+                throw new InvalidParameterException("Type does not exist");
+        }
+        mRefreshView.setImageDrawable(mBaseRefreshView);
+    }
+
+    /**
+     * This method sets padding for the refresh (progress) view.
+     */
+    public void setRefreshViewPadding(int left, int top, int right, int bottom) {
+        mRefreshView.setPadding(left, top, right, bottom);
+    }
+
+    public int getTotalDragDistance() {
+        return mTotalDragDistance;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+        ensureTarget();
+        if (mTarget == null)
+            return;
+
+        widthMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth() - getPaddingRight() - getPaddingLeft(), MeasureSpec.EXACTLY);
+        heightMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight() - getPaddingTop() - getPaddingBottom(), MeasureSpec.EXACTLY);
+        mTarget.measure(widthMeasureSpec, heightMeasureSpec);
+        mRefreshView.measure(widthMeasureSpec, heightMeasureSpec);
+    }
+
+    private void ensureTarget() {
+        if (mTarget != null)
+            return;
+        if (getChildCount() > 0) {
+            for (int i = 0; i < getChildCount(); i++) {
+                View child = getChildAt(i);
+                if (child != mRefreshView) {
+                    mTarget = child;
+                    mTargetPaddingBottom = mTarget.getPaddingBottom();
+                    mTargetPaddingLeft = mTarget.getPaddingLeft();
+                    mTargetPaddingRight = mTarget.getPaddingRight();
+                    mTargetPaddingTop = mTarget.getPaddingTop();
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+
+        if (!isEnabled() || canChildScrollUp() || mRefreshing) {
+            return false;
+        }
+
+        final int action = MotionEventCompat.getActionMasked(ev);
+
+        switch (action) {
+            case MotionEvent.ACTION_DOWN:
+                setTargetOffsetTop(0, true);
+                mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
+                mIsBeingDragged = false;
+                final float initialMotionY = getMotionEventY(ev, mActivePointerId);
+                if (initialMotionY == -1) {
+                    return false;
+                }
+                mInitialMotionY = initialMotionY;
+                break;
+            case MotionEvent.ACTION_MOVE:
+                if (mActivePointerId == INVALID_POINTER) {
+                    return false;
+                }
+                final float y = getMotionEventY(ev, mActivePointerId);
+                if (y == -1) {
+                    return false;
+                }
+                final float yDiff = y - mInitialMotionY;
+                if (yDiff > mTouchSlop && !mIsBeingDragged) {
+                    mIsBeingDragged = true;
+                }
+                break;
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL:
+                mIsBeingDragged = false;
+                mActivePointerId = INVALID_POINTER;
+                break;
+            case MotionEventCompat.ACTION_POINTER_UP:
+                onSecondaryPointerUp(ev);
+                break;
+        }
+
+        return mIsBeingDragged;
+    }
+
+    @Override
+    public boolean onTouchEvent(@NonNull MotionEvent ev) {
+
+        if (!mIsBeingDragged) {
+            return super.onTouchEvent(ev);
+        }
+
+        final int action = MotionEventCompat.getActionMasked(ev);
+
+        switch (action) {
+            case MotionEvent.ACTION_MOVE: {
+                final int pointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId);
+                if (pointerIndex < 0) {
+                    return false;
+                }
+
+                final float y = MotionEventCompat.getY(ev, pointerIndex);
+                final float yDiff = y - mInitialMotionY;
+                final float scrollTop = yDiff * DRAG_RATE;
+                mCurrentDragPercent = scrollTop / mTotalDragDistance;
+                if (mCurrentDragPercent < 0) {
+                    return false;
+                }
+                float boundedDragPercent = Math.min(1f, Math.abs(mCurrentDragPercent));
+                float extraOS = Math.abs(scrollTop) - mTotalDragDistance;
+                float slingshotDist = mTotalDragDistance;
+                float tensionSlingshotPercent = Math.max(0,
+                        Math.min(extraOS, slingshotDist * 2) / slingshotDist);
+                float tensionPercent = (float) ((tensionSlingshotPercent / 4) - Math.pow(
+                        (tensionSlingshotPercent / 4), 2)) * 2f;
+                float extraMove = (slingshotDist) * tensionPercent / 2;
+                int targetY = (int) ((slingshotDist * boundedDragPercent) + extraMove);
+
+                mBaseRefreshView.setPercent(mCurrentDragPercent, true);
+                setTargetOffsetTop(targetY - mCurrentOffsetTop, true);
+                break;
+            }
+            case MotionEventCompat.ACTION_POINTER_DOWN:
+                final int index = MotionEventCompat.getActionIndex(ev);
+                mActivePointerId = MotionEventCompat.getPointerId(ev, index);
+                break;
+            case MotionEventCompat.ACTION_POINTER_UP:
+                onSecondaryPointerUp(ev);
+                break;
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL: {
+                if (mActivePointerId == INVALID_POINTER) {
+                    return false;
+                }
+                final int pointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId);
+                final float y = MotionEventCompat.getY(ev, pointerIndex);
+                final float overScrollTop = (y - mInitialMotionY) * DRAG_RATE;
+                mIsBeingDragged = false;
+                if (overScrollTop > mTotalDragDistance) {
+                    setRefreshing(true, true);
+                } else {
+                    mRefreshing = false;
+                    animateOffsetToStartPosition();
+                }
+                mActivePointerId = INVALID_POINTER;
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private void animateOffsetToStartPosition() {
+        mFrom = mCurrentOffsetTop;
+        mFromDragPercent = mCurrentDragPercent;
+        long animationDuration = Math.abs((long) (MAX_OFFSET_ANIMATION_DURATION * mFromDragPercent));
+
+        mAnimateToStartPosition.reset();
+        mAnimateToStartPosition.setDuration(animationDuration);
+        mAnimateToStartPosition.setInterpolator(mDecelerateInterpolator);
+        mAnimateToStartPosition.setAnimationListener(mToStartListener);
+        mRefreshView.clearAnimation();
+        mRefreshView.startAnimation(mAnimateToStartPosition);
+    }
+
+    private void animateOffsetToCorrectPosition() {
+        mFrom = mCurrentOffsetTop;
+        mFromDragPercent = mCurrentDragPercent;
+
+        mAnimateToCorrectPosition.reset();
+        mAnimateToCorrectPosition.setDuration(MAX_OFFSET_ANIMATION_DURATION);
+        mAnimateToCorrectPosition.setInterpolator(mDecelerateInterpolator);
+        mRefreshView.clearAnimation();
+        mRefreshView.startAnimation(mAnimateToCorrectPosition);
+
+        if (mRefreshing) {
+            mBaseRefreshView.start();
+            if (mNotify) {
+                if (mListener != null) {
+                    mListener.onRefresh();
+                }
+            }
+        } else {
+            mBaseRefreshView.stop();
+            animateOffsetToStartPosition();
+        }
+        mCurrentOffsetTop = mTarget.getTop();
+        mTarget.setPadding(mTargetPaddingLeft, mTargetPaddingTop, mTargetPaddingRight, mTotalDragDistance);
+    }
+
+    private final Animation mAnimateToStartPosition = new Animation() {
+        @Override
+        public void applyTransformation(float interpolatedTime, Transformation t) {
+            moveToStart(interpolatedTime);
+        }
+    };
+
+    private final Animation mAnimateToCorrectPosition = new Animation() {
+        @Override
+        public void applyTransformation(float interpolatedTime, Transformation t) {
+            int targetTop;
+            int endTarget = mTotalDragDistance;
+            targetTop = (mFrom + (int) ((endTarget - mFrom) * interpolatedTime));
+            int offset = targetTop - mTarget.getTop();
+
+            mCurrentDragPercent = mFromDragPercent - (mFromDragPercent - 1.0f) * interpolatedTime;
+            mBaseRefreshView.setPercent(mCurrentDragPercent, false);
+
+            setTargetOffsetTop(offset, false /* requires update */);
+        }
+    };
+
+    private void moveToStart(float interpolatedTime) {
+        int targetTop = mFrom - (int) (mFrom * interpolatedTime);
+        float targetPercent = mFromDragPercent * (1.0f - interpolatedTime);
+        int offset = targetTop - mTarget.getTop();
+
+        mCurrentDragPercent = targetPercent;
+        mBaseRefreshView.setPercent(mCurrentDragPercent, true);
+        mTarget.setPadding(mTargetPaddingLeft, mTargetPaddingTop, mTargetPaddingRight, mTargetPaddingBottom + targetTop);
+        setTargetOffsetTop(offset, false);
+    }
+
+    public void setRefreshing(boolean refreshing) {
+        if (mRefreshing != refreshing) {
+            setRefreshing(refreshing, false /* notify */);
+        }
+    }
+
+    private void setRefreshing(boolean refreshing, final boolean notify) {
+        if (mRefreshing != refreshing) {
+            mNotify = notify;
+            ensureTarget();
+            mRefreshing = refreshing;
+            if (mRefreshing) {
+                mBaseRefreshView.setPercent(1f, true);
+                animateOffsetToCorrectPosition();
+            } else {
+                animateOffsetToStartPosition();
+            }
+        }
+    }
+
+    private Animation.AnimationListener mToStartListener = new Animation.AnimationListener() {
+        @Override
+        public void onAnimationStart(Animation animation) {
+        }
+
+        @Override
+        public void onAnimationRepeat(Animation animation) {
+        }
+
+        @Override
+        public void onAnimationEnd(Animation animation) {
+            mBaseRefreshView.stop();
+            mCurrentOffsetTop = mTarget.getTop();
+        }
+    };
+
+    private void onSecondaryPointerUp(MotionEvent ev) {
+        final int pointerIndex = MotionEventCompat.getActionIndex(ev);
+        final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
+        if (pointerId == mActivePointerId) {
+            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
+            mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
+        }
+    }
+
+    private float getMotionEventY(MotionEvent ev, int activePointerId) {
+        final int index = MotionEventCompat.findPointerIndex(ev, activePointerId);
+        if (index < 0) {
+            return -1;
+        }
+        return MotionEventCompat.getY(ev, index);
+    }
+
+    private void setTargetOffsetTop(int offset, boolean requiresUpdate) {
+        mTarget.offsetTopAndBottom(offset);
+        mBaseRefreshView.offsetTopAndBottom(offset);
+        mCurrentOffsetTop = mTarget.getTop();
+        if (requiresUpdate && android.os.Build.VERSION.SDK_INT < 11) {
+            invalidate();
+        }
+    }
+
+    private boolean canChildScrollUp() {
+        if (android.os.Build.VERSION.SDK_INT < 14) {
+            if (mTarget instanceof AbsListView) {
+                final AbsListView absListView = (AbsListView) mTarget;
+                return absListView.getChildCount() > 0
+                        && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
+                        .getTop() < absListView.getPaddingTop());
+            } else {
+                return mTarget.getScrollY() > 0;
+            }
+        } else {
+            return ViewCompat.canScrollVertically(mTarget, -1);
+        }
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+
+        ensureTarget();
+        if (mTarget == null)
+            return;
+
+        int height = getMeasuredHeight();
+        int width = getMeasuredWidth();
+        int left = getPaddingLeft();
+        int top = getPaddingTop();
+        int right = getPaddingRight();
+        int bottom = getPaddingBottom();
+
+        mTarget.layout(left, top + mCurrentOffsetTop, left + width - right, top + height - bottom + mCurrentOffsetTop);
+        mRefreshView.layout(left, top, left + width - right, top + height - bottom);
+    }
+
+    public void setOnRefreshListener(OnRefreshListener listener) {
+        mListener = listener;
+    }
+
+    public interface OnRefreshListener {
+        void onRefresh();
+    }
+
+}
+

+ 81 - 0
library-refreshlayout/src/main/java/com/yalantis/phoenix/refresh_view/BaseRefreshView.java

@@ -0,0 +1,81 @@
+package com.yalantis.phoenix.refresh_view;
+
+import android.content.Context;
+import android.graphics.ColorFilter;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.NonNull;
+
+import com.yalantis.phoenix.PullToRefreshView;
+
+public abstract class BaseRefreshView extends Drawable implements Drawable.Callback, Animatable {
+
+    private PullToRefreshView mRefreshLayout;
+    private boolean mEndOfRefreshing;
+
+    public BaseRefreshView(Context context, PullToRefreshView layout) {
+        mRefreshLayout = layout;
+    }
+
+    public Context getContext() {
+        return mRefreshLayout != null ? mRefreshLayout.getContext() : null;
+    }
+
+    public PullToRefreshView getRefreshLayout() {
+        return mRefreshLayout;
+    }
+
+    public abstract void setPercent(float percent, boolean invalidate);
+
+    public abstract void offsetTopAndBottom(int offset);
+
+    @Override
+    public void invalidateDrawable(@NonNull Drawable who) {
+        final Callback callback = getCallback();
+        if (callback != null) {
+            callback.invalidateDrawable(this);
+        }
+    }
+
+    @Override
+    public void scheduleDrawable(Drawable who, Runnable what, long when) {
+        final Callback callback = getCallback();
+        if (callback != null) {
+            callback.scheduleDrawable(this, what, when);
+        }
+    }
+
+    @Override
+    public void unscheduleDrawable(Drawable who, Runnable what) {
+        final Callback callback = getCallback();
+        if (callback != null) {
+            callback.unscheduleDrawable(this, what);
+        }
+    }
+
+    @Override
+    public int getOpacity() {
+        return PixelFormat.TRANSLUCENT;
+    }
+
+    @Override
+    public void setAlpha(int alpha) {
+
+    }
+
+    @Override
+    public void setColorFilter(ColorFilter cf) {
+
+    }
+
+    /**
+     * Our animation depend on type of current work of refreshing.
+     * We should to do different things when it's end of refreshing
+     *
+     * @param endOfRefreshing - we will check current state of refresh with this
+     */
+    public void setEndOfRefreshing(boolean endOfRefreshing) {
+        mEndOfRefreshing = endOfRefreshing;
+    }
+}

+ 333 - 0
library-refreshlayout/src/main/java/com/yalantis/phoenix/refresh_view/SunRefreshView.java

@@ -0,0 +1,333 @@
+package com.yalantis.phoenix.refresh_view;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.Typeface;
+import android.graphics.drawable.Animatable;
+import android.view.animation.Animation;
+import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
+import android.view.animation.Transformation;
+
+import com.yalantis.phoenix.PullToRefreshView;
+import com.yalantis.phoenix.R;
+import com.yalantis.phoenix.util.Utils;
+
+/**
+ * Created by Oleksii Shliama on 22/12/2014.
+ * https://dribbble.com/shots/1650317-Pull-to-Refresh-Rentals
+ */
+public class SunRefreshView extends BaseRefreshView implements Animatable {
+
+    private static final float SCALE_START_PERCENT = 0.5f;
+    private static final int ANIMATION_DURATION = 1000;
+
+    private final static float SKY_RATIO = 0.65f;
+    private static final float SKY_INITIAL_SCALE = 1.05f;
+
+    private final static float TOWN_RATIO = 0.22f;
+    private static final float TOWN_INITIAL_SCALE = 1.20f;
+    private static final float TOWN_FINAL_SCALE = 1.30f;
+
+    private static final float SUN_FINAL_SCALE = 0.75f;
+    private static final float SUN_INITIAL_ROTATE_GROWTH = 1.2f;
+    private static final float SUN_FINAL_ROTATE_GROWTH = 1.5f;
+
+    private static final Interpolator LINEAR_INTERPOLATOR = new LinearInterpolator();
+
+    private PullToRefreshView mParent;
+    private Matrix mMatrix;
+    private Animation mAnimation;
+
+    private int mTop;
+    private int mScreenWidth;
+
+    private int mSkyHeight;
+    private float mSkyTopOffset;
+    private float mSkyMoveOffset;
+
+    private int mTownHeight;
+    private float mTownInitialTopOffset;
+    private float mTownFinalTopOffset;
+    private float mTownMoveOffset;
+
+    private int mSunSize = 30;
+    private float mSunLeftOffset;
+    private float mSunTopOffset;
+
+    private float mPercent = 0.0f;
+    private float mRotate = 0.0f;
+
+    private Bitmap mSky;
+    private Bitmap mSun;
+    private Bitmap mTown;
+
+    private boolean isRefreshing = false;
+
+    public SunRefreshView(Context context, final PullToRefreshView parent) {
+        super(context, parent);
+        mParent = parent;
+        mMatrix = new Matrix();
+
+        setupAnimations();
+        parent.post(new Runnable() {
+            @Override
+            public void run() {
+                initiateDimens(parent.getWidth());
+            }
+        });
+    }
+
+    public void initiateDimens(int viewWidth) {
+        if (viewWidth <= 0 || viewWidth == mScreenWidth) return;
+
+        mScreenWidth = viewWidth;
+        mSkyHeight = (int) (SKY_RATIO * mScreenWidth);
+        mSkyTopOffset = (mSkyHeight * 0.38f);
+        mSkyMoveOffset = Utils.convertDpToPixel(getContext(), 15);
+
+//        mTownHeight = (int) (TOWN_RATIO * mScreenWidth);
+        mTownHeight = mParent.getTotalDragDistance();
+
+        mTownInitialTopOffset = (mParent.getTotalDragDistance() - mTownHeight * TOWN_INITIAL_SCALE);
+        mTownFinalTopOffset = (mParent.getTotalDragDistance() - mTownHeight * TOWN_FINAL_SCALE);
+        mTownMoveOffset = Utils.convertDpToPixel(getContext(), 10);
+
+        mSunLeftOffset = 0.3f * (float) mScreenWidth;
+        mSunTopOffset = (mParent.getTotalDragDistance() * 0.2f);
+
+        mTop = -mParent.getTotalDragDistance();
+
+        createBitmaps();
+    }
+
+    private void createBitmaps() {
+        final BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inPreferredConfig = Bitmap.Config.RGB_565;
+
+        mSky = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.sky, options);
+        mSky = Bitmap.createScaledBitmap(mSky, mScreenWidth, mSkyHeight, true);
+        mTown = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.buildings, options);
+        mTown = Bitmap.createScaledBitmap(mTown, mScreenWidth, (int) (mScreenWidth * TOWN_RATIO), true);
+        mSun = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.sun, options);
+        mSun = Bitmap.createScaledBitmap(mSun, sp2px(getContext(), mSunSize), sp2px(getContext(), mSunSize), true);
+    }
+
+    @Override
+    public void setPercent(float percent, boolean invalidate) {
+        setPercent(percent);
+        if (invalidate) setRotate(percent);
+    }
+
+    @Override
+    public void offsetTopAndBottom(int offset) {
+        mTop += offset;
+        invalidateSelf();
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+        if (mScreenWidth <= 0) return;
+
+        final int saveCount = canvas.save();
+
+        canvas.translate(0, mTop);
+        canvas.clipRect(0, -mTop, mScreenWidth, mParent.getTotalDragDistance());
+
+        drawSky(canvas);
+        drawTown(canvas);
+        drawSun(canvas);
+
+        canvas.restoreToCount(saveCount);
+    }
+
+    private void drawSky(Canvas canvas) {
+        Matrix matrix = mMatrix;
+        matrix.reset();
+
+        float dragPercent = Math.min(1f, Math.abs(mPercent));
+
+        float skyScale;
+        float scalePercentDelta = dragPercent - SCALE_START_PERCENT;
+        if (scalePercentDelta > 0) {
+            /** Change skyScale between {@link #SKY_INITIAL_SCALE} and 1.0f depending on {@link #mPercent} */
+            float scalePercent = scalePercentDelta / (1.0f - SCALE_START_PERCENT);
+            skyScale = SKY_INITIAL_SCALE - (SKY_INITIAL_SCALE - 1.0f) * scalePercent;
+        } else {
+            skyScale = SKY_INITIAL_SCALE;
+        }
+
+        float offsetX = -(mScreenWidth * skyScale - mScreenWidth) / 2.0f;
+        float offsetY = (1.0f - dragPercent) * mParent.getTotalDragDistance() - mSkyTopOffset // Offset canvas moving
+                - mSkyHeight * (skyScale - 1.0f) / 2 // Offset sky scaling
+                + mSkyMoveOffset * dragPercent; // Give it a little move top -> bottom
+
+        matrix.postScale(skyScale, skyScale);
+        matrix.postTranslate(offsetX, offsetY);
+        canvas.drawBitmap(mSky, matrix, null);
+    }
+
+    private void drawTown(Canvas canvas) {
+        Matrix matrix = mMatrix;
+        matrix.reset();
+
+        float dragPercent = Math.min(1f, Math.abs(mPercent));
+
+        float townScale;
+        float townTopOffset;
+        float townMoveOffset;
+        float scalePercentDelta = dragPercent - SCALE_START_PERCENT;
+        if (scalePercentDelta > 0) {
+            /**
+             * Change townScale between {@link #TOWN_INITIAL_SCALE} and {@link #TOWN_FINAL_SCALE} depending on {@link #mPercent}
+             * Change townTopOffset between {@link #mTownInitialTopOffset} and {@link #mTownFinalTopOffset} depending on {@link #mPercent}
+             */
+            float scalePercent = scalePercentDelta / (1.0f - SCALE_START_PERCENT);
+            townScale = TOWN_INITIAL_SCALE + (TOWN_FINAL_SCALE - TOWN_INITIAL_SCALE) * scalePercent;
+            townTopOffset = mTownInitialTopOffset - (mTownFinalTopOffset - mTownInitialTopOffset) * scalePercent;
+            townMoveOffset = mTownMoveOffset * (1.0f - scalePercent);
+        } else {
+            float scalePercent = dragPercent / SCALE_START_PERCENT;
+            townScale = TOWN_INITIAL_SCALE;
+            townTopOffset = mTownInitialTopOffset;
+            townMoveOffset = mTownMoveOffset * scalePercent;
+        }
+
+        float offsetX = -(mScreenWidth * townScale - mScreenWidth) / 2.0f;
+        float offsetY = (1.0f - dragPercent) * mParent.getTotalDragDistance() // Offset canvas moving
+                + townTopOffset
+                - mTownHeight * (townScale - 1.0f) / 2 // Offset town scaling
+                + townMoveOffset; // Give it a little move
+
+        matrix.postScale(townScale, townScale);
+        matrix.postTranslate(offsetX, offsetY);
+
+//        canvas.drawBitmap(mTown, matrix, null);
+        Paint paint = new Paint();
+        paint.setColor(Color.BLACK);
+        paint.setAntiAlias(true);
+        paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
+        paint.setTextSize(sp2px(getContext(), 14));
+        if (isRefreshing)
+            canvas.drawText("正在刷新", mScreenWidth / 2 - paint.measureText("正在刷新") / 2, mParent.getTotalDragDistance() / 2 + 12, paint);
+        else
+            canvas.drawText("下拉刷新", mScreenWidth / 2 - paint.measureText("下拉刷新") / 2, mParent.getTotalDragDistance() / 2 + 12, paint);
+
+    }
+
+    public static int sp2px(Context context, float spValue) {
+        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
+        return (int) (spValue * fontScale + 0.5f);
+    }
+
+
+    private void drawSun(Canvas canvas) {
+        Matrix matrix = mMatrix;
+        matrix.reset();
+
+        float dragPercent = mPercent;
+        if (dragPercent > 1.0f) { // Slow down if pulling over set height
+            dragPercent = (dragPercent + 9.0f) / 10;
+        }
+
+        float sunRadius = (float) sp2px(getContext(), mSunSize) / 2.0f;
+        float sunRotateGrowth = SUN_INITIAL_ROTATE_GROWTH;
+
+        float offsetX = mSunLeftOffset;
+        float offsetY = mSunTopOffset
+                + (mParent.getTotalDragDistance() / 2) * (1.0f - dragPercent) // Move the sun up
+                - mTop; // Depending on Canvas position
+
+        float scalePercentDelta = dragPercent - SCALE_START_PERCENT;
+        /*if (scalePercentDelta > 0) {
+            float scalePercent = scalePercentDelta / (1.0f - SCALE_START_PERCENT);
+            float sunScale = 1.0f - (1.0f - SUN_FINAL_SCALE) * scalePercent;
+            sunRotateGrowth += (SUN_FINAL_ROTATE_GROWTH - SUN_INITIAL_ROTATE_GROWTH) * scalePercent;
+
+            matrix.preTranslate(offsetX + (sunRadius - sunRadius * sunScale), offsetY * (2.0f - sunScale));
+            matrix.preScale(sunScale, sunScale);
+
+            offsetX += sunRadius;
+            offsetY = offsetY * (2.0f - sunScale) + sunRadius * sunScale;
+        } else {
+            matrix.postTranslate(offsetX, offsetY);
+
+            offsetX += sunRadius;
+            offsetY += sunRadius;
+        }*/
+
+//        matrix.postRotate(
+//                (isRefreshing ? 360 : -360) * mRotate * (isRefreshing ? 1 : sunRotateGrowth),
+//                offsetX,
+//                offsetY);
+        matrix.setTranslate(60, 25);
+        matrix.postRotate(
+                (isRefreshing ? 360 : -360) * mRotate * (isRefreshing ? 1 : sunRotateGrowth),
+                60 + sunRadius,
+                25 + sunRadius);
+        canvas.drawBitmap(mSun, matrix, null);
+    }
+
+    public void setPercent(float percent) {
+        mPercent = percent;
+    }
+
+    public void setRotate(float rotate) {
+        mRotate = rotate;
+        invalidateSelf();
+    }
+
+    public void resetOriginals() {
+        setPercent(0);
+        setRotate(0);
+    }
+
+    @Override
+    protected void onBoundsChange(Rect bounds) {
+        super.onBoundsChange(bounds);
+    }
+
+    @Override
+    public void setBounds(int left, int top, int right, int bottom) {
+        super.setBounds(left, top, right, mSkyHeight + top);
+    }
+
+    @Override
+    public boolean isRunning() {
+        return false;
+    }
+
+    @Override
+    public void start() {
+        mAnimation.reset();
+        isRefreshing = true;
+        mParent.startAnimation(mAnimation);
+    }
+
+    @Override
+    public void stop() {
+        mParent.clearAnimation();
+        isRefreshing = false;
+        resetOriginals();
+    }
+
+    private void setupAnimations() {
+        mAnimation = new Animation() {
+            @Override
+            public void applyTransformation(float interpolatedTime, Transformation t) {
+                setRotate(interpolatedTime);
+            }
+        };
+        mAnimation.setRepeatCount(Animation.INFINITE);
+        mAnimation.setRepeatMode(Animation.RESTART);
+        mAnimation.setInterpolator(LINEAR_INTERPOLATOR);
+        mAnimation.setDuration(ANIMATION_DURATION);
+    }
+
+}

+ 101 - 0
library-refreshlayout/src/main/java/com/yalantis/phoenix/util/Logger.java

@@ -0,0 +1,101 @@
+package com.yalantis.phoenix.util;
+
+import android.text.TextUtils;
+
+public final class Logger {
+
+    private static final String TAG = "Phoenix";
+
+    /**
+     * Set true or false if you want read logs or not
+     */
+    private static boolean logEnabled_d = false;
+    private static boolean logEnabled_i = false;
+    private static boolean logEnabled_e = false;
+
+    public static void d() {
+        if (logEnabled_d) {
+            android.util.Log.v(TAG, getLocation());
+        }
+    }
+
+    public static void d(String msg) {
+        if (logEnabled_d) {
+            android.util.Log.v(TAG, getLocation() + msg);
+        }
+    }
+
+    public static void i(String msg) {
+        if (logEnabled_i) {
+            android.util.Log.i(TAG, getLocation() + msg);
+        }
+    }
+
+    public static void i() {
+        if (logEnabled_i) {
+            android.util.Log.i(TAG, getLocation());
+        }
+    }
+
+    public static void e(String msg) {
+        if (logEnabled_e) {
+            android.util.Log.e(TAG, getLocation() + msg);
+        }
+    }
+
+    public static void e(String msg, Throwable e) {
+        if (logEnabled_e) {
+            android.util.Log.e(TAG, getLocation() + msg, e);
+        }
+    }
+
+    public static void e(Throwable e) {
+        if (logEnabled_e) {
+            android.util.Log.e(TAG, getLocation(), e);
+        }
+    }
+
+    public static void e() {
+        if (logEnabled_e) {
+            android.util.Log.e(TAG, getLocation());
+        }
+    }
+
+    private static String getLocation() {
+        final String className = Logger.class.getName();
+        final StackTraceElement[] traces = Thread.currentThread()
+                .getStackTrace();
+        boolean found = false;
+
+        for (StackTraceElement trace : traces) {
+            try {
+                if (found) {
+                    if (!trace.getClassName().startsWith(className)) {
+                        Class<?> clazz = Class.forName(trace.getClassName());
+                        return "[" + getClassName(clazz) + ":"
+                                + trace.getMethodName() + ":"
+                                + trace.getLineNumber() + "]: ";
+                    }
+                } else if (trace.getClassName().startsWith(className)) {
+                    found = true;
+                }
+            } catch (ClassNotFoundException ignored) {
+            }
+        }
+
+        return "[]: ";
+    }
+
+    private static String getClassName(Class<?> clazz) {
+        if (clazz != null) {
+            if (!TextUtils.isEmpty(clazz.getSimpleName())) {
+                return clazz.getSimpleName();
+            }
+
+            return getClassName(clazz.getEnclosingClass());
+        }
+
+        return "";
+    }
+
+}

+ 12 - 0
library-refreshlayout/src/main/java/com/yalantis/phoenix/util/Utils.java

@@ -0,0 +1,12 @@
+package com.yalantis.phoenix.util;
+
+import android.content.Context;
+
+public class Utils {
+
+    public static int convertDpToPixel(Context context, int dp) {
+        float density = context.getResources().getDisplayMetrics().density;
+        return Math.round((float) dp * density);
+    }
+
+}

BIN
library-refreshlayout/src/main/res/drawable-hdpi/buildings.png


BIN
library-refreshlayout/src/main/res/drawable-hdpi/sky.png


BIN
library-refreshlayout/src/main/res/drawable-hdpi/sun.png


BIN
library-refreshlayout/src/main/res/drawable-mdpi/buildings.png


BIN
library-refreshlayout/src/main/res/drawable-mdpi/sky.png


BIN
library-refreshlayout/src/main/res/drawable-mdpi/sun.png


BIN
library-refreshlayout/src/main/res/drawable-xhdpi/buildings.png


BIN
library-refreshlayout/src/main/res/drawable-xhdpi/sky.png


BIN
library-refreshlayout/src/main/res/drawable-xhdpi/sun.png


BIN
library-refreshlayout/src/main/res/drawable-xxhdpi/buildings.png


BIN
library-refreshlayout/src/main/res/drawable-xxhdpi/sky.png


BIN
library-refreshlayout/src/main/res/drawable-xxhdpi/sun.png


+ 8 - 0
library-refreshlayout/src/main/res/values/attrs.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <declare-styleable name="RefreshView">
+        <attr name="type" format="enum">
+            <enum name="sun" value="0" />
+        </attr>
+    </declare-styleable>
+</resources>

+ 3 - 3
pullToRefershLibraryMy/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshBase.java

@@ -54,10 +54,10 @@ public abstract class PullToRefreshBase<T extends View> extends LinearLayout imp
 
 	static final String LOG_TAG = "PullToRefresh";
 
-	static final float FRICTION = 5.0f;
+	static final float FRICTION = 4.0f;
 
-	public static final int SMOOTH_SCROLL_DURATION_MS = 200;
-	public static final int SMOOTH_SCROLL_LONG_DURATION_MS = 325;
+	public static final int SMOOTH_SCROLL_DURATION_MS = 500;
+	public static final int SMOOTH_SCROLL_LONG_DURATION_MS = 1525;
 	static final int DEMO_SCROLL_INTERVAL = 225;
 
 	static final String STATE_STATE = "ptr_state";

+ 1 - 1
settings.gradle

@@ -1,2 +1,2 @@
-include ':pullToRefershLibraryMy', ':materialdialogs', ':MPAndroidChart', ':libedittextformlibrary', ':libfloatingactionbutton', ':libbdupdatesdk', ':library-viewpager-indicator', ':library-swipemenu_lv', ':lib-zxing'
+include ':pullToRefershLibraryMy', ':materialdialogs', ':MPAndroidChart', ':libedittextformlibrary', ':libfloatingactionbutton', ':libbdupdatesdk', ':library-viewpager-indicator', ':library-swipemenu_lv', ':lib-zxing', ':library-refreshlayout'
 include ':WeiChat'