瀏覽代碼

1.整合个推
2.连接管理系统

Tony 5 年之前
父節點
當前提交
481aa245d0
共有 100 個文件被更改,包括 1316 次插入111 次删除
  1. 19 2
      app/build.gradle
  2. 28 4
      app/src/main/AndroidManifest.xml
  3. 30 0
      app/src/main/java/com/sunzee/base/BaseApplication.java
  4. 46 0
      app/src/main/java/com/sunzee/model/HttpResult.java
  5. 46 0
      app/src/main/java/com/sunzee/model/domain/GeTuiBean.java
  6. 13 0
      app/src/main/java/com/sunzee/model/domain/Heartbeat.java
  7. 18 0
      app/src/main/java/com/sunzee/model/domain/Name.java
  8. 34 0
      app/src/main/java/com/sunzee/model/message/ApiMessageEvent.java
  9. 4 0
      app/src/main/java/com/sunzee/mvp/advanceparameter/AdvanceParameterPresenter.java
  10. 4 0
      app/src/main/java/com/sunzee/mvp/alarmrecord/AlarmRecordPresenter.java
  11. 3 0
      app/src/main/java/com/sunzee/mvp/debug/DebugPresenter.java
  12. 3 0
      app/src/main/java/com/sunzee/mvp/generalparameter/GeneralParameterPresenter.java
  13. 56 0
      app/src/main/java/com/sunzee/mvp/home/HomePresenter.java
  14. 4 0
      app/src/main/java/com/sunzee/mvp/homepage/HomePagePresenter.java
  15. 4 0
      app/src/main/java/com/sunzee/mvp/languageset/LanguageSetPresenter.java
  16. 4 0
      app/src/main/java/com/sunzee/mvp/other/OtherPresenter.java
  17. 5 1
      app/src/main/java/com/sunzee/mvp/passwordreset/PasswordResetPresenter.java
  18. 4 0
      app/src/main/java/com/sunzee/mvp/showmaterial/ShowMaterialPresenter.java
  19. 4 0
      app/src/main/java/com/sunzee/mvp/statistics/StatisticsPresenter.java
  20. 10 1
      app/src/main/java/com/sunzee/retrofit/ApiStores.java
  21. 183 0
      app/src/main/java/com/sunzee/service/MyIntentService.java
  22. 9 0
      app/src/main/java/com/sunzee/service/MyPushService.java
  23. 0 76
      app/src/main/java/com/sunzee/ui/HomeActivity.java
  24. 172 0
      app/src/main/java/com/sunzee/ui/activity/HomeActivity.java
  25. 1 1
      app/src/main/java/com/sunzee/ui/MainActivity.java
  26. 65 0
      app/src/main/java/com/sunzee/ui/dialog/ManagementSystemDialog.java
  27. 1 1
      app/src/main/java/com/sunzee/ui/AdvanceParameterFragment.java
  28. 1 1
      app/src/main/java/com/sunzee/ui/AlarmRecordFragment.java
  29. 1 1
      app/src/main/java/com/sunzee/ui/DebugFragment.java
  30. 1 1
      app/src/main/java/com/sunzee/ui/GeneralParameterFragment.java
  31. 1 1
      app/src/main/java/com/sunzee/ui/HomepageFragment.java
  32. 1 1
      app/src/main/java/com/sunzee/ui/LanguageSetFragment.java
  33. 1 1
      app/src/main/java/com/sunzee/ui/OtherFragment.java
  34. 1 1
      app/src/main/java/com/sunzee/ui/PasswordResetFragment.java
  35. 1 1
      app/src/main/java/com/sunzee/ui/ShowMaterialFragment.java
  36. 1 1
      app/src/main/java/com/sunzee/ui/StatisticsFragment.java
  37. 329 0
      app/src/main/java/com/sunzee/utils/FileUtil.java
  38. 90 0
      app/src/main/java/com/sunzee/utils/GeTuiUtil.java
  39. 10 16
      app/src/main/java/com/sunzee/utils/HomePagerSimpleFactory.java
  40. 74 0
      app/src/main/java/com/sunzee/utils/SharedPreferencesUtils.java
  41. 二進制
      app/src/main/res/drawable-hdpi/back_icon.png
  42. 二進制
      app/src/main/res/drawable-hdpi/data_icon.png
  43. 二進制
      app/src/main/res/drawable-hdpi/debug_icon.png
  44. 二進制
      app/src/main/res/drawable-hdpi/home_icon.png
  45. 二進制
      app/src/main/res/drawable-hdpi/ic_launcher.png
  46. 二進制
      app/src/main/res/drawable-hdpi/ic_launcher_round.png
  47. 二進制
      app/src/main/res/drawable-hdpi/language_icon.png
  48. 二進制
      app/src/main/res/drawable-hdpi/login_leftlogo.png
  49. 二進制
      app/src/main/res/drawable-hdpi/login_logo.png
  50. 二進制
      app/src/main/res/drawable-hdpi/material_icon.png
  51. 二進制
      app/src/main/res/drawable-hdpi/other_icon.png
  52. 二進制
      app/src/main/res/drawable-hdpi/parameter1_icon.png
  53. 二進制
      app/src/main/res/drawable-hdpi/parameter2_icon.png
  54. 二進制
      app/src/main/res/drawable-hdpi/password_icon.png
  55. 二進制
      app/src/main/res/drawable-hdpi/random.png
  56. 二進制
      app/src/main/res/drawable-hdpi/shutdown.png
  57. 二進制
      app/src/main/res/drawable-hdpi/time.png
  58. 二進制
      app/src/main/res/drawable-hdpi/time2.png
  59. 二進制
      app/src/main/res/drawable-hdpi/timing.png
  60. 二進制
      app/src/main/res/drawable-hdpi/timing2.png
  61. 二進制
      app/src/main/res/drawable-hdpi/warring_icon.png
  62. 二進制
      app/src/main/res/drawable-mdpi/back_icon.png
  63. 二進制
      app/src/main/res/drawable-mdpi/data_icon.png
  64. 二進制
      app/src/main/res/drawable-mdpi/debug_icon.png
  65. 二進制
      app/src/main/res/drawable-mdpi/home_icon.png
  66. 二進制
      app/src/main/res/drawable-mdpi/ic_launcher.png
  67. 二進制
      app/src/main/res/drawable-mdpi/ic_launcher_round.png
  68. 二進制
      app/src/main/res/drawable-mdpi/language_icon.png
  69. 二進制
      app/src/main/res/drawable-mdpi/login_leftlogo.png
  70. 二進制
      app/src/main/res/drawable-mdpi/login_logo.png
  71. 二進制
      app/src/main/res/drawable-mdpi/material_icon.png
  72. 二進制
      app/src/main/res/drawable-mdpi/other_icon.png
  73. 二進制
      app/src/main/res/drawable-mdpi/parameter1_icon.png
  74. 二進制
      app/src/main/res/drawable-mdpi/parameter2_icon.png
  75. 二進制
      app/src/main/res/drawable-mdpi/password_icon.png
  76. 二進制
      app/src/main/res/drawable-mdpi/random.png
  77. 二進制
      app/src/main/res/drawable-mdpi/shutdown.png
  78. 二進制
      app/src/main/res/drawable-mdpi/time.png
  79. 二進制
      app/src/main/res/drawable-mdpi/time2.png
  80. 二進制
      app/src/main/res/drawable-mdpi/timing.png
  81. 二進制
      app/src/main/res/drawable-mdpi/timing2.png
  82. 二進制
      app/src/main/res/drawable-mdpi/warring_icon.png
  83. 34 0
      app/src/main/res/drawable-v24/ic_launcher_foreground.xml
  84. 二進制
      app/src/main/res/drawable-xhdpi/back_icon.png
  85. 二進制
      app/src/main/res/drawable-xhdpi/data_icon.png
  86. 二進制
      app/src/main/res/drawable-xhdpi/debug_icon.png
  87. 二進制
      app/src/main/res/drawable-xhdpi/home_icon.png
  88. 二進制
      app/src/main/res/drawable-xhdpi/ic_launcher.png
  89. 二進制
      app/src/main/res/drawable-xhdpi/ic_launcher_round.png
  90. 二進制
      app/src/main/res/drawable-xhdpi/language_icon.png
  91. 二進制
      app/src/main/res/drawable-xhdpi/login_leftlogo.png
  92. 二進制
      app/src/main/res/drawable-xhdpi/login_logo.png
  93. 二進制
      app/src/main/res/drawable-xhdpi/material_icon.png
  94. 二進制
      app/src/main/res/drawable-xhdpi/other_icon.png
  95. 二進制
      app/src/main/res/drawable-xhdpi/parameter1_icon.png
  96. 二進制
      app/src/main/res/drawable-xhdpi/parameter2_icon.png
  97. 二進制
      app/src/main/res/drawable-xhdpi/password_icon.png
  98. 二進制
      app/src/main/res/drawable-xhdpi/random.png
  99. 二進制
      app/src/main/res/drawable-xhdpi/shutdown.png
  100. 0 0
      app/src/main/res/drawable-xhdpi/time.png

+ 19 - 2
app/build.gradle

@@ -8,6 +8,16 @@ android {
         minSdkVersion 14
         targetSdkVersion 27
         versionCode 1
+        manifestPlaceholders = [
+                //个推应用参数,请填写您申请的 GETUI_APP_ID,GETUI_APP_KEY,GETUI_APP_SECRET 值
+                GETUI_APP_ID    : "GKa6qa12heALjEXZlAn1U3",
+                GETUI_APP_KEY   : "89WV8dfjRg6RlxEchgmnS6",
+                GETUI_APP_SECRET: "fLvPjR8hni7VFMkgjh8lx2"
+        ]
+        ndk {
+            // 注意:这里需要添加项目所需 CPU 类型的最小集
+            abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86"
+        }
     }
 }
 
@@ -19,6 +29,10 @@ ext {
     logginginterceptor = '3.9.1'
     rxjavaVersion = '2.1.11'
     rxandroidVersion = "2.0.2"
+    getuiversion = "2.13.1.0"
+    designversion = "27.1.1"
+    constraintlayoutversion = "1.1.3"
+    eventbusversion = "3.2.0"
 }
 
 dependencies {
@@ -36,6 +50,9 @@ dependencies {
     //rxjava
     implementation "io.reactivex.rxjava2:rxandroid:$rxandroidVersion"
     implementation "io.reactivex.rxjava2:rxjava:$rxjavaVersion"
-    implementation "com.android.support:design:27.1.1"
-    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+    implementation "com.android.support:design:$designversion"
+    implementation "com.android.support.constraint:constraint-layout:$constraintlayoutversion"
+    //请将此处的 ${version} 替换成您当前相应的 SDK 版本号,如 2.14.0.0
+    implementation "com.getui:sdk:$getuiversion"
+    implementation "org.greenrobot:eventbus:$eventbusversion"
 }

+ 28 - 4
app/src/main/AndroidManifest.xml

@@ -1,27 +1,51 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="com.sunzee">
 
     <uses-permission android:name="android.permission.INTERNET" />
+    <!-- iBeancon 功能所需权限 -->
+    <uses-permission android:name="android.permission.BLUETOOTH" />
+    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
+    <!-- 个推电子围栏功能所需权限 -->
+    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
+        tools:ignore="ProtectedPermissions" />
+
     <application
+        android:name=".base.BaseApplication"
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
         <activity
-            android:name="com.sunzee.ui.MainActivity"
-            android:label="@string/app_name"
-            android:screenOrientation="portrait">
+            android:name="com.sunzee.ui.activity.MainActivity"
+            android:label="@string/app_name">
 
         </activity>
-        <activity android:name=".ui.HomeActivity">
+        <activity android:name=".ui.activity.HomeActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
+        <service
+            android:name=".service.MyPushService"
+            android:exported="true"
+            android:label="PushService"
+            android:process=":pushservice" />
+        <service
+            android:name=".service.MyIntentService"
+            android:permission="android.permission.BIND_JOB_SERVICE" />
     </application>
 
 </manifest>

+ 30 - 0
app/src/main/java/com/sunzee/base/BaseApplication.java

@@ -0,0 +1,30 @@
+package com.sunzee.base;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.sunzee.model.domain.Heartbeat;
+import com.sunzee.utils.FileUtil;
+import com.sunzee.utils.GeTuiUtil;
+
+/**
+ * Created by MinKin.
+ */
+public class BaseApplication extends Application {
+
+    public static Context mContext;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        mContext = this;
+        Heartbeat.deviceId = FileUtil.getDeviceId();
+    }
+
+
+    public static Context getContext() {
+        return mContext;
+    }
+
+
+}

+ 46 - 0
app/src/main/java/com/sunzee/model/HttpResult.java

@@ -0,0 +1,46 @@
+package com.sunzee.model;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Http响应实体类
+ * Created by MinKin.
+ */
+public class HttpResult<T> {
+
+    private int code;
+    private T data;
+    @SerializedName("errmsg")
+    private String errorMsg;
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public String getErrorMsg() {
+        return errorMsg;
+    }
+
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
+    }
+
+    /**
+     * 是否请求成功(由服务器状态码决定)
+     */
+    public boolean isSuccess() {
+        return code == 0;
+    }
+}

File diff suppressed because it is too large
+ 46 - 0
app/src/main/java/com/sunzee/model/domain/GeTuiBean.java


+ 13 - 0
app/src/main/java/com/sunzee/model/domain/Heartbeat.java

@@ -0,0 +1,13 @@
+package com.sunzee.model.domain;
+
+/**
+ * @Description 心跳包
+ */
+public class Heartbeat {
+
+    public static String managerId;
+    public static String deviceId;
+    public static String clientId;
+
+
+}

+ 18 - 0
app/src/main/java/com/sunzee/model/domain/Name.java

@@ -0,0 +1,18 @@
+package com.sunzee.model.domain;
+
+/**
+ * @Description 通用名称
+ */
+public interface Name {
+
+    /**
+     * 设备连接状态
+     * 0-未连接
+     * 1-连接中
+     * 2-已连接
+     */
+    String CONNECT_STATE="CONNECT_STATE";
+
+    //系统id
+    String SYSTEM_ID="system_Id";
+}

+ 34 - 0
app/src/main/java/com/sunzee/model/message/ApiMessageEvent.java

@@ -0,0 +1,34 @@
+package com.sunzee.model.message;
+
+/**
+ * @Description 发送推送结果
+ */
+public class ApiMessageEvent {
+
+    private String name;
+
+    private Object data;
+
+    public ApiMessageEvent(String name, Object data){
+        this.name=name;
+        this.data=data;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setMessage(String name) {
+        this.name = name;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+
+
+}

+ 4 - 0
app/src/main/java/com/sunzee/mvp/advanceparameter/AdvanceParameterPresenter.java

@@ -1,6 +1,10 @@
 package com.sunzee.mvp.advanceparameter;
 
 import com.sunzee.base.BasePresenter;
+import com.sunzee.mvp.home.HomeView;
 
 public class AdvanceParameterPresenter extends BasePresenter<AdvanceParameterView> {
+    public AdvanceParameterPresenter(AdvanceParameterView view) {
+        attachView(view);
+    }
 }

+ 4 - 0
app/src/main/java/com/sunzee/mvp/alarmrecord/AlarmRecordPresenter.java

@@ -1,6 +1,10 @@
 package com.sunzee.mvp.alarmrecord;
 
 import com.sunzee.base.BasePresenter;
+import com.sunzee.mvp.advanceparameter.AdvanceParameterView;
 
 public class AlarmRecordPresenter extends BasePresenter<AlarmRecordView> {
+    public AlarmRecordPresenter(AlarmRecordView view) {
+        attachView(view);
+    }
 }

+ 3 - 0
app/src/main/java/com/sunzee/mvp/debug/DebugPresenter.java

@@ -3,4 +3,7 @@ package com.sunzee.mvp.debug;
 import com.sunzee.base.BasePresenter;
 
 public class DebugPresenter extends BasePresenter<DebugView> {
+    public DebugPresenter(DebugView view) {
+        attachView(view);
+    }
 }

+ 3 - 0
app/src/main/java/com/sunzee/mvp/generalparameter/GeneralParameterPresenter.java

@@ -3,4 +3,7 @@ package com.sunzee.mvp.generalparameter;
 import com.sunzee.base.BasePresenter;
 
 public class GeneralParameterPresenter  extends BasePresenter<GeneralParameterView> {
+    public GeneralParameterPresenter(GeneralParameterView view) {
+        attachView(view);
+    }
 }

+ 56 - 0
app/src/main/java/com/sunzee/mvp/home/HomePresenter.java

@@ -0,0 +1,56 @@
+package com.sunzee.mvp.home;
+
+import android.util.Log;
+import android.widget.Toast;
+
+import com.sunzee.base.BasePresenter;
+import com.sunzee.model.HttpResult;
+import com.sunzee.model.domain.Heartbeat;
+import com.sunzee.model.domain.Name;
+import com.sunzee.retrofit.ApiCallback;
+import com.sunzee.ui.activity.HomeActivity;
+import com.sunzee.utils.FileUtil;
+import com.sunzee.utils.SharedPreferencesUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class HomePresenter extends BasePresenter<HomeView> {
+    public HomePresenter(HomeView view) {
+        attachView(view);
+    }
+
+
+    public void connectionSystem(String text) {
+        mvpView.showLoading();
+        if (Heartbeat.clientId == null || Heartbeat.clientId.equals("")) {
+            return;
+        }
+
+        Map<String, String> params = new HashMap<>();
+        SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 2);
+        Heartbeat.deviceId = FileUtil.getDeviceId();
+        SharedPreferencesUtils.setParam(Name.CONNECT_STATE, -1);
+        params.put("clientId", Heartbeat.deviceId);
+        params.put("managerId", text);
+        params.put("gtClientId", Heartbeat.clientId);
+        Heartbeat.managerId = text;
+        Log.d("HomePresenter", "onClickListener: Heartbeat.deviceId=" + Heartbeat.deviceId + ";text=" + text + ";Heartbeat.clientId" + Heartbeat.clientId);
+        addSubscription(apiStores.init(params), new ApiCallback<HttpResult<String>>() {
+            @Override
+            public void onSuccess(HttpResult<String> model) {
+                Log.d("HomePresenter", "onSuccess: data=" + model.getData() + ";code=" + model.getCode());
+            }
+
+            @Override
+            public void onFailure(String msg) {
+                Log.d("HomePresenter", "onFailure: " + msg);
+            }
+
+            @Override
+            public void onFinish() {
+                mvpView.hideLoading();
+            }
+        });
+    }
+}

+ 4 - 0
app/src/main/java/com/sunzee/mvp/homepage/HomePagePresenter.java

@@ -1,6 +1,10 @@
 package com.sunzee.mvp.homepage;
 
 import com.sunzee.base.BasePresenter;
+import com.sunzee.mvp.generalparameter.GeneralParameterView;
 
 public class HomePagePresenter extends BasePresenter<HomePageView> {
+    public HomePagePresenter(HomePageView view) {
+        attachView(view);
+    }
 }

+ 4 - 0
app/src/main/java/com/sunzee/mvp/languageset/LanguageSetPresenter.java

@@ -1,6 +1,10 @@
 package com.sunzee.mvp.languageset;
 
 import com.sunzee.base.BasePresenter;
+import com.sunzee.mvp.homepage.HomePageView;
 
 public class LanguageSetPresenter  extends BasePresenter<LanguageSetView> {
+    public LanguageSetPresenter(LanguageSetView view) {
+        attachView(view);
+    }
 }

+ 4 - 0
app/src/main/java/com/sunzee/mvp/other/OtherPresenter.java

@@ -1,6 +1,10 @@
 package com.sunzee.mvp.other;
 
 import com.sunzee.base.BasePresenter;
+import com.sunzee.mvp.languageset.LanguageSetView;
 
 public class OtherPresenter extends BasePresenter<OtherView> {
+    public OtherPresenter(OtherView view) {
+        attachView(view);
+    }
 }

+ 5 - 1
app/src/main/java/com/sunzee/mvp/passwordreset/PasswordResetPresenter.java

@@ -1,6 +1,10 @@
 package com.sunzee.mvp.passwordreset;
 
 import com.sunzee.base.BasePresenter;
+import com.sunzee.mvp.other.OtherView;
 
-public class PasswordResetPresenter extends BasePresenter {
+public class PasswordResetPresenter extends BasePresenter<PasswordResetView> {
+    public PasswordResetPresenter(PasswordResetView view) {
+        attachView(view);
+    }
 }

+ 4 - 0
app/src/main/java/com/sunzee/mvp/showmaterial/ShowMaterialPresenter.java

@@ -1,6 +1,10 @@
 package com.sunzee.mvp.showmaterial;
 
 import com.sunzee.base.BasePresenter;
+import com.sunzee.mvp.passwordreset.PasswordResetView;
 
 public class ShowMaterialPresenter extends BasePresenter<ShowMaterialView> {
+    public ShowMaterialPresenter(ShowMaterialView view) {
+        attachView(view);
+    }
 }

+ 4 - 0
app/src/main/java/com/sunzee/mvp/statistics/StatisticsPresenter.java

@@ -2,6 +2,10 @@ package com.sunzee.mvp.statistics;
 
 import com.sunzee.base.BasePresenter;
 import com.sunzee.base.BaseView;
+import com.sunzee.mvp.showmaterial.ShowMaterialView;
 
 public class StatisticsPresenter extends BasePresenter<StatisticsView> {
+    public StatisticsPresenter(StatisticsView view) {
+        attachView(view);
+    }
 }

+ 10 - 1
app/src/main/java/com/sunzee/retrofit/ApiStores.java

@@ -1,11 +1,14 @@
 package com.sunzee.retrofit;
 
 import com.sunzee.model.EmailResult;
+import com.sunzee.model.HttpResult;
 
 import java.util.HashMap;
 import java.util.Map;
 
 import io.reactivex.Observable;
+import retrofit2.http.FieldMap;
+import retrofit2.http.FormUrlEncoded;
 import retrofit2.http.GET;
 import retrofit2.http.POST;
 import retrofit2.http.Query;
@@ -15,13 +18,19 @@ import retrofit2.http.QueryMap;
 public interface ApiStores {
     //baseUrl
     String API_SERVER_URL = "http://app.sunzee.com.cn/";
+//    String API_SERVER_URL = "http://192.168.0.185:8082";
 
     // 用bean接收 返回值
     @POST("api/coinOrder/email.htm")
-    Observable<EmailResult> testEmail(@QueryMap Map<String,String> param);
+    Observable<EmailResult> testEmail(@QueryMap Map<String, String> param);
 
     // 用map接收 返回值
     @GET("api/order/getOrderStatus.htm")
     Observable<HashMap> getOrderStatus(@Query("sn") String sn);
 
+
+    @FormUrlEncoded
+    @POST("/api/app_equipment/index/init.htm")
+    Observable<HttpResult<String>> init(@FieldMap Map<String, String> params);
+
 }

+ 183 - 0
app/src/main/java/com/sunzee/service/MyIntentService.java

@@ -0,0 +1,183 @@
+package com.sunzee.service;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.google.gson.Gson;
+import com.igexin.sdk.GTIntentService;
+import com.igexin.sdk.message.GTCmdMessage;
+import com.igexin.sdk.message.GTNotificationMessage;
+import com.igexin.sdk.message.GTTransmitMessage;
+import com.sunzee.model.domain.GeTuiBean;
+import com.sunzee.model.domain.Heartbeat;
+import com.sunzee.model.domain.Name;
+import com.sunzee.model.message.ApiMessageEvent;
+import com.sunzee.utils.GeTuiUtil;
+import com.sunzee.utils.SharedPreferencesUtils;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+
+/**
+ * 继承 GTIntentService 接收来自个推的消息,所有消息在线程中回调,
+ * 如果注册了该服务,则务必要在 AndroidManifest 中声明,否则无法接受消息
+ */
+public class MyIntentService extends GTIntentService {
+    @Override
+    public void onReceiveServicePid(Context context, int i) {
+
+    }
+    @Subscribe
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        EventBus.getDefault().register(this);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        EventBus.getDefault().unregister(this);
+    }
+
+
+    /**
+     * 接收 cid
+     *
+     * @param context
+     * @param clientid
+     */
+    @Override
+    public void onReceiveClientId(Context context, String clientid) {
+        Log.e(TAG, "onReceiveClientId -> " + "clientid = " + clientid);
+        Heartbeat.clientId = clientid;
+    }
+
+    /**
+     * 处理透传消息
+     *
+     * @param context
+     * @param gtTransmitMessage
+     */
+    @Override
+    public void onReceiveMessageData(Context context, GTTransmitMessage gtTransmitMessage) {
+
+        String appid = gtTransmitMessage.getAppid();
+        String taskid = gtTransmitMessage.getTaskId();
+        String messageid = gtTransmitMessage.getMessageId();
+        byte[] payload = gtTransmitMessage.getPayload();
+        String pkg = gtTransmitMessage.getPkgName();
+        String cid = gtTransmitMessage.getClientId();
+
+        String data = new String(payload);
+        Gson gson = new Gson();
+        Log.e(TAG, "onReceiveMessageData: " + ";appid" + appid + ";taskid" + taskid + ";messageid" + messageid + ";payload" + payload + ";pkg" + pkg + ";cid" + cid);
+        Log.e(TAG, "onReceiveMessageData: data:" + data);
+
+        String realData = data;
+
+        Log.e(TAG, "onReceiveMessageData : realData=" + realData);
+        GeTuiBean geTuiBean = gson.fromJson(realData, GeTuiBean.class);
+        String kind = geTuiBean.getKind();
+        switch (kind) {
+            case "clean":
+                //开始清洗
+                startClean(gson, geTuiBean, kind);
+                break;
+            case "statusType":
+                statusType(gson, geTuiBean, kind);
+                break;
+        }
+
+    }
+
+    /**
+     * 开始清洗
+     *
+     * @param gson
+     * @param geTuiBean
+     * @param kind
+     */
+    private void startClean(Gson gson, GeTuiBean geTuiBean, String kind) {
+        Log.e("home", "statusType: 开始清洗");
+    }
+
+    /**
+     * 初始化回调
+     *
+     * @param gson
+     * @param baseBean
+     * @param kind
+     */
+    private void statusType(Gson gson, GeTuiBean baseBean, String kind) {
+        String json = baseBean.getKind_data();
+        String s = gson.fromJson(json, String.class);
+        if (s.equals("rejected")) {
+            //拒绝
+            SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 0);
+            Log.e("home", "statusType: 申请拒绝");
+        } else if (s.equals("agreed")) {
+            //申请通过
+            SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 2);
+            Log.e("home", "statusType: 申请通过");
+            SharedPreferencesUtils.setParam(Name.SYSTEM_ID, Heartbeat.managerId);
+        } else if (s.equals("agreed1")) {
+            SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 2);
+            Log.e("home", "statusType: 申请通过");
+            SharedPreferencesUtils.setParam(Name.SYSTEM_ID, Heartbeat.managerId);
+            // interService 不能弹出弹窗 在 service中弹出
+            EventBus.getDefault().post(new ApiMessageEvent(kind + "1", null));
+
+        }
+        EventBus.getDefault().post(new ApiMessageEvent(kind, null));
+    }
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void event(ApiMessageEvent messageEvent) {
+    }
+
+    /**
+     * cid 离线上线通知
+     *
+     * @param context
+     * @param b
+     */
+    @Override
+    public void onReceiveOnlineState(Context context, boolean b) {
+
+    }
+
+    /**
+     * 各种事件处理回执
+     *
+     * @param context
+     * @param gtCmdMessage
+     */
+    @Override
+    public void onReceiveCommandResult(Context context, GTCmdMessage gtCmdMessage) {
+
+    }
+
+    /**
+     * 通知到达,只有个推通道下发的通知会回调此方法
+     *
+     * @param context
+     * @param gtNotificationMessage
+     */
+    @Override
+    public void onNotificationMessageArrived(Context context, GTNotificationMessage gtNotificationMessage) {
+
+    }
+
+    /**
+     * 通知点击,只有个推通道下发的通知会回调此方法
+     *
+     * @param context
+     * @param gtNotificationMessage
+     */
+    @Override
+    public void onNotificationMessageClicked(Context context, GTNotificationMessage gtNotificationMessage) {
+
+    }
+}

+ 9 - 0
app/src/main/java/com/sunzee/service/MyPushService.java

@@ -0,0 +1,9 @@
+package com.sunzee.service;
+
+import com.igexin.sdk.PushService;
+
+/**
+ * @Description 个推服务
+ */
+public class MyPushService extends PushService {
+}

+ 0 - 76
app/src/main/java/com/sunzee/ui/HomeActivity.java

@@ -1,76 +0,0 @@
-package com.sunzee.ui;
-
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.design.widget.NavigationView;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
-import android.view.MenuItem;
-
-import com.sunzee.R;
-import com.sunzee.base.BaseFragment;
-import com.sunzee.base.MvpActivity;
-import com.sunzee.mvp.home.HomePresenter;
-import com.sunzee.mvp.home.HomeView;
-import com.sunzee.utils.HomePagerSimpleFactory;
-
-public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView {
-
-    private NavigationView mNavigationView;
-    private FragmentManager mFragmentManager;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_home);
-        initView();
-        initEvent();
-    }
-
-    private void initEvent() {
-        mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
-            @Override
-            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
-                //根据id切换页面
-                BaseFragment baseFragment = switchPage(item);
-                if (baseFragment != null) {
-                    switchFragment(baseFragment);
-                }
-                return true;
-            }
-        });
-    }
-
-    private BaseFragment switchPage(MenuItem item) {
-        /**
-         * 1.一直频繁来回切换的。
-         * 2.那么对象不能创建太多。单例。
-         * 3.每个页面都是一个新的对象。
-         */
-        BaseFragment fragment = HomePagerSimpleFactory.getFragment(item.getItemId());
-        return fragment;
-    }
-
-    private void initView() {
-        mNavigationView = findViewById(R.id.bnv_main_navigationbar);
-        mNavigationView.setItemIconTintList(null);
-        mFragmentManager = getSupportFragmentManager();
-    }
-
-    @Override
-    protected HomePresenter createPresenter() {
-        return null;
-    }
-
-    /**
-     * 替换R.id.fl_navgtion_bar_contianr的内容。
-     *
-     * @param fragment 要替换的内容
-     */
-    private void switchFragment(BaseFragment fragment) {
-        FragmentTransaction ftransaction = mFragmentManager.beginTransaction();
-        //替换之前的碎片。
-        ftransaction.replace(R.id.fl_home_content, fragment);
-        ftransaction.commit();
-    }
-}

+ 172 - 0
app/src/main/java/com/sunzee/ui/activity/HomeActivity.java

@@ -0,0 +1,172 @@
+package com.sunzee.ui.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.design.widget.NavigationView;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.TextView;
+
+import com.sunzee.R;
+import com.sunzee.base.BaseFragment;
+import com.sunzee.base.MvpActivity;
+import com.sunzee.model.domain.Heartbeat;
+import com.sunzee.model.domain.Name;
+import com.sunzee.model.message.ApiMessageEvent;
+import com.sunzee.mvp.home.HomePresenter;
+import com.sunzee.mvp.home.HomeView;
+import com.sunzee.ui.dialog.ManagementSystemDialog;
+import com.sunzee.utils.FileUtil;
+import com.sunzee.utils.GeTuiUtil;
+import com.sunzee.utils.HomePagerSimpleFactory;
+import com.sunzee.utils.SharedPreferencesUtils;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+
+public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView {
+
+    private NavigationView mNavigationView;
+    private FragmentManager mFragmentManager;
+    private GeTuiUtil mGeTuiUtil;
+    private TextView mTvConnectionSystem;
+    private String systemId;
+    private TextView mTvSystemId;
+    private ManagementSystemDialog mManagementSystemDialog;
+    private static final String TAG = "HomeActivity";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_home);
+        initView();
+        initEvent();
+
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        EventBus.getDefault().register(this);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        EventBus.getDefault().unregister(this);
+    }
+
+    private void initEvent() {
+        mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
+            @Override
+            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
+                //根据id切换页面
+                BaseFragment baseFragment = switchPage(item);
+                if (baseFragment != null) {
+                    switchFragment(baseFragment);
+                }
+                return true;
+            }
+        });
+        mTvConnectionSystem.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (mManagementSystemDialog == null) {
+                    mManagementSystemDialog = new ManagementSystemDialog(HomeActivity.this);
+                }
+                mManagementSystemDialog.setCanceledOnTouchOutside(true);
+                mManagementSystemDialog.setListener(new ManagementSystemDialog.DialogClickListener() {
+                    @Override
+                    public void onClickListener(int type, String text) {
+                        switch (type) {
+                            case R.id.btn_apply:
+                                systemId = text;
+                                mvpPresenter.connectionSystem(text);
+                                SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 1);
+                                mTvSystemId.setText("连接申请中");
+                                mTvConnectionSystem.setVisibility(View.GONE);
+                                break;
+                        }
+                    }
+                });
+                mManagementSystemDialog.show();
+            }
+        });
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void event(ApiMessageEvent messageEvent) {
+        switch (messageEvent.getName()) {
+            case "statusType":
+                //刷新界面
+                cheeckConnectState(true);
+                break;
+        }
+    }
+
+    /**
+     * 检查连接状态并更新界面
+     *
+     * @param isFrist 是否第一次初始化
+     */
+    private void cheeckConnectState(boolean isFrist) {
+        int connectState = (int) SharedPreferencesUtils.getParam(Name.CONNECT_STATE, -1);
+        if (connectState == 2) {
+            String param = (String) SharedPreferencesUtils.getParam(Name.SYSTEM_ID, "");
+            if (param != null && !TextUtils.isEmpty(param)) {
+                mTvSystemId.setVisibility(View.VISIBLE);
+                mTvSystemId.setText("已连接:" + param);
+                mTvConnectionSystem.setVisibility(View.GONE);
+            }
+            Log.e(TAG, "cheeckConnectState:连接成功: " + connectState);
+            SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 2);
+            Heartbeat.deviceId = FileUtil.getDeviceId();
+        } else if (connectState == 1) {
+            mTvSystemId.setText("连接申请中!!!");
+            mTvConnectionSystem.setVisibility(View.GONE);
+            Log.e(TAG, "cheeckConnectState: 正在连接: " + connectState);
+        } else if (connectState == 0) {
+            mTvConnectionSystem.setVisibility(View.VISIBLE);
+            mTvSystemId.setVisibility(View.GONE);
+        }
+    }
+
+    private BaseFragment switchPage(MenuItem item) {
+        //1.一直频繁来回切换的。2.那么对象不能创建太多。单例。3.每个页面都是一个新的对象。
+        BaseFragment fragment = HomePagerSimpleFactory.getFragment(item.getItemId());
+        return fragment;
+    }
+
+    private void initView() {
+        mNavigationView = findViewById(R.id.bnv_main_navigationbar);
+        mNavigationView.setItemIconTintList(null);
+        mFragmentManager = getSupportFragmentManager();
+        mGeTuiUtil = new GeTuiUtil(this);
+        mGeTuiUtil.geTui();
+
+        mTvConnectionSystem = findViewById(R.id.connection_system);
+        mTvSystemId = findViewById(R.id.tv_system_id);
+        String managerId = (String) SharedPreferencesUtils.getParam(Name.SYSTEM_ID, "");
+        if (managerId != null && !TextUtils.isEmpty(managerId)) {
+            cheeckConnectState(false);
+        }
+    }
+
+    @Override
+    protected HomePresenter createPresenter() {
+        return new HomePresenter(this);
+    }
+
+    private void switchFragment(BaseFragment fragment) {
+        FragmentTransaction ftransaction = mFragmentManager.beginTransaction();
+        ftransaction.replace(R.id.fl_home_content, fragment);
+        ftransaction.commit();
+    }
+}

+ 1 - 1
app/src/main/java/com/sunzee/ui/MainActivity.java

@@ -1,4 +1,4 @@
-package com.sunzee.ui;
+package com.sunzee.ui.activity;
 
 import android.os.Bundle;
 import android.view.View;

+ 65 - 0
app/src/main/java/com/sunzee/ui/dialog/ManagementSystemDialog.java

@@ -0,0 +1,65 @@
+package com.sunzee.ui.dialog;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import com.sunzee.R;
+
+public class ManagementSystemDialog extends Dialog {
+    //在构造方法里提前加载了样式
+    private Context context;//上下文
+    private DialogClickListener listener;
+    private Button mBtnApply;
+    private EditText mEtServerId;
+
+
+    public ManagementSystemDialog(Context context) {
+        super(context, R.style.DialogBgD);//加载样式
+        this.context = context;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        //提前设置Dialog的一些样式
+        setContentView(R.layout.dialog_connect_server);
+        initView();
+        initEvent();
+    }
+
+    private void initEvent() {
+        mBtnApply.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                //如果输入为空。
+                String trim = mEtServerId.getText().toString().trim();
+                if (TextUtils.isEmpty(trim)) {
+                    Toast.makeText(context, "输入框不能为空!", Toast.LENGTH_SHORT).show();
+                } else {
+                    listener.onClickListener(R.id.btn_apply, trim);
+                    dismiss();
+                }
+
+            }
+        });
+    }
+
+    private void initView() {
+        mBtnApply = findViewById(R.id.btn_apply);
+        mEtServerId = findViewById(R.id.et_server_id);
+    }
+
+    public void setListener(DialogClickListener listener) {
+        this.listener = listener;
+    }
+
+    public interface DialogClickListener {
+        void onClickListener(int type, String text);
+    }
+}

+ 1 - 1
app/src/main/java/com/sunzee/ui/AdvanceParameterFragment.java

@@ -1,4 +1,4 @@
-package com.sunzee.ui;
+package com.sunzee.ui.fragment;
 
 import android.os.Bundle;
 import android.support.annotation.NonNull;

+ 1 - 1
app/src/main/java/com/sunzee/ui/AlarmRecordFragment.java

@@ -1,4 +1,4 @@
-package com.sunzee.ui;
+package com.sunzee.ui.fragment;
 
 import android.os.Bundle;
 import android.support.annotation.NonNull;

+ 1 - 1
app/src/main/java/com/sunzee/ui/DebugFragment.java

@@ -1,4 +1,4 @@
-package com.sunzee.ui;
+package com.sunzee.ui.fragment;
 
 import android.os.Bundle;
 import android.support.annotation.NonNull;

+ 1 - 1
app/src/main/java/com/sunzee/ui/GeneralParameterFragment.java

@@ -1,4 +1,4 @@
-package com.sunzee.ui;
+package com.sunzee.ui.fragment;
 
 import android.os.Bundle;
 import android.support.annotation.NonNull;

+ 1 - 1
app/src/main/java/com/sunzee/ui/HomepageFragment.java

@@ -1,4 +1,4 @@
-package com.sunzee.ui;
+package com.sunzee.ui.fragment;
 
 import android.os.Bundle;
 import android.support.annotation.NonNull;

+ 1 - 1
app/src/main/java/com/sunzee/ui/LanguageSetFragment.java

@@ -1,4 +1,4 @@
-package com.sunzee.ui;
+package com.sunzee.ui.fragment;
 
 import android.os.Bundle;
 import android.support.annotation.NonNull;

+ 1 - 1
app/src/main/java/com/sunzee/ui/OtherFragment.java

@@ -1,4 +1,4 @@
-package com.sunzee.ui;
+package com.sunzee.ui.fragment;
 
 import android.os.Bundle;
 import android.support.annotation.NonNull;

+ 1 - 1
app/src/main/java/com/sunzee/ui/PasswordResetFragment.java

@@ -1,4 +1,4 @@
-package com.sunzee.ui;
+package com.sunzee.ui.fragment;
 
 import android.os.Bundle;
 import android.support.annotation.NonNull;

+ 1 - 1
app/src/main/java/com/sunzee/ui/ShowMaterialFragment.java

@@ -1,4 +1,4 @@
-package com.sunzee.ui;
+package com.sunzee.ui.fragment;
 
 import android.os.Bundle;
 import android.support.annotation.NonNull;

+ 1 - 1
app/src/main/java/com/sunzee/ui/StatisticsFragment.java

@@ -1,4 +1,4 @@
-package com.sunzee.ui;
+package com.sunzee.ui.fragment;
 
 import android.os.Bundle;
 import android.support.annotation.NonNull;

+ 329 - 0
app/src/main/java/com/sunzee/utils/FileUtil.java

@@ -0,0 +1,329 @@
+package com.sunzee.utils;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.text.TextUtils;
+import android.util.Log;
+
+
+import com.sunzee.model.domain.Name;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.RandomAccessFile;
+import java.net.FileNameMap;
+import java.net.URLConnection;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Random;
+
+/**
+ * @Description 文件工具类
+ */
+public class FileUtil {
+    public static String FILEPATH = "/storage/emulated/0/logdata/";
+    public static final long SEVENT_DAYS = 604800000;
+
+    private static String TAG = "FileUtil";
+
+    /**
+     * 获取指定目录内所有文件路径
+     *
+     * @param dirPath 需要查询的文件目录
+     * @param _type   查询类型,比如mp3
+     */
+    public static File[] getAllFiles(String dirPath, String _type) {
+        File f = new File(dirPath);
+        if (!f.exists()) {//判断路径是否存在
+            if (f.mkdir()) {
+                getAllFiles(dirPath, _type);
+            }
+            return null;
+        }
+        File[] files = f.listFiles();
+        if (files == null) {//判断权限
+            return null;
+        }
+        for (File _file : files) {//遍历目录
+            String _name = _file.getName();
+            String filePath = _file.getAbsolutePath();//获取文件路径
+            String fileName = _file.getName().substring(0, _name.length() - 4);//获取文件名
+            Log.d("LOGCAT", "fileName:" + fileName);
+            Log.d("LOGCAT", "FILEPATH:" + filePath);
+
+        }
+        return files;
+    }
+
+    /**
+     * 判断文件是否为图片
+     *
+     * @param filePath 路径
+     * @return
+     */
+    public static boolean isImageFile(String filePath) {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inJustDecodeBounds = true;
+        BitmapFactory.decodeFile(filePath, options);
+        if (options.outWidth == -1) {
+            return false;
+        }
+        return true;
+    }
+
+
+    private final static String PREFIX_VIDEO = "video/";
+
+    /**
+     * Get the Mime Type from a File
+     *
+     * @param fileName 文件名
+     * @return 返回MIME类型
+     * thx https://www.oschina.net/question/571282_223549
+     * add by fengwenhua 2017年5月3日09:55:01
+     */
+    private static String getMimeType(String fileName) {
+        FileNameMap fileNameMap = URLConnection.getFileNameMap();
+        String type = fileNameMap.getContentTypeFor(fileName);
+        return type;
+    }
+
+    /**
+     * 根据文件后缀名判断 文件是否是视频文件
+     *
+     * @param fileName 文件名
+     * @return 是否是视频文件
+     */
+    public static boolean isVedioFile(String fileName) {
+        String mimeType = getMimeType(fileName);
+        if (!TextUtils.isEmpty(fileName) && mimeType.contains(PREFIX_VIDEO)) {
+            return true;
+        }
+        return false;
+    }
+
+
+    public static String getDeviceId() {
+        String deviceId = "";
+        File file = new File("/storage/emulated/0/mht/deviceid.txt");
+        String fileContent = getFileContent(file);
+        if (file != null && !TextUtils.isEmpty(fileContent)) {
+            //如果存在 直接获取
+            Log.e(TAG, "getDeviceId: " + fileContent);
+            deviceId = fileContent.trim();
+        } else {
+            //不存在 先生成再获取
+            writeData();
+            deviceId = getFileContent(file).trim();
+        }
+        int param = (int) SharedPreferencesUtils.getParam(Name.CONNECT_STATE, 10);
+        if (param == 2) {
+            return deviceId;
+        } else {
+            return "";
+        }
+    }
+
+    private static void writeData() {
+        String filePath = "/storage/emulated/0/mht/";
+        String fileName = "deviceid.txt";
+        String deviceId = "";
+        long l = System.currentTimeMillis();
+        Random random = new Random();
+        String randomText = "";
+        for (int i = 0; i < 4; i++) {
+            int j = random.nextInt(1000);
+            randomText = randomText + j;
+        }
+        deviceId = String.valueOf(l) + randomText;
+        writeTxtToFile(deviceId, filePath, fileName);
+    }
+
+    // 将字符串写入到文本文件中
+    private static void writeTxtToFile(String strcontent, String filePath, String fileName) {
+        //生成文件夹之后,再生成文件,不然会出错
+        makeFilePath(filePath, fileName);
+
+        String strFilePath = filePath + fileName;
+        // 每次写入时,都换行写
+        String strContent = strcontent + "\r\n";
+        try {
+            File file = new File(strFilePath);
+            if (!file.exists()) {
+                Log.d("TestFile", "Create the file:" + strFilePath);
+                file.getParentFile().mkdirs();
+                file.createNewFile();
+            }
+            RandomAccessFile raf = new RandomAccessFile(file, "rwd");
+            raf.seek(file.length());
+            raf.write(strContent.getBytes());
+            raf.close();
+        } catch (Exception e) {
+            Log.e("TestFile", "Error on write File:" + e);
+        }
+    }
+
+//生成文件
+
+    private static File makeFilePath(String filePath, String fileName) {
+        File file = null;
+        makeRootDirectory(filePath);
+        try {
+            file = new File(filePath + fileName);
+            if (!file.exists()) {
+                file.createNewFile();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return file;
+    }
+
+//生成文件夹
+
+    private static void makeRootDirectory(String filePath) {
+        File file = null;
+        try {
+            file = new File(filePath);
+            if (!file.exists()) {
+                file.mkdir();
+            }
+        } catch (Exception e) {
+            Log.i("error:", e + "");
+        }
+    }
+
+
+    //读取指定目录下的所有TXT文件的文件内容
+    private static String getFileContent(File file) {
+        String content = "";
+        if (!file.isDirectory()) {  //检查此路径名的文件是否是一个目录(文件夹)
+            if (file.getName().endsWith("txt")) {//文件格式为""文件
+                BufferedReader buffreader = null;
+                try {
+                    buffreader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
+                    String line = "";
+                    //分行读取
+                    while ((line = buffreader.readLine()) != null) {
+                        content += line + "\n";
+                    }
+                } catch (java.io.FileNotFoundException e) {
+                    Log.d("TestFile", "The File doesn't not exist.");
+                } catch (IOException e) {
+                    Log.d("TestFile", e.getMessage());
+                } finally {
+                    try {
+                        if (buffreader != null) {
+                            buffreader.close();//关闭输入流
+                        }
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+        return content;
+    }
+
+    //flie:要删除的文件夹的所在位置
+    public static void deleteFile(File file) {
+        if (file.isDirectory()) {
+            File[] files = file.listFiles();
+            for (int i = 0; i < files.length; i++) {
+                File f = files[i];
+                deleteFile(f);
+            }
+//            file.delete();//如要保留文件夹,只删除文件,请注释这行
+        } else if (file.exists()) {
+            file.delete();
+        }
+    }
+
+    /**
+     * 获取文件后缀名
+     *
+     * @param fileName
+     * @return
+     */
+    public static String getFileType(String fileName) {
+        return fileName.substring(fileName.lastIndexOf(".") + 1);
+    }
+
+    public static Bitmap getLoacalBitmap(String url) {
+        FileInputStream fis = null;
+        try {
+            fis = new FileInputStream(url);
+            return BitmapFactory.decodeStream(fis);  ///把流转化为Bitmap图片
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+            return null;
+        } finally {
+            if (fis != null) {
+                try {
+                    fis.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 删除超过7天的log文件
+     */
+    public static void pastDueLog() {
+        File logFolder = new File(FILEPATH);
+        if (logFolder.exists()) {
+            File[] logFiles = logFolder.listFiles();
+            for (File file : logFiles) {
+                SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
+                String nowDate = format.format(new Date(System.currentTimeMillis()));
+                //Log.d(TAG, "duibi: " + nowDate);
+                try {
+                    String replace = file.getName().replace("-" + FileUtil.getDeviceId() + ".txt", "");
+                    Log.d(TAG, "pastDueLog: " + replace);
+                    Date dateFile = format.parse(replace);
+                    Date dataNow = format.parse(nowDate);
+                    long fileTime = dateFile.getTime();
+                    long nowTime = dataNow.getTime();
+                    if (nowTime - fileTime > SEVENT_DAYS) {
+                        //如果超过7天,我们就进行删除指定的文件,否则就什么都不做。
+                        //Log.d(TAG, "duibi: "+fileTime);
+                        //删除
+                        file.delete();
+                    }
+                    //Log.d(TAG, "duibi: "+dataNow);
+                    //Log.d(TAG, "duibi: " + file.getName());
+                } catch (ParseException e) {
+                    //604800000 7天
+                    e.printStackTrace();
+                }
+
+            }
+        }
+
+    }
+
+    /**
+     * 获取当前时间
+     *
+     * @return
+     */
+    public static String getFileName() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
+        String date = format.format(new Date(System.currentTimeMillis())) + "-" + FileUtil.getDeviceId() + ".txt";
+        return date;
+    }
+
+    /**
+     * 創建log文件
+     */
+    public static File createLogFile() {
+        return makeFilePath(FILEPATH, FileUtil.getFileName());
+    }
+}

+ 90 - 0
app/src/main/java/com/sunzee/utils/GeTuiUtil.java

@@ -0,0 +1,90 @@
+package com.sunzee.utils;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.support.v4.app.ActivityCompat;
+
+import com.igexin.sdk.PushManager;
+import com.sunzee.base.BaseApplication;
+import com.sunzee.service.MyIntentService;
+import com.sunzee.service.MyPushService;
+
+import java.io.File;
+
+public class GeTuiUtil {
+
+    private Activity activity;
+    public static final int REQUEST_PERMISSION = 0;
+    private String appkey = "";
+    private String appsecret = "";
+    private String appid = "";
+
+    public GeTuiUtil(Activity activity) {
+        this.activity = activity;
+
+    }
+
+    /**
+     * 个推
+     */
+    public void geTui() {
+        parseManifests();
+        PackageManager pkgManager = BaseApplication.getContext().getPackageManager();
+        // 读写 sd card 权限非常重要, android6.0默认禁止的, 建议初始化之前就弹窗让用户赋予该权限
+        boolean sdCardWritePermission =
+                pkgManager.checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, BaseApplication.getContext().getPackageName()) == PackageManager.PERMISSION_GRANTED;
+
+        // read phone state用于获取 imei 设备信息
+        boolean phoneSatePermission =
+                pkgManager.checkPermission(Manifest.permission.READ_PHONE_STATE, BaseApplication.getContext().getPackageName()) == PackageManager.PERMISSION_GRANTED;
+
+        if (Build.VERSION.SDK_INT >= 23 && !sdCardWritePermission || !phoneSatePermission) {
+            requestPermission();
+        } else {
+            PushManager.getInstance().initialize(BaseApplication.getContext().getApplicationContext(), MyPushService.class);
+        }
+
+        // 注册 intentService 后 PushDemoReceiver 无效, sdk 会使用 DemoIntentService 传递数据,
+        // AndroidManifest 对应保留一个即可(如果注册 DemoIntentService, 可以去掉 PushDemoReceiver, 如果注册了
+        // IntentService, 必须在 AndroidManifest 中声明)
+        PushManager.getInstance().registerPushIntentService(BaseApplication.getContext().getApplicationContext(), MyIntentService.class);
+
+        // cpu 架构
+//        com.hboxs.base_library.util.LogUtil.d(TAG, "cpu arch = " + (Build.VERSION.SDK_INT < 21 ? Build.CPU_ABI : Build.SUPPORTED_ABIS[0]));
+
+        // 检查 so 是否存在
+        File file = new File(BaseApplication.getContext().getApplicationInfo().nativeLibraryDir + File.separator + "libgetuiext2.so");
+//        LogUtil.e(TAG, "libgetuiext2.so exist = " + file.exists());
+    }
+
+    /**
+     * 个推
+     * 获取key等数据
+     */
+    private void parseManifests() {
+        String packageName = BaseApplication.getContext().getPackageName();
+        try {
+            ApplicationInfo appInfo = BaseApplication.getContext().getPackageManager().getApplicationInfo(packageName, PackageManager.GET_META_DATA);
+            if (appInfo.metaData != null) {
+                appid = appInfo.metaData.getString("PUSH_APPID");
+                appsecret = appInfo.metaData.getString("PUSH_APPSECRET");
+                appkey = appInfo.metaData.getString("PUSH_APPKEY");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 个推
+     */
+    private void requestPermission() {
+        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE},
+                REQUEST_PERMISSION);
+    }
+
+
+}

+ 10 - 16
app/src/main/java/com/sunzee/utils/HomePagerSimpleFactory.java

@@ -1,23 +1,17 @@
 package com.sunzee.utils;
 
-import android.widget.Toast;
-
 import com.sunzee.R;
 import com.sunzee.base.BaseFragment;
-import com.sunzee.ui.AdvanceParameterFragment;
-import com.sunzee.ui.AlarmRecordFragment;
-import com.sunzee.ui.DebugFragment;
-import com.sunzee.ui.GeneralParameterFragment;
-import com.sunzee.ui.HomeActivity;
-import com.sunzee.ui.HomepageFragment;
-import com.sunzee.ui.LanguageSetFragment;
-import com.sunzee.ui.MainActivity;
-import com.sunzee.ui.OtherFragment;
-import com.sunzee.ui.PasswordResetFragment;
-import com.sunzee.ui.ShowMaterialFragment;
-import com.sunzee.ui.StatisticsFragment;
-
-import java.util.Locale;
+import com.sunzee.ui.fragment.AdvanceParameterFragment;
+import com.sunzee.ui.fragment.AlarmRecordFragment;
+import com.sunzee.ui.fragment.DebugFragment;
+import com.sunzee.ui.fragment.GeneralParameterFragment;
+import com.sunzee.ui.fragment.HomepageFragment;
+import com.sunzee.ui.fragment.LanguageSetFragment;
+import com.sunzee.ui.fragment.OtherFragment;
+import com.sunzee.ui.fragment.PasswordResetFragment;
+import com.sunzee.ui.fragment.ShowMaterialFragment;
+import com.sunzee.ui.fragment.StatisticsFragment;
 
 /**
  * 主界面的page增加,使用簡單工廠模式,只需要生產方提供數據,使用者無需修改代碼。

+ 74 - 0
app/src/main/java/com/sunzee/utils/SharedPreferencesUtils.java

@@ -0,0 +1,74 @@
+package com.sunzee.utils;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+import com.sunzee.base.BaseApplication;
+
+
+/**
+ * @Description SharedPrefence工具类
+ */
+public class SharedPreferencesUtils {
+    /**
+     * 保存在手机里面的文件名
+     */
+    private static final String FILE_NAME = "share_date";
+
+
+    /**
+     * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
+     *
+     * @param key
+     * @param object
+     */
+    public static void setParam(String key, Object object) {
+
+        String type = object.getClass().getSimpleName();
+        SharedPreferences sp = BaseApplication.getContext().getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
+        SharedPreferences.Editor editor = sp.edit();
+
+        if ("String".equals(type)) {
+            editor.putString(key, (String) object);
+        } else if ("Integer".equals(type)) {
+            editor.putInt(key, (Integer) object);
+        } else if ("Boolean".equals(type)) {
+            editor.putBoolean(key, (Boolean) object);
+        } else if ("Float".equals(type)) {
+            editor.putFloat(key, (Float) object);
+        } else if ("Long".equals(type)) {
+            editor.putLong(key, (Long) object);
+        }
+
+        editor.commit();
+    }
+
+
+    /**
+     * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
+     *
+     * @param key
+     * @param defaultObject
+     * @return
+     */
+    public static Object getParam(String key, Object defaultObject) {
+        String type = defaultObject.getClass().getSimpleName();
+        SharedPreferences sp = BaseApplication.getContext().getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
+
+        if ("String".equals(type)) {
+            return sp.getString(key, (String) defaultObject);
+        } else if ("Integer".equals(type)) {
+            return sp.getInt(key, (Integer) defaultObject);
+        } else if ("Boolean".equals(type)) {
+            return sp.getBoolean(key, (Boolean) defaultObject);
+        } else if ("Float".equals(type)) {
+            return sp.getFloat(key, (Float) defaultObject);
+        } else if ("Long".equals(type)) {
+            return sp.getLong(key, (Long) defaultObject);
+        }
+
+        return null;
+    }
+
+
+}

二進制
app/src/main/res/drawable-hdpi/back_icon.png


二進制
app/src/main/res/drawable-hdpi/data_icon.png


二進制
app/src/main/res/drawable-hdpi/debug_icon.png


二進制
app/src/main/res/drawable-hdpi/home_icon.png


二進制
app/src/main/res/drawable-hdpi/ic_launcher.png


二進制
app/src/main/res/drawable-hdpi/ic_launcher_round.png


二進制
app/src/main/res/drawable-hdpi/language_icon.png


二進制
app/src/main/res/drawable-hdpi/login_leftlogo.png


二進制
app/src/main/res/drawable-hdpi/login_logo.png


二進制
app/src/main/res/drawable-hdpi/material_icon.png


二進制
app/src/main/res/drawable-hdpi/other_icon.png


二進制
app/src/main/res/drawable-hdpi/parameter1_icon.png


二進制
app/src/main/res/drawable-hdpi/parameter2_icon.png


二進制
app/src/main/res/drawable-hdpi/password_icon.png


二進制
app/src/main/res/drawable-hdpi/random.png


二進制
app/src/main/res/drawable-hdpi/shutdown.png


二進制
app/src/main/res/drawable-hdpi/time.png


二進制
app/src/main/res/drawable-hdpi/time2.png


二進制
app/src/main/res/drawable-hdpi/timing.png


二進制
app/src/main/res/drawable-hdpi/timing2.png


二進制
app/src/main/res/drawable-hdpi/warring_icon.png


二進制
app/src/main/res/drawable-mdpi/back_icon.png


二進制
app/src/main/res/drawable-mdpi/data_icon.png


二進制
app/src/main/res/drawable-mdpi/debug_icon.png


二進制
app/src/main/res/drawable-mdpi/home_icon.png


二進制
app/src/main/res/drawable-mdpi/ic_launcher.png


二進制
app/src/main/res/drawable-mdpi/ic_launcher_round.png


二進制
app/src/main/res/drawable-mdpi/language_icon.png


二進制
app/src/main/res/drawable-mdpi/login_leftlogo.png


二進制
app/src/main/res/drawable-mdpi/login_logo.png


二進制
app/src/main/res/drawable-mdpi/material_icon.png


二進制
app/src/main/res/drawable-mdpi/other_icon.png


二進制
app/src/main/res/drawable-mdpi/parameter1_icon.png


二進制
app/src/main/res/drawable-mdpi/parameter2_icon.png


二進制
app/src/main/res/drawable-mdpi/password_icon.png


二進制
app/src/main/res/drawable-mdpi/random.png


二進制
app/src/main/res/drawable-mdpi/shutdown.png


二進制
app/src/main/res/drawable-mdpi/time.png


二進制
app/src/main/res/drawable-mdpi/time2.png


二進制
app/src/main/res/drawable-mdpi/timing.png


二進制
app/src/main/res/drawable-mdpi/timing2.png


二進制
app/src/main/res/drawable-mdpi/warring_icon.png


File diff suppressed because it is too large
+ 34 - 0
app/src/main/res/drawable-v24/ic_launcher_foreground.xml


二進制
app/src/main/res/drawable-xhdpi/back_icon.png


二進制
app/src/main/res/drawable-xhdpi/data_icon.png


二進制
app/src/main/res/drawable-xhdpi/debug_icon.png


二進制
app/src/main/res/drawable-xhdpi/home_icon.png


二進制
app/src/main/res/drawable-xhdpi/ic_launcher.png


二進制
app/src/main/res/drawable-xhdpi/ic_launcher_round.png


二進制
app/src/main/res/drawable-xhdpi/language_icon.png


二進制
app/src/main/res/drawable-xhdpi/login_leftlogo.png


二進制
app/src/main/res/drawable-xhdpi/login_logo.png


二進制
app/src/main/res/drawable-xhdpi/material_icon.png


二進制
app/src/main/res/drawable-xhdpi/other_icon.png


二進制
app/src/main/res/drawable-xhdpi/parameter1_icon.png


二進制
app/src/main/res/drawable-xhdpi/parameter2_icon.png


二進制
app/src/main/res/drawable-xhdpi/password_icon.png


二進制
app/src/main/res/drawable-xhdpi/random.png


二進制
app/src/main/res/drawable-xhdpi/shutdown.png


+ 0 - 0
app/src/main/res/drawable-xhdpi/time.png


Some files were not shown because too many files changed in this diff