From e102578ebfc95c27aeb13dce13fb82af53a2bead Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期四, 25 二月 2021 17:07:23 +0800
Subject: [PATCH] 1. 新增夜间施工查询界面 2. 新增夜间施工管理统计界面

---
 app/src/main/res/drawable/selector_bg_green_or_yellow.xml                                   |    2 
 app/src/main/res/layout/layout_load_fail_view.xml                                           |   30 
 app/src/main/res/layout/activity_night_work_manage.xml                                      |  114 +
 app/src/main/res/layout/item_night_work_2.xml                                               |   24 
 app/src/main/res/anim/left_exit_3.xml                                                       |    6 
 app/src/main/res/anim/right_enter_2.xml                                                     |    6 
 app/src/main/java/cn/flightfeather/thirdapp/model/bean/NightWorkSummary.kt                  |   12 
 app/src/main/res/mipmap-xxhdpi/ic_developing.png                                            |    0 
 app/src/main/res/mipmap-xhdpi/file_ic_detail_excel.png                                      |    0 
 app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkRecordActivity.kt     |  161 ++
 app/src/main/java/cn/flightfeather/thirdapp/repository/dao/MediaFileDao.kt                  |   48 
 app/src/test/java/cn/flightfeather/thirdapp/Test.kt                                         |    7 
 app/src/main/res/layout/layout_loading.xml                                                  |   12 
 app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseActivity.kt                     |   13 
 app/src/main/java/cn/flightfeather/thirdapp/util/tbs/Tbs.kt                                 |   36 
 app/src/main/java/cn/flightfeather/thirdapp/module/common/FileDownloadFragment.kt           |  170 ++
 app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragment.kt                     |   56 
 app/src/main/res/layout/item_night_work_3.xml                                               |   99 +
 app/src/main/java/cn/flightfeather/thirdapp/httpservice/NightWorkService.kt                 |   46 
 app/build.gradle                                                                            |   24 
 app/src/main/res/mipmap-xhdpi/ic_share.png                                                  |    0 
 app/src/main/java/cn/flightfeather/thirdapp/util/file/FileUtils.kt                          |  376 +++++
 app/src/main/java/cn/flightfeather/thirdapp/repository/MediaFileRepository.kt               |   51 
 app/src/main/res/values/strings.xml                                                         |    4 
 app/src/main/java/cn/flightfeather/thirdapp/business/widgettype3/HomeFragment_scene.java    |   88 
 app/src/main/res/anim/right_exit_2.xml                                                      |    6 
 app/src/main/java/cn/flightfeather/thirdapp/module/common/FileBrowseViewModel.kt            |   34 
 app/src/main/java/cn/flightfeather/thirdapp/common/net/ResultObserver.kt                    |    8 
 app/src/main/java/cn/flightfeather/thirdapp/business/widgettype2/HomeFragment_comptent.java |   40 
 app/src/main/res/layout/function_card5_scene.xml                                            |   60 
 app/src/main/res/layout/fragment_home_pollution_scene.xml                                   |    1 
 app/src/main/res/layout/fragment_file_download.xml                                          |   88 +
 app/src/main/java/cn/flightfeather/thirdapp/model/bean/NightWorkFileVo.kt                   |   54 
 app/src/main/java/cn/flightfeather/thirdapp/module/common/OfficeFileManageActivity.kt       |   41 
 app/src/main/java/cn/flightfeather/thirdapp/CommonApplication.java                          |    4 
 app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/DataLoadModel.kt              |  134 +
 app/src/main/res/mipmap-mdpi/ic_developing.png                                              |    0 
 app/src/main/java/cn/flightfeather/thirdapp/util/SystemServiceUtils.kt                      |   49 
 app/src/main/res/layout/layout_recycler_view_refresh.xml                                    |   17 
 app/src/main/java/com/ping/greendao/gen/DaoMaster.java                                      |    7 
 app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragmentActivity.kt             |   41 
 app/src/main/res/layout/item_night_work_no_more.xml                                         |   74 +
 app/src/main/java/cn/flightfeather/thirdapp/module/base/ToolbarSetInterface.kt              |   83 +
 app/src/main/java/cn/flightfeather/thirdapp/module/inspection/MenuCameraActivity.kt         |    6 
 app/src/main/java/cn/flightfeather/thirdapp/util/DialogUtil2.kt                             |   23 
 app/src/main/res/layout/layout_night_work_empty.xml                                         |   78 +
 app/src/main/res/layout/layout_toolbar_2.xml                                                |    5 
 app/src/main/res/values/styles.xml                                                          |    4 
 app/src/main/res/layout/function_card5_competent.xml                                        |   60 
 app/src/main/java/cn/flightfeather/thirdapp/util/download/UpDownloadUtil.kt                 |   60 
 app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/RecyclerViewPanel.kt          |  337 ++--
 app/src/main/java/cn/flightfeather/thirdapp/repository/NightWorkRepository.kt               |   84 +
 app/src/main/res/layout/item_night_work.xml                                                 |   28 
 app/src/main/res/mipmap-hdpi/ic_developing.png                                              |    0 
 app/src/main/res/anim/left_enter_3.xml                                                      |    6 
 app/src/main/res/layout/layout_empty_view.xml                                               |   29 
 app/src/main/res/layout/function_card4_scene.xml                                            |   14 
 app/src/main/java/cn/flightfeather/thirdapp/model/bean/BaseResponse.kt                      |    6 
 app/src/main/res/layout/item_scene_task.xml                                                 |   20 
 build.gradle                                                                                |    2 
 app/src/main/res/layout/dialog_scene_list.xml                                               |    2 
 app/src/main/java/cn/flightfeather/thirdapp/bean/entity/MediaFileCache.java                 |   56 
 app/src/main/res/layout/activity_night_work.xml                                             |    4 
 app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkManageActivity.kt     |   99 +
 app/src/main/res/layout/fragment_office_file.xml                                            |   16 
 app/src/main/res/mipmap-xhdpi/file_ic_detail_pdf.png                                        |    0 
 app/src/main/AndroidManifest.xml                                                            |   11 
 app/src/main/java/cn/flightfeather/thirdapp/common/net/FlatMapUtil.kt                       |   76 +
 app/src/main/java/cn/flightfeather/thirdapp/util/DateUtil.kt                                |  346 ++++
 app/src/main/res/layout/activity_fragment_container.xml                                     |   19 
 app/src/main/res/layout/layout_empty_load_more.xml                                          |   24 
 app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/RecyclerViewSetInterface.kt   |   17 
 app/src/main/res/drawable/shape_bg_gradient_2.xml                                           |   21 
 app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragmentListActivity.kt         |  106 +
 app/src/main/java/cn/flightfeather/thirdapp/util/Constant.java                              |    2 
 app/src/main/java/cn/flightfeather/thirdapp/module/common/OfficeFileReadFragment.kt         |  131 +
 /dev/null                                                                                   |   12 
 app/src/main/res/mipmap-xxxhdpi/ic_developing.png                                           |    0 
 app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkViewModel.kt          |   66 
 app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/EmptyLoadMoreView.kt          |   18 
 app/src/main/res/layout/fragment_home_competent.xml                                         |    1 
 app/src/main/res/layout/item_scene_new_task.xml                                             |   20 
 app/src/main/res/layout/tool_bar_layout.xml                                                 |  103 +
 app/src/main/java/cn/flightfeather/thirdapp/common/database/DbFlatMapUtil.kt                |  131 +
 app/src/main/java/com/ping/greendao/gen/DaoSession.java                                     |   14 
 app/src/main/java/cn/flightfeather/thirdapp/util/CommonUtils.java                           |   24 
 app/src/main/java/com/ping/greendao/gen/MediaFileCacheDao.java                              |  157 ++
 app/src/main/res/layout/layout_loading_view.xml                                             |   26 
 app/src/main/res/layout/recycler_item_section_head.xml                                      |   18 
 app/src/main/res/mipmap-xhdpi/ic_developing.png                                             |    0 
 90 files changed, 4,080 insertions(+), 328 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index eeda49f..c2b3b5f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -13,12 +13,17 @@
         applicationId "cn.flightfeather.thirdapp"
         minSdkVersion 19
         targetSdkVersion 28
-        versionCode 25
-        versionName "1.1.14.08"
+        versionCode 27
+        versionName "1.1.14.10"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         renderscriptTargetApi 25
         renderscriptSupportModeEnabled true
         multiDexEnabled true
+
+        ndk {
+            //x5 鍏煎64浣嶆墜鏈�
+            abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'mips'
+        }
     }
     buildTypes {
         release {
@@ -45,7 +50,7 @@
 }
 
 greendao {
-    schemaVersion 12
+    schemaVersion 13
     daoPackage 'com.ping.greendao.gen'
     targetGenDir 'src/main/java'
 }
@@ -118,6 +123,19 @@
     //kotlin plugin
     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
     implementation "org.jetbrains.anko:anko:$anko_version"
+
+    //鑵捐TBS鏂囦欢娴忚鏈嶅姟
+    api 'com.tencent.tbs.tbssdk:sdk:43697'
+
+    //鏂囦欢涓嬭浇
+    implementation "com.liulishuo.okdownload:okdownload:${file_download_version}"
+    implementation "com.liulishuo.okdownload:sqlite:${file_download_version}"
+    implementation "com.liulishuo.okdownload:okhttp:${file_download_version}"
+    implementation "com.liulishuo.okdownload:ktx:${file_download_version}"
+    implementation "com.liulishuo.okdownload:filedownloader:${file_download_version}"
+
+    //鍦嗗舰杩涘害鏉�
+    implementation "com.mikhaellopez:circularprogressbar:${progressbar_version}"
 }
 repositories {
     mavenCentral()
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index bc6cabe..3b74d86 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -56,7 +56,7 @@
 
         <provider
             android:name="android.support.v4.content.FileProvider"
-            android:authorities="cn.flightfeather.thirdapp.fileProvider"
+            android:authorities="@string/file_provide"
             android:exported="false"
             android:grantUriPermissions="true">
             <meta-data
@@ -191,6 +191,15 @@
             android:name=".module.task.SceneDetailActivity"
             android:theme="@style/AppTheme.NoActionBar" />
         <activity
+            android:name=".module.nightwork.NightWorkRecordActivity"
+            android:theme="@style/AppTheme.NoActionBar" />
+        <activity
+            android:name=".module.nightwork.NightWorkManageActivity"
+            android:theme="@style/AppTheme.NoActionBar" />
+        <activity
+            android:name=".module.common.OfficeFileManageActivity"
+            android:theme="@style/AppTheme.NoActionBar" />
+        <activity
             android:name=".module.inspection.MenuGradeActivity"
             android:screenOrientation="portrait"
             android:theme="@style/AppTheme"/>
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/CommonApplication.java b/app/src/main/java/cn/flightfeather/thirdapp/CommonApplication.java
index 5eb080e..40bb282 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/CommonApplication.java
+++ b/app/src/main/java/cn/flightfeather/thirdapp/CommonApplication.java
@@ -17,6 +17,7 @@
 import cn.flightfeather.thirdapp.bean.entity.Userinfo;
 import cn.flightfeather.thirdapp.common.net.RetrofitFactory;
 import cn.flightfeather.thirdapp.util.crashreport.MyCrashHandler;
+import cn.flightfeather.thirdapp.util.tbs.Tbs;
 import retrofit2.Retrofit;
 import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
 import retrofit2.converter.gson.GsonConverterFactory;
@@ -52,6 +53,9 @@
         //鍒濆鍖栫綉缁滆姹�
         RetrofitFactory.init(this);
 
+        //x5鍐呮牳鍒濆鍖�
+        Tbs.Companion.init(this);
+
         if (instance == null) {
             instance = this;
         }
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/bean/entity/MediaFileCache.java b/app/src/main/java/cn/flightfeather/thirdapp/bean/entity/MediaFileCache.java
new file mode 100644
index 0000000..edb1f02
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/bean/entity/MediaFileCache.java
@@ -0,0 +1,56 @@
+package cn.flightfeather.thirdapp.bean.entity;
+
+import org.greenrobot.greendao.annotation.Entity;
+import org.greenrobot.greendao.annotation.Generated;
+import org.greenrobot.greendao.annotation.Id;
+import org.greenrobot.greendao.annotation.Property;
+
+/**
+ * @author riku
+ * Date: 2020/4/18
+ */
+@Entity
+public class MediaFileCache {
+    @Id(autoincrement = true)
+    private Long id;
+    @Property
+    private String url;
+    @Property
+    private String path;
+    @Property
+    private String thumbnailPath;
+    @Generated(hash = 554333244)
+    public MediaFileCache(Long id, String url, String path, String thumbnailPath) {
+        this.id = id;
+        this.url = url;
+        this.path = path;
+        this.thumbnailPath = thumbnailPath;
+    }
+    @Generated(hash = 545339127)
+    public MediaFileCache() {
+    }
+    public Long getId() {
+        return this.id;
+    }
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public String getUrl() {
+        return this.url;
+    }
+    public void setUrl(String url) {
+        this.url = url;
+    }
+    public String getPath() {
+        return this.path;
+    }
+    public void setPath(String path) {
+        this.path = path;
+    }
+    public String getThumbnailPath() {
+        return this.thumbnailPath;
+    }
+    public void setThumbnailPath(String thumbnailPath) {
+        this.thumbnailPath = thumbnailPath;
+    }
+}
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/business/widgettype2/HomeFragment_comptent.java b/app/src/main/java/cn/flightfeather/thirdapp/business/widgettype2/HomeFragment_comptent.java
index 51c4980..e3d3624 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/business/widgettype2/HomeFragment_comptent.java
+++ b/app/src/main/java/cn/flightfeather/thirdapp/business/widgettype2/HomeFragment_comptent.java
@@ -2,11 +2,13 @@
 
 
 import android.content.Context;
+import android.content.Intent;
 import android.os.Build;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
+import android.support.constraint.ConstraintLayout;
 import android.support.v4.app.Fragment;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
@@ -43,6 +45,7 @@
 import java.util.List;
 import java.util.Map;
 
+import butterknife.BindView;
 import butterknife.ButterKnife;
 import butterknife.Unbinder;
 import cn.flightfeather.thirdapp.CommonApplication;
@@ -58,6 +61,7 @@
 import cn.flightfeather.thirdapp.bean.vo.TaskVo;
 import cn.flightfeather.thirdapp.httpservice.ProblemListService;
 import cn.flightfeather.thirdapp.httpservice.TaskService;
+import cn.flightfeather.thirdapp.module.nightwork.NightWorkManageActivity;
 import cn.flightfeather.thirdapp.util.ChartGenerator;
 import cn.flightfeather.thirdapp.util.CommonUtils;
 import cn.flightfeather.thirdapp.util.Constant;
@@ -324,6 +328,7 @@
         viewHolder1.initViewHolder1();
         viewHolder2.initViewholder2();
         viewHolder3.initViewHolder3();
+        viewHolder5.initViewHolder5();
     }
 
 
@@ -1186,38 +1191,21 @@
         }
     }
 
+    @BindView(R.id.cl_night_work)
+    ConstraintLayout cl_night_work;
+
     public class ViewHolder5  {
-//        ImageView task1,task2;
-//        TextView task1date, task1name,task2date, task2name;
 
         ViewHolder5(Bundle savedInstanceState, View itemView) {
-//            task2 = (ImageView) itemView.findViewById(R.id.iv_tody_task2);
-//            task1date = (TextView) itemView.findViewById(R.id.tv_tody_task1date);
-//            task1name = (TextView) itemView.findViewById(R.id.tv_tody_task1name);
-//            task2date = (TextView) itemView.findViewById(R.id.tv_tody_task2date);
-//            task2name = (TextView) itemView.findViewById(R.id.tv_tody_task2name);
-            itemView.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View view) {
-//                    mRecyclerViewAdapter.addData(0);
-                }
-            });
-            itemView.setOnLongClickListener(new View.OnLongClickListener() {
-                @Override
-                public boolean onLongClick(View view) {
-//                    mRecyclerViewAdapter.addData(0);
-                    return true;
-                }
-            });
+
         }
 
         void refreshView() {
-//            task1.setBackgroundResource(R.drawable.icon_tody_task_1);
-//            task2.setBackgroundResource(R.drawable.icon_tody_task_2);
-//            task1date.setTitle(new Date().toString());
-//            task2date.setTitle(new Date().toString());
-//            task1name.setTitle("浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О");
-//            task2name.setTitle("浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О");
+            initViewHolder5();
+        }
+
+        private void initViewHolder5() {
+            cl_night_work.setOnClickListener(v -> startActivity(new Intent(getContext(), NightWorkManageActivity.class)));
         }
     }
 
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/business/widgettype3/HomeFragment_scene.java b/app/src/main/java/cn/flightfeather/thirdapp/business/widgettype3/HomeFragment_scene.java
index 33cdab4..0df6103 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/business/widgettype3/HomeFragment_scene.java
+++ b/app/src/main/java/cn/flightfeather/thirdapp/business/widgettype3/HomeFragment_scene.java
@@ -1,6 +1,7 @@
 package cn.flightfeather.thirdapp.business.widgettype3;
 
 
+import android.arch.lifecycle.ViewModelProviders;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
@@ -11,7 +12,6 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.Window;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -32,9 +32,7 @@
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import butterknife.BindView;
 import butterknife.ButterKnife;
@@ -42,24 +40,23 @@
 import butterknife.Unbinder;
 import cn.flightfeather.thirdapp.CommonApplication;
 import cn.flightfeather.thirdapp.R;
-import cn.flightfeather.thirdapp.bean.entity.Domainitem;
 import cn.flightfeather.thirdapp.bean.entity.Scense;
 import cn.flightfeather.thirdapp.bean.entity.Subtask;
 import cn.flightfeather.thirdapp.bean.vo.InspectionInfoVo;
-import cn.flightfeather.thirdapp.bean.vo.InspectionVo;
 import cn.flightfeather.thirdapp.bean.vo.RankVo;
 import cn.flightfeather.thirdapp.bean.vo.TaskVo;
+import cn.flightfeather.thirdapp.common.net.ResultCallBack;
 import cn.flightfeather.thirdapp.dataanalysis.AnalysisOverViewFragment;
 import cn.flightfeather.thirdapp.httpservice.InspectionService;
 import cn.flightfeather.thirdapp.httpservice.TaskService;
+import cn.flightfeather.thirdapp.model.bean.NightWorkFileVo;
+import cn.flightfeather.thirdapp.module.nightwork.NightWorkRecordActivity;
+import cn.flightfeather.thirdapp.module.nightwork.NightWorkViewModel;
 import cn.flightfeather.thirdapp.util.Constant;
 import cn.flightfeather.thirdapp.util.DateFormatter;
-import cn.flightfeather.thirdapp.util.ScreenUtils;
-import cn.flightfeather.thirdapp.view.MyScrollView;
 import retrofit2.Call;
 import retrofit2.Callback;
 import retrofit2.Response;
-import retrofit2.Retrofit;
 
 /**
  * A simple {@link Fragment} subclass.
@@ -86,33 +83,19 @@
     private ViewHolder2 viewHolder2;
     private ViewHolder3 viewHolder3;
     private ViewHolder4 viewHolder4;
+    private ViewHolder5 viewHolder5;
     //ViewHolder1(浠婃棩浠诲姟)
-    private Map<String, List<TaskVo>> taskAllMapList = new HashMap<>();//Map<鏃堕棿, 鎵�鏈変换鍔★紙椤跺眰浠诲姟銆佹棩浠诲姟銆佸瓙浠诲姟锛�>
-    private ArrayList<Subtask> mSubtaskList = new ArrayList<>();
     private ArrayList<Subtask> subtaskListOfUser = new ArrayList<>();
-    private ArrayList<TaskVo> mDayTaskList = new ArrayList<>();
-    private Calendar calendarCurrent;
-    private String mCurYearMonth;
-    private String mToday;
-    private boolean requestAgain;
-    private Retrofit mRetrofit;
-    private boolean firstLoad = true;
-    private final int VISIBLENUM = 2;//浠婃棩浠诲姟鏄剧ず鏈�灏戠殑浠诲姟鏁�
-    private Boolean visibility = false;
-    private Subtask subtask;
-    private InspectionVo inspectionVo;
-    //褰撳墠鍦烘櫙绫诲瀷
-    private String curSceneType = "1";
-    private List<Domainitem> sceneTypeData = new ArrayList<>();//鍦烘櫙绫诲瀷
-    //鐘舵�佹爮涓庢爣棰樻爮鐨勯珮搴﹀拰涓烘粦鍔ㄧ粍浠舵偓鍋滅殑鏈�澶ч珮搴�
-    private int topHeight;
     //鏄惁鍦ㄥ垏鎹㈠洖鏉ユ椂鍒锋柊
     private boolean isUnHiddenRefresh;
     private Unbinder unbinder;
 
+    private NightWorkViewModel viewModel;
+
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
+        viewModel = ViewModelProviders.of(this).get(NightWorkViewModel.class);
         // Inflate the layout for this fragment
         View view = inflater.inflate(R.layout.fragment_home_pollution_scene, container, false);
         unbinder = ButterKnife.bind(this, view);
@@ -161,26 +144,14 @@
     @Override
     public void onStart() {
         super.onStart();
-        int statusBarHeight = ScreenUtils.getStatusHeight(getActivity());//鐘舵�佹爮楂樺害
-
-        int titleBarHeight = getActivity().getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();//鏍囬鏍忛珮搴�
-        topHeight = titleBarHeight + statusBarHeight;
     }
 
     public HomeFragment_scene() {
         // Required empty public constructor
     }
 
-    MyScrollView sv_home_base;
-
-    LinearLayout ll_weather_detail;
-
     private void initData(){
         application = (CommonApplication) getActivity().getApplication();
-        mRetrofit = application.getRetrofit();
-        Date now = Calendar.getInstance().getTime();
-        mCurYearMonth = DateFormatter.YearMonthFormat.format(now);
-        mToday = DateFormatter.dateFormat2.format(now);
     }
 
     private void initUI(View view) {
@@ -210,10 +181,13 @@
         viewHolder2 = new ViewHolder2(savedInstanceState, sv_home_page);
         viewHolder3 = new ViewHolder3(savedInstanceState, sv_home_page);
         viewHolder4 = new ViewHolder4(savedInstanceState, sv_home_page);
+        viewHolder5 = new ViewHolder5();
+
         viewHolder1.initViewHolder1();
         viewHolder1.refreshView();
         viewHolder2.refreshView();
 //        viewHolder3.initViewHolder3();
+        viewHolder5.init();
     }
 
 
@@ -712,9 +686,45 @@
     }
     //</editor-fold>
 
+    @BindView(R.id.cl_night_work) ConstraintLayout cl_night_work;
+    @BindView(R.id.txt_news) TextView txt_news;
+    public class ViewHolder5 {
+
+        void init() {
+            cl_night_work.setOnClickListener(v -> startActivity(new Intent(getContext(), NightWorkRecordActivity.class)));
+            viewModel.getNightWorkFile(false, 1, new ResultCallBack<List<NightWorkFileVo>>(){
+                @Override
+                public void onCacheSuccess(@org.jetbrains.annotations.Nullable List<NightWorkFileVo> result) {
+
+                }
+
+                @Override
+                public void onPage(int current, int total) {
+
+                }
+
+                @Override
+                public void onSuccess(@org.jetbrains.annotations.Nullable List<NightWorkFileVo> result) {
+                    if (result == null || result.isEmpty()) {
+                        txt_news.setText("鏆傛棤鏂拌鍙瘉");
+                    } else {
+                        txt_news.setText("鏈夋柊璁稿彲璇佷笅鍙戯紝璇锋煡鐪�");
+                    }
+                }
+
+                @Override
+                public void onFailure() {
+                    txt_news.setText("缃戠粶杩炴帴澶辫触锛岃閫�鍑洪噸璇�");
+                }
+            });
+        }
+    }
+
+
+
 
     //<editor-fold desc="鐐瑰嚮浜嬩欢">
-    @OnClick({R.id.text_goto_change, R.id.image_goto_change})
+    @OnClick({R.id.card_change_problem, R.id.card_changed_problem})
     void OnClick() {
         Intent intent = new Intent("cn.flightfeather.thirdapp.broadcasereceiver.MainReceiver");
         intent.setAction(Constant.GOTO_INSPECTION_FRAGMENT);
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/common/database/DbFlatMapUtil.kt b/app/src/main/java/cn/flightfeather/thirdapp/common/database/DbFlatMapUtil.kt
new file mode 100644
index 0000000..c3d91f1
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/common/database/DbFlatMapUtil.kt
@@ -0,0 +1,131 @@
+package cn.flightfeather.thirdapp.common.database
+
+import com.ping.greendao.gen.DaoSession
+import org.greenrobot.greendao.AbstractDao
+import retrofit2.Response
+
+/**
+ * @author riku
+ * Date: 2019/4/25
+ * 鏁版嵁搴撴搷浣滄楠ゆ娊璞�
+ */
+
+/**
+ * 鍚戞暟鎹簱淇濆瓨瀹炰綋淇℃伅
+ * @param <T> Entity type
+ * @param <K> Primary key (PK) type; use Void if entity does not have exactly one PK
+ */
+fun <E, K> flatMapDbSaveResult(dao: AbstractDao<E, K>, listener: FlatSaveInterface<E, K>): Boolean {
+    val results = listener.onQuery(dao)
+    try {
+        return if (results.isEmpty()) {
+            val entities = listener.onInsert()
+            entities.forEach {
+                dao.insert(it)
+            }
+            true
+        } else {
+            listener.onUpdate(results)
+            results.forEach {
+                dao.update(it)
+            }
+            true
+        }
+    } catch (e: Exception) {
+        e.printStackTrace()
+    }
+    return false
+}
+
+interface FlatSaveInterface<E, K> {
+    //淇濆瓨鍓嶇殑姝ラ锛屾煡鐪嬭淇濆瓨鐨勬暟鎹槸鍚﹀瓨鍦�
+    fun onQuery(dao: AbstractDao<E, K>): List<E>
+    //鏁版嵁宸插瓨鍦紝閫夋嫨鏇存柊
+    fun onUpdate(list: List<E>)
+    //鏁版嵁涓嶅瓨鍦紝鎻掑叆鏂扮殑淇濆瓨瀹炰綋
+    fun onInsert(): List<E>
+}
+
+/**
+ * 鍚戞暟鎹簱淇濆瓨缃戠粶鑾峰彇鐨勫疄浣撲俊鎭�
+ */
+fun <E, K, T> FlatMapDbSaveResult(dao: AbstractDao<E, K>, response: Response<T>, listener: FlatSaveInterface<E, K>): Boolean {
+    if (response.isSuccessful) {
+        val results = listener.onQuery(dao)
+        try {
+            return if (results.isEmpty()) {
+                val entities = listener.onInsert()
+                entities.forEach {
+                    dao.insert(it)
+                }
+                true
+            } else {
+                listener.onUpdate(results)
+                results.forEach {
+                    dao.update(it)
+                }
+                true
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+    return false
+}
+
+/**
+ * 鑾峰彇鏁版嵁搴撲繚瀛樼殑鍒楄〃淇℃伅
+ */
+fun<E, T, R> FlatMapDbReadList(daoSession: DaoSession, listener:FlatDbReadConversionListInterface<E, T, R>): ArrayList<R> {
+    val result = listener.onQuery(daoSession)
+    val list = ArrayList<T>()
+    if (result.isNotEmpty()) {
+        result.forEach {
+            list.addAll(listener.onJson(it))
+        }
+    }
+    val dataList = ArrayList<R>()
+    list.forEach {
+        dataList.add(listener.onConversion(it))
+    }
+    return dataList
+}
+
+//鐢ㄤ簬鏁版嵁搴撲腑锛岄渶瑕佸皢瀛樺偍鐨勫瓧娈垫寜Json鏍煎紡杞崲
+interface FlatDbReadConversionListInterface<E,T, R> {
+    //鏌ヨ璇彞
+    fun onQuery(d: DaoSession): List<E>
+    //瀛樺偍鐨凧son杞崲涓洪渶瑕佺殑瀹炰綋
+    fun onJson(e: E): List<T>
+    //濡傛灉浣跨敤dataBinding, 鍒欏彲浠ヨ浆鎹负瀵瑰簲鐨勫疄浣擄紱鎴栫敤浜庡墠绔睍绀轰笌缃戠粶浼犺緭鐨勬暟鎹疄浣撶粨鏋勪笉鍚岀殑鎯呭喌
+    fun onConversion(t: T): R
+}
+
+
+/**
+ * 鑾峰彇鏁版嵁搴撲繚瀛樼殑鍒楄〃淇℃伅
+ */
+fun<E, T, R> FlatMapDbReadList(daoSession: DaoSession, listener:FlatDbReadConversionObjectInterface<E, T, R>): ArrayList<R> {
+    val result = listener.onQuery(daoSession)
+    val list = ArrayList<T>()
+    if (result.isNotEmpty()) {
+        result.forEach {
+            list.add(listener.onBean(it))
+        }
+    }
+    val dataList = ArrayList<R>()
+    list.forEach {
+        dataList.add(listener.onConversion(it))
+    }
+    return dataList
+}
+
+//鐢ㄤ簬鏁版嵁搴撲腑锛岄渶瑕佸皢瀹屾暣鐨勮〃杞崲涓哄搴旂殑bean瀹炰綋
+interface FlatDbReadConversionObjectInterface<E,T, R> {
+    //鏌ヨ璇彞
+    fun onQuery(d: DaoSession): List<E>
+    //瀛樺偍鐨凧son杞崲涓洪渶瑕佺殑瀹炰綋
+    fun onBean(e: E): T
+    //濡傛灉浣跨敤dataBinding, 鍒欏彲浠ヨ浆鎹负瀵瑰簲鐨勫疄浣擄紱鎴栫敤浜庡墠绔睍绀轰笌缃戠粶浼犺緭鐨勬暟鎹疄浣撶粨鏋勪笉鍚岀殑鎯呭喌
+    fun onConversion(t: T): R
+}
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/common/net/FlatMapUtil.kt b/app/src/main/java/cn/flightfeather/thirdapp/common/net/FlatMapUtil.kt
new file mode 100644
index 0000000..c0b8171
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/common/net/FlatMapUtil.kt
@@ -0,0 +1,76 @@
+package cn.flightfeather.thirdapp.common.net
+
+import io.reactivex.ObservableSource
+import io.reactivex.Observer
+import retrofit2.Response
+
+/**
+ * @author riku
+ * Date: 2019/4/29
+ */
+
+/**
+ * 灏哛esponse杞寲涓哄疄浣撴暟鎹�
+ */
+class FlatMapResponse2Result<T>(private val response: Response<T>) : ObservableSource<T> {
+    override fun subscribe(observer: Observer<in T?>) {
+        if (response.isSuccessful) {
+            observer.onNext(response.body())
+        } else {
+            observer.onError(Throwable(response.code().toString(), Throwable(response.errorBody().toString())))
+        }
+    }
+}
+
+/**
+ * 灏嗗疄浣撴暟鎹浆鍖栦负Response
+ */
+class FlatMapResult2Response<T>(private val t: T) : ObservableSource<Response<T>> {
+
+    override fun subscribe(observer: Observer<in Response<T>?>) {
+        observer.onNext(Response.success(t))
+    }
+}
+
+/**
+ * 涓嶆崯澶県eader鐨勬儏鍐典笅杞寲Response涓殑 鍒楄〃 鏁版嵁
+ */
+class FlatMapResponse2ResponseResult<T>(private val response: Response<T>, private val conversionCallBack: FlatConversionInterface<T>) :
+    ObservableSource<Response<ArrayList<Any>>> {
+    override fun subscribe(observer: Observer<in Response<ArrayList<Any>>>) {
+        if (response.isSuccessful) {
+            val result = conversionCallBack.onConversion(response.body())
+            observer.onNext(Response.success(result, response.headers()))
+
+        } else {
+            observer.onError(Throwable(response.code().toString(), Throwable(response.errorBody().toString())))
+        }
+
+    }
+}
+
+/**
+ * 涓嶆崯澶県eader鐨勬儏鍐典笅杞寲Response涓殑 瀹炰綋 鏁版嵁
+ */
+class FlatMapResponse2ResponseObject<T, R>(private val response: Response<T>, private val conversionCallBack: FlatConversionObjectInterface<T, R>) :
+    ObservableSource<Response<R>> {
+    override fun subscribe(observer: Observer<in Response<R>>) {
+        if (response.isSuccessful) {
+            val result = conversionCallBack.onConversion(response.body())
+            observer.onNext(Response.success(result, response.headers()))
+
+        } else {
+            observer.onError(Throwable(response.code().toString(), Throwable(response.errorBody().toString())))
+        }
+
+    }
+}
+
+
+interface FlatConversionInterface<T> {
+    fun onConversion(t: T?): ArrayList<Any>
+}
+
+interface FlatConversionObjectInterface<T, R> {
+    fun onConversion(t: T?): R
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/common/net/ResultObserver.kt b/app/src/main/java/cn/flightfeather/thirdapp/common/net/ResultObserver.kt
index 2cbc42f..b40a8cb 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/common/net/ResultObserver.kt
+++ b/app/src/main/java/cn/flightfeather/thirdapp/common/net/ResultObserver.kt
@@ -1,6 +1,7 @@
 package cn.flightfeather.thirdapp.common.net
 
 import android.accounts.NetworkErrorException
+import cn.flightfeather.thirdapp.model.bean.BaseResponse
 import io.reactivex.Observer
 import io.reactivex.disposables.Disposable
 import retrofit2.Response
@@ -66,8 +67,11 @@
         var currentPage = -1
         var totalPage = -1
         try {
-            currentPage = response.headers().get("currentPage")?.toInt() ?: -1
-            totalPage = response.headers().get("totalPage")?.toInt() ?: -1
+            val body = response.body()
+            if (body is BaseResponse<*>) {
+                currentPage = body.head?.page ?: -1
+                totalPage = body.head?.totalPage ?: -1
+            }
         } catch (e: Exception) {
             e.printStackTrace()
         }
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/httpservice/NightWorkService.kt b/app/src/main/java/cn/flightfeather/thirdapp/httpservice/NightWorkService.kt
new file mode 100644
index 0000000..cb2d636
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/httpservice/NightWorkService.kt
@@ -0,0 +1,46 @@
+package cn.flightfeather.thirdapp.httpservice
+
+import cn.flightfeather.thirdapp.model.bean.BaseResponse
+import cn.flightfeather.thirdapp.model.bean.NightWorkFileVo
+import cn.flightfeather.thirdapp.model.bean.NightWorkSummary
+import cn.flightfeather.thirdapp.util.Constant
+import io.reactivex.Observable
+import retrofit2.Response
+import retrofit2.http.GET
+import retrofit2.http.POST
+import retrofit2.http.Query
+
+/**
+ * @author riku
+ * Date: 2020/12/29
+ */
+interface NightWorkService {
+    @GET("nightwork/record/all")
+    fun getRecord(
+//            @Query("cityCode") cityCode: String?,
+            @Query("districtCode") districtCode: String,
+            @Query("page") page: Int,
+            @Query("perPage") perPage: Int = Constant.PAGE_SIZE
+    ): Observable<Response<BaseResponse<List<NightWorkFileVo>>>>
+
+    @GET("nightwork/record")
+    fun getNightWorkFile(
+            @Query("userId") userId: String,
+            @Query("isRead") isRead: Boolean? = null,
+            @Query("page") page: Int,
+            @Query("perPage") perPage: Int = Constant.PAGE_SIZE
+    ): Observable<Response<BaseResponse<List<NightWorkFileVo>>>>
+
+    @POST("nightwork/sign")
+    fun signFile(
+            @Query("userId") userId: String,
+            @Query("fileNum") fileNum: String,
+            @Query("id") id: Int
+    ): Observable<Response<BaseResponse<Int>>>
+
+    @GET("nightwork/summary")
+    fun getSummary(
+//            @Query("cityCode") cityCode: String?,
+            @Query("districtCode") districtCode: String
+    ): Observable<Response<BaseResponse<NightWorkSummary>>>
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/model/bean/BaseResponse.kt b/app/src/main/java/cn/flightfeather/thirdapp/model/bean/BaseResponse.kt
index 6d5cf6c..45251bc 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/model/bean/BaseResponse.kt
+++ b/app/src/main/java/cn/flightfeather/thirdapp/model/bean/BaseResponse.kt
@@ -8,5 +8,11 @@
 data class BaseResponse<T>(
         val success: Boolean,
         val message: String,
+        val head: DataHead? = null,
         val data: T?
+)
+
+data class DataHead(
+        var page: Int = 1,
+        var totalPage: Int = 1
 )
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/model/bean/NightWorkFileVo.kt b/app/src/main/java/cn/flightfeather/thirdapp/model/bean/NightWorkFileVo.kt
new file mode 100644
index 0000000..00fbdea
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/model/bean/NightWorkFileVo.kt
@@ -0,0 +1,54 @@
+package cn.flightfeather.thirdapp.model.bean
+
+import com.google.gson.annotations.SerializedName
+import java.util.*
+
+/**
+ * @author riku
+ * Date: 2020/12/29
+ * 宸ュ湴澶滈棿鏂藉伐鏂囦欢
+ */
+class NightWorkFileVo {
+    @SerializedName("ncId")
+    var id: Int? = null
+    @SerializedName("ncNum")
+    var num: String? = null
+    @SerializedName("ncItemName")
+    var itemName: String? = null
+    @SerializedName("ncItemUnit")
+    var itemUnit: String? = null
+    @SerializedName("ncProvinceCode")
+    var pCode: String? = null
+    @SerializedName("ncProvinceName")
+    var pName: String? = null
+    @SerializedName("ncCityCode")
+    var cCode: String? = null
+    @SerializedName("ncCityName")
+    var cName: String? = null
+    @SerializedName("ncDistrictCode")
+    var dCode: String? = null
+    @SerializedName("ncDistrictName")
+    var dName: String? = null
+    @SerializedName("ncConstructionUnit")
+    var constructionUnit: String? = null
+    @SerializedName("ncPerson")
+    var person: String? = null
+    @SerializedName("ncApplyContent")
+    var applyContent: String? = null
+    @SerializedName("ncStartDate")
+    var startDate: Date? = null
+    @SerializedName("ncEndDate")
+    var endDate: Date? = null
+    @SerializedName("ncFileName")
+    var fileName: String? = null
+    @SerializedName("ncCreateTime")
+    var createTime: Date? = null
+    @SerializedName("ncUrl")
+    var url: String? = null
+    @SerializedName("ncUserId")
+    var userId: String? = null
+    @SerializedName("ncSceneId")
+    var sceneId: String? = null
+    @SerializedName("ncRead")
+    var isRead: Boolean? = null
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/model/bean/NightWorkSummary.kt b/app/src/main/java/cn/flightfeather/thirdapp/model/bean/NightWorkSummary.kt
new file mode 100644
index 0000000..b7e3552
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/model/bean/NightWorkSummary.kt
@@ -0,0 +1,12 @@
+package cn.flightfeather.thirdapp.model.bean
+
+/**
+ * @author riku
+ * Date: 2021/2/24
+ */
+class NightWorkSummary {
+    //鏂囦欢鎬绘暟
+    val totalCount: Int = 0
+    //宸茬鏀舵枃浠舵暟
+    var signedCount: Int = 0
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseActivity.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseActivity.kt
index 739b530..87c3ad2 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseActivity.kt
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseActivity.kt
@@ -1,6 +1,7 @@
 package cn.flightfeather.thirdapp.module.base
 
 import android.annotation.SuppressLint
+import android.app.Activity
 import android.content.Context
 import android.content.Intent
 import android.content.pm.ActivityInfo
@@ -12,6 +13,7 @@
 import android.support.v7.widget.Toolbar
 import android.view.MenuItem
 import android.view.ViewGroup
+import android.view.inputmethod.InputMethodManager
 import com.bumptech.glide.Glide
 import com.bumptech.glide.util.Util
 import io.reactivex.disposables.Disposable
@@ -78,3 +80,14 @@
 inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) {
     beginTransaction().func().commit()
 }
+
+/**
+ * 鎷撳睍fragment涓殣钘忚蒋閿洏鐨勬柟娉�
+ */
+fun Activity.hideKeyboard() {
+    this.window?.peekDecorView()?.let {
+        val inputManager =
+                this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+        inputManager.hideSoftInputFromWindow(it.windowToken, 0)
+    }
+}
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragment.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragment.kt
index abb56be..e1045a9 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragment.kt
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragment.kt
@@ -3,12 +3,18 @@
 
 import android.app.Activity
 import android.content.Context
+import android.graphics.drawable.Drawable
 import android.os.Build
 import android.os.Bundle
 import android.support.v4.app.Fragment
+import android.support.v7.widget.Toolbar
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.view.inputmethod.InputMethodManager
+import android.widget.TextView
+import cn.flightfeather.thirdapp.R
+import kotlinx.android.synthetic.main.tool_bar_layout.*
 import org.greenrobot.eventbus.EventBus
 
 /**
@@ -16,20 +22,45 @@
  * 2019.7.29
  * 鍩虹被fragment
  */
-abstract class BaseFragment : Fragment() {
+abstract class BaseFragment : Fragment(), ToolbarSetInterface {
 
     var mContext: Context? = null
 
     var mRootView: ViewGroup? = null
 
+    private lateinit var contentView: View
+
+    override fun getToolBar(): Toolbar = contentView.findViewById(R.id.tool_bar)
+
+    override fun toolbarEnabled(): Boolean =false
+
+    override fun getHeadIcon(): View = contentView.findViewById(R.id.img_back)
+
+    override fun onHeadIconClick() { activity?.onBackPressed() }
+
+    override fun getMyTitleTextView(): TextView? = contentView.findViewById(R.id.tv_main_title)
+
+    override fun getTitleEnabled(): Boolean = true
+
+    override fun getTitleText(): String? = ""
+
+    override fun getMenus(): List<View>? = listOf(contentView.findViewById(R.id.img_menu_1), contentView.findViewById(R.id.img_menu_2), contentView.findViewById(R.id.img_menu_3))
+
+    override fun getMenuVisibility(): List<Int?> = listOf(View.VISIBLE, View.VISIBLE, View.VISIBLE)
+
+    override fun getMenuRes(): List<Drawable?> = listOf(null)
+
+    override fun getMenuClickListener(): List<View.OnClickListener?> = listOf(null)
+
     override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
+            inflater: LayoutInflater, container: ViewGroup?,
+            savedInstanceState: Bundle?
     ): View? {
         mRootView = container
-        val view = inflater.inflate(getLayoutId(), container, false)
+        contentView = inflater.inflate(getLayoutId(), container, false)
         onCreateView()
-        return view
+        initToolbar()
+        return contentView
     }
 
     override fun onAttach(context: Context?) {
@@ -51,8 +82,23 @@
         }
     }
 
+    open fun onBackPressed(onActivityBack: () -> Unit) {
+        onActivityBack()
+    }
+
     open fun onCreateView() = Unit
 
     abstract fun getLayoutId(): Int
 
+    /**
+     * 鎷撳睍fragment涓殣钘忚蒋閿洏鐨勬柟娉�
+     */
+    fun Fragment.hideKeyboard() {
+        this.activity?.window?.peekDecorView()?.let {
+            val inputManager =
+                    this.activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+            inputManager.hideSoftInputFromWindow(it.windowToken, 0)
+        }
+    }
+
 }
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragmentActivity.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragmentActivity.kt
new file mode 100644
index 0000000..430fc04
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragmentActivity.kt
@@ -0,0 +1,41 @@
+package cn.flightfeather.thirdapp.module.base
+
+import android.support.v7.widget.Toolbar
+import cn.flightfeather.thirdapp.R
+import kotlinx.android.synthetic.main.tool_bar_layout.*
+
+/**
+ * @author riku
+ * Date: 2019/5/8
+ */
+abstract class BaseFragmentActivity:BaseFragmentListActivity() {
+
+    override fun getFragmentList(): ArrayList<BaseFragment>? = if (getInitFragment() == null) {
+        null
+    } else {
+        arrayListOf(getInitFragment()!!)
+    }
+
+//    override fun getToolBar(): Toolbar? = tool_bar
+
+    override fun getFragmentContainerID(): Int = R.id.container
+
+    override fun getLayoutId(): Int = R.layout.activity_fragment_container
+
+    abstract fun getInitFragment(): BaseFragment?
+
+    override fun onBackPressed() {
+        hideKeyboard()
+        if (fragments?.isNotEmpty() == true) {
+            fragments?.last()?.onBackPressed {
+                if (fragments?.size ?: 0 > 1) {
+                    navigateBack()
+                } else {
+                    super.onBackPressed()
+                }
+            }
+        } else {
+            super.onBackPressed()
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragmentListActivity.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragmentListActivity.kt
new file mode 100644
index 0000000..afd8696
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/base/BaseFragmentListActivity.kt
@@ -0,0 +1,106 @@
+package cn.flightfeather.thirdapp.module.base
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Bundle
+import android.support.v4.app.FragmentTransaction
+import android.support.v7.widget.Toolbar
+import cn.flightfeather.thirdapp.R
+
+/**
+ * @author riku
+ * Date: 2019/4/16
+ * 鍖呭惈fragment鐨勫熀绫籥ctivity
+ */
+abstract class BaseFragmentListActivity : BaseActivity(){
+
+    var lastFragmentPos = -1
+
+    var fragments: ArrayList<BaseFragment>? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        fragments = getFragmentList()
+        initToolbar()
+        navigateTo(0)
+    }
+
+    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+        super.onActivityResult(requestCode, resultCode, data)
+//        fragments?.forEach { it.onActivityResult(requestCode, resultCode, data) }
+    }
+
+    private fun initToolbar() {
+//        getToolBar()?.let { setSupportActionBar(it)}
+    }
+
+    //fragment鍒囨崲
+    @SuppressLint("CommitTransaction")
+    open fun navigateTo(p: Int, reStart: Boolean = false, transaction: FragmentTransaction? = null) {
+        fragments?.let {
+            if (p >= it.size || p < 0) return
+
+            (transaction ?: supportFragmentManager.beginTransaction())
+                .apply {
+                    if (lastFragmentPos >= 0 && lastFragmentPos < it.size) hide(it[lastFragmentPos])
+                    if (!it[p].isAdded) {
+                        add(getFragmentContainerID(), it[p], it[p].javaClass.simpleName)
+                    }
+                    show(it[p])
+                }.commitAllowingStateLoss()
+            lastFragmentPos = p
+        }
+    }
+
+    @SuppressLint("CommitTransaction")
+    fun navigateToNext(fragment: BaseFragment) {
+        fragments?.add(fragment)
+        if (fragments?.size ?: 0 > 1) {
+            navigateTo((fragments?.size ?: 0) - 1,
+                transaction = supportFragmentManager.beginTransaction().apply {
+                    setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
+                    setCustomAnimations(R.anim.right_enter_2, R.anim.left_exit_3)
+                })
+        }
+    }
+
+    @SuppressLint("CommitTransaction")
+    fun navigateBack() {
+        if (fragments?.size ?: 0 > 1) {
+            navigateTo((fragments?.size ?: 0) - 2,
+                transaction = supportFragmentManager.beginTransaction().apply {
+                    setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
+                    setCustomAnimations(R.anim.left_enter_3, R.anim.right_exit_2)
+                })
+        }
+        fragments?.removeAt(fragments?.size!! - 1)
+    }
+
+    /**
+     * 灏唂ragment 浠庡鑸爤涓垹闄�
+     */
+    fun deleteFragmentFromNavigation(fragment: BaseFragment) {
+        fragments?.let {list ->
+            if (list.contains(fragment)) {
+                var index = 0
+                for (i in 0 until list.size) {
+                    if (list[i] == fragment) {
+                        break
+                    }
+                    index++
+                }
+                fragments?.remove(fragment)
+                if (lastFragmentPos >= index) {
+                    lastFragmentPos -= 1
+                }
+            }
+        }
+    }
+
+    abstract fun getFragmentList(): ArrayList<BaseFragment>?
+
+    abstract fun getFragmentContainerID(): Int
+
+//    abstract fun getToolBar(): Toolbar?
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/base/ToolbarSetInterface.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/base/ToolbarSetInterface.kt
new file mode 100644
index 0000000..c250316
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/base/ToolbarSetInterface.kt
@@ -0,0 +1,83 @@
+package cn.flightfeather.thirdapp.module.base
+
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.support.v7.widget.Toolbar
+import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import org.jetbrains.anko.topPadding
+
+/**
+ * @author riku
+ * Date: 2019/5/8
+ * toolbar璁剧疆鎺ュ彛
+ */
+interface ToolbarSetInterface {
+    fun initToolbar() {
+        if (toolbarEnabled()) {
+            //璁剧疆鐢ㄦ埛澶村儚鐐瑰嚮浜嬩欢
+            getHeadIcon().setOnClickListener {
+                onHeadIconClick()
+            }
+            //宸︿晶鎸夐挳
+            getHeadIconRes()?.let {
+                val icon = getHeadIcon()
+                if (icon is ImageView) {
+                    icon.setImageDrawable(it)
+                }
+            }
+            //toolbar鏍囬鏂囧瓧
+            getMyTitleTextView()?.apply {
+                getTitleText()?.let {
+                    text = it
+                    visibility = if (getTitleEnabled()) View.VISIBLE else View.INVISIBLE
+                }
+            }
+            //鍙充晶鑿滃崟鎸夐挳
+            val menuList = getMenus() ?: emptyList()
+            val visibilities = getMenuVisibility()
+            val resources = getMenuRes()
+            val listeners = getMenuClickListener()
+            for (index in menuList.indices) {
+                menuList[index].apply {
+                    visibility = if (index < visibilities.size) visibilities[index]
+                            ?: View.GONE else View.GONE
+                    if (this is ImageView) {
+                        setImageDrawable(if (index < resources.size) resources[index] else null)
+                    }
+                    setOnClickListener(if (index < listeners.size) listeners[index] else null)
+                }
+            }
+        }
+    }
+    fun getToolBar(): Toolbar
+
+    fun toolbarEnabled(): Boolean
+
+    //toolbar宸︿晶鍥炬爣
+    fun getHeadIcon(): View
+    //toolbar宸︿晶鍥炬爣鐐瑰嚮浜嬩欢
+    fun onHeadIconClick()
+    //宸︿晶鎸夐挳鐨勫浘鐗囪祫婧�
+    fun getHeadIconRes(): Drawable? = null
+
+    //toolbar灞呬腑鏍囬
+    fun getMyTitleTextView(): TextView?
+    //鏄惁灞曠ず鏍囬鏍忎腑闂存爣棰�
+    fun getTitleEnabled(): Boolean
+    //鏍囬鍐呭
+    fun getTitleText(): String?
+
+
+    //toolbar 鍙充晶鑿滃崟
+    fun getMenus():List<View>?
+    //涓変釜鑿滃崟鎸夐挳鐨勫彲瑙佹��
+    fun getMenuVisibility(): List<Int?>
+    //涓変釜鑿滃崟鎸夐挳鐨勫浘鐗囪祫婧�
+    fun getMenuRes(): List<Drawable?>
+    //涓変釜鑿滃崟鎸夐挳鐨勬枃鏈�
+    fun getMenuText(): List<String?> = emptyList()
+    //涓変釜鑿滃崟鎸夐挳鐨勭偣鍑讳簨浠�
+    fun getMenuClickListener(): List<View.OnClickListener?>
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/common/FileBrowseViewModel.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/common/FileBrowseViewModel.kt
new file mode 100644
index 0000000..279070f
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/common/FileBrowseViewModel.kt
@@ -0,0 +1,34 @@
+package cn.flightfeather.thirdapp.module.common
+
+import cn.flightfeather.thirdapp.common.net.ResultCallBack
+import cn.flightfeather.thirdapp.module.base.BaseViewModel
+import cn.flightfeather.thirdapp.repository.MediaFileRepository
+import cn.flightfeather.thirdapp.util.file.FileItem
+
+/**
+ * @author riku
+ * Date: 2019/11/22
+ */
+class FileBrowseViewModel  : BaseViewModel() {
+
+    private val mediaFileRepository = MediaFileRepository()
+
+    val selectedFilePathList = ArrayList<String>()
+
+    //鎵�鏈夋枃浠讹紝鎸夌収鏂囦欢绫诲瀷鍒嗙被
+    val totalFiles = mutableMapOf<String, MutableList<FileItem>>()
+
+    //绫诲瀷鏂囦欢灞曠ず鐘舵�侊紝璁板綍璇ョ被鍨嬫枃浠剁殑閮ㄥ垎鏄惁宸茬粡灞曠ず鍦ㄧ晫闈笂
+    private val fileShowState = mutableMapOf<String, Boolean>()
+
+    //鍚屼竴绫诲瀷鏂囦欢鏌ヨ鍒板灏戜釜鍚庨渶瑕佸埛鏂板睍绀哄埌鐣岄潰涓�
+    private val needShowNum = 10
+
+    fun getFileCache(url: String, resultCallBack: ResultCallBack<String>) {
+        mediaFileRepository.getFileCache(url, resultCallBack)
+    }
+
+    fun saveFileCache(url: String, localPath: String) {
+        mediaFileRepository.saveFileCache(url, localPath)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/common/FileDownloadFragment.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/common/FileDownloadFragment.kt
new file mode 100644
index 0000000..a46efed
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/common/FileDownloadFragment.kt
@@ -0,0 +1,170 @@
+package cn.flightfeather.thirdapp.module.common
+
+import android.arch.lifecycle.ViewModelProviders
+import android.graphics.drawable.Drawable
+import android.os.Bundle
+import android.view.View
+import cn.flightfeather.thirdapp.R
+import cn.flightfeather.thirdapp.common.net.ResultCallBack
+import cn.flightfeather.thirdapp.module.base.BaseFragment
+import cn.flightfeather.thirdapp.module.base.BaseFragmentActivity
+import cn.flightfeather.thirdapp.util.file.FileUtils
+import com.liulishuo.okdownload.DownloadTask
+import com.liulishuo.okdownload.StatusUtil
+import com.liulishuo.okdownload.core.cause.EndCause
+import com.liulishuo.okdownload.kotlin.execute1
+import kotlinx.android.synthetic.main.fragment_file_download.*
+import org.jetbrains.anko.doAsync
+import java.io.File
+
+/**
+ * @author riku
+ * Date: 2019/12/31
+ */
+class FileDownloadFragment : BaseFragment() {
+
+    companion object {
+        fun newInstance(filePos: Int, filePath: String?, fileName: String?): FileDownloadFragment {
+            val bundle = Bundle().apply {
+                putInt("filePos", filePos)
+                putString("filePath", filePath)
+                putString("fileName", fileName)
+            }
+            return FileDownloadFragment().apply { arguments = bundle }
+        }
+    }
+
+    override fun getTitleText(): String? = "鏂囦欢涓嬭浇"
+
+    override fun toolbarEnabled(): Boolean = true
+
+    private var filePos = 0
+
+    private var filePath: String? = ""
+
+    private var fileName: String? = ""
+
+    private var task: DownloadTask? = null
+
+    private var downloadFilePath = ""
+
+    private lateinit var fileBrowseViewModel: FileBrowseViewModel
+
+    override fun getLayoutId(): Int = R.layout.fragment_file_download
+
+    override fun onCreateView() {
+        super.onCreateView()
+        fileBrowseViewModel = ViewModelProviders.of(this).get(FileBrowseViewModel::class.java)
+
+        arguments?.let {
+            filePos = it.getInt("filePos")
+            filePath = it.getString("filePath")
+            fileName = it.getString("fileName")
+        }
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+//        img_file_type.setImageResource(FileIcons.bigIcon(fileName))
+        txt_file_name.text = fileName
+        showLoadingText(false)
+
+        initTask()
+        initStatus()
+
+        filePath?.let {url ->
+            fileBrowseViewModel.getFileCache(url, object : ResultCallBack<String> {
+                override fun onSuccess(result: String?) {
+                    result?.let {
+                        downloadFilePath = it
+                        navigateToNextFragment()
+                    }
+                }
+
+                override fun onFailure() {
+                    startTask()
+                }
+            })
+        }
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        task?.cancel()
+    }
+
+    private fun initTask() {
+        context?.let {
+            val parentFile = FileUtils.getCacheDir(it)
+            downloadFilePath = parentFile.path + File.separator + fileName
+            filePath?.let {p ->
+                task = DownloadTask.Builder(p, parentFile)
+                    .setFilename(fileName)
+                    .setMinIntervalMillisCallbackProcess(16)
+                    .setPassIfAlreadyCompleted(false)
+                    .build()
+            }
+        }
+    }
+
+    private fun initStatus() =task?.let {
+        val status = StatusUtil.getStatus(it)
+        if (status == StatusUtil.Status.COMPLETED) {
+
+        }
+
+    }
+
+    private fun startTask() {
+        txt_progress.postDelayed({
+            if (activity != null && !activity!!.isFinishing && !activity!!.isDestroyed) {
+                showLoadingText(true)
+            }
+        }, 3000)
+        doAsync {
+            task?.execute1(
+                connected = {task, blockCount, currentOffset, totalLength ->
+                    // todo: 2019/12/31
+                },
+                progress = {task, currentOffset, totalLength ->
+                    circularProgressBar?.apply {
+                        progress = currentOffset.toFloat()
+                        progressMax = totalLength.toFloat()
+                    }
+                    val t = "${FileUtils.parseToFileSize(currentOffset)}/${FileUtils.parseToFileSize(totalLength)}"
+                    txt_progress?.text = t
+                }
+            ) { task, cause, realCause, model ->
+                task.tag = null
+                if (cause == EndCause.COMPLETED) {
+                    filePath?.let {
+                        fileBrowseViewModel.saveFileCache(it, downloadFilePath)
+                    }
+                    navigateToNextFragment()
+                } else if (cause == EndCause.ERROR) {
+                    // todo: 2019/12/31
+                }
+            }
+        }
+    }
+
+    private fun showLoadingText(visible: Boolean) {
+        if (visible) {
+            circularProgressBar.visibility = View.VISIBLE
+            txt_progress.visibility = View.VISIBLE
+            progress_circular.visibility = View.GONE
+        } else {
+            circularProgressBar.visibility = View.GONE
+            txt_progress.visibility = View.GONE
+            progress_circular.visibility = View.VISIBLE
+        }
+    }
+
+    private fun navigateToNextFragment() {
+        val a = activity
+        if (a is BaseFragmentActivity) {
+            a.navigateToNext(OfficeFileReadFragment.newInstance(filePos, downloadFilePath, fileName))
+            a.deleteFragmentFromNavigation(this@FileDownloadFragment)
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/common/OfficeFileManageActivity.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/common/OfficeFileManageActivity.kt
new file mode 100644
index 0000000..f93d35c
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/common/OfficeFileManageActivity.kt
@@ -0,0 +1,41 @@
+package cn.flightfeather.thirdapp.module.common
+
+import android.os.Bundle
+import cn.flightfeather.thirdapp.module.base.BaseFragment
+import cn.flightfeather.thirdapp.module.base.BaseFragmentActivity
+
+/**
+ * @author riku
+ * Date: 2019/12/31
+ */
+class OfficeFileManageActivity : BaseFragmentActivity() {
+
+    companion object {
+        const val FILE_PATH = "FILE_PATH"
+        const val FILE_POS = "FILE_POS"
+    }
+
+    private var filePos = 0
+
+    private var filePath: String? = ""
+
+    private var fileName: String? = ""
+
+    private var isRemoteFile = true
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        filePos = intent.getIntExtra("filePos", 0)
+        filePath = intent.getStringExtra("filePath")
+        fileName = intent.getStringExtra("fileName")
+        isRemoteFile = intent.getBooleanExtra("isRemoteFile", true)
+        super.onCreate(savedInstanceState)
+
+    }
+
+    override fun getInitFragment(): BaseFragment? =
+            if (isRemoteFile) {
+                FileDownloadFragment.newInstance(filePos, filePath, fileName)
+            } else {
+                OfficeFileReadFragment.newInstance(filePos, filePath, fileName)
+            }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/common/OfficeFileReadFragment.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/common/OfficeFileReadFragment.kt
new file mode 100644
index 0000000..76db360
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/common/OfficeFileReadFragment.kt
@@ -0,0 +1,131 @@
+package cn.flightfeather.thirdapp.module.common
+
+import android.app.Activity
+import android.content.Intent
+import android.graphics.drawable.Drawable
+import android.os.Bundle
+import android.os.Environment
+import android.support.v4.content.ContextCompat
+import android.view.View
+import android.view.ViewGroup
+import cn.flightfeather.thirdapp.R
+import cn.flightfeather.thirdapp.module.base.BaseFragment
+import cn.flightfeather.thirdapp.util.SystemServiceUtils
+import cn.flightfeather.thirdapp.util.file.FileUtils
+import com.tencent.smtt.sdk.QbSdk
+import com.tencent.smtt.sdk.TbsReaderView
+import kotlinx.android.synthetic.main.fragment_office_file.*
+import org.json.JSONException
+import org.json.JSONObject
+import java.io.File
+
+/**
+ * @author riku
+ * Date: 2019/12/31
+ * office鏂囦欢娴忚
+ */
+class OfficeFileReadFragment : BaseFragment() {
+
+    companion object {
+        fun newInstance(filePos: Int, filePath: String?, fileName: String?): OfficeFileReadFragment {
+            val bundle = Bundle().apply {
+                putInt("filePos", filePos)
+                putString("filePath", filePath)
+                putString("fileName", fileName)
+            }
+            return OfficeFileReadFragment().apply { arguments = bundle }
+        }
+    }
+
+    override fun toolbarEnabled(): Boolean = true
+
+    override fun getMenuVisibility(): List<Int?> = listOf(View.VISIBLE)
+
+    override fun getMenuRes(): List<Drawable?> = listOf(ContextCompat.getDrawable(context!!, R.drawable.icon_share_blue))
+
+    override fun getMenuClickListener(): List<View.OnClickListener?> = listOf(View.OnClickListener {
+        SystemServiceUtils.shareFile(activity, filePath)
+    })
+
+    override fun getTitleText(): String? = fileName
+
+    private var filePos = 0
+
+    private var filePath: String? = ""
+
+    private var fileName: String? = ""
+
+    private lateinit var tbsReaderView: TbsReaderView
+
+    override fun getLayoutId(): Int = R.layout.fragment_office_file
+
+    override fun onCreateView() {
+        arguments?.let {
+            filePos = it.getInt("filePos")
+            filePath = it.getString("filePath")
+            fileName = it.getString("fileName")
+        }
+        super.onCreateView()
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+//        init()
+        openLocalFile()
+
+        val intent = Intent()
+        intent.putExtra(OfficeFileManageActivity.FILE_PATH, filePath)
+        intent.putExtra(OfficeFileManageActivity.FILE_POS, filePos)
+        activity?.setResult(Activity.RESULT_OK, intent)
+    }
+
+    override fun onDetach() {
+        super.onDetach()
+        tbsReaderView.onStop()
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        tbsReaderView.onStop()
+    }
+
+    private fun init() {
+        val params = hashMapOf<String, String>()
+        params["local"] = "true"
+        val obj = JSONObject()
+        try {
+            obj.put("pkgName", context?.applicationContext?.packageName)
+        } catch (e: JSONException) {
+            e.printStackTrace()
+        }
+        params["menuData"] = obj.toString()
+        QbSdk.getMiniQBVersion(context)
+        QbSdk.openFileReader(context, filePath, params) {
+            activity?.finish()
+        }
+    }
+
+    private fun openLocalFile() {
+        tbsReaderView = TbsReaderView(context, null)
+        tbs_reader_container.addView(tbsReaderView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
+        if (!filePath.isNullOrEmpty()) {
+            val tempFile = File("/storage/emulated/0/TbsReaderTemp")
+            if (!tempFile.exists()) {
+                tempFile.mkdirs()
+            }
+
+            //鍔犺浇鏂囦欢
+            val localBundle = Bundle()
+            localBundle.putString("filePath", filePath)
+            localBundle.putString(
+                    "tempPath",
+                    Environment.getExternalStorageDirectory().path + File.separator + "TbsReaderTemp"
+            )
+            val result = tbsReaderView.preOpen(FileUtils.getExtensionName(filePath), false)
+            if (result) {
+                tbsReaderView.openFile(localBundle)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/inspection/MenuCameraActivity.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/inspection/MenuCameraActivity.kt
index 59f991a..82a55a5 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/module/inspection/MenuCameraActivity.kt
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/inspection/MenuCameraActivity.kt
@@ -51,6 +51,7 @@
 
     //褰撳墠閫夋嫨鐨勬媿鐓х被鍨�
     private var currentType = MediaFileType.RoutineRecord
+    private var currentTypeName = currentType.des
 
     lateinit var viewModel: MenuCameraViewModel
 
@@ -94,7 +95,9 @@
                     val oldFile = File(it)
                     val cal = Calendar.getInstance().apply { time = subTask?.executionstarttime }
                     scene?.run {
-                        val path = "FlightFeather/Photo/" + districtname + "/"+ cal.get(Calendar.YEAR) + "骞�" + (cal.get(Calendar.MONTH) + 1) + "鏈�/"+ (cal.get(Calendar.MONTH) + 1) + "鏈�" + cal.get(Calendar.DAY_OF_MONTH) + "鏃�/"+ name + "/浠绘剰鎷嶇収/"
+                        val path = "FlightFeather/Photo/" + districtname + "/" + cal.get(Calendar.YEAR) + "骞�" + (cal.get(Calendar.MONTH) + 1) + "鏈�/" +
+                                (cal.get(Calendar.MONTH) + 1) + "鏈�" + cal.get(Calendar.DAY_OF_MONTH) + "鏃�/" + name + "/浠绘剰鎷嶇収/" + currentTypeName + "/"
+
                         val fileName = UUIDGenerator.generateUUID(4) + ".jpg"
                         val newFile = File(Environment.getExternalStorageDirectory(), path + fileName)
                         if (!newFile.parentFile.exists()) {
@@ -154,6 +157,7 @@
             addOnItemTouchListener(RecyclerItemClickListener(this@MenuCameraActivity, this, object : RecyclerItemClickListener.OnItemClickListener {
                 override fun onItemClick(view: View?, position: Int) {
                     currentType = type
+                    currentTypeName = title.text.toString()
                     //鎷嶇収
                     if (dataList[position].guid == null) {
                         PhotoUtil.pickPhoto2(this@MenuCameraActivity, TAKE_PHOTO, 9)
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkManageActivity.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkManageActivity.kt
new file mode 100644
index 0000000..6d4adbc
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkManageActivity.kt
@@ -0,0 +1,99 @@
+package cn.flightfeather.thirdapp.module.nightwork
+
+import android.arch.lifecycle.Observer
+import android.arch.lifecycle.ViewModelProviders
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import cn.flightfeather.thirdapp.R
+import cn.flightfeather.thirdapp.model.bean.NightWorkFileVo
+import cn.flightfeather.thirdapp.module.base.BaseActivity
+import cn.flightfeather.thirdapp.module.common.OfficeFileManageActivity
+import cn.flightfeather.thirdapp.util.CommonUtils
+import cn.flightfeather.thirdapp.view.recyclerview.BaseCustomViewHolder
+import cn.flightfeather.thirdapp.view.recyclerview.MySection
+import cn.flightfeather.thirdapp.view.recyclerview.RecyclerViewPanel
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import kotlinx.android.synthetic.main.activity_night_work_manage.*
+import kotlinx.android.synthetic.main.layout_toolbar_2.*
+
+/**
+ * @author riku
+ * Date: 2021/1/4
+ */
+class NightWorkManageActivity : BaseActivity() {
+    override fun getLayoutId(): Int = R.layout.activity_night_work_manage
+
+    lateinit var viewModel: NightWorkViewModel
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        viewModel = ViewModelProviders.of(this).get(NightWorkViewModel::class.java)
+
+        initToolbar()
+        initView()
+        initRecyclerView()
+        initObserver()
+
+        viewModel.getSummary()
+    }
+
+    private fun initToolbar() {
+        img_back.setOnClickListener { finish() }
+        tv_main_title.text = "澶滈棿鏂藉伐璁稿彲"
+    }
+
+    private fun initView() {
+
+    }
+
+    private fun initRecyclerView() {
+        object : RecyclerViewPanel<NightWorkFileVo>(viewModel.dataLoadModel3, recycler_view, this) {
+            override fun getItemLayoutId(): Int? = R.layout.item_night_work_3
+
+            override fun onBindView(holder: BaseCustomViewHolder, item: MySection<NightWorkFileVo>?) {
+                item?.t?.let {vo ->
+                    val time = CommonUtils.getStartEndDate(vo.startDate, vo.endDate)
+
+                    holder.setText(R.id.txt_content, vo.itemName)
+                            .setText(R.id.txt_night_work_num, vo.num)
+                            .setText(R.id.txt_time, time)
+                            if (vo.isRead == true) {
+                                holder.setSelected(R.id.txt_signed, true)
+                                        .setText(R.id.txt_signed, getString(R.string.signed))
+
+                            } else{
+                                holder.setSelected(R.id.txt_signed, false)
+                                        .setText(R.id.txt_signed, getString(R.string.unsigned))
+                            }
+                }
+            }
+
+            override fun onItemClick(adapter: BaseQuickAdapter<Any?, BaseViewHolder>, view: View, position: Int, dataList: List<NightWorkFileVo>) {
+                super.onItemClick(adapter, view, position, dataList)
+                openDetail(dataList[position])
+            }
+        }.run {
+            init()
+            startRefresh()
+        }
+    }
+
+    private fun initObserver() {
+        viewModel.summary.observe(this, Observer {
+            it?.let { n ->
+                txt_total_count.text = n.totalCount.toString()
+                txt_signed_count.text = n.signedCount.toString()
+            }
+        })
+    }
+
+    private fun openDetail(nightWorkFileVo: NightWorkFileVo) {
+        val intent = Intent(this, OfficeFileManageActivity::class.java)
+        intent.putExtra("filePath", nightWorkFileVo.url)
+        intent.putExtra("fileName", nightWorkFileVo.fileName)
+        intent.putExtra("isRemoteFile", nightWorkFileVo.url?.contains("http") == true)
+        startActivity(intent)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkRecordActivity.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkRecordActivity.kt
index 3872ef9..530d7ae 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkRecordActivity.kt
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkRecordActivity.kt
@@ -1,10 +1,25 @@
 package cn.flightfeather.thirdapp.module.nightwork
 
 import android.arch.lifecycle.ViewModelProviders
+import android.content.Intent
 import android.os.Bundle
+import android.support.v7.widget.LinearLayoutManager
+import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
 import android.view.View
 import cn.flightfeather.thirdapp.R
+import cn.flightfeather.thirdapp.common.net.ResultCallBack
+import cn.flightfeather.thirdapp.model.bean.NightWorkFileVo
 import cn.flightfeather.thirdapp.module.base.BaseActivity
+import cn.flightfeather.thirdapp.module.common.OfficeFileManageActivity
+import cn.flightfeather.thirdapp.util.CommonUtils
+import cn.flightfeather.thirdapp.view.recyclerview.BaseCustomViewHolder
+import cn.flightfeather.thirdapp.view.recyclerview.EmptyLoadMoreView
+import cn.flightfeather.thirdapp.view.recyclerview.MySection
+import cn.flightfeather.thirdapp.view.recyclerview.RecyclerViewPanel
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.chad.library.adapter.base.loadmore.LoadMoreView
 import kotlinx.android.synthetic.main.activity_night_work.*
 import kotlinx.android.synthetic.main.layout_toolbar_2.*
 
@@ -12,10 +27,25 @@
  * @author riku
  * Date: 2020/12/24
  */
-class NightWorkRecordActivity : BaseActivity(), View.OnClickListener {
-    override fun getLayoutId(): Int = R.layout.activity_night_work
+class NightWorkRecordActivity : BaseActivity() {
+
+    inner class FileLoadMoreView : LoadMoreView() {
+        override fun getLayoutId(): Int = R.layout.item_night_work_no_more
+
+        override fun getLoadingViewId(): Int = R.id.no_more
+
+        override fun getLoadFailViewId(): Int = R.id.no_more
+
+        override fun getLoadEndViewId(): Int = R.id.no_more
+    }
 
     lateinit var viewModel: NightWorkViewModel
+
+    private lateinit var recyclerViewPanel1: RecyclerViewPanel<NightWorkFileVo>
+
+    private lateinit var recyclerViewPanel2: RecyclerViewPanel<NightWorkFileVo>
+
+    override fun getLayoutId(): Int = R.layout.activity_night_work
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -28,23 +58,142 @@
     }
 
     private fun initToolbar() {
-        img_back.setOnClickListener(this)
+        img_back.setOnClickListener { finish() }
         tv_main_title.text = "澶滈棿鏂藉伐璁稿彲"
     }
 
+    /**
+     * 鏈�鏂版湭璇绘枃浠�
+     */
     private fun initRecyclerView1() {
-        recycler_view
+        recyclerViewPanel1 = object : RecyclerViewPanel<NightWorkFileVo>(viewModel.dataLoadModel1, recycler_view, this) {
+            private val TYPE_ITEM = 1
+            private val TYPE_EMPTY = 2
+
+            override fun getItemLayoutId(): Int? = R.layout.item_night_work
+
+//            override fun getItemLayoutIdMap(): Map<Int, Int> = mapOf(
+//                    Pair(TYPE_ITEM, R.layout.item_night_work),
+//                    Pair(TYPE_EMPTY, R.layout.item_night_work_no_more)
+//            )
+
+//            override fun convertToSection(list: List<NightWorkFileVo>): MutableList<MySection<NightWorkFileVo>> {
+//                val resultList = mutableListOf<MySection<NightWorkFileVo>>()
+//                list.forEach {
+//                    if (it.id != null) {
+//                        resultList.add(MySection(it, TYPE_ITEM))
+//                    }
+//                }
+//                resultList.add(MySection(NightWorkFileVo(), TYPE_EMPTY))
+//                return resultList
+//            }
+
+            override fun onBindView(holder: BaseCustomViewHolder, item: MySection<NightWorkFileVo>?) {
+                item?.t?.let { vo ->
+//                    when (holder.itemViewType) {
+//                        TYPE_ITEM -> {
+//
+//                        }
+//                        TYPE_EMPTY -> Unit
+//                        else -> Unit
+//                    }
+                    val time = CommonUtils.getStartEndDate(vo.startDate, vo.endDate)
+                    holder.setText(R.id.txt_night_work_num, vo.num)
+                            .setText(R.id.txt_content, vo.applyContent)
+                            .setText(R.id.txt_time, time)
+                            .addOnClickListener(R.id.txt_sign)
+                }
+            }
+
+            override fun onItemClick(adapter: BaseQuickAdapter<Any?, BaseViewHolder>, view: View, position: Int, dataList: List<NightWorkFileVo>) {
+                super.onItemClick(adapter, view, position, dataList)
+                val d = dataList[position]
+                openDetail(d)
+                d.id?.let { id ->
+                    d.num?.let { num ->
+                        viewModel.signFile(id, num, object : ResultCallBack<Int> {
+                            override fun onSuccess(result: Int?) {
+                                adapter.remove(position)
+                                recyclerViewPanel2.addData(0, listOf(d))
+                            }
+
+                            override fun onFailure() {
+                            }
+                        })
+                    }
+                }
+            }
+
+            override fun onItemChildClick(adapter: BaseQuickAdapter<Any?, BaseViewHolder>, view: View, position: Int, dataList: List<NightWorkFileVo>) {
+                super.onItemChildClick(adapter, view, position, dataList)
+                val d = dataList[position]
+                when (view.id) {
+                    R.id.txt_sign -> {
+                        d.id?.let { id ->
+                            d.num?.let { num ->
+                                viewModel.signFile(id, num, object : ResultCallBack<Int> {
+                                    override fun onSuccess(result: Int?) {
+                                        adapter.remove(position)
+                                        recyclerViewPanel2.addData(0, listOf(d))
+                                    }
+
+                                    override fun onFailure() {
+                                    }
+                                })
+                            }
+                        }
+                    }
+                }
+            }
+
+            override fun getMyLayoutManager(): RecyclerView.LayoutManager = LinearLayoutManager(this@NightWorkRecordActivity, LinearLayoutManager.HORIZONTAL, false)
+
+            override fun needSwipeRefresh(): Boolean = false
+
+            override fun getLoadMoreView(): LoadMoreView? = FileLoadMoreView()
+
+            override fun getMyEmptyView(): View? = LayoutInflater.from(this@NightWorkRecordActivity).inflate(R.layout.layout_night_work_empty, null)
+
+        }.also {
+            it.init()
+            it.startRefresh()
+        }
     }
 
+    /**
+     * 鍘嗗彶鏂囦欢
+     */
     private fun initRecyclerView2() {
+        recyclerViewPanel2 = object : RecyclerViewPanel<NightWorkFileVo>(viewModel.dataLoadModel2, recycler_view_2, this) {
+            override fun getItemLayoutId(): Int? = R.layout.item_night_work_2
 
+            override fun onBindView(holder: BaseCustomViewHolder, item: MySection<NightWorkFileVo>?) {
+                item?.t?.let { vo ->
+                    val time = CommonUtils.getStartEndDate(vo.startDate, vo.endDate)
+                    holder.setText(R.id.txt_content, vo.applyContent)
+                            .setText(R.id.txt_time, time)
+                }
+            }
+
+            override fun onItemClick(adapter: BaseQuickAdapter<Any?, BaseViewHolder>, view: View, position: Int, dataList: List<NightWorkFileVo>) {
+                super.onItemClick(adapter, view, position, dataList)
+                openDetail(dataList[position])
+            }
+        }.also {
+            it.init()
+            it.startRefresh()
+        }
     }
 
     private fun initObserver() {
 
     }
 
-    override fun onClick(v: View?) {
-        TODO("Not yet implemented")
+    private fun openDetail(nightWorkFileVo: NightWorkFileVo) {
+        val intent = Intent(this, OfficeFileManageActivity::class.java)
+        intent.putExtra("filePath", nightWorkFileVo.url)
+        intent.putExtra("fileName", nightWorkFileVo.fileName)
+        intent.putExtra("isRemoteFile", nightWorkFileVo.url?.contains("http") == true)
+        startActivity(intent)
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkViewModel.kt b/app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkViewModel.kt
index fc21fcc..ac909ce 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkViewModel.kt
+++ b/app/src/main/java/cn/flightfeather/thirdapp/module/nightwork/NightWorkViewModel.kt
@@ -1,6 +1,12 @@
 package cn.flightfeather.thirdapp.module.nightwork
 
+import android.arch.lifecycle.MutableLiveData
+import cn.flightfeather.thirdapp.common.net.ResultCallBack
+import cn.flightfeather.thirdapp.model.bean.NightWorkFileVo
+import cn.flightfeather.thirdapp.model.bean.NightWorkSummary
 import cn.flightfeather.thirdapp.module.base.BaseViewModel
+import cn.flightfeather.thirdapp.repository.NightWorkRepository
+import cn.flightfeather.thirdapp.view.recyclerview.DataLoadModel
 
 /**
  * @author riku
@@ -8,4 +14,64 @@
  */
 class NightWorkViewModel : BaseViewModel() {
 
+    private val nightWorkRepository = NightWorkRepository()
+
+    var summary = MutableLiveData<NightWorkSummary>()
+
+    //鑾峰彇鏈�鏂版湭璇绘枃浠�
+    val dataLoadModel1 = object : DataLoadModel<NightWorkFileVo>(application) {
+        override fun loadDataByRefresh() {
+            getNightWorkFile(false, 1, this)
+        }
+
+        override fun loadDataByLoadMore(page: Int) {
+            getNightWorkFile(false, page, this)
+        }
+    }
+
+    //鑾峰彇鍘嗗彶宸茶鏂囦欢
+    val dataLoadModel2 = object : DataLoadModel<NightWorkFileVo>(application) {
+        override fun loadDataByRefresh() {
+            getNightWorkFile(true, 1, this)
+        }
+
+        override fun loadDataByLoadMore(page: Int) {
+            getNightWorkFile(true, page, this)
+        }
+    }
+
+    //鑾峰彇鍏ㄩ儴鏂囦欢
+    val dataLoadModel3 = object : DataLoadModel<NightWorkFileVo>(application) {
+        override fun loadDataByRefresh() {
+            getRecord(application.currentUser.dguid, 1, this)
+        }
+
+        override fun loadDataByLoadMore(page: Int) {
+            getRecord(application.currentUser.dguid, page, this)
+        }
+    }
+
+    fun getNightWorkFile(isRead: Boolean, page: Int, callBack: ResultCallBack<List<NightWorkFileVo>>) {
+        nightWorkRepository.getNightWorkFile(userId, isRead, page, callBack)
+    }
+
+    fun signFile(fileId: Int, fileNum: String, callBack: ResultCallBack<Int>) {
+        nightWorkRepository.signFile(userId, fileNum, fileId, callBack)
+    }
+
+    fun getRecord(districtCode: String, page: Int, callBack: ResultCallBack<List<NightWorkFileVo>>) {
+        nightWorkRepository.getRecord(districtCode, page, callBack)
+    }
+
+    fun getSummary() {
+        nightWorkRepository.getSummary(application.currentUser.dguid, object : ResultCallBack<NightWorkSummary> {
+            override fun onSuccess(result: NightWorkSummary?) {
+                result?.let { summary.value = it }
+            }
+
+            override fun onFailure() {
+//                summary.value = NightWorkSummary()
+            }
+        })
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/repository/MediaFileRepository.kt b/app/src/main/java/cn/flightfeather/thirdapp/repository/MediaFileRepository.kt
new file mode 100644
index 0000000..9edb3b0
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/repository/MediaFileRepository.kt
@@ -0,0 +1,51 @@
+package cn.flightfeather.thirdapp.repository
+
+import cn.flightfeather.thirdapp.common.net.ResultCallBack
+import cn.flightfeather.thirdapp.common.net.ResultObserver
+import cn.flightfeather.thirdapp.common.net.RetrofitFactory
+import cn.flightfeather.thirdapp.repository.dao.MediaFileDao
+import retrofit2.Response
+import java.io.File
+
+/**
+ * @author riku
+ * Date: 2020/4/18
+ */
+class MediaFileRepository {
+    private val mediaFileDao =  MediaFileDao()
+
+    fun getFileCache(url: String?, resultCallBack: ResultCallBack<String>) {
+        //url 涓嶆槸缃戠粶璺緞鏃讹紝杩斿洖鍏惰嚜韬�
+        if (url?.contains("http") != true) {
+            resultCallBack.onSuccess(url)
+            return
+        }
+
+        val dbService = mediaFileDao.getFileCache(url).map {
+            Response.success(it)
+        }
+
+        RetrofitFactory.executeResult(dbService, object : ResultObserver<String>() {
+            override fun onSuccess(result: String?) {
+                if (result.isNullOrBlank()) {
+                    resultCallBack.onFailure()
+                } else {
+                    val file = File(result)
+                    if (file.exists()) {
+                        resultCallBack.onSuccess(result)
+                    } else {
+                        resultCallBack.onFailure()
+                    }
+                }
+            }
+
+            override fun onFailure(e: Throwable, isNetWorkError: Boolean) {
+                resultCallBack.onFailure()
+            }
+        })
+    }
+
+    fun saveFileCache(url: String, localPath: String) {
+        mediaFileDao.saveFileCache(url, localPath)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/repository/NightWorkRepository.kt b/app/src/main/java/cn/flightfeather/thirdapp/repository/NightWorkRepository.kt
new file mode 100644
index 0000000..2b51811
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/repository/NightWorkRepository.kt
@@ -0,0 +1,84 @@
+package cn.flightfeather.thirdapp.repository
+
+import cn.flightfeather.thirdapp.common.net.ResultCallBack
+import cn.flightfeather.thirdapp.common.net.ResultObserver
+import cn.flightfeather.thirdapp.common.net.RetrofitFactory
+import cn.flightfeather.thirdapp.httpservice.NightWorkService
+import cn.flightfeather.thirdapp.model.bean.BaseResponse
+import cn.flightfeather.thirdapp.model.bean.NightWorkFileVo
+import cn.flightfeather.thirdapp.model.bean.NightWorkSummary
+
+/**
+ * @author riku
+ * Date: 2020/12/29
+ */
+class NightWorkRepository {
+    val retrofit = RetrofitFactory.instance.retrofit
+
+    fun getRecord(districtCode: String, page: Int, resultCallBack: ResultCallBack<List<NightWorkFileVo>>) {
+        val service = retrofit.create(NightWorkService::class.java).getRecord(districtCode, page)
+
+        RetrofitFactory.executeResult(service, object : ResultObserver<BaseResponse<List<NightWorkFileVo>>>() {
+            override fun onSuccess(result: BaseResponse<List<NightWorkFileVo>>?) {
+                resultCallBack.onSuccess(result?.data)
+            }
+
+            override fun onPage(current: Int, total: Int) {
+                super.onPage(current, total)
+                resultCallBack.onPage(current, total)
+            }
+
+            override fun onFailure(e: Throwable, isNetWorkError: Boolean) {
+                resultCallBack.onFailure()
+            }
+        })
+    }
+
+    fun getNightWorkFile(userId: String, isRead: Boolean? = null, page: Int, resultCallBack: ResultCallBack<List<NightWorkFileVo>>) {
+        val service = retrofit.create(NightWorkService::class.java).getNightWorkFile(userId, isRead, page)
+
+        RetrofitFactory.executeResult(service, object : ResultObserver<BaseResponse<List<NightWorkFileVo>>>() {
+            override fun onSuccess(result: BaseResponse<List<NightWorkFileVo>>?) {
+                resultCallBack.onSuccess(result?.data)
+            }
+
+            override fun onPage(current: Int, total: Int) {
+                super.onPage(current, total)
+                resultCallBack.onPage(current, total)
+            }
+
+            override fun onFailure(e: Throwable, isNetWorkError: Boolean) {
+                resultCallBack.onFailure()
+            }
+        })
+    }
+
+    fun signFile(userId: String, fileNum: String, id: Int, resultCallBack: ResultCallBack<Int>) {
+        val service = retrofit.create(NightWorkService::class.java).signFile(userId, fileNum, id)
+
+        RetrofitFactory.executeResult(service, object : ResultObserver<BaseResponse<Int>>() {
+            override fun onSuccess(result: BaseResponse<Int>?) {
+                resultCallBack.onSuccess(result?.data)
+            }
+
+            override fun onFailure(e: Throwable, isNetWorkError: Boolean) {
+                resultCallBack.onFailure()
+            }
+        })
+    }
+
+    fun getSummary(districtCode: String, resultCallBack: ResultCallBack<NightWorkSummary>) {
+        val service = retrofit.create(NightWorkService::class.java).getSummary(districtCode)
+
+        RetrofitFactory.executeResult(service, object : ResultObserver<BaseResponse<NightWorkSummary>>() {
+            override fun onSuccess(result: BaseResponse<NightWorkSummary>?) {
+                resultCallBack.onSuccess(result?.data)
+            }
+
+            override fun onFailure(e: Throwable, isNetWorkError: Boolean) {
+                resultCallBack.onFailure()
+            }
+        })
+
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/repository/dao/MediaFileDao.kt b/app/src/main/java/cn/flightfeather/thirdapp/repository/dao/MediaFileDao.kt
index e9b7ff7..b7174b8 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/repository/dao/MediaFileDao.kt
+++ b/app/src/main/java/cn/flightfeather/thirdapp/repository/dao/MediaFileDao.kt
@@ -1,9 +1,14 @@
 package cn.flightfeather.thirdapp.repository.dao
 
+import cn.flightfeather.thirdapp.bean.entity.MediaFileCache
 import cn.flightfeather.thirdapp.bean.entity.Mediafile
 import cn.flightfeather.thirdapp.common.database.DbFactory
+import cn.flightfeather.thirdapp.common.database.FlatSaveInterface
+import cn.flightfeather.thirdapp.common.database.flatMapDbSaveResult
+import com.ping.greendao.gen.MediaFileCacheDao
 import com.ping.greendao.gen.MediafileDao
 import io.reactivex.Observable
+import org.greenrobot.greendao.AbstractDao
 
 /**
  * @author riku
@@ -70,4 +75,47 @@
             true
         }
     }
+
+    /**
+     * 鑾峰彇缂撳瓨鐨勬枃浠�
+     */
+    fun getFileCache(url: String?): Observable<String> {
+        return DbFactory.getGreenDaoObservable().map {
+            val resultList = it.mediaFileCacheDao.queryBuilder()
+                    .where(MediaFileCacheDao.Properties.Url.eq(url))
+                    .list()
+            if (resultList.isNotEmpty()) {
+                resultList[0].path
+            } else {
+                ""
+            }
+        }
+    }
+
+    /**
+     * 淇濆瓨缂撳瓨鐨勬枃浠�
+     */
+    fun saveFileCache(url: String, localPath: String, thumbnailPath: String? = null) {
+        flatMapDbSaveResult(DbFactory.getInstance().mediaFileCacheDao,
+                object : FlatSaveInterface<MediaFileCache, Long> {
+                    override fun onQuery(dao: AbstractDao<MediaFileCache, Long>): List<MediaFileCache> {
+                        return dao.queryBuilder()
+                                .where(MediaFileCacheDao.Properties.Url.eq(url))
+                                .list()
+                    }
+
+                    override fun onUpdate(list: List<MediaFileCache>) {
+                        list[0].apply {
+                            path = localPath
+                        }
+                    }
+
+                    override fun onInsert(): List<MediaFileCache> {
+                        return listOf(MediaFileCache().apply {
+                            this.url = url
+                            this.path = localPath
+                        })
+                    }
+                })
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/util/CommonUtils.java b/app/src/main/java/cn/flightfeather/thirdapp/util/CommonUtils.java
index 2f318e7..143fec5 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/util/CommonUtils.java
+++ b/app/src/main/java/cn/flightfeather/thirdapp/util/CommonUtils.java
@@ -5,10 +5,12 @@
 import com.ping.greendao.gen.DaoSession;
 import com.ping.greendao.gen.DomainitemDao;
 
+import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 
 import cn.flightfeather.thirdapp.R;
 import cn.flightfeather.thirdapp.bean.entity.Domainitem;
@@ -18,6 +20,7 @@
  */
 
 public class CommonUtils {
+
     public static List<Domainitem> getDomainItemByCalalogGuid(DaoSession daoSession, String guid) {
         return daoSession.getDomainitemDao().queryBuilder()
                 .where(DomainitemDao.Properties.Dcguid.eq(guid))
@@ -210,6 +213,26 @@
         cal.setTime(getCurrentYearEndTime());
         cal.add(Calendar.YEAR, -1);
         return cal.getTime();
+    }
+
+    /**
+     * 鑾峰彇鏃堕棿娈垫枃鏈�
+     */
+    public static String getStartEndDate(Date startDate, Date endDate) {
+        SimpleDateFormat format1 = new SimpleDateFormat("yyyy.MM.dd", Locale.CHINESE);
+        String s = format1.format(startDate);
+        String e = format1.format(endDate);
+        String str = "";
+        try {
+            if (s.substring(0, 4).equals(e.substring(0, 4))) {
+                str = s + "-" + e.substring(5);
+            } else {
+                str = s + "-" + e;
+            }
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        return str;
     }
 
     /**
@@ -457,4 +480,5 @@
     public static byte intToByte(int x) {
         return (byte) x;
     }
+
 }
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/util/Constant.java b/app/src/main/java/cn/flightfeather/thirdapp/util/Constant.java
index 28f6f8f..ea74dbb 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/util/Constant.java
+++ b/app/src/main/java/cn/flightfeather/thirdapp/util/Constant.java
@@ -123,4 +123,6 @@
     //灞曠ず绫诲瀷
     String UNCHANGED = "unchanged";//闂灞曠ず绫诲瀷
     String CHANGED = "changed"; //鏁存敼灞曠ず绫诲瀷
+
+    int PAGE_SIZE = 10;
 }
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/util/CrashHandler.java b/app/src/main/java/cn/flightfeather/thirdapp/util/CrashHandler.java
deleted file mode 100644
index 8b9d360..0000000
--- a/app/src/main/java/cn/flightfeather/thirdapp/util/CrashHandler.java
+++ /dev/null
@@ -1,198 +0,0 @@
-package cn.flightfeather.thirdapp.util;
-
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.os.Build;
-import android.os.Environment;
-import android.os.Looper;
-import android.widget.Toast;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.lang.Thread.UncaughtExceptionHandler;
-import java.lang.reflect.Field;
-import java.util.Calendar;
-import java.util.HashMap;
-import java.util.Map;
-
-import cn.flightfeather.thirdapp.CommonApplication;
-
-/**
- * UncaughtException澶勭悊绫�,褰撶▼搴忓彂鐢烾ncaught寮傚父鐨勬椂鍊�,鏈夎绫绘潵鎺ョ绋嬪簭,骞惰褰曞彂閫侀敊璇姤鍛�.
- *
- * @author user
- */
-public class CrashHandler implements UncaughtExceptionHandler {
-
-    public static final String TAG = "CrashHandler";
-    private final CommonApplication mApp;
-
-    // 绯荤粺榛樿鐨刄ncaughtException澶勭悊绫�
-    private UncaughtExceptionHandler mDefaultHandler;
-    // CrashHandler瀹炰緥
-    private static CrashHandler INSTANCE;
-    // 绋嬪簭鐨凜ontext瀵硅薄
-    private Context mContext;
-    // 鐢ㄦ潵瀛樺偍璁惧淇℃伅鍜屽紓甯镐俊鎭�
-    private Map<String, String> infos = new HashMap<>();
-
-    private CrashHandler(CommonApplication app) {
-        this.mApp = app;
-    }
-    /**
-     * 鑾峰彇CrashHandler瀹炰緥 ,鍗曚緥妯″紡
-     */
-    public static CrashHandler getInstance(CommonApplication app) {
-        if (INSTANCE == null) {
-            INSTANCE = new CrashHandler(app);
-        }
-        return INSTANCE;
-    }
-
-    /**
-     * 鍒濆鍖�
-     *
-     * @param context 涓婁笅鏂�
-     */
-    public void init(Context context) {
-        mContext = context;
-        // 鑾峰彇绯荤粺榛樿鐨刄ncaughtException澶勭悊鍣�
-        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
-        // 璁剧疆璇rashHandler涓虹▼搴忕殑榛樿澶勭悊鍣�
-        Thread.setDefaultUncaughtExceptionHandler(this);
-    }
-
-    /**
-     * 褰揢ncaughtException鍙戠敓鏃朵細杞叆璇ュ嚱鏁版潵澶勭悊
-     */
-    @Override
-    public void uncaughtException(Thread thread, Throwable ex) {
-        if (!handleException(ex) && mDefaultHandler != null) {
-            // 濡傛灉鐢ㄦ埛娌℃湁澶勭悊鍒欒绯荤粺榛樿鐨勫紓甯稿鐞嗗櫒鏉ュ鐞�
-            mDefaultHandler.uncaughtException(thread, ex);
-        } else {
-            try {
-                Thread.sleep(3000);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-            // 閫�鍑虹▼搴�
-            android.os.Process.killProcess(android.os.Process.myPid());
-            System.exit(1);
-        }
-    }
-
-    /**
-     * 鑷畾涔夐敊璇鐞�,鏀堕泦閿欒淇℃伅 鍙戦�侀敊璇姤鍛婄瓑鎿嶄綔鍧囧湪姝ゅ畬鎴�.
-     *
-     * @param ex 寮傚父
-     * @return true:濡傛灉澶勭悊浜嗚寮傚父淇℃伅;鍚﹀垯杩斿洖false.
-     */
-    private boolean handleException(Throwable ex) {
-        if (ex == null) {
-            return false;
-        }
-        // 浣跨敤Toast鏉ユ樉绀哄紓甯镐俊鎭�
-        new Thread() {
-            @Override
-            public void run() {
-                Looper.prepare();
-                Toast.makeText(mContext, "寰堟姳姝�,绋嬪簭鍑虹幇寮傚父,鍗冲皢閫�鍑�.", Toast.LENGTH_LONG)
-                        .show();
-                Looper.loop();
-            }
-        }.start();
-        // 鏀堕泦璁惧鍙傛暟淇℃伅
-        collectDeviceInfo(mContext);
-        // 淇濆瓨鏃ュ織鏂囦欢
-        saveCrashInfo2File(ex);
-        return true;
-    }
-
-    /**
-     * 鏀堕泦璁惧鍙傛暟淇℃伅
-     *
-     * @param ctx 涓婁笅鏂�
-     */
-    public void collectDeviceInfo(Context ctx) {
-        try {
-            PackageManager pm = ctx.getPackageManager();
-            PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(),
-                    PackageManager.GET_ACTIVITIES);
-            if (pi != null) {
-                String versionName = pi.versionName == null ? "null"
-                        : pi.versionName;
-                String versionCode = pi.versionCode + "";
-                infos.put("versionName", versionName);
-                infos.put("versionCode", versionCode);
-            }
-        } catch (NameNotFoundException e) {
-            e.printStackTrace();
-        }
-        Field[] fields = Build.class.getDeclaredFields();
-        for (Field field : fields) {
-            try {
-                field.setAccessible(true);
-                infos.put(field.getName(), field.get(null).toString());
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    /**
-     * 淇濆瓨閿欒淇℃伅鍒版枃浠朵腑
-     *
-     * @param ex 寮傚父
-     * @return 杩斿洖鏂囦欢鍚嶇О, 渚夸簬灏嗘枃浠朵紶閫佸埌鏈嶅姟鍣�
-     */
-    private String saveCrashInfo2File(Throwable ex) {
-
-        final StringBuilder sb = new StringBuilder();
-        for (Map.Entry<String, String> entry : infos.entrySet()) {
-            String key = entry.getKey();
-            String value = entry.getValue();
-            sb.append(key).append("=").append(value).append("\n");
-        }
-
-        Writer writer = new StringWriter();
-        PrintWriter printWriter = new PrintWriter(writer);
-        ex.printStackTrace(printWriter);
-        Throwable cause = ex.getCause();
-        while (cause != null) {
-            cause.printStackTrace(printWriter);
-            cause = cause.getCause();
-        }
-        printWriter.close();
-        String result = writer.toString();
-        sb.append(result);
-        try {
-            String time = DateFormatter.dateTimeFormat_full.format(Calendar.getInstance().getTime());
-            String fileName = "crash-" + time + ".log";
-            String path;
-            if (Environment.getExternalStorageState().equals(
-                    Environment.MEDIA_MOUNTED)) {
-                path = Environment.getExternalStorageDirectory()
-                        .getAbsolutePath() + "/crash/";
-            } else {
-                path = mApp.getFilesDir()+"/crash/";
-            }
-            File dir = new File(path);
-            if (!dir.exists()) {
-                dir.mkdirs();
-            }
-            FileOutputStream fos = new FileOutputStream(path + fileName);
-            fos.write(sb.toString().getBytes());
-            fos.close();
-            return fileName;
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-}
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/util/DateUtil.kt b/app/src/main/java/cn/flightfeather/thirdapp/util/DateUtil.kt
new file mode 100644
index 0000000..2158b05
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/util/DateUtil.kt
@@ -0,0 +1,346 @@
+package cn.flightfeather.thirdapp.util
+
+import cn.flightfeather.thirdapp.CommonApplication
+import java.lang.Exception
+import java.text.SimpleDateFormat
+import java.util.*
+import kotlin.math.round
+
+/**
+ * @author riku
+ * Date: 2019/4/9
+ * 閫氱敤宸ュ叿绫�
+ */
+object DateUtil {
+
+    private const val MILLIS_LIMIT = 1000.0
+
+    private const val SECONDS_LIMIT = 60 * MILLIS_LIMIT
+
+    private const val MINUTES_LIMIT = 60 * SECONDS_LIMIT
+
+    private const val HOURS_LIMIT = 24 * MINUTES_LIMIT
+
+    private const val YESTERDAY_LIMIT = 2 * HOURS_LIMIT
+
+    private const val DAYS_LIMIT = 30 * HOURS_LIMIT
+
+    private val weekDays = listOf("鍛ㄦ棩", "鍛ㄤ竴", "鍛ㄤ簩", "鍛ㄤ笁", "鍛ㄥ洓", "鍛ㄤ簲", "鍛ㄥ叚")
+
+    /**
+     * yyyy-MM-dd HH:mm:ss
+     */
+    fun getDateStr(date: Date?, chinese: Boolean = false): String {
+        if (date == null) {
+            return ""
+        }
+        try {
+            return if (chinese) {
+                SimpleDateFormat("yyyy骞碝M鏈坉d鏃� HH:mm:ss", Locale.getDefault()).format(date)
+            } else {
+                SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(date)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return ""
+    }
+
+    /**
+     * HH:mm:ss
+     */
+    fun getTimeStr(date: Date?): String {
+        try {
+            return getDateStr(date).substring(11)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return ""
+    }
+
+    /**
+     * HH:mm
+     */
+    fun getHourMinStr(date: Date?): String {
+        try {
+            return getDateStr(date).substring(11, 16)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return ""
+    }
+
+    /**
+     * YYYY
+     */
+    fun getYearStr(date: Date?): String {
+        try {
+            return getDateStr(date).substring(0, 4)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return ""
+    }
+
+    /**
+     * dd
+     */
+    fun getDayStr(date: Date?): String {
+        try {
+            return getDateStr(date).substring(8, 10)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return ""
+    }
+
+    /**
+     * yyyy-MM
+     */
+    fun getYearMonthStr(date: Date?, chinese: Boolean = false): String {
+        try {
+            return getDateStr(date,chinese).substring(0, if (chinese) 8 else 7)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return ""
+    }
+
+    /**
+     * MM-dd
+     */
+    fun getMonthDayStr(date: Date?, chinese: Boolean = false): String {
+        try {
+            return getDateStr(date, chinese).substring(5, if (chinese) 11 else 10)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return ""
+    }
+
+    /**
+     * yyyy-MM-dd
+     */
+    fun getYearMonthDayStr(date: Date?, chinese: Boolean = false): String {
+        try {
+            return getDateStr(date, chinese).substring(0, if (chinese) 11 else 10)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return ""
+    }
+
+    /**
+     * yyyy-MM-dd HH:mm
+     */
+    fun getYearToMinStr(date: Date?): String {
+        try {
+            return getDateStr(date).substring(0, 16)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return ""
+    }
+
+    /**
+     * 鑾峰彇鏄熸湡
+     */
+    fun getWeekDay(date: Date?): String {
+        val index = Calendar.getInstance(Locale.getDefault()).apply {
+            date?.let { time = it }
+        }.get(Calendar.DAY_OF_WEEK) - 1
+        return weekDays[index]
+    }
+
+    fun parseYearMonth(str: String): Date {
+        try {
+            return SimpleDateFormat("yyyy-MM", Locale.getDefault()).parse(str)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return Date()
+    }
+
+    fun parseYearToMin(str: String): Date {
+        try {
+            return SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()).parse(str)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return Date()
+    }
+
+    fun parseYearToHour(str: String): Date {
+        try {
+            return SimpleDateFormat("yyyy-MM-dd HH", Locale.getDefault()).parse(str)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return Date()
+    }
+
+    /**
+     * 鑾峰彇鏈堝垵
+     */
+    fun getMonthFirstDay(date: Date?): Date {
+        return Calendar.getInstance().apply { time = date }
+            .apply {
+                set(Calendar.DAY_OF_MONTH, 1)
+                set(Calendar.HOUR_OF_DAY, 0)
+                set(Calendar.MINUTE, 0)
+                set(Calendar.SECOND, 0)
+            }.time
+    }
+
+    /**
+     * 鑾峰彇涓嬫湀鍒�
+     */
+    fun getNextMonthFirstDay(date: Date?): Date {
+        return Calendar.getInstance().apply { time = date }
+            .apply {
+                set(Calendar.DAY_OF_MONTH, 1)
+                set(Calendar.HOUR_OF_DAY, 0)
+                set(Calendar.MINUTE, 0)
+                set(Calendar.SECOND, 0)
+                val m = get(Calendar.MONTH)
+                if (m == 11) {
+                    add(Calendar.YEAR, 1)
+                    set(Calendar.MONTH, 0)
+                } else {
+                    add(Calendar.MONTH, 1)
+                }
+            }.time
+    }
+
+    /**
+     * 鎸夌粰瀹氱殑鏈堜唤浠ュ強鍛ㄦ湡锛屽緱鍑哄綋鍓嶆湀浠芥墍鍦ㄥ懆鏈熺殑寮�濮嬫湀锛堜緥锛屼竴骞翠互瀛e害鍒嗕负4娈垫椂闂达紝鍗冲懆鏈熶负3鏈堬紝鍒�5鏈堟墍鍦ㄥ懆鏈熷紑濮嬫湀涓�4鏈堬級
+     */
+    fun getStartMonthByPeriod(currentMon: Int, period: Int):Int? {
+        return if (period in 1..12 && currentMon in 1..12) {
+            val m = currentMon % period
+            val r = currentMon / period
+            period * r + if (m == 0) 1 - period else 1
+        } else {
+            null
+        }
+    }
+
+    /**
+     * 鎸夌粰瀹氱殑鏈堜唤浠ュ強鍛ㄦ湡锛屽緱鍑哄綋鍓嶆湀浠芥墍鍦ㄥ懆鏈熺殑寮�濮嬫湀
+     */
+    fun getEndMonthByPeriod(currentMon: Int, period: Int): Int? {
+        val s = getStartMonthByPeriod(currentMon, period)
+        return if (s != null) {
+            s + period - 1
+        } else {
+            null
+        }
+    }
+
+    /**
+     * 鑾峰彇璇煶鏃堕棿鏍煎紡鍖� 1鈥�23鈥欌��
+     * @param sec 绉�
+     */
+    fun getAudioTimeStr(sec: Int):String {
+        return when (sec * 1000) {
+            in 0 until SECONDS_LIMIT.toInt() -> "$sec\""
+            in SECONDS_LIMIT.toInt() until MINUTES_LIMIT.toInt() -> "${sec / 60}\'${sec % 60}\""
+            else -> ""
+        }
+    }
+
+    /**
+     * 鑾峰彇鏃堕棿鏍煎紡鍖�
+     */
+    fun getNewsTimeStr(date: Date?, chinese: Boolean = false): String {
+        if (date == null) {
+            return ""
+        }
+        val subTime = Date().time - date.time
+
+        val now = Calendar.getInstance().apply {
+            time = Date()
+            set(Calendar.HOUR_OF_DAY, 0)
+            set(Calendar.MINUTE, 0)
+            set(Calendar.SECOND, 0)
+            set(Calendar.MILLISECOND, 0)
+        }
+        val objDate = Calendar.getInstance().apply {
+            time = date
+            set(Calendar.HOUR_OF_DAY, 0)
+            set(Calendar.MINUTE, 0)
+            set(Calendar.SECOND, 0)
+            set(Calendar.MILLISECOND, 0)
+        }
+        val thisYear = now.get(Calendar.YEAR)
+        val thisMonth = now.get(Calendar.MONTH)
+        val thisDay = now.get(Calendar.DAY_OF_MONTH)
+
+        val objYear = objDate.get(Calendar.YEAR)
+        val objMonth = objDate.get(Calendar.MONTH)
+        val objDay = objDate.get(Calendar.DAY_OF_MONTH)
+
+        when {
+            now.time == objDate.time -> return when {
+                subTime < MILLIS_LIMIT -> "鍒氬垰"
+                subTime < SECONDS_LIMIT -> round(subTime / MILLIS_LIMIT).toString() + " " + "绉掑墠"
+                subTime < MINUTES_LIMIT -> round(subTime / SECONDS_LIMIT).toString() + " " + "鍒嗛挓鍓�"
+                subTime < HOURS_LIMIT -> round(subTime / MINUTES_LIMIT).toString() + " " + "灏忔椂鍓�"
+                else -> getYearMonthStr(date, chinese)
+            }
+            objYear < thisYear -> return getYearMonthStr(date, chinese)
+            objMonth < thisMonth -> return getMonthDayStr(date, chinese)
+            else -> return if (thisDay - objDay == 1) {
+                "鏄ㄥぉ"
+            } else {
+                getMonthDayStr(date, chinese)
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇鏍煎紡鍖栫殑鏃堕棿宸�
+     * @param from 寮�濮嬫椂闂�
+     * @param to 缁撴潫鏃堕棿
+     * @return 杩斿洖寮�濮嬫椂闂翠笌缁撴潫鏃堕棿鐨勬椂闂村樊锛屼緥3澶┿��1澶┿��24灏忔椂銆�50鍒嗛挓绛夛紝鏃堕棿鍗曚綅鍙彇 骞淬�佹湀銆佸ぉ銆佸皬鏃躲�佸垎閽�
+     */
+    fun getTimeDiffFormat(from: Date?, to: Date?): String? {
+        if (from == null || to == null) {
+            return null
+        }
+
+        val subTime = to.time - from.time
+
+        //淇濊瘉from 灏忎簬绛変簬 to
+        if (subTime < 0) {
+            return null
+        }
+
+        val fromTime = Calendar.getInstance().apply {
+            time = from
+        }
+        val toTime = Calendar.getInstance().apply {
+            time = to
+        }
+
+        val fromYear = fromTime.get(Calendar.YEAR)
+        val fromMonth = fromTime.get(Calendar.MONTH)
+        val fromDay = fromTime.get(Calendar.DAY_OF_YEAR)
+
+        val toYear = toTime.get(Calendar.YEAR)
+        val toMonth = toTime.get(Calendar.MONTH)
+        val toDay = toTime.get(Calendar.DAY_OF_YEAR)
+
+        return when {
+            fromYear < toYear -> "${toYear - fromYear}" + "骞�"
+            fromMonth < toMonth -> "${toMonth - fromMonth}" + "鏈�"
+            fromDay < toDay -> "${toDay - fromDay}" + "澶�"
+            fromDay == toDay -> when {
+                subTime < MINUTES_LIMIT -> round(subTime / SECONDS_LIMIT).toInt().toString() + " " + "鍒嗛挓"
+                subTime < HOURS_LIMIT -> round(subTime / MINUTES_LIMIT).toInt().toString() + " " + "灏忔椂"
+                else -> throw IllegalStateException("this branch is impossible!")
+            }
+            else -> throw IllegalStateException("this branch is impossible!")
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/util/DialogUtil2.kt b/app/src/main/java/cn/flightfeather/thirdapp/util/DialogUtil2.kt
index a866f6c..4bef372 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/util/DialogUtil2.kt
+++ b/app/src/main/java/cn/flightfeather/thirdapp/util/DialogUtil2.kt
@@ -21,6 +21,29 @@
  */
 object DialogUtil2 {
 
+    fun showLoadingDialog(context: Context, message: CharSequence?, cancelable: Boolean, cancelListener: DialogInterface.OnCancelListener?): Dialog? {
+        val dialog = Dialog(context)
+        val view = LayoutInflater.from(context).inflate(R.layout.layout_loading, null)
+        dialog.setContentView(view)
+        if (message.isNullOrBlank()) {
+            view.findViewById<TextView>(R.id.txt_tip).visibility = View.GONE
+        } else {
+            view.findViewById<TextView>(R.id.txt_tip).apply {
+                visibility = View.VISIBLE
+                text = message
+            }
+        }
+        dialog.setCanceledOnTouchOutside(false)
+        dialog.setCancelable(cancelable)
+        dialog.setOnCancelListener(cancelListener)
+        dialog.window?.attributes?.gravity = Gravity.CENTER
+        val lp = dialog.window?.attributes
+        lp?.dimAmount = 0.2f
+        dialog.window?.attributes = lp
+        dialog.show()
+        return dialog
+    }
+
     fun showAlertDialog(
             context: Context?,
             content: String,
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/util/SystemServiceUtils.kt b/app/src/main/java/cn/flightfeather/thirdapp/util/SystemServiceUtils.kt
index 7f3ab7e..785e23d 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/util/SystemServiceUtils.kt
+++ b/app/src/main/java/cn/flightfeather/thirdapp/util/SystemServiceUtils.kt
@@ -1,5 +1,7 @@
 package cn.flightfeather.thirdapp.util
 
+import android.app.Activity
+import android.app.Dialog
 import android.content.Intent
 import android.graphics.Bitmap
 import android.net.Uri
@@ -9,6 +11,10 @@
 import android.support.v4.app.Fragment
 import android.support.v4.app.FragmentActivity
 import android.support.v4.content.FileProvider
+import android.webkit.MimeTypeMap
+import cn.flightfeather.thirdapp.util.file.FileUtils
+import com.flightfeather.taizhang.common.utils.download.UpDownloadUtil
+import org.jetbrains.anko.toast
 import java.io.File
 import java.io.FileOutputStream
 
@@ -41,22 +47,53 @@
         } ?: ""
     }
 
+    fun shareFile(activity: Activity?, path: String?) {
+        if (path?.contains("http") == true) {
+            var d: Dialog? = null
+            activity?.let {
+                d = DialogUtil2.showLoadingDialog(it, "涓嬭浇涓�", false, null)
+            }
+            UpDownloadUtil.download(activity, path, FileUtils.getFileName(path), {
+                d?.dismiss()
+                share(activity, it)
+            }, {
+                activity?.toast("涓嬭浇澶辫触")
+                d?.dismiss()
+            })
+        } else {
+            share(activity, path)
+        }
+    }
 
-    fun saveBitmap(path: String, bitmap: Bitmap) {
+    fun saveBitmap(path: String, bitmap: Bitmap): Boolean {
         val file = File(path)
         if (!file.parentFile.exists()) {
             file.parentFile.mkdirs()
-        }else if (file.exists()) {
+        } else if (file.exists()) {
             file.delete()
         }
         try {
             val out = FileOutputStream(file)
-            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)
+            bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)
             out.flush()
             out.close()
+            return true
         } catch (e: Throwable) {
             e.printStackTrace()
         }
+
+        return false
+    }
+
+    private fun share(activity: Activity?, path: String?) {
+        val uri = FileUtils.getUri(activity, path)
+        val extension = FileUtils.getExtensionName(path)
+        val intent = Intent().apply {
+            action = Intent.ACTION_SEND
+            putExtra(Intent.EXTRA_STREAM, uri)
+            type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
+        }
+        activity?.startActivity(Intent.createChooser(intent, "鍒嗕韩鏂囨。"))
     }
 
     private fun getFilePath(): String {
@@ -71,9 +108,9 @@
         val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
         val uri: Uri = if (Build.VERSION.SDK_INT >= 24) {
             FileProvider.getUriForFile(
-                activity,
-                activity.packageName + ".fileProvider",
-                File(mFilePath)
+                    activity,
+                    activity.packageName + ".fileProvider",
+                    File(mFilePath)
             )
         } else {
             Uri.fromFile(File(mFilePath))
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/util/download/UpDownloadUtil.kt b/app/src/main/java/cn/flightfeather/thirdapp/util/download/UpDownloadUtil.kt
new file mode 100644
index 0000000..3d1d8b1
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/util/download/UpDownloadUtil.kt
@@ -0,0 +1,60 @@
+package com.flightfeather.taizhang.common.utils.download
+
+import android.content.Context
+import cn.flightfeather.thirdapp.common.net.NetWorkProgressListener
+import cn.flightfeather.thirdapp.util.file.FileUtils
+import com.liulishuo.okdownload.DownloadTask
+import com.liulishuo.okdownload.core.cause.EndCause.*
+import com.liulishuo.okdownload.kotlin.execute1
+import org.jetbrains.anko.doAsync
+import java.io.File
+
+/**
+ * @author riku
+ * Date: 2020/3/6
+ */
+object UpDownloadUtil {
+
+    /**
+     * @param onSuccess 涓嬭浇瀹屾垚鍚庣殑鏂囦欢璺緞
+     */
+    fun download(
+        context: Context?, url: String, fileName: String,
+        onSuccess: (downloadFilePath: String) -> Unit,
+        onFailure: () -> Unit,
+        netWorkProgressListener: NetWorkProgressListener? = null
+    ) {
+        context?.let {
+            val parentFile = FileUtils.getCacheDir(it)
+            val downloadFilePath = parentFile.path + File.separator + fileName
+            val task = DownloadTask.Builder(url, parentFile)
+                .setFilename(fileName)
+                .setMinIntervalMillisCallbackProcess(16)
+                .setPassIfAlreadyCompleted(false)
+                .build()
+            doAsync {
+                task?.execute1(
+                    connected = { task, blockCount, currentOffset, totalLength ->
+                    },
+                    progress = { task, currentOffset, totalLength ->
+                        netWorkProgressListener?.onProgress(currentOffset, totalLength)
+                    }
+                ) { task, cause, realCause, model ->
+                    task.tag = null
+                    when (cause) {
+                        COMPLETED -> {
+                            onSuccess(downloadFilePath)
+                        }
+                        ERROR,
+                        CANCELED,
+                        FILE_BUSY,
+                        SAME_TASK_BUSY,
+                        PRE_ALLOCATE_FAILED -> {
+                            onFailure()
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/util/file/FileUtils.kt b/app/src/main/java/cn/flightfeather/thirdapp/util/file/FileUtils.kt
new file mode 100644
index 0000000..e57d97b
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/util/file/FileUtils.kt
@@ -0,0 +1,376 @@
+package cn.flightfeather.thirdapp.util.file
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.BitmapFactory
+import android.media.MediaMetadataRetriever
+import android.net.Uri
+import android.os.Build
+import android.os.Environment
+import android.support.v4.content.FileProvider
+import cn.flightfeather.thirdapp.R
+import cn.flightfeather.thirdapp.util.CommonUtils
+import cn.flightfeather.thirdapp.util.DateUtil
+import cn.flightfeather.thirdapp.util.file.FileUtils.GB
+import cn.flightfeather.thirdapp.util.file.FileUtils.KB
+import cn.flightfeather.thirdapp.util.file.FileUtils.MB
+import io.reactivex.Observable
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.schedulers.Schedulers
+import java.io.File
+import java.io.FileOutputStream
+import java.util.*
+import kotlin.collections.ArrayList
+import kotlin.math.round
+
+/**
+ * @author riku
+ * Date: 2019/6/11
+ * 鏂囦欢鎿嶄綔宸ュ叿绫�
+ */
+object FileUtils {
+
+    const val KB = 1024L
+    const val MB = 1024 * KB
+    const val GB = 1024 * MB
+
+    //鏂囨。
+    private val FILE_EXTENSION_LIST = listOf(
+        "xls", "xlsx", "ppt", "pptx", "doc",
+        "docx", "pdf", "html", "htm", "txt",
+        "rar", "zip", "7z"
+    )
+
+    //鍥剧墖
+    private val IMAGE_EXTENSION_LIST = listOf(
+        "png", "gif", "jpg", "jpeg"
+    )
+
+    //闊宠棰�
+    val VIDEO_EXTENSION_LIST = listOf(
+        "mp4", "mp3", "3gp", "m4a"
+    )
+
+
+    private val FILE_TYPE_TITLE_MAP = mapOf(
+        Pair("xls", "EXCEL"),
+        Pair("xlsx", "EXCEL"),
+        Pair("doc", "WORD"),
+        Pair("docx", "WORD"),
+        Pair("pdf", "PDF"),
+        Pair("ppt", "PPT"),
+        Pair("pptx", "PPT")
+    )
+
+    private const val UNKNOWN = "OTHERS"
+
+    val ROOT_PATH: String = Environment.getExternalStorageDirectory().absolutePath
+
+    /**
+     * 鑾峰彇缂撳瓨鐩綍
+     */
+    fun getCacheDir(context: Context? = null): File {
+        return File(Environment.getExternalStorageDirectory().absolutePath, "/TaiZhang/files/")
+    }
+
+    fun getAudioDir(): File {
+        return File(Environment.getExternalStorageDirectory().absolutePath, "/TaiZhang/audio/")
+    }
+
+    /**
+     * 鍘嬬缉鍥剧墖鑷矹PG鏍煎紡
+     */
+    fun compress2JPG(context: Context, path: String): File {
+        val file = File(path)
+
+        val opts = BitmapFactory.Options()
+        //灏嗗浘鐗囩殑闀垮缂╁皬涓�1/2
+        opts.inSampleSize = 2
+        val bm = BitmapFactory.decodeFile(file.absolutePath, opts)
+
+        return compress2JPG(context, bm)
+    }
+
+    fun compress2JPG(context: Context, bitmap: Bitmap): File {
+        val fileName = "${Date().time}.jpg"
+        val outputFile =
+            File(getCacheDir(context), "thumbnail${File.separator}$fileName")
+        if (!outputFile.parentFile.exists()) {
+            outputFile.parentFile.mkdirs()
+        }
+
+//            val opts = BitmapFactory.Options()
+//            //灏嗗浘鐗囩殑闀垮缂╁皬涓�1/2
+//            opts.inSampleSize = 2
+//            val bm = BitmapFactory.decodeFile(file.absolutePath, opts)
+
+        val normalSize = 1440
+        val width: Int
+        val height: Int
+
+        if (bitmap.width >= bitmap.height) {
+            width = normalSize
+            height = normalSize * bitmap.height / bitmap.width
+        } else {
+            height = normalSize
+            width = normalSize * bitmap.width / bitmap.height
+        }
+
+        val bmSmall = Bitmap.createScaledBitmap(bitmap, width, height, true)
+
+        bmSmall.compress(Bitmap.CompressFormat.JPEG, 80, FileOutputStream(outputFile.absolutePath))
+
+        bitmap.recycle()
+        bmSmall.recycle()
+
+        return outputFile
+    }
+
+    private fun getAllFile(path: String = ROOT_PATH, index: Int = 0, onFound: (fileItems: List<FileItem>) -> Unit) {
+        val file = File(path)
+        var files = emptyArray<File>()
+        try {
+            files = file.listFiles()
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        //鑾峰彇澶辫触
+//        if (files.isEmpty()) {
+//            onFound(emptyList())
+//        }
+
+        for (f in files) {
+            if (f.isHidden) continue
+            if (path != ROOT_PATH ||
+                (f.path.contains("download", true)
+                        || f.path.contains("android", true)
+                        || f.path.contains("tencent", true)
+                        )
+            ) {
+
+                //濡傛灉鏄枃浠剁洰褰曪紝鍒欑户缁煡鎵�
+                if (f.isDirectory) {
+                    getAllFile(f.path, index + 1, onFound)
+                } else if (getOfficeFileTitle(getExtensionName(f.name)) != UNKNOWN) {
+                    val updateTime = DateUtil.getYearToMinStr(Date(f.lastModified()))
+                    onFound(
+                        listOf(
+                            FileItem(f.name, f.path, updateTime, f.size())
+                        )
+                    )
+                }
+            }
+        }
+
+        //鍒ゆ柇杩涘叆鐨勭涓�灞傛枃浠惰矾寰勭殑鎵�鏈夋枃浠堕亶鍘嗗畬鎴愬悗锛岃繑鍥炰竴涓壒瀹氱殑瀵硅薄琛ㄧず鏌ヨ缁撴潫
+        if (index == 0) {
+            onFound(
+                listOf(
+                    FileItem("done", "done")
+                )
+            )
+        }
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢璺緞涓嬬殑鎵�鏈夋枃浠跺垪琛�
+     */
+    fun getAllFiles(path: String = ROOT_PATH): Observable<List<FileItem>> = Observable.create<List<FileItem>> { emitter ->
+        getAllFile(path) {
+            emitter.onNext(it)
+        }
+        emitter.onComplete()
+    }.subscribeOn(Schedulers.io())
+        .observeOn(AndroidSchedulers.mainThread())
+
+    /**
+     * 鑾峰彇鏂囦欢璺緞涓嬬殑鎵�鏈夋枃浠跺垪琛�
+     */
+    fun showFileDir(path: String = ROOT_PATH): List<FileItem> {
+        val fileListItems = mutableListOf<FileItem>()
+        val file = File(path)
+        var files = emptyArray<File>()
+
+        try {
+            files = file.listFiles()
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        //鑾峰彇澶辫触
+        if (files.isEmpty()) {
+            return emptyList()
+        }
+
+        //濡傛灉褰撳墠鐩綍涓嶆槸鏍圭洰褰�
+//        if (ROOT_PATH != path) {
+//            fileListItems.add(FileItem("@1", ROOT_PATH))
+//            fileListItems.add(FileItem("@2", file.parent))
+//        }
+
+        files.sortWith(compareBy({ !it.isDirectory }, { it.name }))
+        //娣诲姞鎵�鏈夋枃浠�
+        for (f in files) {
+            if (!f.isHidden) {
+                val updateTime = DateUtil.getYearToMinStr(Date(f.lastModified()))
+                fileListItems.add(FileItem(f.name, f.path, updateTime, f.size(), f.list()?.size ?: 0))
+            }
+        }
+
+        return fileListItems
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢鎵╁睍鍚�
+     */
+    fun getExtensionName(filename: String?): String {
+        if (!filename.isNullOrEmpty()) {
+            val dot = filename.lastIndexOf('.')
+            if (dot > -1 && dot < filename.length - 1) {
+                return filename.substring(dot + 1)
+            }
+        }
+        return ""
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢鍚�
+     */
+    fun getFileName(path: String?): String {
+        if (!path.isNullOrEmpty()) {
+            val dot = path.lastIndexOf('/')
+            if (dot > -1 && dot < path.length - 1) {
+                return path.substring(dot + 1)
+            }
+        }
+        return ""
+    }
+
+
+    /**
+     * 鑾峰彇鏂囦欢绫诲瀷瀵瑰簲鐨勭畝绉版爣棰�
+     */
+    fun getOfficeFileTitle(extensionName: String): String =
+        FILE_TYPE_TITLE_MAP[extensionName] ?: UNKNOWN
+
+    fun getOfficeFileTitleByName(fileName:String):String =
+        getOfficeFileTitle(getExtensionName(fileName))
+
+    /**
+     * 鑾峰彇鏂囦欢绫诲瀷涓枃绠�绉�
+     */
+    fun getFileTypeName(path: String?): String = when (getExtensionName(path)) {
+        in FILE_EXTENSION_LIST -> "鏂囨。"
+        in IMAGE_EXTENSION_LIST -> "鍥剧墖"
+        in VIDEO_EXTENSION_LIST -> "闊宠棰�"
+        else -> "鍏朵粬"
+    }
+
+    fun hasEnoughMemory(file: File): Boolean {
+        return file.freeSpace > 50 * MB
+    }
+
+    /**
+     * 鑾峰彇瑙嗛缂╃暐鍥�
+     */
+    fun getVideoBitmapObservable(context: Context, uri: String?): Observable<File> =
+        Observable.create<File> { emitter ->
+            val retriever = MediaMetadataRetriever()
+            try {
+                if (uri?.contains("http") == true) {
+                    retriever.setDataSource(uri, mutableMapOf<String, String>())
+                } else {
+                    retriever.setDataSource(uri)
+                }
+                val bitmap = retriever.frameAtTime
+                if (bitmap != null) {
+                    val b = compress2JPG(context, bitmap)
+                    emitter.onNext(b)
+                }
+            } catch (e: Exception) {
+                emitter.onError(e)
+            }
+            emitter.onComplete()
+        }.subscribeOn(Schedulers.io())
+
+    fun getVideoBitmap(context: Context, uri: String?): File? {
+        val retriever = MediaMetadataRetriever()
+        try {
+            if (uri?.contains("http") == true) {
+                retriever.setDataSource(uri, mutableMapOf<String, String>())
+            } else {
+                retriever.setDataSource(uri)
+            }
+            val bitmap = retriever.frameAtTime
+            if (bitmap != null) {
+                compress2JPG(context, bitmap).let {
+                    return it
+                }
+            }
+        } catch (e: Exception) {
+        }
+
+        return null
+    }
+
+
+    fun getUri(context: Context?, path: String?): Uri? {
+        return getUri(context, File(path))
+    }
+
+    fun getUri(context: Context?, file: File): Uri? {
+        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            context?.let {
+                FileProvider.getUriForFile(it, it.getString(R.string.file_provide), file)
+            }
+        } else {
+            Uri.fromFile(file)
+        }
+    }
+
+
+    fun parseToFileSize(length: Long): String {
+        return when (length) {
+            in 0..KB -> "$length B"
+            in KB..MB -> "${round(length.toDouble().div(KB.toDouble()).times(100)).div(100.0)} K"
+            in MB..GB -> "${round(length.toDouble().div(MB.toDouble()).times(100)).div(100.0)} M"
+            else -> if (length >= GB) {
+                "${round(length.toDouble().div(GB.toDouble()).times(100)).div(100.0)} G"
+            } else {
+                ""
+            }
+        }
+    }
+}
+
+/**
+ * 鎷撳睍鏂囦欢鍒楄〃鍒犻櫎
+ */
+fun List<File>.delete() {
+    this.forEach {
+        it.delete()
+    }
+}
+
+/**
+ * 鎷撳睍鑾峰彇鏂囦欢澶у皬
+ */
+fun File.size(): String {
+    return when (val bytes = this.length()) {
+        in 0..KB -> "$bytes B"
+        in KB..MB -> "${round(bytes.toDouble().div(KB.toDouble()).times(100)).div(100)} K"
+        in MB..GB -> "${round(bytes.toDouble().div(MB.toDouble()).times(100)).div(100)} M"
+        else -> if (bytes >= GB) {
+            "${round(bytes.toDouble().div(GB.toDouble()).times(100)).div(100)} G"
+        } else {
+            ""
+        }
+    }
+}
+
+data class FileItem(
+    val name: String,
+    val path: String,
+    val updateTime: String = "",
+    val size: String = "",
+    val listFileNum: Int = 0
+)
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/util/tbs/Tbs.kt b/app/src/main/java/cn/flightfeather/thirdapp/util/tbs/Tbs.kt
new file mode 100644
index 0000000..8df68cf
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/util/tbs/Tbs.kt
@@ -0,0 +1,36 @@
+package cn.flightfeather.thirdapp.util.tbs
+
+import android.content.Context
+import com.tencent.smtt.sdk.QbSdk
+
+
+
+/**
+ * 鑵捐tbs 鍐呮牳锛岀洰鍓嶇敤浜庢祻瑙坥ffice鏂囨。
+ * @author riku
+ * Date: 2019/12/31
+ */
+class Tbs {
+
+    companion object {
+
+        fun init(applicationContext: Context) {
+            //鎼滈泦鏈湴tbs鍐呮牳淇℃伅骞朵笂鎶ユ湇鍔″櫒锛屾湇鍔″櫒杩斿洖缁撴灉鍐冲畾浣跨敤鍝釜鍐呮牳銆�
+
+            val cb = object : QbSdk.PreInitCallback {
+
+                override fun onViewInitFinished(arg0: Boolean) {
+                    // TODO Auto-generated method stub
+                    //x5鍏ф牳鍒濆鍖栧畬鎴愮殑鍥炶皟锛屼负true琛ㄧずx5鍐呮牳鍔犺浇鎴愬姛锛屽惁鍒欒〃绀簒5鍐呮牳鍔犺浇澶辫触锛屼細鑷姩鍒囨崲鍒扮郴缁熷唴鏍搞��
+
+                }
+
+                override fun onCoreInitFinished() {
+                    // TODO Auto-generated method stub
+                }
+            }
+            //x5鍐呮牳鍒濆鍖栨帴鍙�
+            QbSdk.initX5Environment(applicationContext, cb)
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/DataLoadInterface.kt b/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/DataLoadInterface.kt
deleted file mode 100644
index 4a0972b..0000000
--- a/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/DataLoadInterface.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package cn.flightfeather.thirdapp.view.recyclerview
-
-import cn.flightfeather.thirdapp.common.net.ResultCallBack
-
-/**
- * @author riku
- * Date: 2020/12/24
- * 鍒楄〃鏁版嵁鍔犺浇閫昏緫鎺ュ彛
- */
-interface DataLoadInterface<T> : ResultCallBack<List<T>> {
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/DataLoadModel.kt b/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/DataLoadModel.kt
new file mode 100644
index 0000000..36b6a3c
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/DataLoadModel.kt
@@ -0,0 +1,134 @@
+package cn.flightfeather.thirdapp.view.recyclerview
+
+import android.content.Context
+import cn.flightfeather.thirdapp.common.net.ResultCallBack
+import org.jetbrains.anko.runOnUiThread
+
+/**
+ * @author riku
+ * Date: 2020/12/24
+ * 鍒楄〃鏁版嵁鍔犺浇閫昏緫
+ */
+abstract class DataLoadModel<T>(private val application: Context) : ResultCallBack<List<T>> {
+    var dataList = listOf<T>()
+
+    private var loadState = LoadState.NONE
+
+    private var needMore = true
+
+    private var totalPage: Int = -1
+
+    private var currentPage = 1
+
+    var loadStateListener: (loadState: LoadState) -> Unit = {}
+
+    var dataLoadListener: (dataList: List<T>) -> Unit = {}
+
+    /**
+     * 鏁版嵁閲嶈浇
+     */
+    open fun refresh() {
+        if (isLoading()) {
+            return
+        }
+        currentPage = 1
+        loadState = LoadState.Refresh
+        onLoadState(loadState)
+        loadDataByRefresh()
+    }
+
+    /**
+     * 鍔犺浇鏇村
+     */
+    open fun loadMore() {
+        if (isLoading()) {
+            return
+        }
+        currentPage++
+        loadState = LoadState.LoadMore
+        onLoadState(loadState)
+        loadDataByLoadMore(currentPage)
+    }
+
+    /**
+     * 鍔犺浇瀹屾垚锛屽埛鏂板姞杞界姸鎬�
+     */
+    private fun completeLoadData(isFail: Boolean = false) {
+        loadState = when (loadState) {
+            LoadState.Refresh -> if (!isFail) LoadState.RefreshDone else LoadState.RefreshFail
+            LoadState.LoadMore -> if (!isFail) {
+                if (needMore) {
+                    LoadState.LoadMoreComplete
+                } else {
+                    LoadState.LoadMoreEnd
+                }
+            } else LoadState.LoadMoreFail
+            LoadState.NONE -> LoadState.RefreshDone
+            else -> LoadState.RefreshDone
+        }
+        onLoadState(loadState)
+    }
+
+    /**
+     * 鍒锋柊鐘舵�佸垽鏂�
+     */
+    private fun isLoading(): Boolean =
+            loadState == LoadState.Refresh || loadState == LoadState.LoadMore
+
+    /**
+     * 鏁版嵁鏇存柊
+     */
+    private fun commitResult(result: List<T>?) {
+        result?.let {
+            dataList = it
+            onDataLoad(dataList)
+        }
+    }
+
+    //鏍规嵁鍒嗛〉鍒ゆ柇褰撳墠鎵ц鐨勬槸鍒锋柊杩樻槸鍔犺浇鏇村
+    fun isFirstData(): Boolean = currentPage == 1
+
+    override fun onPage(current: Int, total: Int) {
+        if (total > 0) {
+            totalPage = total
+        }
+        if (current > 0) {
+            currentPage = current
+        }
+        application.runOnUiThread {
+            needMore = (currentPage < totalPage)
+        }
+    }
+
+    override fun onSuccess(result: List<T>?) {
+        commitResult(result)
+        completeLoadData()
+    }
+
+    override fun onCacheSuccess(result: List<T>?) {
+        if (isFirstData()) {
+            application.runOnUiThread {
+                result?.let {
+                    commitResult(it)
+                }
+            }
+        }
+    }
+
+    override fun onFailure() {
+        completeLoadData(true)
+        //鑾峰彇鏂扮殑涓嬮〉淇℃伅澶辫触鏃讹紝鍒嗛〉鏁拌繕鍘�
+        if (currentPage > 2) {
+            currentPage--
+        }
+    }
+
+    private fun onLoadState(loadState: LoadState) = loadStateListener(loadState)
+
+    private fun onDataLoad(dataList: List<T>) = dataLoadListener(dataList)
+
+    abstract fun loadDataByRefresh()
+
+    abstract fun loadDataByLoadMore(page: Int)
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/EmptyLoadMoreView.kt b/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/EmptyLoadMoreView.kt
new file mode 100644
index 0000000..f41fc1f
--- /dev/null
+++ b/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/EmptyLoadMoreView.kt
@@ -0,0 +1,18 @@
+package cn.flightfeather.thirdapp.view.recyclerview
+
+import cn.flightfeather.thirdapp.R
+import com.chad.library.adapter.base.loadmore.LoadMoreView
+
+/**
+ * @author riku
+ * Date: 2020/12/31
+ */
+class EmptyLoadMoreView : LoadMoreView() {
+    override fun getLayoutId(): Int = R.layout.layout_empty_load_more
+
+    override fun getLoadingViewId(): Int = R.id.loading
+
+    override fun getLoadFailViewId(): Int = R.id.load_fail
+
+    override fun getLoadEndViewId(): Int = R.id.load_end
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/RecyclerViewPanel.kt b/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/RecyclerViewPanel.kt
index 4ae13fb..c3d84d8 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/RecyclerViewPanel.kt
+++ b/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/RecyclerViewPanel.kt
@@ -1,173 +1,164 @@
-//package cn.flightfeather.thirdapp.view.recyclerview
-//
-//import android.annotation.SuppressLint
-//import android.arch.lifecycle.LifecycleOwner
-//import android.arch.lifecycle.Observer
-//import android.content.Context
-//import android.support.v4.content.ContextCompat
-//import android.support.v4.widget.SwipeRefreshLayout
-//import android.support.v7.widget.LinearLayoutManager
-//import android.support.v7.widget.RecyclerView
-//import android.view.LayoutInflater
-//import android.view.View
-//import com.chad.library.adapter.base.BaseQuickAdapter
-//import com.chad.library.adapter.base.BaseViewHolder
-//
-///**
-// * RecyclerView妯″潡
-// * @author riku
-// * Date: 2019/11/22
-// * reference layout is [R.layout.layout_recycler_view_refresh]
-// */
-//abstract class RecyclerViewPanel<T>(
-//        private val viewModel: BaseViewModel<T>,
-//        private val lifecycleObserver: LifecycleOwner,
-//        private val rootView: View? = null
-//) : RecyclerViewSetInterface<T>, SwipeRefreshLayoutSetInterface {
-//
-//    constructor(
-//            viewModel: BaseViewModel<T>,
-//            lifecycleObserver: LifecycleOwner,
-//            recyclerView: RecyclerView,
-//            context: Context?,
-//            refreshLayout: SwipeRefreshLayout? = null
-//    ) : this(viewModel, lifecycleObserver) {
-//        context?.let { this.context = it }
-//        tempRecyclerView = recyclerView
-//        this.tempRefreshLayout = refreshLayout
-//    }
-//
-//    private lateinit var context: Context
-//    private var tempRecyclerView: RecyclerView? = null
-//    private var tempRefreshLayout: SwipeRefreshLayout? = null
-//
-//    override var adapter: BaseRecyclerAdapter<T>? = null
-//
-//    private var mRecyclerView: RecyclerView? = null
-//
-//    private var refreshLayout: SwipeRefreshLayout? = null
-//
-//    init {
-//        if (rootView != null) {
-//            this@RecyclerViewPanel.context = rootView.context
-//        }
-//    }
-//
-//    open fun init() {
-//        initViews()
-//        initList()
-//        initSwipeRefreshLayout()
-//        initObserver()
-//    }
-//
-//    private fun initViews() {
-//        mRecyclerView = rootView?.findViewById(R.id.recycler_view) ?: tempRecyclerView
-//        refreshLayout = rootView?.findViewById(R.id.refresh_layout) ?: tempRefreshLayout
-//    }
-//
-//    open fun initObserver() {
-//        viewModel.loading.observe(lifecycleObserver, Observer {
-//            refreshLoadingStatus(it)
-//        })
-//
-//        viewModel.dataList.observe(lifecycleObserver, Observer { dataList ->
-//            dataList?.let {
-//                if (viewModel.isFirstData()) {
-//                    setNewData(it)
-//                } else {
-//                    addData(it)
-//                }
-//            }
-//        })
-//
-//        viewModel.dataChanged.observe(lifecycleObserver, Observer {
-//            if (it == true) {
-//                adapter?.notifyDataSetChanged()
-//            }
-//        })
-//    }
-//
-//    override fun getRecyclerView(): RecyclerView? =
-//            mRecyclerView ?: rootView?.findViewById(R.id.recycler_view) ?: tempRecyclerView
-//
-//    override fun onRefreshDone() = stopRefresh()
-//    override fun onRefreshFail() = stopRefresh()
-//    override fun onLoadMoreEnd() = Unit
-//    override fun onLoadMoreComplete() = Unit
-//    override fun onLoadMoreFail() = Unit
-//    override fun onRefreshNone() = stopRefresh()
-//
-//    override fun getMyLayoutManager(): RecyclerView.LayoutManager =
-//            LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
-//
-//    override fun getItemLayoutIdMap(): Map<Int, Int> = emptyMap()
-//
-//    override fun getSectionLayoutId(): Int = R.layout.recycler_item_section_head
-//
-//    override fun getSectionDataList(): List<MySection<T>> =
-//            MySection.convert2Section(viewModel.dataList.value)
-//
-//    override fun onItemClick(
-//            adapter: BaseQuickAdapter<Any?, BaseViewHolder>,
-//            view: View,
-//            position: Int,
-//            dataList: List<T>
-//    ) = Unit
-//
-//    override fun onItemChildClick(
-//            adapter: BaseQuickAdapter<Any?, BaseViewHolder>,
-//            view: View,
-//            position: Int,
-//            dataList: List<T>
-//    ) = Unit
-//
-//    override fun enableLoadMore(): Boolean = true
-//
-//    override fun onLoadMoreStart() {
-//        if (getSwipeRefreshLayout()?.isRefreshing == true) {
-//            adapter?.loadMoreComplete()
-//            return
-//        }
-//    }
-//
-//    override fun onLoadMoreRequested() = viewModel.loadMore()
-//
-//    override fun enableUpFetch(): Boolean = false
-//
-//    @SuppressLint("InflateParams")
-//    override fun getMyEmptyView(): View? =
-//            LayoutInflater.from(context).inflate(R.layout.layout_empty_view, null)
-//
-//    @SuppressLint("InflateParams")
-//    override fun getMyLoadingView(): View? = LayoutInflater.from(context).inflate(R.layout.layout_loading_view, null)
-//
-//    @SuppressLint("InflateParams")
-//    override fun getMyLoadFailView(): View? = LayoutInflater.from(context).inflate(R.layout.layout_load_fail_view, null)
-//
-//    //******************************SwipeRefreshLayout************************************************************
-//
-//    override fun getSwipeRefreshLayout(): SwipeRefreshLayout? =
-//            refreshLayout ?: rootView?.findViewById(R.id.refresh_layout) ?: tempRefreshLayout
-//
-//    override fun enableRefresh(): Boolean = true
-//
-//    override fun needSwipeRefresh(): Boolean = true
-//
-//    override fun onRefreshRequested() {
-//        //绗笁鏂箁ecyclerView鐨勪笂鎷夊姞杞界粨鏉熷悗锛屽鏋滀笅鎷夊埛鏂版墽琛岋紝鍒欏簲璇ラ噸鏂版墦寮�鐩戝惉
-//        try {
-//            if (!adapter?.isLoadMoreEnable!!) {
-//                setLoadMore()
-//            }
-//        } catch (e: Exception) {
-//            e.printStackTrace()
-//        }
-//        viewModel.refresh()
-//    }
-//
-//    override fun getColorList(): Array<Int> = arrayOf(
-//            ContextCompat.getColor(context, R.color.colorPrimary),
-//            ContextCompat.getColor(context, R.color.colorPrimaryDark),
-//            ContextCompat.getColor(context, R.color.colorAccent)
-//    )
-//}
\ No newline at end of file
+package cn.flightfeather.thirdapp.view.recyclerview
+
+import android.annotation.SuppressLint
+import android.arch.lifecycle.LifecycleOwner
+import android.arch.lifecycle.Observer
+import android.content.Context
+import android.support.v4.content.ContextCompat
+import android.support.v4.widget.SwipeRefreshLayout
+import android.support.v7.widget.LinearLayoutManager
+import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
+import android.view.View
+import cn.flightfeather.thirdapp.R
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+
+/**
+ * RecyclerView妯″潡
+ * @author riku
+ * Date: 2019/11/22
+ * reference layout is [R.layout.layout_recycler_view_refresh]
+ */
+abstract class RecyclerViewPanel<T>(
+        private val dataLoadModel: DataLoadModel<T>,
+        private val rootView: View? = null
+) : RecyclerViewSetInterface<T>, SwipeRefreshLayoutSetInterface {
+
+    constructor(
+            dataLoadModel: DataLoadModel<T>,
+            recyclerView: RecyclerView,
+            context: Context?,
+            refreshLayout: SwipeRefreshLayout? = null
+    ) : this(dataLoadModel) {
+        context?.let { this.context = it }
+        tempRecyclerView = recyclerView
+        this.tempRefreshLayout = refreshLayout
+    }
+
+    private lateinit var context: Context
+    private var tempRecyclerView: RecyclerView? = null
+    private var tempRefreshLayout: SwipeRefreshLayout? = null
+
+    override var adapter: BaseRecyclerAdapter<T>? = null
+
+    private var mRecyclerView: RecyclerView? = null
+
+    private var refreshLayout: SwipeRefreshLayout? = null
+
+    init {
+        if (rootView != null) {
+            this@RecyclerViewPanel.context = rootView.context
+        }
+    }
+
+    open fun init() {
+        initViews()
+        initList()
+        initSwipeRefreshLayout()
+        initObserver()
+    }
+
+    private fun initViews() {
+        mRecyclerView = rootView?.findViewById(R.id.recycler_view) ?: tempRecyclerView
+        refreshLayout = rootView?.findViewById(R.id.refresh_layout) ?: tempRefreshLayout
+    }
+
+    open fun initObserver() {
+        dataLoadModel.loadStateListener = {
+            refreshLoadingStatus(it)
+        }
+
+        dataLoadModel.dataLoadListener = {
+            if (dataLoadModel.isFirstData()) {
+                setNewData(it)
+            } else {
+                addData(it)
+            }
+        }
+    }
+
+    override fun getRecyclerView(): RecyclerView? =
+            mRecyclerView ?: rootView?.findViewById(R.id.recycler_view) ?: tempRecyclerView
+
+    override fun onRefreshDone() = stopRefresh()
+    override fun onRefreshFail() = stopRefresh()
+    override fun onLoadMoreEnd() = Unit
+    override fun onLoadMoreComplete() = Unit
+    override fun onLoadMoreFail() = Unit
+    override fun onRefreshNone() = stopRefresh()
+
+    override fun getMyLayoutManager(): RecyclerView.LayoutManager =
+            LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
+
+    override fun getItemLayoutIdMap(): Map<Int, Int> = emptyMap()
+
+    override fun getSectionLayoutId(): Int = R.layout.recycler_item_section_head
+
+    override fun getSectionDataList(): List<MySection<T>> =
+            MySection.convert2Section(dataLoadModel.dataList)
+
+    override fun onItemClick(
+            adapter: BaseQuickAdapter<Any?, BaseViewHolder>,
+            view: View,
+            position: Int,
+            dataList: List<T>
+    ) = Unit
+
+    override fun onItemChildClick(
+            adapter: BaseQuickAdapter<Any?, BaseViewHolder>,
+            view: View,
+            position: Int,
+            dataList: List<T>
+    ) = Unit
+
+    override fun enableLoadMore(): Boolean = true
+
+    override fun onLoadMoreStart() {
+        if (getSwipeRefreshLayout()?.isRefreshing == true) {
+            adapter?.loadMoreComplete()
+            return
+        }
+    }
+
+    override fun onLoadMoreRequested() = dataLoadModel.loadMore()
+
+    override fun enableUpFetch(): Boolean = false
+
+    @SuppressLint("InflateParams")
+    override fun getMyEmptyView(): View? =
+            LayoutInflater.from(context).inflate(R.layout.layout_empty_view, null)
+
+    @SuppressLint("InflateParams")
+    override fun getMyLoadingView(): View? = LayoutInflater.from(context).inflate(R.layout.layout_loading_view, null)
+
+    @SuppressLint("InflateParams")
+    override fun getMyLoadFailView(): View? = LayoutInflater.from(context).inflate(R.layout.layout_load_fail_view, null)
+
+    //******************************SwipeRefreshLayout************************************************************
+
+    override fun getSwipeRefreshLayout(): SwipeRefreshLayout? =
+            refreshLayout ?: rootView?.findViewById(R.id.refresh_layout) ?: tempRefreshLayout
+
+    override fun enableRefresh(): Boolean = true
+
+    override fun needSwipeRefresh(): Boolean = true
+
+    override fun onRefreshRequested() {
+        //绗笁鏂箁ecyclerView鐨勪笂鎷夊姞杞界粨鏉熷悗锛屽鏋滀笅鎷夊埛鏂版墽琛岋紝鍒欏簲璇ラ噸鏂版墦寮�鐩戝惉
+        try {
+            if (!adapter?.isLoadMoreEnable!!) {
+                setLoadMore()
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        dataLoadModel.refresh()
+    }
+
+    override fun getColorList(): Array<Int> = arrayOf(
+            ContextCompat.getColor(context, R.color.colorPrimary),
+            ContextCompat.getColor(context, R.color.colorPrimaryDark),
+            ContextCompat.getColor(context, R.color.colorAccent)
+    )
+}
\ No newline at end of file
diff --git a/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/RecyclerViewSetInterface.kt b/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/RecyclerViewSetInterface.kt
index 6025ae3..095e079 100644
--- a/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/RecyclerViewSetInterface.kt
+++ b/app/src/main/java/cn/flightfeather/thirdapp/view/recyclerview/RecyclerViewSetInterface.kt
@@ -5,6 +5,8 @@
 import android.view.ViewGroup
 import com.chad.library.adapter.base.BaseQuickAdapter
 import com.chad.library.adapter.base.BaseViewHolder
+import com.chad.library.adapter.base.loadmore.LoadMoreView
+import com.chad.library.adapter.base.loadmore.SimpleLoadMoreView
 
 /**
  * @author riku
@@ -65,7 +67,7 @@
             //璁剧疆绌哄竷灞�
             getMyLoadingView()?.let { emptyView = it }
 
-//            setLoadMoreView(SimpleLoadMoreView())
+            getLoadMoreView()?.let { setLoadMoreView(it)}
         }
         //鍔犺浇鏇村
         setLoadMore()
@@ -117,7 +119,7 @@
     /**
      * 灏嗗垪琛ㄦ暟鎹浛鎹㈡垚鏂扮殑鏁版嵁
      */
-    fun setNewData(dataList: ArrayList<T>) {
+    fun setNewData(dataList: List<T>) {
         val resultList = convertToSection(dataList)
         addSection(resultList)
         adapter?.setNewData(resultList)
@@ -127,14 +129,14 @@
     /**
      * 鍦ㄥ師鏁版嵁鍩虹涓婃坊鍔犳柊鏁版嵁
      */
-    fun addData(dataList: ArrayList<T>) {
+    fun addData(dataList: List<T>) {
         val resultList = convertToSection(dataList)
         addSection(resultList)
         adapter?.addData(resultList)
         onDataUpdated(adapter)
     }
 
-    fun addData(pos: Int, dataList: ArrayList<T>){
+    fun addData(pos: Int, dataList: List<T>){
         val resultList = convertToSection(dataList)
         addSection(resultList)
         adapter?.addData(pos, resultList)
@@ -197,10 +199,10 @@
     fun getSectionLayoutId(): Int
 
     //鑷畾涔夋槸鍚﹂渶瑕佹坊鍔犲垪琛ㄥ垎缁�
-    fun addSection(dataList: ArrayList<MySection<T>>) = Unit
+    fun addSection(dataList: MutableList<MySection<T>>) = Unit
 
     //灏嗘暟鎹浆鎹负鍒楄〃鑳芥帴鍙楃殑鍥哄畾缁撴瀯
-    fun convertToSection(list: ArrayList<T>): ArrayList<MySection<T>> = MySection.convert2Section(list)
+    fun convertToSection(list: List<T>): MutableList<MySection<T>> = MySection.convert2Section(list)
 
     //鏁版嵁鏇存柊缁撴潫
     fun onDataUpdated(adapter: BaseRecyclerAdapter<T>?, pos: Int? = null) = Unit
@@ -260,6 +262,9 @@
     //鑾峰彇绌哄竷灞�
     fun getMyLoadFailView(): View? = null
 
+    //鑾峰彇鍔犺浇甯冨眬
+    fun getLoadMoreView(): LoadMoreView? = null
+
     //鍒嗗壊绾�
     fun getDivider(): RecyclerView.ItemDecoration? = null
 
diff --git a/app/src/main/java/com/ping/greendao/gen/DaoMaster.java b/app/src/main/java/com/ping/greendao/gen/DaoMaster.java
index 6b68579..8de81d0 100644
--- a/app/src/main/java/com/ping/greendao/gen/DaoMaster.java
+++ b/app/src/main/java/com/ping/greendao/gen/DaoMaster.java
@@ -14,10 +14,10 @@
 
 // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
 /**
- * Master of DAO (schema version 12): knows all DAOs.
+ * Master of DAO (schema version 13): knows all DAOs.
  */
 public class DaoMaster extends AbstractDaoMaster {
-    public static final int SCHEMA_VERSION = 12;
+    public static final int SCHEMA_VERSION = 13;
 
     /** Creates underlying database table using DAOs. */
     public static void createAllTables(Database db, boolean ifNotExists) {
@@ -47,6 +47,7 @@
         TaskvertionDao.createTable(db, ifNotExists);
         TownDao.createTable(db, ifNotExists);
         UserinfoDao.createTable(db, ifNotExists);
+        MediaFileCacheDao.createTable(db, ifNotExists);
     }
 
     /** Drops underlying database table using DAOs. */
@@ -77,6 +78,7 @@
         TaskvertionDao.dropTable(db, ifExists);
         TownDao.dropTable(db, ifExists);
         UserinfoDao.dropTable(db, ifExists);
+        MediaFileCacheDao.dropTable(db, ifExists);
     }
 
     /**
@@ -121,6 +123,7 @@
         registerDaoClass(TaskvertionDao.class);
         registerDaoClass(TownDao.class);
         registerDaoClass(UserinfoDao.class);
+        registerDaoClass(MediaFileCacheDao.class);
     }
 
     public DaoSession newSession() {
diff --git a/app/src/main/java/com/ping/greendao/gen/DaoSession.java b/app/src/main/java/com/ping/greendao/gen/DaoSession.java
index 5fa92aa..de8fce0 100644
--- a/app/src/main/java/com/ping/greendao/gen/DaoSession.java
+++ b/app/src/main/java/com/ping/greendao/gen/DaoSession.java
@@ -34,6 +34,7 @@
 import cn.flightfeather.thirdapp.bean.entity.Taskvertion;
 import cn.flightfeather.thirdapp.bean.entity.Town;
 import cn.flightfeather.thirdapp.bean.entity.Userinfo;
+import cn.flightfeather.thirdapp.bean.entity.MediaFileCache;
 
 import com.ping.greendao.gen.ChangeAdviceDao;
 import com.ping.greendao.gen.ChangeEffectDao;
@@ -61,6 +62,7 @@
 import com.ping.greendao.gen.TaskvertionDao;
 import com.ping.greendao.gen.TownDao;
 import com.ping.greendao.gen.UserinfoDao;
+import com.ping.greendao.gen.MediaFileCacheDao;
 
 // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
 
@@ -97,6 +99,7 @@
     private final DaoConfig taskvertionDaoConfig;
     private final DaoConfig townDaoConfig;
     private final DaoConfig userinfoDaoConfig;
+    private final DaoConfig mediaFileCacheDaoConfig;
 
     private final ChangeAdviceDao changeAdviceDao;
     private final ChangeEffectDao changeEffectDao;
@@ -124,6 +127,7 @@
     private final TaskvertionDao taskvertionDao;
     private final TownDao townDao;
     private final UserinfoDao userinfoDao;
+    private final MediaFileCacheDao mediaFileCacheDao;
 
     public DaoSession(Database db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig>
             daoConfigMap) {
@@ -207,6 +211,9 @@
         userinfoDaoConfig = daoConfigMap.get(UserinfoDao.class).clone();
         userinfoDaoConfig.initIdentityScope(type);
 
+        mediaFileCacheDaoConfig = daoConfigMap.get(MediaFileCacheDao.class).clone();
+        mediaFileCacheDaoConfig.initIdentityScope(type);
+
         changeAdviceDao = new ChangeAdviceDao(changeAdviceDaoConfig, this);
         changeEffectDao = new ChangeEffectDao(changeEffectDaoConfig, this);
         cityDao = new CityDao(cityDaoConfig, this);
@@ -233,6 +240,7 @@
         taskvertionDao = new TaskvertionDao(taskvertionDaoConfig, this);
         townDao = new TownDao(townDaoConfig, this);
         userinfoDao = new UserinfoDao(userinfoDaoConfig, this);
+        mediaFileCacheDao = new MediaFileCacheDao(mediaFileCacheDaoConfig, this);
 
         registerDao(ChangeAdvice.class, changeAdviceDao);
         registerDao(ChangeEffect.class, changeEffectDao);
@@ -260,6 +268,7 @@
         registerDao(Taskvertion.class, taskvertionDao);
         registerDao(Town.class, townDao);
         registerDao(Userinfo.class, userinfoDao);
+        registerDao(MediaFileCache.class, mediaFileCacheDao);
     }
     
     public void clear() {
@@ -289,6 +298,7 @@
         taskvertionDaoConfig.clearIdentityScope();
         townDaoConfig.clearIdentityScope();
         userinfoDaoConfig.clearIdentityScope();
+        mediaFileCacheDaoConfig.clearIdentityScope();
     }
 
     public ChangeAdviceDao getChangeAdviceDao() {
@@ -395,4 +405,8 @@
         return userinfoDao;
     }
 
+    public MediaFileCacheDao getMediaFileCacheDao() {
+        return mediaFileCacheDao;
+    }
+
 }
diff --git a/app/src/main/java/com/ping/greendao/gen/MediaFileCacheDao.java b/app/src/main/java/com/ping/greendao/gen/MediaFileCacheDao.java
new file mode 100644
index 0000000..eff5cd3
--- /dev/null
+++ b/app/src/main/java/com/ping/greendao/gen/MediaFileCacheDao.java
@@ -0,0 +1,157 @@
+package com.ping.greendao.gen;
+
+import android.database.Cursor;
+import android.database.sqlite.SQLiteStatement;
+
+import org.greenrobot.greendao.AbstractDao;
+import org.greenrobot.greendao.Property;
+import org.greenrobot.greendao.internal.DaoConfig;
+import org.greenrobot.greendao.database.Database;
+import org.greenrobot.greendao.database.DatabaseStatement;
+
+import cn.flightfeather.thirdapp.bean.entity.MediaFileCache;
+
+// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
+/** 
+ * DAO for table "MEDIA_FILE_CACHE".
+*/
+public class MediaFileCacheDao extends AbstractDao<MediaFileCache, Long> {
+
+    public static final String TABLENAME = "MEDIA_FILE_CACHE";
+
+    /**
+     * Properties of entity MediaFileCache.<br/>
+     * Can be used for QueryBuilder and for referencing column names.
+     */
+    public static class Properties {
+        public final static Property Id = new Property(0, Long.class, "id", true, "_id");
+        public final static Property Url = new Property(1, String.class, "url", false, "URL");
+        public final static Property Path = new Property(2, String.class, "path", false, "PATH");
+        public final static Property ThumbnailPath = new Property(3, String.class, "thumbnailPath", false, "THUMBNAIL_PATH");
+    }
+
+
+    public MediaFileCacheDao(DaoConfig config) {
+        super(config);
+    }
+    
+    public MediaFileCacheDao(DaoConfig config, DaoSession daoSession) {
+        super(config, daoSession);
+    }
+
+    /** Creates the underlying database table. */
+    public static void createTable(Database db, boolean ifNotExists) {
+        String constraint = ifNotExists? "IF NOT EXISTS ": "";
+        db.execSQL("CREATE TABLE " + constraint + "\"MEDIA_FILE_CACHE\" (" + //
+                "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id
+                "\"URL\" TEXT," + // 1: url
+                "\"PATH\" TEXT," + // 2: path
+                "\"THUMBNAIL_PATH\" TEXT);"); // 3: thumbnailPath
+    }
+
+    /** Drops the underlying database table. */
+    public static void dropTable(Database db, boolean ifExists) {
+        String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"MEDIA_FILE_CACHE\"";
+        db.execSQL(sql);
+    }
+
+    @Override
+    protected final void bindValues(DatabaseStatement stmt, MediaFileCache entity) {
+        stmt.clearBindings();
+ 
+        Long id = entity.getId();
+        if (id != null) {
+            stmt.bindLong(1, id);
+        }
+ 
+        String url = entity.getUrl();
+        if (url != null) {
+            stmt.bindString(2, url);
+        }
+ 
+        String path = entity.getPath();
+        if (path != null) {
+            stmt.bindString(3, path);
+        }
+ 
+        String thumbnailPath = entity.getThumbnailPath();
+        if (thumbnailPath != null) {
+            stmt.bindString(4, thumbnailPath);
+        }
+    }
+
+    @Override
+    protected final void bindValues(SQLiteStatement stmt, MediaFileCache entity) {
+        stmt.clearBindings();
+ 
+        Long id = entity.getId();
+        if (id != null) {
+            stmt.bindLong(1, id);
+        }
+ 
+        String url = entity.getUrl();
+        if (url != null) {
+            stmt.bindString(2, url);
+        }
+ 
+        String path = entity.getPath();
+        if (path != null) {
+            stmt.bindString(3, path);
+        }
+ 
+        String thumbnailPath = entity.getThumbnailPath();
+        if (thumbnailPath != null) {
+            stmt.bindString(4, thumbnailPath);
+        }
+    }
+
+    @Override
+    public Long readKey(Cursor cursor, int offset) {
+        return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
+    }    
+
+    @Override
+    public MediaFileCache readEntity(Cursor cursor, int offset) {
+        MediaFileCache entity = new MediaFileCache( //
+            cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id
+            cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // url
+            cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // path
+            cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3) // thumbnailPath
+        );
+        return entity;
+    }
+     
+    @Override
+    public void readEntity(Cursor cursor, MediaFileCache entity, int offset) {
+        entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
+        entity.setUrl(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1));
+        entity.setPath(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2));
+        entity.setThumbnailPath(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));
+     }
+    
+    @Override
+    protected final Long updateKeyAfterInsert(MediaFileCache entity, long rowId) {
+        entity.setId(rowId);
+        return rowId;
+    }
+    
+    @Override
+    public Long getKey(MediaFileCache entity) {
+        if(entity != null) {
+            return entity.getId();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public boolean hasKey(MediaFileCache entity) {
+        return entity.getId() != null;
+    }
+
+    @Override
+    protected final boolean isEntityUpdateable() {
+        return true;
+    }
+    
+}
diff --git a/app/src/main/res/anim/left_enter_3.xml b/app/src/main/res/anim/left_enter_3.xml
new file mode 100644
index 0000000..4d3bd5a
--- /dev/null
+++ b/app/src/main/res/anim/left_enter_3.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate
+        android:duration="200"
+        android:fromXDelta="-100%p" />
+</set>
\ No newline at end of file
diff --git a/app/src/main/res/anim/left_exit_3.xml b/app/src/main/res/anim/left_exit_3.xml
new file mode 100644
index 0000000..6c792a8
--- /dev/null
+++ b/app/src/main/res/anim/left_exit_3.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate
+        android:duration="200"
+        android:toXDelta="-100%p" />
+</set>
\ No newline at end of file
diff --git a/app/src/main/res/anim/right_enter_2.xml b/app/src/main/res/anim/right_enter_2.xml
new file mode 100644
index 0000000..c5dd58a
--- /dev/null
+++ b/app/src/main/res/anim/right_enter_2.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate
+        android:duration="200"
+        android:fromXDelta="100%p" />
+</set>
\ No newline at end of file
diff --git a/app/src/main/res/anim/right_exit_2.xml b/app/src/main/res/anim/right_exit_2.xml
new file mode 100644
index 0000000..da89fd6
--- /dev/null
+++ b/app/src/main/res/anim/right_exit_2.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate
+        android:duration="200"
+        android:toXDelta="100%p" />
+</set>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/selector_bg_green_or_yellow.xml b/app/src/main/res/drawable/selector_bg_green_or_yellow.xml
index 25b615b..9ba90b2 100644
--- a/app/src/main/res/drawable/selector_bg_green_or_yellow.xml
+++ b/app/src/main/res/drawable/selector_bg_green_or_yellow.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:drawable="@drawable/shape_green" android:state_selected="true"/>
-    <item android:drawable="@drawable/shape_yellow"></item>
+    <item android:drawable="@drawable/shape_yellow" android:state_selected="false"/>
 
 </selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_bg_gradient_2.xml b/app/src/main/res/drawable/shape_bg_gradient_2.xml
new file mode 100644
index 0000000..465f2eb
--- /dev/null
+++ b/app/src/main/res/drawable/shape_bg_gradient_2.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <!-- 濉厖鐨勯鑹� -->
+    <!--<solid android:color="#6195B6"/>-->
+    <!-- 璁剧疆鎸夐挳鐨勫洓涓涓哄姬褰� -->
+    <!-- android:radius 寮у舰鐨勫崐寰� -->
+    <!--<corners-->
+        <!--android:radius="20dp" />-->
+    <!--鎻忚竟-->
+    <!--<stroke-->
+        <!--android:width="0dp"-->
+        <!--android:color="@color/white" />-->
+    <!-- padding锛欱utton閲岄潰鐨勬枃瀛椾笌Button杈圭晫鐨勯棿闅� -->
+    <!--娓愬彉-->
+    <gradient
+        android:angle="-45"
+        android:startColor="#A2D2E8"
+        android:centerColor="@color/white"
+        android:endColor="@color/white"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_fragment_container.xml b/app/src/main/res/layout/activity_fragment_container.xml
new file mode 100644
index 0000000..123415f
--- /dev/null
+++ b/app/src/main/res/layout/activity_fragment_container.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.CoordinatorLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+<!--    <include layout="@layout/tool_bar_layout"/>-->
+
+    <FrameLayout
+        android:id="@+id/container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fillViewport="true"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior">
+    </FrameLayout>
+
+</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_night_work.xml b/app/src/main/res/layout/activity_night_work.xml
index 7f63f68..733d3b7 100644
--- a/app/src/main/res/layout/activity_night_work.xml
+++ b/app/src/main/res/layout/activity_night_work.xml
@@ -27,13 +27,14 @@
                 android:textColor="@color/main_color_1"
                 android:textStyle="bold"
                 android:textSize="@dimen/textSize_18"
-                android:text="鏈�鏂版枃浠�"/>
+                android:text="鏈鏂囦欢"/>
 
             <TextView
                 android:id="@+id/txt_more"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginEnd="@dimen/dimen16"
+                android:visibility="gone"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintBottom_toBottomOf="@id/txt_title"
                 android:text="鏇村"/>
@@ -68,6 +69,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginEnd="@dimen/dimen16"
+                android:visibility="gone"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintBottom_toBottomOf="@id/txt_history"
                 android:text="鏇村"/>
diff --git a/app/src/main/res/layout/activity_night_work_manage.xml b/app/src/main/res/layout/activity_night_work_manage.xml
new file mode 100644
index 0000000..7065087
--- /dev/null
+++ b/app/src/main/res/layout/activity_night_work_manage.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:background="@color/lightGray">
+
+    <include layout="@layout/layout_toolbar_2" />
+
+<!--    <android.support.v4.widget.NestedScrollView-->
+<!--        android:layout_width="match_parent"-->
+<!--        android:layout_height="match_parent">-->
+        <android.support.constraint.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:paddingTop="@dimen/dimen4">
+
+            <TextView
+                android:id="@+id/txt_title"
+                android:visibility="gone"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/dimen16"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                android:textColor="@color/main_color_1"
+                android:textStyle="bold"
+                android:textSize="@dimen/textSize_notes"
+                android:text="澶滄柦鏂囦欢缁熻"/>
+
+            <LinearLayout
+                android:id="@+id/ll_total"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:layout_marginStart="@dimen/dimen16"
+                android:layout_marginEnd="@dimen/dimen4"
+                android:gravity="center"
+                android:background="@drawable/shape_white"
+                app:layout_constraintTop_toBottomOf="@id/txt_title"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintEnd_toStartOf="@id/ll_signed">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    style="@style/TextStyle.Category"
+                    android:layout_gravity="start"
+                    android:text="鎬荤鍙戞枃浠�"/>
+
+                <TextView
+                    android:id="@+id/txt_total_count"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    style="@style/TextStyle.Category.Item"
+                    android:layout_marginTop="@dimen/dimen8"
+                    android:layout_marginBottom="@dimen/dimen8"
+                    android:textSize="@dimen/title_text_size_1"
+                    android:text="0"/>
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/ll_signed"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:layout_marginStart="@dimen/dimen4"
+                android:layout_marginEnd="@dimen/dimen16"
+                android:gravity="center"
+                android:background="@drawable/shape_white"
+                app:layout_constraintTop_toBottomOf="@id/txt_title"
+                app:layout_constraintStart_toEndOf="@id/ll_total"
+                app:layout_constraintEnd_toEndOf="parent">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    style="@style/TextStyle.Category"
+                    android:layout_gravity="start"
+                    android:text="宸茬鏀舵枃浠�"/>
+
+                <TextView
+                    android:id="@+id/txt_signed_count"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    style="@style/TextStyle.Category.Item"
+                    android:layout_marginTop="@dimen/dimen8"
+                    android:layout_marginBottom="@dimen/dimen8"
+                    android:textSize="@dimen/title_text_size_1"
+                    android:text="0"/>
+            </LinearLayout>
+
+            <android.support.v7.widget.RecyclerView
+                android:id="@+id/recycler_view"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_marginTop="@dimen/dimen4"
+                android:layout_marginStart="@dimen/dimen16"
+                android:layout_marginEnd="@dimen/dimen16"
+                app:layout_constraintTop_toBottomOf="@id/ll_total"
+                app:layout_constraintBottom_toBottomOf="parent"
+                tools:listitem="@layout/item_night_work_3"
+                tools:itemCount="6"
+                app:layoutManager="android.support.v7.widget.LinearLayoutManager"
+                android:orientation="vertical"/>
+
+        </android.support.constraint.ConstraintLayout>
+
+<!--    </android.support.v4.widget.NestedScrollView>-->
+
+</LinearLayout>
diff --git a/app/src/main/res/layout/dialog_scene_list.xml b/app/src/main/res/layout/dialog_scene_list.xml
index bc4c552..4841d0e 100644
--- a/app/src/main/res/layout/dialog_scene_list.xml
+++ b/app/src/main/res/layout/dialog_scene_list.xml
@@ -9,8 +9,6 @@
         android:id="@+id/cv_body"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_marginStart="@dimen/fab_margin"
-        android:layout_marginEnd="@dimen/fab_margin"
         android:layout_marginTop="30dp"
         android:layout_marginBottom="30dp"
         android:padding="@dimen/dimen8"
diff --git a/app/src/main/res/layout/fragment_file_download.xml b/app/src/main/res/layout/fragment_file_download.xml
new file mode 100644
index 0000000..5ea0ad1
--- /dev/null
+++ b/app/src/main/res/layout/fragment_file_download.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.CoordinatorLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <include layout="@layout/tool_bar_layout"/>
+
+    <android.support.constraint.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior">
+
+    <ImageView
+        android:id="@+id/img_file_type"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@mipmap/file_ic_detail_pdf"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_marginTop="60dp" />
+
+    <TextView
+        android:id="@+id/txt_file_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:textColor="@color/main_color_1"
+        android:textSize="18sp"
+        android:maxLines="3"
+        android:ellipsize="end"
+        tools:text="鏂囦欢鍚嶇О"
+        android:textStyle="bold"
+        android:gravity="center"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/img_file_type"
+        android:layout_marginTop="@dimen/dimen8"
+        android:layout_marginStart="80dp"
+        android:layout_marginEnd="80dp"/>
+
+    <ProgressBar
+        android:id="@+id/progress_circular"
+        android:layout_width="@dimen/title_icon_size_2"
+        android:layout_height="@dimen/title_icon_size_2"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/txt_file_name"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintVertical_bias="0.7"
+        android:progress="100"
+        android:indeterminate="false"
+        android:visibility="visible"
+        style="?android:attr/progressBarStyle" />
+
+    <com.mikhaellopez.circularprogressbar.CircularProgressBar
+        android:id="@+id/circularProgressBar"
+        android:layout_width="@dimen/title_icon_size_2"
+        android:layout_height="@dimen/title_icon_size_2"
+        app:cpb_background_progressbar_color="@color/gray"
+        app:cpb_background_progressbar_width="4dp"
+        app:cpb_progress_direction="to_right"
+        app:cpb_progressbar_color="@color/colorAccent"
+        app:cpb_progressbar_width="4dp"
+        app:cpb_round_border="false"
+        app:cpb_progress="50"
+        app:cpb_progress_max="200"
+        android:visibility="gone"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/txt_file_name"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintVertical_bias="0.7"/>
+
+    <TextView
+        android:id="@+id/txt_progress"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/circularProgressBar"
+        android:visibility="gone"
+        tools:text="25k/3M"/>
+    </android.support.constraint.ConstraintLayout>
+
+</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home_competent.xml b/app/src/main/res/layout/fragment_home_competent.xml
index fc2e267..3ea6dc1 100644
--- a/app/src/main/res/layout/fragment_home_competent.xml
+++ b/app/src/main/res/layout/fragment_home_competent.xml
@@ -124,6 +124,7 @@
                 android:layout_height="match_parent"
                 android:orientation="vertical">
                 <include layout="@layout/function_card1_competent" />
+                <include layout="@layout/function_card5_competent" />
                 <include layout="@layout/function_card4_competent" />
                 <include layout="@layout/function_card2_competent" />
                 <include layout="@layout/function_card3_competent" />
diff --git a/app/src/main/res/layout/fragment_home_pollution_scene.xml b/app/src/main/res/layout/fragment_home_pollution_scene.xml
index d6b6a29..9852586 100644
--- a/app/src/main/res/layout/fragment_home_pollution_scene.xml
+++ b/app/src/main/res/layout/fragment_home_pollution_scene.xml
@@ -122,6 +122,7 @@
                 android:layout_height="match_parent"
                 android:orientation="vertical">
                 <include layout="@layout/function_card1_scene" />
+                <include layout="@layout/function_card5_scene" />
                 <include layout="@layout/function_card2_scene"
                     android:visibility="gone"/>
                 <include layout="@layout/function_card3_scene" />
diff --git a/app/src/main/res/layout/fragment_office_file.xml b/app/src/main/res/layout/fragment_office_file.xml
new file mode 100644
index 0000000..a217b40
--- /dev/null
+++ b/app/src/main/res/layout/fragment_office_file.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.CoordinatorLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <include layout="@layout/tool_bar_layout"/>
+
+    <FrameLayout
+        android:id="@+id/tbs_reader_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
+
+</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/function_card4_scene.xml b/app/src/main/res/layout/function_card4_scene.xml
index 4fe2259..79eb8c2 100644
--- a/app/src/main/res/layout/function_card4_scene.xml
+++ b/app/src/main/res/layout/function_card4_scene.xml
@@ -7,7 +7,8 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:paddingStart="@dimen/dimen8"
-    android:paddingEnd="@dimen/dimen8">
+    android:paddingEnd="@dimen/dimen8"
+    android:paddingBottom="@dimen/dimen4">
 
     <android.support.v7.widget.CardView
         android:id="@+id/card_change_problem"
@@ -37,6 +38,7 @@
                 android:text="0"
                 android:textColor="#FA4A4D"
                 android:textSize="@dimen/textSize_18"
+                app:layout_constraintTop_toTopOf="parent"
                 app:layout_constraintRight_toRightOf="parent"/>
             <ImageView
                 android:id="@+id/image_change_count"
@@ -45,6 +47,7 @@
                 android:scaleType="centerInside"
                 android:src="@drawable/ic_change"
                 android:adjustViewBounds="true"
+                app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toTopOf="parent" />
             <TextView
                 android:id="@+id/textView1"
@@ -87,6 +90,7 @@
                 android:text="0"
                 android:textColor="#56C4A0"
                 android:textSize="@dimen/textSize_18"
+                app:layout_constraintTop_toTopOf="parent"
                 app:layout_constraintRight_toRightOf="parent"/>
 
             <ImageView
@@ -96,6 +100,7 @@
                 android:src="@drawable/ic_changed"
                 android:scaleType="centerInside"
                 android:adjustViewBounds="true"
+                app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintBottom_toTopOf="@id/textView5"/>
             <TextView
                 android:id="@+id/textView5"
@@ -140,6 +145,7 @@
                 android:ellipsize="end"
                 android:lines="2"
                 android:text="鎮ㄧ鎴鏃ユ湡杩樻湁"
+                app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toTopOf="parent"/>
             <TextView
                 android:id="@+id/text_change_left_day"
@@ -171,7 +177,9 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:src="@drawable/ic_change_done"
-                android:scaleType="centerCrop" />
+                android:scaleType="centerCrop"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"/>
         </android.support.constraint.ConstraintLayout>
     </android.support.v7.widget.CardView>
 
@@ -181,6 +189,7 @@
         android:layout_height="30dp"
         android:textColor="@color/white"
         android:background="@drawable/shape_button_blue"
+        android:visibility="gone"
         android:text="鍘绘暣鏀�"
         android:clickable="true"
         android:focusable="true"
@@ -199,6 +208,7 @@
         android:id="@+id/image_goto_change"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:visibility="gone"
         android:src="@drawable/ic_play_arrow_white_24dp"
         app:layout_constraintRight_toRightOf="@id/text_goto_change"
         app:layout_constraintTop_toTopOf="@id/text_goto_change"
diff --git a/app/src/main/res/layout/function_card5_competent.xml b/app/src/main/res/layout/function_card5_competent.xml
new file mode 100644
index 0000000..0d28616
--- /dev/null
+++ b/app/src/main/res/layout/function_card5_competent.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v7.widget.CardView
+    style="@style/bigCardView"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    app:cardCornerRadius="@dimen/dimen8">
+
+    <android.support.constraint.ConstraintLayout
+        android:id="@+id/cl_night_work"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="@dimen/dimen8">
+
+
+        <ImageView
+            android:id="@+id/img_night_work"
+            android:layout_width="@dimen/title_icon_size"
+            android:layout_height="@dimen/title_icon_size"
+            android:background="@drawable/ic_supervise_info"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"/>
+
+        <TextView
+            android:id="@+id/txt_night_work"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textStyle="bold"
+            android:text="澶滈棿鏂藉伐璁稿彲"
+            android:textColor="@color/black"
+            android:textSize="12sp"
+            android:layout_marginStart="10dp"
+            app:layout_constraintStart_toEndOf="@id/img_night_work"
+            app:layout_constraintTop_toTopOf="@id/img_night_work"
+            app:layout_constraintBottom_toBottomOf="@id/img_night_work"/>
+
+        <TextView
+            android:id="@+id/txt_news"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/dimen4"
+            app:layout_constraintStart_toStartOf="@id/txt_night_work"
+            app:layout_constraintTop_toBottomOf="@id/img_night_work"
+            android:text="璁稿彲璇佸彂甯冪粺璁�"/>
+
+        <TextView
+            android:id="@+id/txt_more"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="鐐瑰嚮鏌ョ湅 >"
+            android:textColor="@color/gray"
+            android:textSize="10sp"
+            app:layout_constraintTop_toBottomOf="@id/txt_news"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
+
+    </android.support.constraint.ConstraintLayout>
+</android.support.v7.widget.CardView>
\ No newline at end of file
diff --git a/app/src/main/res/layout/function_card5_scene.xml b/app/src/main/res/layout/function_card5_scene.xml
new file mode 100644
index 0000000..68d5d81
--- /dev/null
+++ b/app/src/main/res/layout/function_card5_scene.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v7.widget.CardView
+    style="@style/bigCardView"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    app:cardCornerRadius="@dimen/dimen8">
+
+    <android.support.constraint.ConstraintLayout
+        android:id="@+id/cl_night_work"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="@dimen/dimen8">
+
+
+        <ImageView
+            android:id="@+id/img_night_work"
+            android:layout_width="@dimen/title_icon_size"
+            android:layout_height="@dimen/title_icon_size"
+            android:background="@drawable/ic_supervise_info"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"/>
+
+        <TextView
+            android:id="@+id/txt_night_work"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textStyle="bold"
+            android:text="澶滈棿鏂藉伐璁稿彲"
+            android:textColor="@color/main_text_color"
+            android:textSize="@dimen/textSize_16"
+            android:layout_marginStart="10dp"
+            app:layout_constraintStart_toEndOf="@id/img_night_work"
+            app:layout_constraintTop_toTopOf="@id/img_night_work"
+            app:layout_constraintBottom_toBottomOf="@id/img_night_work"/>
+
+        <TextView
+            android:id="@+id/txt_news"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/dimen4"
+            app:layout_constraintStart_toStartOf="@id/txt_night_work"
+            app:layout_constraintTop_toBottomOf="@id/img_night_work"
+            android:text="鏆傛棤鏂拌鍙瘉"/>
+
+        <TextView
+            android:id="@+id/txt_more"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="鐐瑰嚮鏌ョ湅 >"
+            android:textColor="@color/gray"
+            android:textSize="10sp"
+            app:layout_constraintTop_toBottomOf="@id/txt_news"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
+
+    </android.support.constraint.ConstraintLayout>
+</android.support.v7.widget.CardView>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_night_work.xml b/app/src/main/res/layout/item_night_work.xml
index 661068b..502f99e 100644
--- a/app/src/main/res/layout/item_night_work.xml
+++ b/app/src/main/res/layout/item_night_work.xml
@@ -1,14 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.design.card.MaterialCardView
+<android.support.v7.widget.CardView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:orientation="horizontal"
-    android:layout_width="220dp"
+    android:layout_width="200dp"
     android:layout_height="wrap_content"
     app:cardCornerRadius="@dimen/dimen16"
     app:cardBackgroundColor="@color/white"
-    android:layout_marginEnd="@dimen/dimen16"
+    android:layout_marginStart="@dimen/dimen4"
+    android:layout_marginEnd="@dimen/dimen8"
+    android:layout_marginTop="@dimen/dimen4"
     android:layout_marginBottom="@dimen/dimen4">
 
     <android.support.constraint.ConstraintLayout
@@ -77,14 +79,30 @@
 
     </android.support.constraint.ConstraintLayout>
 
+    <TextView
+        android:id="@+id/txt_sign"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="start|bottom"
+        android:background="@drawable/button_bg_enable_2"
+        style="@style/TextStyle.Category.Item"
+        android:textColor="@color/white"
+        android:paddingStart="@dimen/dimen8"
+        android:paddingEnd="@dimen/dimen8"
+        android:paddingTop="@dimen/dimen2"
+        android:paddingBottom="@dimen/dimen2"
+        android:layout_marginStart="@dimen/dimen16"
+        android:layout_marginBottom="@dimen/dimen16"
+        android:text="绛炬敹"/>
+
     <ImageView
         android:layout_width="wrap_content"
         android:layout_height="160dp"
         android:src="@mipmap/ic_file"
         android:layout_gravity="bottom|end"
-        android:layout_marginTop="150dp"
+        android:layout_marginTop="120dp"
         app:layout_constraintTop_toBottomOf="@id/txt_time"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"/>
 
-</android.support.design.card.MaterialCardView>
\ No newline at end of file
+</android.support.v7.widget.CardView>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_night_work_2.xml b/app/src/main/res/layout/item_night_work_2.xml
index 8f32848..80dede5 100644
--- a/app/src/main/res/layout/item_night_work_2.xml
+++ b/app/src/main/res/layout/item_night_work_2.xml
@@ -13,8 +13,7 @@
         android:id="@+id/img_icon"
         android:layout_width="46dp"
         android:layout_height="46dp"
-        android:src="@drawable/button_bg_enable_2"
-        android:tint="#1C1E33"
+        android:src="@mipmap/ic_file"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"/>
 
@@ -32,13 +31,14 @@
 
     <TextView
         android:id="@+id/txt_time"
-        android:layout_width="wrap_content"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
         style="@style/TextStyle.Category.Item"
         android:textColor="@color/main_color_1"
         tools:text="鏂藉伐鍐呭"
         android:layout_marginStart="@dimen/dimen16"
         app:layout_constraintStart_toEndOf="@id/img_icon"
+        app:layout_constraintEnd_toStartOf="@id/txt_signed"
         app:layout_constraintTop_toBottomOf="@id/txt_1"/>
 
     <TextView
@@ -65,5 +65,23 @@
         app:layout_constraintBottom_toBottomOf="@id/img_icon"
         app:layout_constraintVertical_bias="1"/>
 
+    <TextView
+        android:id="@+id/txt_signed"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="start|bottom"
+        android:background="@drawable/button_bg_enable_2"
+        style="@style/TextStyle.Category.Item"
+        android:backgroundTint="@color/lightGreen"
+        android:textColor="@color/white"
+        android:paddingStart="@dimen/dimen8"
+        android:paddingEnd="@dimen/dimen8"
+        android:paddingTop="@dimen/dimen2"
+        android:paddingBottom="@dimen/dimen2"
+        android:text="宸茬鏀�"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"/>
+
 
 </android.support.constraint.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_night_work_3.xml b/app/src/main/res/layout/item_night_work_3.xml
new file mode 100644
index 0000000..ddd7138
--- /dev/null
+++ b/app/src/main/res/layout/item_night_work_3.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:orientation="horizontal"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingTop="@dimen/dimen8"
+    android:paddingBottom="@dimen/dimen8"
+    android:layout_marginBottom="@dimen/dimen4"
+    android:background="@color/white">
+
+    <ImageView
+        android:id="@+id/img_icon"
+        android:visibility="visible"
+        android:layout_width="46dp"
+        android:layout_height="46dp"
+        android:src="@mipmap/ic_file"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"/>
+
+    <TextView
+        android:id="@+id/txt_1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        style="@style/TextStyle.Category"
+        android:text="椤圭洰鍚嶇О"
+        app:layout_constraintStart_toEndOf="@id/img_icon"
+        app:layout_constraintTop_toTopOf="parent"/>
+
+    <TextView
+        android:id="@+id/txt_content"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        tools:text="椤圭洰鍐呭"
+        style="@style/TextStyle.Category.Item"
+        app:layout_constraintStart_toStartOf="@id/txt_1"
+        app:layout_constraintEnd_toStartOf="@id/txt_signed"
+        app:layout_constraintTop_toBottomOf="@id/txt_1"/>
+
+    <TextView
+        android:id="@+id/txt_2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        style="@style/TextStyle.Category"
+        android:text="鏂囦欢缂栧彿"
+        android:layout_marginTop="@dimen/dimen16"
+        app:layout_constraintStart_toStartOf="@id/txt_content"
+        app:layout_constraintTop_toBottomOf="@id/txt_content"/>
+
+    <TextView
+        android:id="@+id/txt_night_work_num"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        style="@style/TextStyle.Category.Item"
+        tools:text="澶滈棿璁稿彲璇佺紪鍙�"
+        app:layout_constraintStart_toStartOf="@id/txt_1"
+        app:layout_constraintTop_toBottomOf="@id/txt_2" />
+
+    <TextView
+        android:id="@+id/txt_3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        style="@style/TextStyle.Category"
+        android:text="鏂藉伐鏃堕棿"
+        android:layout_marginTop="@dimen/dimen16"
+        app:layout_constraintStart_toStartOf="@id/txt_time"
+        app:layout_constraintTop_toBottomOf="@id/txt_content"/>
+
+    <TextView
+        android:id="@+id/txt_time"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        style="@style/TextStyle.Category.Item"
+        tools:text="2020.12.01-12.03"
+        android:layout_marginStart="@dimen/dimen16"
+        app:layout_constraintStart_toEndOf="@id/txt_night_work_num"
+        app:layout_constraintTop_toBottomOf="@id/txt_3"/>
+
+    <TextView
+        android:id="@+id/txt_signed"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="start|bottom"
+        android:background="@drawable/selector_bg_green_or_yellow"
+        style="@style/TextStyle.Category.Item"
+        android:textColor="@color/white"
+        android:paddingStart="@dimen/dimen8"
+        android:paddingEnd="@dimen/dimen8"
+        android:paddingTop="@dimen/dimen2"
+        android:paddingBottom="@dimen/dimen2"
+        android:layout_marginEnd="@dimen/dimen4"
+        android:text="@string/signed"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"/>
+
+
+</android.support.constraint.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_night_work_no_more.xml b/app/src/main/res/layout/item_night_work_no_more.xml
new file mode 100644
index 0000000..569c1e3
--- /dev/null
+++ b/app/src/main/res/layout/item_night_work_no_more.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v7.widget.CardView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/no_more"
+    android:orientation="horizontal"
+    android:layout_width="200dp"
+    android:layout_height="wrap_content"
+    app:cardCornerRadius="@dimen/dimen16"
+    app:cardBackgroundColor="@color/white"
+    android:layout_marginStart="@dimen/dimen4"
+    android:layout_marginEnd="@dimen/dimen8"
+    android:layout_marginTop="@dimen/dimen4"
+    android:layout_marginBottom="@dimen/dimen4">
+
+    <android.support.constraint.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/transparent"
+        android:layout_marginTop="50dp"
+        android:padding="@dimen/dimen16"
+        android:elevation="@dimen/dimen2"
+        tools:ignore="UnusedAttribute">
+
+        <TextView
+            android:id="@+id/txt_1"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            style="@style/TextStyle.Category"
+            android:text="鏂囦欢缂栧彿"
+            android:visibility="gone"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"/>
+
+        <TextView
+            android:id="@+id/txt_night_work_num"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="鍒板簳浜唦"
+            style="@style/TextStyle.Category.Item"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/txt_1"/>
+
+    </android.support.constraint.ConstraintLayout>
+
+    <TextView
+        android:id="@+id/txt_sign"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="start|bottom"
+        android:background="@drawable/button_bg_enable_2"
+        style="@style/TextStyle.Category.Item"
+        android:visibility="gone"
+        android:textColor="@color/white"
+        android:paddingStart="@dimen/dimen8"
+        android:paddingEnd="@dimen/dimen8"
+        android:paddingTop="@dimen/dimen2"
+        android:paddingBottom="@dimen/dimen2"
+        android:layout_marginStart="@dimen/textSize_16"
+        android:layout_marginBottom="@dimen/dimen16"
+        android:text="绛炬敹"/>
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="160dp"
+        android:src="@mipmap/ic_file"
+        android:layout_gravity="bottom|end"
+        android:layout_marginTop="120dp"
+        app:layout_constraintTop_toBottomOf="@id/txt_time"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"/>
+
+</android.support.v7.widget.CardView>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_scene_new_task.xml b/app/src/main/res/layout/item_scene_new_task.xml
index e1a50e8..0af7f22 100644
--- a/app/src/main/res/layout/item_scene_new_task.xml
+++ b/app/src/main/res/layout/item_scene_new_task.xml
@@ -12,8 +12,8 @@
     <android.support.constraint.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:paddingLeft="16dp"
-        android:paddingRight="16dp"
+        android:paddingLeft="@dimen/dimen4"
+        android:paddingRight="@dimen/dimen4"
         android:paddingTop="10dp"
         android:paddingBottom="10dp">
         <TextView
@@ -23,7 +23,7 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintBottom_toBottomOf="parent"
-            android:textSize="17sp"
+            android:textSize="@dimen/textSize_16"
             android:gravity="center"
             android:minEms="1"
             tools:text="1"
@@ -38,21 +38,19 @@
             app:layout_constraintTop_toTopOf="parent"
             android:layout_marginStart="@dimen/dimen8"
             android:layout_marginEnd="@dimen/dimen8"
-            android:singleLine="true"
             android:textSize="17sp"
-            tools:text="浠诲姟鍚嶇О"/>
+            tools:text="浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О"/>
 
         <TextView
             android:id="@+id/tv_item_task_list_address"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
             app:layout_constraintStart_toStartOf="@id/tv_item_task_list_name"
-            app:layout_constraintEnd_toStartOf="@id/tv_scene_type"
+            app:layout_constraintEnd_toEndOf="@id/tv_item_task_list_name"
             app:layout_constraintTop_toBottomOf="@id/tv_item_task_list_name"
             app:layout_constraintHorizontal_bias="0"
             android:layout_marginEnd="@dimen/dimen8"
-            android:singleLine="true"
-            tools:text="浠诲姟鍦扮偣"
+            tools:text="浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣"
             android:textSize="13sp" />
 
         <TextView
@@ -60,12 +58,12 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             style="@style/textTag"
-            app:layout_constraintStart_toEndOf="@id/tv_item_task_list_address"
+            app:layout_constraintStart_toStartOf="@id/tv_item_task_list_name"
             app:layout_constraintEnd_toEndOf="@id/tv_item_task_list_name"
-            app:layout_constraintTop_toBottomOf="@id/tv_item_task_list_name"
+            app:layout_constraintTop_toBottomOf="@id/tv_item_task_list_address"
             app:layout_constraintHorizontal_bias="0"
             android:singleLine="true"
-            tools:text="宸ュ湴" />
+            tools:text="宸ュ湴宸ュ湴宸ュ湴宸ュ湴宸ュ湴宸ュ湴宸ュ湴" />
 
         <LinearLayout
             android:id="@+id/ll_monitor_num"
diff --git a/app/src/main/res/layout/item_scene_task.xml b/app/src/main/res/layout/item_scene_task.xml
index 4779303..8be7187 100644
--- a/app/src/main/res/layout/item_scene_task.xml
+++ b/app/src/main/res/layout/item_scene_task.xml
@@ -12,8 +12,8 @@
     <android.support.constraint.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:paddingLeft="16dp"
-        android:paddingRight="16dp"
+        android:paddingLeft="@dimen/dimen4"
+        android:paddingRight="@dimen/dimen4"
         android:paddingTop="10dp"
         android:paddingBottom="10dp">
         <TextView
@@ -23,7 +23,7 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintBottom_toBottomOf="parent"
-            android:textSize="17sp"
+            android:textSize="@dimen/textSize_16"
             android:gravity="center"
             android:minEms="1"
             tools:text="1"
@@ -38,21 +38,19 @@
             app:layout_constraintTop_toTopOf="parent"
             android:layout_marginStart="@dimen/dimen8"
             android:layout_marginEnd="@dimen/dimen8"
-            android:singleLine="true"
             android:textSize="17sp"
-            tools:text="浠诲姟鍚嶇О"/>
+            tools:text="浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О浠诲姟鍚嶇О"/>
 
         <TextView
             android:id="@+id/tv_item_task_list_address"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
             app:layout_constraintStart_toStartOf="@id/tv_item_task_list_name"
-            app:layout_constraintEnd_toStartOf="@id/tv_scene_type"
+            app:layout_constraintEnd_toEndOf="@id/tv_item_task_list_name"
             app:layout_constraintTop_toBottomOf="@id/tv_item_task_list_name"
             app:layout_constraintHorizontal_bias="0"
             android:layout_marginEnd="@dimen/dimen8"
-            android:singleLine="true"
-            tools:text="浠诲姟鍦扮偣"
+            tools:text="浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣浠诲姟鍦扮偣"
             android:textSize="13sp" />
 
         <TextView
@@ -60,12 +58,12 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             style="@style/textTag"
-            app:layout_constraintStart_toEndOf="@id/tv_item_task_list_address"
+            app:layout_constraintStart_toStartOf="@id/tv_item_task_list_name"
             app:layout_constraintEnd_toEndOf="@id/tv_item_task_list_name"
-            app:layout_constraintTop_toBottomOf="@id/tv_item_task_list_name"
+            app:layout_constraintTop_toBottomOf="@id/tv_item_task_list_address"
             app:layout_constraintHorizontal_bias="0"
             android:singleLine="true"
-            tools:text="宸ュ湴" />
+            tools:text="宸ュ湴宸ュ湴宸ュ湴宸ュ湴宸ュ湴宸ュ湴宸ュ湴" />
 
 
         <TextView
diff --git a/app/src/main/res/layout/layout_empty_load_more.xml b/app/src/main/res/layout/layout_empty_load_more.xml
new file mode 100644
index 0000000..b0cfcbc
--- /dev/null
+++ b/app/src/main/res/layout/layout_empty_load_more.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="0dp"
+    android:layout_height="0dp"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:background="@color/transparentGray">
+
+    <View
+        android:id="@+id/loading"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <View
+        android:id="@+id/load_fail"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <View
+        android:id="@+id/load_end"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_empty_view.xml b/app/src/main/res/layout/layout_empty_view.xml
new file mode 100644
index 0000000..445f8cd
--- /dev/null
+++ b/app/src/main/res/layout/layout_empty_view.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingBottom="100dp"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+    <ImageView
+        android:id="@+id/img_no_data"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintVertical_bias="0.2"
+        android:scaleType="centerInside"
+        android:src="@mipmap/ic_developing"/>
+
+    <TextView
+        android:id="@+id/tv_no_data"
+        app:layout_constraintTop_toBottomOf="@id/img_no_data"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="鏆傛棤鏁版嵁"
+        android:gravity="center"
+        android:textColor="@color/gray"
+        android:visibility="visible"/>
+</android.support.constraint.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_load_fail_view.xml b/app/src/main/res/layout/layout_load_fail_view.xml
new file mode 100644
index 0000000..18794d9
--- /dev/null
+++ b/app/src/main/res/layout/layout_load_fail_view.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+    <ImageView
+        android:id="@+id/img_no_data"
+        android:layout_width="0dp"
+        android:layout_height="46dp"
+        android:visibility="visible"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintVertical_bias="0.2"
+        android:scaleType="fitCenter"
+        android:src="@drawable/ic_announcement_black_24dp"
+        android:tint="@color/secondary_text"/>
+
+    <TextView
+        android:id="@+id/tv_no_data"
+        app:layout_constraintTop_toBottomOf="@id/img_no_data"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="鍔犺浇澶辫触, 涓嬫媺鍒锋柊閲嶈瘯"
+        android:gravity="center"
+        android:textColor="@color/gray"
+        android:visibility="visible"/>
+</android.support.constraint.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_loading.xml b/app/src/main/res/layout/layout_loading.xml
index 84c2024..ded0406 100644
--- a/app/src/main/res/layout/layout_loading.xml
+++ b/app/src/main/res/layout/layout_loading.xml
@@ -12,9 +12,11 @@
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical|center_horizontal"
         />
-    <!--<TextView-->
-        <!--android:id="@+id/tipTextView"-->
-        <!--android:layout_width="wrap_content"-->
-        <!--android:layout_height="wrap_content"-->
-        <!--android:title="鍔犺浇涓�..."/>-->
+    <TextView
+        android:id="@+id/txt_tip"
+        android:visibility="gone"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical|center_horizontal"
+        android:text="鍔犺浇涓�..."/>
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_loading_view.xml b/app/src/main/res/layout/layout_loading_view.xml
new file mode 100644
index 0000000..0b709e1
--- /dev/null
+++ b/app/src/main/res/layout/layout_loading_view.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+    <ProgressBar
+        android:id="@+id/view_waiting"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintVertical_bias="0.2" />
+
+    <TextView
+        android:id="@+id/tv_no_data"
+        app:layout_constraintTop_toBottomOf="@id/view_waiting"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="鍔犺浇涓�..."
+        android:gravity="center"
+        android:textColor="@color/gray"
+        android:visibility="visible"/>
+</android.support.constraint.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_night_work_empty.xml b/app/src/main/res/layout/layout_night_work_empty.xml
new file mode 100644
index 0000000..21ac798
--- /dev/null
+++ b/app/src/main/res/layout/layout_night_work_empty.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+    <android.support.v7.widget.CardView
+        android:id="@+id/no_more"
+        android:orientation="horizontal"
+        android:layout_width="200dp"
+        android:layout_height="wrap_content"
+        app:cardCornerRadius="@dimen/dimen16"
+        app:cardBackgroundColor="@color/white"
+        android:layout_marginStart="@dimen/dimen4"
+        android:layout_marginEnd="@dimen/dimen8"
+        android:layout_marginTop="@dimen/dimen4"
+        android:layout_marginBottom="@dimen/dimen4">
+
+        <android.support.constraint.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="@color/transparent"
+            android:layout_marginTop="50dp"
+            android:padding="@dimen/dimen16"
+            android:elevation="@dimen/dimen2"
+            tools:ignore="UnusedAttribute">
+
+            <TextView
+                android:id="@+id/txt_1"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                style="@style/TextStyle.Category"
+                android:text="鏂囦欢缂栧彿"
+                android:visibility="gone"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"/>
+
+            <TextView
+                android:id="@+id/txt_night_work_num"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="鏆傛棤鏂扮殑璁稿彲璇�"
+                style="@style/TextStyle.Category.Item"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/txt_1"/>
+
+        </android.support.constraint.ConstraintLayout>
+
+        <TextView
+            android:id="@+id/txt_sign"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="start|bottom"
+            android:background="@drawable/button_bg_enable_2"
+            style="@style/TextStyle.Category.Item"
+            android:visibility="gone"
+            android:textColor="@color/white"
+            android:paddingStart="@dimen/dimen8"
+            android:paddingEnd="@dimen/dimen8"
+            android:paddingTop="@dimen/dimen2"
+            android:paddingBottom="@dimen/dimen2"
+            android:layout_marginStart="@dimen/textSize_16"
+            android:layout_marginBottom="@dimen/dimen16"
+            android:text="绛炬敹"/>
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="160dp"
+            android:src="@mipmap/ic_file"
+            android:layout_gravity="bottom|end"
+            android:layout_marginTop="120dp"
+            app:layout_constraintTop_toBottomOf="@id/txt_time"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
+
+    </android.support.v7.widget.CardView>
+</FrameLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_recycler_view_refresh.xml b/app/src/main/res/layout/layout_recycler_view_refresh.xml
new file mode 100644
index 0000000..4efeb84
--- /dev/null
+++ b/app/src/main/res/layout/layout_recycler_view_refresh.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v4.widget.SwipeRefreshLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/refresh_layout"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior">
+
+    <android.support.v7.widget.RecyclerView
+            android:id="@+id/recycler_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:layout_constraintTop_toTopOf="parent">
+    </android.support.v7.widget.RecyclerView>
+</android.support.v4.widget.SwipeRefreshLayout>
+
diff --git a/app/src/main/res/layout/layout_toolbar_2.xml b/app/src/main/res/layout/layout_toolbar_2.xml
index 0323d3d..78e4cf6 100644
--- a/app/src/main/res/layout/layout_toolbar_2.xml
+++ b/app/src/main/res/layout/layout_toolbar_2.xml
@@ -6,7 +6,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/toolbar"
     app:contentInsetStart="0dp"
-    android:background="@color/transparent">
+    android:background="@color/colorPrimary">
 
     <android.support.constraint.ConstraintLayout
         android:layout_width="match_parent"
@@ -18,7 +18,6 @@
             android:layout_height="40dp"
             android:padding="@dimen/dimen8"
             android:src="@drawable/ic_menu_back"
-            android:tint="#1C1E33"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintBottom_toBottomOf="parent"/>
@@ -31,7 +30,7 @@
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintBottom_toBottomOf="parent"
-            android:textColor="#1C1E33"
+            android:textColor="@color/white"
             style="@style/ToolbarTitleStyle"
             tools:text="鏍囬"/>
 
diff --git a/app/src/main/res/layout/recycler_item_section_head.xml b/app/src/main/res/layout/recycler_item_section_head.xml
new file mode 100644
index 0000000..62a8fb1
--- /dev/null
+++ b/app/src/main/res/layout/recycler_item_section_head.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:tools="http://schemas.android.com/tools"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingTop="@dimen/dimen8"
+        android:background="@color/lightGray">
+    <TextView
+            android:id="@+id/tv_section_head"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/app_name"
+            android:background="@android:color/white"
+            android:textColor="@color/gray"
+            android:elevation="0.5dp">
+    </TextView>
+</FrameLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/tool_bar_layout.xml b/app/src/main/res/layout/tool_bar_layout.xml
new file mode 100644
index 0000000..4d472da
--- /dev/null
+++ b/app/src/main/res/layout/tool_bar_layout.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.AppBarLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/app_bar_layout"
+    app:elevation="1dp"
+    tools:ignore="UnusedAttribute" >
+
+    <android.support.design.widget.CollapsingToolbarLayout
+        android:id="@+id/collapse_tool_bar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="@dimen/actionbarHeight"
+        app:contentScrim="@color/colorPrimary"
+        app:titleEnabled="false"
+        app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">
+        <android.support.constraint.ConstraintLayout
+            android:id="@+id/tool_bar_expanded_container"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:layout_collapseMode="parallax"
+            app:layout_collapseParallaxMultiplier="0.85">
+        </android.support.constraint.ConstraintLayout>
+
+        <android.support.v7.widget.Toolbar
+            android:id="@+id/tool_bar"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/actionbarHeight"
+            app:layout_collapseMode="pin"
+            app:contentInsetStart="0dp">
+            <android.support.constraint.ConstraintLayout
+                android:visibility="visible"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+                <ImageView
+                    android:id="@+id/img_back"
+                    android:layout_width="@dimen/title_icon_size_2"
+                    android:layout_height="@dimen/title_icon_size_2"
+                    android:src="@drawable/ic_menu_back"
+                    android:padding="@dimen/dimen8"
+                    android:layout_marginStart="@dimen/dimen8"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    android:foreground="?attr/selectableItemBackgroundBorderless"
+                    tools:ignore="UnusedAttribute"/>
+
+                <TextView
+                    android:id="@+id/tv_main_title"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    style="@style/ToolbarTitleStyle"
+                    tools:text="@string/version"/>
+
+                <ImageView
+                    android:id="@+id/img_menu_1"
+                    android:layout_width="@dimen/title_icon_size_2"
+                    android:layout_height="@dimen/title_icon_size_2"
+                    android:padding="8dp"
+                    android:tint="@color/white"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toStartOf="@id/img_menu_2"
+                    android:foreground="?attr/selectableItemBackground"
+                    android:layout_marginEnd="@dimen/dimen8" />
+
+                <ImageView
+                    android:id="@+id/img_menu_2"
+                    android:layout_width="@dimen/title_icon_size_2"
+                    android:layout_height="@dimen/title_icon_size_2"
+                    android:padding="8dp"
+                    android:tint="@color/white"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toStartOf="@id/img_menu_3"
+                    android:foreground="?attr/selectableItemBackground"
+                    android:layout_marginEnd="@dimen/dimen8" />
+
+                <ImageView
+                    android:id="@+id/img_menu_3"
+                    android:layout_width="@dimen/title_icon_size_2"
+                    android:layout_height="@dimen/title_icon_size_2"
+                    android:padding="8dp"
+                    android:tint="@color/white"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    android:foreground="?attr/selectableItemBackground"
+                    android:layout_marginEnd="@dimen/dimen8" />
+
+            </android.support.constraint.ConstraintLayout>
+        </android.support.v7.widget.Toolbar>
+
+    </android.support.design.widget.CollapsingToolbarLayout>
+
+</android.support.design.widget.AppBarLayout>
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_developing.png b/app/src/main/res/mipmap-hdpi/ic_developing.png
new file mode 100644
index 0000000..3d1b1b5
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_developing.png
Binary files differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_developing.png b/app/src/main/res/mipmap-mdpi/ic_developing.png
new file mode 100644
index 0000000..98faa25
--- /dev/null
+++ b/app/src/main/res/mipmap-mdpi/ic_developing.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xhdpi/file_ic_detail_excel.png b/app/src/main/res/mipmap-xhdpi/file_ic_detail_excel.png
new file mode 100644
index 0000000..a634a3a
--- /dev/null
+++ b/app/src/main/res/mipmap-xhdpi/file_ic_detail_excel.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xhdpi/file_ic_detail_pdf.png b/app/src/main/res/mipmap-xhdpi/file_ic_detail_pdf.png
new file mode 100644
index 0000000..aaf12de
--- /dev/null
+++ b/app/src/main/res/mipmap-xhdpi/file_ic_detail_pdf.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_developing.png b/app/src/main/res/mipmap-xhdpi/ic_developing.png
new file mode 100644
index 0000000..3223387
--- /dev/null
+++ b/app/src/main/res/mipmap-xhdpi/ic_developing.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_share.png b/app/src/main/res/mipmap-xhdpi/ic_share.png
new file mode 100644
index 0000000..ea2a9fe
--- /dev/null
+++ b/app/src/main/res/mipmap-xhdpi/ic_share.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_developing.png b/app/src/main/res/mipmap-xxhdpi/ic_developing.png
new file mode 100644
index 0000000..ed8e699
--- /dev/null
+++ b/app/src/main/res/mipmap-xxhdpi/ic_developing.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_developing.png b/app/src/main/res/mipmap-xxxhdpi/ic_developing.png
new file mode 100644
index 0000000..3eb7ff2
--- /dev/null
+++ b/app/src/main/res/mipmap-xxxhdpi/ic_developing.png
Binary files differ
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 99c40ba..fc96abe 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -14,6 +14,8 @@
     <!--浠诲姟fragment鏂囧瓧-->
     <string name="task">浠诲姟</string>
 
+    <string name="file_provide">cn.flightfeather.thirdapp.fileProvider</string>
+
     <!--鍒涘缓鏈堜换鍔�-->
     <string name="new_month_task">鍒涘缓鏈堜换鍔�</string>
     <string name="task_name">浠诲姟鍚嶇О</string>
@@ -142,5 +144,7 @@
     <string name="title_activity_new_top_task_map">NewTopTaskMapActivity</string>
     <string name="info_name">鍚嶇О:</string>
     <string name="minus">- </string>
+    <string name="signed">宸茬鏀�</string>
+    <string name="unsigned">鏈鏀�</string>
 
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index bb60abd..9d7e49b 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -237,12 +237,12 @@
     </style>
 
     <style name="TextStyle.Category">
-        <item name="android:textSize">@dimen/textSize_notes</item>
+        <item name="android:textSize">10sp</item>
         <item name="android:textColor">@color/main_color_3</item>
     </style>
 
     <style name="TextStyle.Category.Item">
-        <item name="android:textSize">@dimen/textSize_16</item>
+        <item name="android:textSize">@dimen/textSize_14</item>
         <item name="android:textStyle">bold</item>
         <item name="android:textColor">@color/main_color_1</item>
     </style>
diff --git a/app/src/test/java/cn/flightfeather/thirdapp/Test.kt b/app/src/test/java/cn/flightfeather/thirdapp/Test.kt
index 8739267..b0a37d1 100644
--- a/app/src/test/java/cn/flightfeather/thirdapp/Test.kt
+++ b/app/src/test/java/cn/flightfeather/thirdapp/Test.kt
@@ -42,4 +42,11 @@
         val s = Gson().toJson(list)
         println(s)
     }
+
+    @Test
+    fun foo4() {
+        val list = listOf(1, 2, 3)
+        list.toMutableList().clear()
+        println(list)
+    }
 }
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 1ad50e8..a05cf3f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -8,6 +8,8 @@
     ext.image_picker_version = '2.2.7'
     ext.glide_version = '4.9.0'
     ext.adaper_version = '2.9.46'
+    ext.file_download_version = '1.0.7'
+    ext.progressbar_version = '3.0.3'
 
     repositories {
         jcenter()

--
Gitblit v1.9.3