Browse Source

1.增加全蹲位清洗
2.增加厕所状态页面:统计今日清洗次数,统计今日进出人数,展示厕所使用状态,以及示意图。

Administrator 4 years ago
parent
commit
99599ad7e7
37 changed files with 1999 additions and 170 deletions
  1. 8 6
      app/src/main/AndroidManifest.xml
  2. 165 0
      app/src/main/java/com/sunzee/db/CleaningBeanDao.java
  3. 3 0
      app/src/main/java/com/sunzee/db/DaoMaster.java
  4. 10 0
      app/src/main/java/com/sunzee/db/DaoSession.java
  5. 54 2
      app/src/main/java/com/sunzee/model/HoleInformation.java
  6. 85 0
      app/src/main/java/com/sunzee/model/domain/CleaningBean.java
  7. 5 0
      app/src/main/java/com/sunzee/model/domain/Name.java
  8. 333 0
      app/src/main/java/com/sunzee/mvp/homeactivity/HomeactivityPresenter.java
  9. 25 0
      app/src/main/java/com/sunzee/mvp/homeactivity/HomeactivityView.java
  10. 2 1
      app/src/main/java/com/sunzee/receiver/BootBroadcastReceiver.java
  11. 9 1
      app/src/main/java/com/sunzee/retrofit/ApiStores.java
  12. 21 2
      app/src/main/java/com/sunzee/service/MyIntentService.java
  13. 282 132
      app/src/main/java/com/sunzee/service/MyService.java
  14. 24 3
      app/src/main/java/com/sunzee/ui/activity/HomeActivity.java
  15. 391 0
      app/src/main/java/com/sunzee/ui/activity/HomePageActivity.java
  16. 49 1
      app/src/main/java/com/sunzee/ui/activity/LoginActivity.java
  17. 24 13
      app/src/main/java/com/sunzee/ui/dialog/ShutdownDialog.java
  18. 2 1
      app/src/main/java/com/sunzee/ui/fragment/HomepageFragment.java
  19. 22 0
      app/src/main/res/drawable-xhdpi/shape_radio_thumb.xml
  20. BIN
      app/src/main/res/drawable-xxxhdpi/icon1.png
  21. BIN
      app/src/main/res/drawable-xxxhdpi/icon2.png
  22. BIN
      app/src/main/res/drawable-xxxhdpi/icon3.png
  23. BIN
      app/src/main/res/drawable-xxxhdpi/icon4.png
  24. BIN
      app/src/main/res/drawable-xxxhdpi/icon5.png
  25. BIN
      app/src/main/res/drawable-xxxhdpi/icon6.png
  26. BIN
      app/src/main/res/drawable-xxxhdpi/icon7.png
  27. BIN
      app/src/main/res/drawable-xxxhdpi/icon8.png
  28. BIN
      app/src/main/res/drawable-xxxhdpi/icon9.png
  29. 1 1
      app/src/main/res/drawable/shape_clearorgle_rectangle.xml
  30. 5 5
      app/src/main/res/drawable/shape_radio_thumb.xml
  31. 22 0
      app/src/main/res/drawable/shape_radio_thumbblue.xml
  32. 1 0
      app/src/main/res/layout/activity_home.xml
  33. 440 0
      app/src/main/res/layout/activity_homeactivity.xml
  34. 11 1
      app/src/main/res/layout/dialog_shutdown.xml
  35. 1 0
      app/src/main/res/values-en/strings.xml
  36. 2 0
      app/src/main/res/values/colors.xml
  37. 2 1
      app/src/main/res/values/strings.xml

+ 8 - 6
app/src/main/AndroidManifest.xml

@@ -38,7 +38,14 @@
 
         <activity
             android:name=".ui.activity.HomeActivity"
-            android:windowSoftInputMode="stateHidden|adjustPan">
+            android:windowSoftInputMode="stateHidden|adjustPan"/>
+
+        <activity android:name=".ui.activity.LoginActivity" />
+        <activity android:name=".ui.activity.AdvertisingActivity">
+
+        </activity>
+
+        <activity android:name=".ui.activity.HomePageActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
@@ -46,11 +53,6 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".ui.activity.LoginActivity" />
-        <activity android:name=".ui.activity.AdvertisingActivity">
-
-        </activity>
-
         <service
             android:name=".service.MyPushService"
             android:exported="true"

+ 165 - 0
app/src/main/java/com/sunzee/db/CleaningBeanDao.java

@@ -0,0 +1,165 @@
+package com.sunzee.db;
+
+import android.database.Cursor;
+import android.database.sqlite.SQLiteStatement;
+
+import com.sunzee.model.domain.CleaningBean;
+import com.sunzee.model.domain.WarringBean;
+
+import org.greenrobot.greendao.AbstractDao;
+import org.greenrobot.greendao.Property;
+import org.greenrobot.greendao.database.Database;
+import org.greenrobot.greendao.database.DatabaseStatement;
+import org.greenrobot.greendao.internal.DaoConfig;
+
+// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
+
+/**
+ * DAO for table "CLEANING_BEAN".
+*/
+public class CleaningBeanDao extends AbstractDao<CleaningBean, Long> {
+
+    public static final String TABLENAME = "CLEANING_BEAN";
+
+    /**
+     * Properties of entity WarringBean.<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 Time = new Property(1, long.class, "time", false, "TIME");
+        public final static Property CleanCount = new Property(2, String.class, "cleanCount", false, "CLEANCOUNT");
+        public final static Property InCount = new Property(3, String.class, "inCount", false, "INCOUNT");
+        public final static Property OutCount = new Property(4, String.class, "outCount", false, "OUTCOUNT");
+    }
+
+
+    public CleaningBeanDao(DaoConfig config) {
+        super(config);
+    }
+
+    public CleaningBeanDao(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 + "\"CLEANING_BEAN\" (" + //
+                "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id
+                "\"TIME\" INTEGER NOT NULL ," + // 1: time
+                "\"CLEANCOUNT\" TEXT," +
+                "\"INCOUNT\" TEXT," +
+                "\"OUTCOUNT\" TEXT);");
+    }
+
+    /** Drops the underlying database table. */
+    public static void dropTable(Database db, boolean ifExists) {
+        String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"CLEANING_BEAN\"";
+        db.execSQL(sql);
+    }
+
+    @Override
+    protected final void bindValues(DatabaseStatement stmt, CleaningBean entity) {
+        stmt.clearBindings();
+ 
+        Long id = entity.getId();
+        if (id != null) {
+            stmt.bindLong(1, id);
+        }
+        stmt.bindLong(2, entity.getTime());
+ 
+        String cleanCount = entity.getCleanCount();
+        if (cleanCount != null) {
+            stmt.bindString(3, cleanCount);
+        }
+ 
+        String inCount = entity.getInCount();
+        if (inCount != null) {
+            stmt.bindString(4, inCount);
+        }
+
+        String outCount = entity.getOutCount();
+        if (outCount != null) {
+            stmt.bindString(5, outCount);
+        }
+    }
+
+    @Override
+    protected final void bindValues(SQLiteStatement stmt, CleaningBean entity) {
+        stmt.clearBindings();
+ 
+        Long id = entity.getId();
+        if (id != null) {
+            stmt.bindLong(1, id);
+        }
+        stmt.bindLong(2, entity.getTime());
+
+        String cleanCount = entity.getCleanCount();
+        if (cleanCount != null) {
+            stmt.bindString(3, cleanCount);
+        }
+
+        String inCount = entity.getInCount();
+        if (inCount != null) {
+            stmt.bindString(4, inCount);
+        }
+
+        String outCount = entity.getOutCount();
+        if (outCount != null) {
+            stmt.bindString(5, outCount);
+        }
+    }
+
+    @Override
+    public Long readKey(Cursor cursor, int offset) {
+        return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
+    }    
+
+    @Override
+    public CleaningBean readEntity(Cursor cursor, int offset) {
+        CleaningBean entity = new CleaningBean( //
+            cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id
+            cursor.getLong(offset + 1), // time
+            cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // thingError
+            cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // remark
+            cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4) // remark
+        );
+        return entity;
+    }
+     
+    @Override
+    public void readEntity(Cursor cursor, CleaningBean entity, int offset) {
+        entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
+        entity.setTime(cursor.getLong(offset + 1));
+        entity.setCleanCount(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2));
+        entity.setInCount(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));
+        entity.setOutCount(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4));
+     }
+    
+    @Override
+    protected final Long updateKeyAfterInsert(CleaningBean entity, long rowId) {
+        entity.setId(rowId);
+        return rowId;
+    }
+    
+    @Override
+    public Long getKey(CleaningBean entity) {
+        if(entity != null) {
+            return entity.getId();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public boolean hasKey(CleaningBean entity) {
+        return entity.getId() != null;
+    }
+
+    @Override
+    protected final boolean isEntityUpdateable() {
+        return true;
+    }
+    
+}

+ 3 - 0
app/src/main/java/com/sunzee/db/DaoMaster.java

@@ -25,6 +25,7 @@ public class DaoMaster extends AbstractDaoMaster {
         LocalOrderBeanDao.createTable(db, ifNotExists);
         OrderBeanDao.createTable(db, ifNotExists);
         WarringBeanDao.createTable(db, ifNotExists);
+        CleaningBeanDao.createTable(db,ifNotExists);
     }
 
     /** Drops underlying database table using DAOs. */
@@ -32,6 +33,7 @@ public class DaoMaster extends AbstractDaoMaster {
         LocalOrderBeanDao.dropTable(db, ifExists);
         OrderBeanDao.dropTable(db, ifExists);
         WarringBeanDao.dropTable(db, ifExists);
+        CleaningBeanDao.dropTable(db,ifExists);
     }
 
     /**
@@ -53,6 +55,7 @@ public class DaoMaster extends AbstractDaoMaster {
         registerDaoClass(LocalOrderBeanDao.class);
         registerDaoClass(OrderBeanDao.class);
         registerDaoClass(WarringBeanDao.class);
+        registerDaoClass(CleaningBeanDao.class);
     }
 
     public DaoSession newSession() {

+ 10 - 0
app/src/main/java/com/sunzee/db/DaoSession.java

@@ -1,5 +1,6 @@
 package com.sunzee.db;
 
+import com.sunzee.model.domain.CleaningBean;
 import com.sunzee.model.domain.LocalOrderBean;
 import com.sunzee.model.domain.OrderBean;
 import com.sunzee.model.domain.WarringBean;
@@ -24,10 +25,12 @@ public class DaoSession extends AbstractDaoSession {
     private final DaoConfig localOrderBeanDaoConfig;
     private final DaoConfig orderBeanDaoConfig;
     private final DaoConfig warringBeanDaoConfig;
+    private final DaoConfig cleaningBeanDaoConfig;
 
     private final LocalOrderBeanDao localOrderBeanDao;
     private final OrderBeanDao orderBeanDao;
     private final WarringBeanDao warringBeanDao;
+    private final CleaningBeanDao cleaningBeanDao;
 
     public DaoSession(Database db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig>
             daoConfigMap) {
@@ -42,19 +45,25 @@ public class DaoSession extends AbstractDaoSession {
         warringBeanDaoConfig = daoConfigMap.get(WarringBeanDao.class).clone();
         warringBeanDaoConfig.initIdentityScope(type);
 
+        cleaningBeanDaoConfig = daoConfigMap.get(CleaningBeanDao.class).clone();
+        cleaningBeanDaoConfig.initIdentityScope(type);
+
         localOrderBeanDao = new LocalOrderBeanDao(localOrderBeanDaoConfig, this);
         orderBeanDao = new OrderBeanDao(orderBeanDaoConfig, this);
         warringBeanDao = new WarringBeanDao(warringBeanDaoConfig, this);
+        cleaningBeanDao = new CleaningBeanDao(cleaningBeanDaoConfig,this);
 
         registerDao(LocalOrderBean.class, localOrderBeanDao);
         registerDao(OrderBean.class, orderBeanDao);
         registerDao(WarringBean.class, warringBeanDao);
+        registerDao(CleaningBean.class, cleaningBeanDao);
     }
     
     public void clear() {
         localOrderBeanDaoConfig.clearIdentityScope();
         orderBeanDaoConfig.clearIdentityScope();
         warringBeanDaoConfig.clearIdentityScope();
+        cleaningBeanDaoConfig.clearIdentityScope();
     }
 
     public LocalOrderBeanDao getLocalOrderBeanDao() {
@@ -69,4 +78,5 @@ public class DaoSession extends AbstractDaoSession {
         return warringBeanDao;
     }
 
+    public CleaningBeanDao getCleaningBeanDao() {return cleaningBeanDao;}
 }

+ 54 - 2
app/src/main/java/com/sunzee/model/HoleInformation.java

@@ -16,12 +16,61 @@ public class HoleInformation {
      */
     private long timeDuration;
     /**
-     *  改变状态的时间是什么时候
+     * 改变状态的时间是什么时候
      * 出了廁所的時間
      */
     private long outTimeDuration;
 
-    private String bodySensor ="2";
+    /**
+     * 人体传感器的状态
+     * 2:表示还没用过。
+     * 0:表示没人
+     * 1:表示有人
+     */
+    private String bodySensor = "2";
+
+    /**
+     * false表示没人
+     * true表示有人
+     */
+    private boolean isUserAndEmpty =false;
+
+    /**
+     * 0:有人
+     * 1:没人
+     * 2:清洗中
+     * 3:表示还没使用过这个变量
+     */
+    private String userStates="0";
+
+    /**
+     * 判断是否可以根据人体传感器进行清洗
+     */
+    private boolean isInBodySensor = false;
+
+    public String getUserStates() {
+        return userStates;
+    }
+
+    public void setUserStates(String userStates) {
+        this.userStates = userStates;
+    }
+
+    public boolean isInBodySensor() {
+        return isInBodySensor;
+    }
+
+    public void setInBodySensor(boolean inBodySensor) {
+        isInBodySensor = inBodySensor;
+    }
+
+    public boolean isUserAndEmpty() {
+        return isUserAndEmpty;
+    }
+
+    public void setUserAndEmpty(boolean userAndEmpty) {
+        isUserAndEmpty = userAndEmpty;
+    }
 
     public String getBodySensor() {
         return bodySensor;
@@ -65,6 +114,9 @@ public class HoleInformation {
         return "HoleInformation{" +
                 "state=" + state +
                 ", timeDuration=" + timeDuration +
+                ", outTimeDuration=" + outTimeDuration +
+                ", bodySensor='" + bodySensor + '\'' +
+                ", isUserAndEmpty=" + isUserAndEmpty +
                 '}';
     }
 }

+ 85 - 0
app/src/main/java/com/sunzee/model/domain/CleaningBean.java

@@ -0,0 +1,85 @@
+package com.sunzee.model.domain;
+
+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 whw
+ * @time 2019/4/8
+ * @Description 错误实体类
+ */
+@Entity
+public class CleaningBean {
+    @Id(autoincrement = true)
+    private Long id;
+    @Property(nameInDb = "TIME")
+    private long time;
+    @Property(nameInDb = "CLEANCOUNT")
+    private String cleanCount;
+    @Property(nameInDb = "INCOUNT")
+    private String inCount;
+    @Property(nameInDb = "OUTCOUNT")
+    private String outCount;
+
+    @Generated(hash = 1406434038)
+    public CleaningBean(Long id, long time, String cleanCount, String inCount, String outCount) {
+        this.id = id;
+        this.time = time;
+        this.cleanCount = cleanCount;
+        this.inCount = inCount;
+        this.outCount = outCount;
+    }
+    @Generated(hash = 1917309366)
+    public CleaningBean() {
+    }
+
+    public Long getId() {
+        return this.id;
+    }
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public long getTime() {
+        return this.time;
+    }
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+    public String getCleanCount() {
+        return cleanCount;
+    }
+
+    public void setCleanCount(String cleanCount) {
+        this.cleanCount = cleanCount;
+    }
+
+    public String getInCount() {
+        return inCount;
+    }
+
+    public void setInCount(String inCount) {
+        this.inCount = inCount;
+    }
+
+    public String getOutCount() {
+        return outCount;
+    }
+
+    public void setOutCount(String outCount) {
+        this.outCount = outCount;
+    }
+
+    @Override
+    public String toString() {
+        return "CleaningBean{" +
+                "id=" + id +
+                ", time=" + time +
+                ", cleanCount='" + cleanCount + '\'' +
+                ", inCount='" + inCount + '\'' +
+                ", outCount='" + outCount + '\'' +
+                '}';
+    }
+}

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

@@ -43,5 +43,10 @@ public interface Name {
      */
     String STARTCLEAN = "startClean";
 
+    /**
+     * app程序写的全蹲位清洗
+     */
+    String ALLCLEANING = "allcleaning";
+
 
 }

+ 333 - 0
app/src/main/java/com/sunzee/mvp/homeactivity/HomeactivityPresenter.java

@@ -0,0 +1,333 @@
+package com.sunzee.mvp.homeactivity;
+
+import android.os.Environment;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.google.gson.Gson;
+import com.orhanobut.hawk.Hawk;
+import com.sunzee.base.BaseApplication;
+import com.sunzee.base.BasePresenter;
+import com.sunzee.db.CleaningBeanDao;
+import com.sunzee.model.Global;
+import com.sunzee.model.Heartbeat;
+import com.sunzee.model.HttpResult;
+import com.sunzee.model.HttpResult2;
+import com.sunzee.model.domain.CleaningBean;
+import com.sunzee.model.domain.GetAdBean;
+import com.sunzee.model.domain.Name;
+import com.sunzee.model.domain.ParameterBean;
+import com.sunzee.mvp.advertising.AdvertisingView;
+import com.sunzee.retrofit.ApiCallback;
+import com.sunzee.thread.advanceparameter.ThreadPoolAdvanceParameter;
+import com.sunzee.utils.AlarmManagerUtil;
+import com.sunzee.utils.FileUtil;
+import com.sunzee.utils.HexadecimalUtil;
+import com.wuxiaolong.androidutils.library.LogUtil;
+
+import org.greenrobot.greendao.query.QueryBuilder;
+import org.greenrobot.greendao.query.WhereCondition;
+
+import java.io.File;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+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 okhttp3.RequestBody;
+
+/**
+ * 厕所状态界面 presenter
+ * 需求:
+ */
+public class HomeactivityPresenter extends BasePresenter<HomeactivityView> {
+
+
+    private static final String TAG = "HomeactivityPresenter";
+    private CleaningBeanDao cleaningBeanDao;
+
+    public HomeactivityPresenter(HomeactivityView view) {
+        attachView(view);
+        cleaningBeanDao = BaseApplication.getInstances().getDaoSession().getCleaningBeanDao();
+    }
+
+
+
+    //-------------------------------------------------------------------------清洗规则 start--------------------------------------------------------------------------------------------
+    public void requstCleanRule() {
+        Map<String, String> params = new HashMap<>();
+        params.put("clientId", Heartbeat.deviceId);
+        addSubscription(apiStores.cleanRule(params), new ApiCallback<HttpResult<String>>() {
+            @Override
+            public void onSuccess(HttpResult<String> model) {
+                String times = model.getData().trim();
+                Log.d(TAG, "onSuccess: " + times);
+                if ("尚未设定清洗规则".equals(times)) {
+                    return;
+                }
+                Log.d(TAG, "onSuccess: ");
+                Log.d(TAG, "onSuccess2: " + times);
+                if (!TextUtils.isEmpty(times)) {
+                    String[] Alltime = times.split("\\,");
+                    Global.alarmNumber = Alltime.length;
+                    for (int i = 0; i < Alltime.length; i++) {
+                        String[] data = Alltime[i].split(":");
+                        for (String datum : data) {
+                            Log.d(TAG, "onSuccess1: " + datum);
+                        }
+                        //设置定时闹钟
+                        AlarmManagerUtil.setAlarm(BaseApplication.getContext(), 1, Integer.valueOf(data[0]), Integer.valueOf(data[1]), Integer.valueOf(data[2]), i, 0, "闹钟响了26");
+                    }
+                }
+            }
+
+            @Override
+            public void onFailure(String msg) {
+                Log.d(TAG, "onFailure: " + msg);
+            }
+
+            @Override
+            public void onFinish() {
+            }
+        });
+    }
+
+    //-------------------------------------------------------------------------清洗规则 end--------------------------------------------------------------------------------------------
+
+    //------------------------------------------------------------------请求是否已经付费了。或者说过期了。 start-----------------------------------------------
+    public void requestCleanTimeAndRemaining() {
+        Map<String, String> params = new HashMap<>();
+        params.put("clientId", Heartbeat.deviceId);
+        addSubscription(apiStores.getCleanTimeAndRemaining(params), new ApiCallback<HttpResult2<String>>() {
+            @Override
+            public void onSuccess(HttpResult2<String> model) {
+                Log.d(TAG, "onSuccess11: " + model);
+                String overdueDate = model.getOverdueDate();
+                String remaining = model.getRemaining();
+                if (TextUtils.isEmpty(overdueDate)) {
+                    //如果为空
+                    Hawk.put(Name.OVERDUE_DATE, null);
+                } else {
+                    try {
+                        Calendar calendar = Calendar.getInstance();
+                        calendar.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(overdueDate));
+                        Hawk.put(Name.OVERDUE_DATE, calendar.getTimeInMillis());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        Hawk.put(Name.OVERDUE_DATE, null);
+                    }
+                }
+                if (TextUtils.isEmpty(remaining)) {
+                    Hawk.put(Name.REMAINING, null);
+                } else {
+                    Hawk.put(Name.REMAINING, remaining);
+                }
+
+            }
+
+            @Override
+            public void onFailure(String msg) {
+                Log.d(TAG, "onFailure: " + msg);
+                //失败了。
+            }
+
+            @Override
+            public void onFinish() {
+            }
+        });
+    }
+
+    //---------------------------------------------------------------------请求是否已经付费了。 end---------------------------------------------
+    public void setAdvanced(String name, ArrayList<String> results, ThreadPoolAdvanceParameter threadGetParameter1) {
+        if (name.equals("D418")) {
+            if (!threadGetParameter1.isReceive2()) {
+                threadGetParameter1.setReceive2(true);
+                threadGetParameter1.stopReadD418();
+                threadGetParameter1.getValues()[6] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(0))));
+                threadGetParameter1.getValues()[7] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(1))));
+                threadGetParameter1.getValues()[0] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(2))));
+                threadGetParameter1.getValues()[1] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(3))));
+                threadGetParameter1.getValues()[2] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(4))));
+                threadGetParameter1.getValues()[3] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(5))));
+                threadGetParameter1.getValues()[4] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(6))));
+                threadGetParameter1.getValues()[5] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(7))));
+
+                Log.d(TAG, "D418setAdvanced: "+results.size());
+            }
+        } else if (name.equals("D426")) {
+            if (!threadGetParameter1.isReceive1()) {
+                threadGetParameter1.setReceive1(true);
+                threadGetParameter1.stopReadD426();
+                threadGetParameter1.getValues()[7] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+                threadGetParameter1.getValues()[8] = String.valueOf(HexadecimalUtil.hex2dec(results.get(1)));
+                threadGetParameter1.getValues()[9] = String.valueOf(HexadecimalUtil.hex2dec(results.get(2)));
+                threadGetParameter1.getValues()[10] = String.valueOf(HexadecimalUtil.hex2dec(results.get(3)));
+                threadGetParameter1.getValues()[11] = String.valueOf(HexadecimalUtil.hex2dec(results.get(4)));
+                threadGetParameter1.getValues()[12] = String.valueOf(HexadecimalUtil.hex2dec(results.get(5)));
+                threadGetParameter1.getValues()[13] = String.valueOf(HexadecimalUtil.hex2dec(results.get(6)));
+                threadGetParameter1.getValues()[14] = String.valueOf(HexadecimalUtil.hex2dec(results.get(7)));
+                threadGetParameter1.getValues()[15] = String.valueOf(HexadecimalUtil.hex2dec(results.get(8)));
+                Log.d(TAG, "D426setAdvanced: "+results.size());
+            }
+        }
+        if (threadGetParameter1.isReceive1() &&
+                threadGetParameter1.isReceive2()) {
+            mvpView.getDataSuccess();
+            threadGetParameter1.setReceive1(false);
+            threadGetParameter1.setReceive2(false);
+        }
+    }
+
+    private String get177Data(long l) {
+        return String.valueOf(Math.round((l/ Global.num)*10));
+    }
+
+    public void updateAdvanced(ArrayList<ParameterBean> parameterBeans) {
+
+        String url = "/api/app_equipment/index/updateParam/1/" + Heartbeat.deviceId + ".htm";
+        Gson gson = new Gson();
+        String json = gson.toJson(parameterBeans);
+        RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json);
+        addSubscription(apiStores.updateParamApi(url, body), new ApiCallback<HttpResult<String>>() {
+            @Override
+            public void onSuccess(HttpResult<String> model) {
+                Log.d(TAG, "onSuccess: " + model);
+            }
+
+            @Override
+            public void onFailure(String msg) {
+            }
+
+            @Override
+            public void onFinish() {
+            }
+        });
+    }
+
+    /**
+     * 上次局部清洗的蹲位有多少个
+     *
+     * @param num 数量
+     */
+    public void sendPositionNum(int num) {
+        Map<String, String> params = new HashMap<>();
+        params.put("clientId", Heartbeat.deviceId + "");
+        params.put("num", num + "");
+        Log.d(TAG, "sendPositionNum: " + num);
+        addSubscription(apiStores.sendPositionNum(params), new ApiCallback<HttpResult<String>>() {
+
+            @Override
+            public void onSuccess(HttpResult<String> model) {
+            }
+
+            @Override
+            public void onFailure(String msg) {
+            }
+
+            @Override
+            public void onFinish() {
+
+            }
+        });
+    }
+
+    /**
+     * 上传厕所的使用状态
+     * @param sn  几号厕所
+     * @param status 厕所使用状态
+     */
+    public void sendStatusOfToiletUse(String sn,String status){
+        Log.d(TAG, "11onSuccess: "+Heartbeat.deviceId);
+        Map<String, String> params = new HashMap<>();
+        params.put("clientId", Heartbeat.deviceId + "");
+        params.put("sn", sn);
+        params.put("status", status);
+        addSubscription(apiStores.sendStatusOfToiletUse(params), new ApiCallback<HttpResult<String>>() {
+
+            @Override
+            public void onSuccess(HttpResult<String> model) {
+                Log.d(TAG, "sendStatusOfToiletUse11onSuccess: "+model);
+            }
+
+            @Override
+            public void onFailure(String msg) {
+            }
+
+            @Override
+            public void onFinish() {
+
+            }
+        });
+    }
+
+    public void createBox(int number){
+        Map<String, String> params = new HashMap<>();
+        params.put("clientId", Heartbeat.deviceId + "");
+        params.put("number", number+"");
+        addSubscription(apiStores.createBox(params), new ApiCallback<HttpResult<String>>() {
+
+            @Override
+            public void onSuccess(HttpResult<String> model) {
+                Log.d(TAG, "createBox11onSuccess: "+model);
+            }
+
+            @Override
+            public void onFailure(String msg) {
+            }
+
+            @Override
+            public void onFinish() {
+
+            }
+        });
+    }
+
+
+    /**
+     * 查询今天的使用次数
+     */
+    public CleaningBean queryTodayCleanCount() {
+        QueryBuilder<CleaningBean> qb = cleaningBeanDao.queryBuilder();
+        List<CleaningBean> list = qb.where(new WhereCondition.StringCondition("TIME >= ? and TIME <= ?",
+                tomorrowDateStr(0), tomorrowDateStr(1))).build().list();
+        Log.d(TAG, "tomorrowDateStronStartCommand: "+list.size());
+        if (list.size()<=0) {
+            //添加今天的数据,如果一直不关机呢?那么我们就需要当前时间如何重新插入数据。
+            CleaningBean cleaningBean = new CleaningBean();
+            cleaningBean.setOutCount("0");
+            cleaningBean.setInCount("0");
+            cleaningBean.setCleanCount("0");
+            cleaningBean.setTime(System.currentTimeMillis());
+            cleaningBeanDao.insert(cleaningBean);
+            return null;
+        }
+        return  list.get(0);
+    }
+
+    /**
+     * 获取明天的日期字符串
+     * @return
+     */
+    public static long tomorrowDateStr(int number){
+        Date date=new Date();//取时间
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        //把日期往后增加一天.整数往后推,负数往前移动
+        calendar.add(calendar.DATE,number);
+        //这个时间就是日期往后推一天的结果
+        date=calendar.getTime();
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        String tomorrowStr = formatter.format(date);
+        Date parse= null;
+        try {
+            parse = formatter.parse(tomorrowStr);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return parse.getTime();
+    }
+}

+ 25 - 0
app/src/main/java/com/sunzee/mvp/homeactivity/HomeactivityView.java

@@ -0,0 +1,25 @@
+package com.sunzee.mvp.homeactivity;
+
+import com.sunzee.base.BaseView;
+
+import java.io.File;
+import java.util.ArrayList;
+
+/**
+ *  厕所状态 view
+ */
+public interface HomeactivityView extends BaseView {
+
+    /**
+     * 更新日期
+     *
+     * @param sysTimeStr
+     */
+    void updateTime(CharSequence sysTimeStr);
+
+    /**
+     * 上传进阶参数
+     */
+    void getDataSuccess();
+
+}

+ 2 - 1
app/src/main/java/com/sunzee/receiver/BootBroadcastReceiver.java

@@ -5,6 +5,7 @@ import android.content.Context;
 import android.content.Intent;
 
 import com.sunzee.ui.activity.AdvertisingActivity;
+import com.sunzee.ui.activity.HomePageActivity;
 
 public class BootBroadcastReceiver extends BroadcastReceiver {
     static final String ACTION = "android.intent.action.BOOT_COMPLETED";
@@ -12,7 +13,7 @@ public class BootBroadcastReceiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {
         if (intent.getAction().equals(ACTION)) {
-            Intent mainActivityIntent = new Intent(context, AdvertisingActivity.class);  // 要启动的Activity
+            Intent mainActivityIntent = new Intent(context, HomePageActivity.class);  // 要启动的Activity
             mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             context.startActivity(mainActivityIntent);
         }

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

@@ -91,7 +91,15 @@ public interface ApiStores {
     @GET("api/app_alarmRecord/clean/cleanReport.htm")
     Observable<HttpResult<String>> getCleanReport(@QueryMap Map<String, String> params);
 
-    //上机器有多少个蹲位
+    //上机器有多少个蹲位
     @GET("api/app_alarmRecord/clean/sendPositionNum.htm")
     Observable<HttpResult<String>> sendPositionNum(@QueryMap Map<String, String> params);
+
+    //上传厕所的使用状态
+    @POST("/api/app_equipment/index/updateBox.htm")
+    Observable<HttpResult<String>> sendStatusOfToiletUse(@QueryMap Map<String, String> params);
+
+    //添加厕所格子(有多少个坑)
+    @POST("/api/app_equipment/index/createBox.htm")
+    Observable<HttpResult<String>> createBox(@QueryMap Map<String, String> params);
 }

+ 21 - 2
app/src/main/java/com/sunzee/service/MyIntentService.java

@@ -35,8 +35,10 @@ import com.sunzee.model.message.ApiMessageEvent;
 import com.sunzee.retrofit.ApiCallback;
 import com.sunzee.retrofit.ApiClient;
 import com.sunzee.retrofit.ApiStores;
+import com.sunzee.ui.activity.HomeActivity;
 import com.sunzee.utils.AlarmManagerUtil;
 import com.sunzee.utils.SharedPreferencesUtils;
+import com.sunzee.utils.ToastUtil;
 import com.wuxiaolong.androidutils.library.LogUtil;
 
 import org.greenrobot.eventbus.EventBus;
@@ -117,7 +119,24 @@ public class MyIntentService extends GTIntentService {
         String kind = geTuiBean.getKind();
         switch (kind) {
             case "clean":
-                //一间清洗
+                //一键清洗:也就是全蹲位清洗。
+                if (!HomeActivity.isStartingUp) {
+                    ToastUtil.showToast("你好,此操作需要在开机后才能操作");
+                    break;
+                }
+                //全蹲位清洗,需要在开机的状态才能执行。
+                synchronized (MyService.sCleaningLocationList) {//多线程操作需要加上同步锁
+                    MyService.sCleaningLocationList.clear();
+                    for (int i = 1; i <=MyService.TOTAL_SUM; i++) {
+                        if (i==4) {
+                            continue;
+                        }
+                        MyService. sCleaningLocationList.addFirst(i);
+                    }
+                    //开始清洗。
+                    EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
+                }
+
                 Log.d(TAG, "onReceiveMessageData:clean ");
                 startClean(gson, geTuiBean, kind);
                 break;
@@ -147,7 +166,7 @@ public class MyIntentService extends GTIntentService {
                 requestCleanTimeAndRemaining();
                 break;
             case "cleanPositionNum":
-                //局部清洗
+                //局部清洗:根据后台传递的序号来决定要清洗的厕所。
                 cleanPositionNum(gson, geTuiBean, kind);
                 break;
         }

+ 282 - 132
app/src/main/java/com/sunzee/service/MyService.java

@@ -29,12 +29,14 @@ import com.hboxs.serialport.util.HexUtils;
 import com.orhanobut.hawk.Hawk;
 import com.sunzee.R;
 import com.sunzee.base.BaseApplication;
+import com.sunzee.db.CleaningBeanDao;
 import com.sunzee.db.WarringBeanDao;
 import com.sunzee.model.Global;
 import com.sunzee.model.Heartbeat;
 import com.sunzee.model.HoleInformation;
 import com.sunzee.model.HttpResult;
 import com.sunzee.model.domain.AddAlarmRecordBean;
+import com.sunzee.model.domain.CleaningBean;
 import com.sunzee.model.domain.ErrorBean;
 import com.sunzee.model.domain.GetAdBean;
 import com.sunzee.model.domain.HeartbeatBean;
@@ -50,6 +52,7 @@ import com.sunzee.retrofit.ApiClient;
 import com.sunzee.retrofit.ApiStores;
 import com.sunzee.thread.advanceparameter.ThreadPoolAdvanceParameter;
 import com.sunzee.thread.myservice.ThreadPoolMyservice;
+import com.sunzee.ui.activity.HomeActivity;
 import com.sunzee.ui.dialog.WarringDialog;
 import com.sunzee.utils.FileUtil;
 import com.sunzee.utils.HexadecimalUtil;
@@ -64,8 +67,11 @@ import com.wuxiaolong.androidutils.library.LogUtil;
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
+import org.greenrobot.greendao.query.QueryBuilder;
+import org.greenrobot.greendao.query.WhereCondition;
 
 import java.io.File;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -91,7 +97,7 @@ public class MyService extends Service {
     private boolean isRead = true;
     private boolean isRegularCleaning = false;
     private ThreadPoolAdvanceParameter mPoolAdvanceParameter = new ThreadPoolAdvanceParameter();
-    public final static int TOTAL_SUM = 14;
+    public final static int TOTAL_SUM = 6;
 
     //存储两个数据:是否上过厕所,一开始上厕所的时间是什么时候
     //CopyOnWriteArrayList并不是完全意义上的线程安全,如果涉及到remove操作,一定要谨慎处理。
@@ -115,7 +121,7 @@ public class MyService extends Service {
     public void onCreate() {
         super.onCreate();
         Log.d(TAG, "MyServiceonCreate: ");
-        synchronized (sCleaningLocationList){
+        synchronized (sCleaningLocationList) {
             sHoleInformationList.clear();
             for (int i = 0; i < TOTAL_SUM; i++) {
                 sHoleInformationList.add(new HoleInformation(2, 0));//初始化
@@ -186,6 +192,30 @@ public class MyService extends Service {
         if (warringDialog == null) {
             warringBeanDao = BaseApplication.getInstances().getDaoSession().getWarringBeanDao();
         }
+        if (cleaningBeanDao == null) {
+            cleaningBeanDao = BaseApplication.getInstances().getDaoSession().getCleaningBeanDao();
+        }
+      /*  if (cleaningBeanDao==null) {
+            cleaningBeanDao = BaseApplication.getInstances().getDaoSession().getCleaningBeanDao();
+
+            //初始化数据
+            //取出数据
+            QueryBuilder<CleaningBean> qb = cleaningBeanDao.queryBuilder();
+            List<CleaningBean> list = qb.where(new WhereCondition.StringCondition("TIME >= ? and TIME <= ?",
+                    tomorrowDateStr(0), tomorrowDateStr(1))).build().list();
+            Log.d(TAG, "tomorrowDateStronStartCommand: "+list.size());
+            if (list.size()<=0) {
+                //添加今天的数据,如果一直不关机呢?那么我们就需要当前时间如何重新插入数据。
+                CleaningBean cleaningBean = new CleaningBean();
+                cleaningBean.setOutCount("0");
+                cleaningBean.setInCount("0");
+                cleaningBean.setCleanCount("0");
+                cleaningBean.setTime(System.currentTimeMillis());
+                long insert = cleaningBeanDao.insert(cleaningBean);
+            }
+
+        }*/
+
         if (isRead) {
             isRead = !isRead;
             mThreadPoolMyservice.stopReadM600();
@@ -198,6 +228,50 @@ public class MyService extends Service {
         //return START_STICKY ;
     }
 
+
+    /**
+     * 增加清洗次数
+     */
+    public void addTodayCleanCount(int cleanCount, int inCount, int outCount) {
+        QueryBuilder<CleaningBean> qb = cleaningBeanDao.queryBuilder();
+        List<CleaningBean> list = qb.where(new WhereCondition.StringCondition("TIME >= ? and TIME <= ?",
+                tomorrowDateStr(0), tomorrowDateStr(1))).build().list();
+        if (list.size() > 0) {
+            CleaningBean cleaningBean = list.get(0);
+            cleaningBean.setCleanCount((Integer.valueOf(cleaningBean.getCleanCount()) + cleanCount) + "");
+
+            cleaningBean.setInCount(Integer.valueOf(cleaningBean.getInCount()) + inCount + "");
+            cleaningBean.setOutCount(Integer.valueOf(cleaningBean.getOutCount()) + outCount + "");
+
+            cleaningBeanDao.update(cleaningBean);
+        }
+    }
+
+
+    /**
+     * 获取明天的日期字符串
+     *
+     * @return
+     */
+    public static long tomorrowDateStr(int number) {
+        Date date = new Date();//取时间
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        //把日期往后增加一天.整数往后推,负数往前移动
+        calendar.add(calendar.DATE, number);
+        //这个时间就是日期往后推一天的结果
+        date = calendar.getTime();
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        String tomorrowStr = formatter.format(date);
+        Date parse = null;
+        try {
+            parse = formatter.parse(tomorrowStr);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return parse.getTime();
+    }
+
     @Override
     public void onDestroy() {
         super.onDestroy();
@@ -361,6 +435,14 @@ public class MyService extends Service {
                 //开始清洗 随机清洗,会给要清洗的蹲位是
                 cleanPositionNum(messageEvent.getData());
                 break;
+            case "allcleaning":
+                if (!PreventSpeedClickUtil.isFastClick()) {
+                    return;
+                }
+                //监听开机按钮的全蹲位清洗
+                cleanPositionNumX20((Integer)messageEvent.getData(),0);
+                cleanPositionNum(messageEvent.getData());
+                break;
             default:
                 break;
 
@@ -919,7 +1001,7 @@ public class MyService extends Service {
     }
 
     //------------------------------------------------------------------------广告 end---------------------------------
-    private boolean isAwait = true;
+    private boolean isAwait = false;
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void event(Message messageEvent) {
@@ -1021,30 +1103,7 @@ public class MyService extends Service {
                         } catch (Exception e) {
                             e.printStackTrace();
                         }
-                    }/* else if (name.equals("X12")) {
-                        String results = HexadecimalUtil.hexStringToByte(AsciiUtils.asciiByteArray2HexStr(responseFrame.getData()));
-                        String s1 = HexadecimalUtil.flipString(results, 6).substring(0, TOTAL_SUM);//6个厕所蹲位
-                        List<String> lis = Arrays.asList(s1.split(""));//第0位会是空字符串
-                        ArrayList<String> result = new ArrayList(lis);//
-                        result.remove(0);
-                        String s = Arrays.toString(result.toArray());
-                        Log.d(TAG, "X12event: "+result.size()+";s:"+s);
-                        //  Log.d(TAG, "result event: " + result.get(0) + result.get(1));
-
-                        //todo 是否监听
-                        //监控1号厕所
-                        monitoring(result.get(0), 1);
-                        //监控2号厕所
-                        monitoring(result.get(1), 2);
-                        //监控3号厕所
-                        monitoring(result.get(2), 3);
-                        //监控4号厕所
-                        monitoring(result.get(3), 4);
-                        //监控5号厕所
-                        monitoring(result.get(4), 5);
-                        //监控6号厕所
-                        monitoring(result.get(5), 6);
-                    }*/else if(name.equals("X12")){
+                    } else if (name.equals("X12")) {
                         String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
                         List<String> strList = HexadecimalUtil.getStrList(result, 4);
                         StringBuilder sb = new StringBuilder();
@@ -1061,21 +1120,48 @@ public class MyService extends Service {
                         list2.remove(0);
 
                         String s = Arrays.toString(list2.toArray());
-                        Log.d(TAG, "X12event1: "+s);
+                        Log.d(TAG, "X12event1: " + s);
+                        //如果没有开机,那么这里面的代码不会执行。
+                        if (!HomeActivity.isStartingUp) {
+                            return;
+                        }
+                        //监控1号厕所:门锁,以及人体传感器。根据厕所的个数来决定要监听的厕所的个数
+                        for (int i = 1; i<=TOTAL_SUM;i++){
+                            if (i==5 |i==6) {
+                                monitoring(list2.get(i+1), i, "0");
+                                bodySensor(i, list2.get(i+7));
+                                continue;
+                            }
+                            monitoring(list2.get(i+1), i, list2.get(i+7));
+                            bodySensor(i, list2.get(i+7));
+                        }
+
+                        //监控1号厕所:门锁,以及人体传感器。
+                       /* monitoring(list2.get(2), 1, list2.get(8));
+                        //监控2号厕所
+                        monitoring(list2.get(3), 2, list2.get(9));
+                        //监控3号厕所
+                        monitoring(list2.get(4), 3, list2.get(10));
+                        //监控4号厕所
+                        monitoring(list2.get(5), 4, list2.get(11));
+                        //监控5号厕所
+                        monitoring(list2.get(6), 5, "0");
+                        //监控6号厕所
+                        monitoring(list2.get(7), 6, "0" );*/
 
 
                         //监控1号厕所
-                        monitoring(list2.get(2), 1,list2.get(8));
+                      /*  bodySensor(1, list2.get(8));
                         //监控2号厕所
-                        monitoring(list2.get(3), 2,list2.get(9));
+                        bodySensor(2, list2.get(9));
                         //监控3号厕所
-                        monitoring(list2.get(4), 3,list2.get(10));
+                        bodySensor(3, list2.get(10));
                         //监控4号厕所
-                        monitoring(list2.get(5), 4,"0"/*list2.get(11)*/);
+                        bodySensor(4, list2.get(11));
                         //监控5号厕所
-                        monitoring(list2.get(6), 5,"0"/*list2.get(12)*/);
+                        bodySensor(5, list2.get(12));
                         //监控6号厕所
-                        monitoring(list2.get(7), 6,"0"/*list2.get(13)*/);
+                        bodySensor(6, list2.get(13));*/
 
                     } else if (name.equals("D2")) {
                         String data = String.valueOf(HexadecimalUtil.hex2dec(HexadecimalUtil.flipString(AsciiUtils.asciiByteArray2HexStr(responseFrame.getData())).get(0)));
@@ -1089,6 +1175,9 @@ public class MyService extends Service {
                                     if (!isToiletClean) {
                                         isToiletClean = true;
                                     }
+                                    if (isCleanOK) {
+                                        isCleanOK = false;
+                                    }
                                 }
                                 break;
                             case "1": //第一次待机中,开机完毕
@@ -1097,6 +1186,7 @@ public class MyService extends Service {
                                 synchronized (sCleaningLocationList) {//多线程操作需要加上同步锁
                                     if (isAwait) {
                                         isAwait = false;
+                                        isCleanOK = false;
                                         new Handler().postDelayed(new Runnable() {
                                             @Override
                                             public void run() {
@@ -1104,15 +1194,19 @@ public class MyService extends Service {
                                                     while (sCleaningLocationList.size() > 0) {
                                                         Integer first = sCleaningLocationList.getFirst();
                                                         HoleInformation holeInformation = sHoleInformationList.get(first - 1);
-                                                        if (holeInformation.getState() != 0 && holeInformation.getState() != 2 && "1".equals(holeInformation.getBodySensor())) {
-                                                            //被移除了
-                                                            Log.d(TAG, "被移除了1: " + first);
-                                                            sCleaningLocationList.removeFirst();
-                                                        } else if (holeInformation.getState() != 0 && holeInformation.getState() != 2) {
+                                                        if (holeInformation.getState() != 0 && holeInformation.getState() != 2) {
                                                             Log.d(TAG, "被移除了3: " + first);
                                                             sCleaningLocationList.removeFirst();
-                                                        }else {
-                                                            cleanPositionNumX20(first);
+                                                        } else {
+                                                            if ("1".equals(holeInformation.getBodySensor())) {// 1表示有人,有人我们就移出他
+                                                                Log.d(TAG, "run: 人体传感器检测到还有人,那么单纯靠人体传感器来执行。");
+                                                                //这里需要判断门是否关着,如果光着,我们没有必要使用人体传感器,如果门关着,都不会添加到这里面
+                                                                holeInformation.setInBodySensor(true);//可以开始判断了。
+                                                                sCleaningLocationList.removeFirst();
+                                                                continue;
+                                                            }
+                                                            addTodayCleanCount(1, 0, 0);
+                                                            cleanPositionNumX20(first, 1);
                                                             Log.d(TAG, "isClean開始清洗add: " + first);
                                                             cleanCount++;
                                                             return;
@@ -1120,7 +1214,7 @@ public class MyService extends Service {
                                                     }
                                                 }
                                             }
-                                        },6000);
+                                        }, 6000);
                                     }
                                 }
                                 break;
@@ -1128,24 +1222,24 @@ public class MyService extends Service {
                                 //todo 清洗中,需要各个10秒再开始
                                 synchronized (sCleaningLocationList) {
                                     //todo 必须sCleaningLocationList和sHoleInformationList不为空。才能执行里面的代码。
-                                    if (sCleaningLocationList.size()>0 &&sHoleInformationList.size()>0) {
+                                    if (sCleaningLocationList.size() > 0 && sHoleInformationList.size() > 0) {
                                         if (isToiletClean) {
                                             isCleanOK = true;
                                             //多线程,我们需要控制只执行一次?
                                             Integer first = sCleaningLocationList.getFirst();//sCleaningLocationList取出来的数据从1开始。
                                             HoleInformation holeInformation = sHoleInformationList.get(first - 1);
+                                            holeInformation.setUserStates("2");
                                             Log.d(TAG, "isClean開始清洗add急停: " + holeInformation.getState());
                                             if (holeInformation.getState() != 2) {
                                                 //如果在清洗中,那么就急停
                                                 isToiletClean = false;
+                                                sCleaningLocationList.removeFirst();//检测到厕所里面有人,那么我就移出她。但是移出,会不会影响其他的呢?
                                                 mThreadPoolMyservice.stopSetMM10();
                                                 mThreadPoolMyservice.startSetMM10("M10");
                                                 Log.d(TAG, "sCleaningLocationList: 紧急停止");
                                             }
                                         }
                                     }
-
-
                                 }
                                 break;
                             case "7"://清洗完毕----清洗過程中還是清洗完畢
@@ -1153,58 +1247,60 @@ public class MyService extends Service {
                                     if (isCleanOK) {
                                         isCleanOK = false;
 
-                                        //准备清洗下一个厕所,如果为10次,那么就需要复位。
-                                        if (cleanCount >= 10) {
-                                            cleanCount = 0;
-                                            mThreadPoolMyservice.stopWriteMM3();
-                                            mThreadPoolMyservice.startWriteMM3("M3");
-                                            return;
-                                        }
                                         new Handler().postDelayed(new Runnable() {
                                             @Override
                                             public void run() {
                                                 synchronized (sCleaningLocationList) {//移除这里出现了问题。
-                                                    if (sCleaningLocationList.size() != 0) {
-                                                        Integer first = null;
-                                                        //上一个清洗的厕所123
-                                                        Log.d(TAG, "被移除了2: " + first);
-                                                        last = sCleaningLocationList.removeFirst();
-                                                        //如果集合大于0,那么我就取出第一个位置,进行判断是否正在上厕所,如果是,那么就需要移除,继续下一个,
-                                                        while (sCleaningLocationList.size() > 0) {
-                                                            first = sCleaningLocationList.getFirst();//现在要清洗的厕所。456
-//                                                if (sHoleInformationList.get(first-1).getState()==3) {
-                                                            StringBuilder sb = new StringBuilder();
-                                                            for (Integer integer1 : sCleaningLocationList) {
-                                                                sb.append(integer1);
-                                                            }
+                                                    if (sCleaningLocationList.size() == 0) {
+                                                        return;
+                                                    }
+                                                    Integer first = null;
+                                                    //上一个清洗的厕所123
+                                                    Log.d(TAG, "被移除了2: " + first);
+                                                    last = sCleaningLocationList.removeFirst();
+                                                    //准备清洗下一个厕所,如果为10次,那么就需要复位。移除之后再复位。
+                                                    if (cleanCount >= 10) {
+                                                        cleanCount = 0;
+                                                        mThreadPoolMyservice.stopWriteMM3();
+                                                        mThreadPoolMyservice.startWriteMM3("M3");
+                                                        return;
+                                                    }
+                                                    //如果集合大于0,那么我就取出第一个位置,进行判断是否正在上厕所,如果是,那么就需要移除,继续下一个,
+                                                    while (sCleaningLocationList.size() > 0) {
 
-                                                            HoleInformation holeInformation = sHoleInformationList.get(first - 1);
-                                                            if (holeInformation.getState() != 0 && holeInformation.getState() != 2 && "1".equals(holeInformation.getBodySensor())) {
-                                                                Log.d(TAG, "被移除了3: " + first);
-                                                                sCleaningLocationList.removeFirst();
-                                                                //如果没有人在里面,但是人体传感器检测到有人,那么移除
-                                                                //如果有人在里面,即使人体创奇检测到有人或者没人,都移除。
-                                                            } else if (holeInformation.getState() != 0 && holeInformation.getState() != 2) {
-                                                                Log.d(TAG, "被移除了3: " + first);
-                                                                sCleaningLocationList.removeFirst();
-                                                            } else  {
-                                                                if ((last == 1 || last == 2 || last == 3) && (first == 4 || first == 5 || first == 6)) {
-                                                                    mThreadPoolMyservice.stopWriteMM3();
-                                                                    mThreadPoolMyservice.startWriteMM3("M3");
-                                                                    Log.d(TAG, "isClean: 开始复位4");
-                                                                    return;
-                                                                }
-                                                                cleanPositionNumX20(first);
-                                                                Log.d(TAG, "isClean開始清洗add: " + first);
-                                                                cleanCount++;
+                                                        first = sCleaningLocationList.getFirst();//现在要清洗的厕所。456
+                                                        StringBuilder sb = new StringBuilder();
+                                                        for (Integer integer1 : sCleaningLocationList) {
+                                                            sb.append(integer1);
+                                                        }
+                                                        HoleInformation holeInformation = sHoleInformationList.get(first - 1);
+                                                        if (holeInformation.getState() != 0 && holeInformation.getState() != 2) {
+                                                            Log.d(TAG, "被移除了3: " + first);
+                                                            sCleaningLocationList.removeFirst();
+                                                        } else {
+                                                            if ((last == 1 || last == 2 || last == 3) && (first == 4 || first == 5 || first == 6)) {
+                                                                mThreadPoolMyservice.stopWriteMM3();
+                                                                mThreadPoolMyservice.startWriteMM3("M3");
+                                                                Log.d(TAG, "isClean: 开始复位4");
                                                                 return;
                                                             }
+                                                            //判断是否有人,是否可以清洗,如果可以,那么继续走下去,如果不可以,直接移除
+                                                            if ("1".equals(holeInformation.getBodySensor())) {//这里使用的判断不对,因为一开始就是false
+                                                                Log.d(TAG, "run: 人体传感器检测到还有人,那么单纯靠人体传感器来执行。");
+                                                                holeInformation.setInBodySensor(true);//可以开始判断了。
+                                                                sCleaningLocationList.removeFirst();
+                                                                continue;
+                                                            }
+                                                            addTodayCleanCount(1, 0, 0);
+                                                            cleanPositionNumX20(first, 2);
+                                                            Log.d(TAG, "isClean開始清洗add: " + first);
+                                                            cleanCount++;
+                                                            return;
                                                         }
-
                                                     }
                                                 }
                                             }
-                                        },6000);
+                                        }, 6000);
                                     }
                                 }
                                 break;
@@ -1217,27 +1313,66 @@ public class MyService extends Service {
                         ArrayList<String> results = HexadecimalUtil.flipString(result);
                         setAdvanced(name, results, mPoolAdvanceParameter);
                     }
-
                     break;
                 }
         }
     }
 
+    private void bodySensor(int position, String isSomeone1) {
+        synchronized (sCleaningLocationList) {
+            HoleInformation holeInformation = sHoleInformationList.get(position - 1);
+            //表示这个厕所可以单纯靠人体传感器来判断是否需要开始清洗了。
+            if (!(holeInformation.isInBodySensor() && "0".equals(isSomeone1))) {
+                return;
+            }
+            //如果靠人体传感器来,那么我们需要附加一个条件就是人体传感器必须灭了才行
+            holeInformation.setInBodySensor(false);
+            Log.d(TAG, "bodySensor 人体传感器开始执行了。" + position + isSomeone1);
+            if (sCleaningLocationList.size() == 0) {
+                //添加进来,并且开始清洗。
+                Log.d(TAG, "addLastbodySensor: 1");
+                if (isAwait) {//为true,表示复位中
+                    //只是添加进来
+                    Log.d(TAG, "addLastbodySensor: 2");
+                    addTodayCleanCount(0, 0, 1);
+                    sCleaningLocationList.addLast(position);
+                } else {//表示没有复位中。那么就可以直接清洗
+                    sCleaningLocationList.addLast(position);
+                    if (last == null) {
+                        return;
+                    }
+                    if ((last == 1 || last == 2 || last == 3) && (position == 4 || position == 5 || position == 6)) {
+                        Log.d(TAG, "isClean: 開始复位1");
+                        mThreadPoolMyservice.stopWriteMM3();
+                        mThreadPoolMyservice.startWriteMM3("M3");
+                        return;
+                    }
+                    cleanCount++;
+                    addTodayCleanCount(1, 0, 1);
+                    cleanPositionNumX20(position, 3);
+                }
+            } else {
+                //只是添加进来
+                Log.d(TAG, "addLastbodySensor: 2");
+                addTodayCleanCount(0, 0, 1);
+                sCleaningLocationList.addLast(position);
+            }
+        }
+
+    }
+
 
     private void monitoring(String number, int position, String isSomeone1) {
-        //   Log.d(TAG, "monitoring: " + number + position);
         synchronized (sCleaningLocationList) {//多线程操作需要加上同步锁
-            if ("0".equals(number)) {//
+            if ("0".equals(number)) {//没人
                 //是否加入清洗
-                isClean(position,isSomeone1);
-            } else if ("1".equals(number)) {
+                isClean(position, isSomeone1);
+            } else if ("1".equals(number)) {//有人
                 //记录
-                addCleanTime(position,isSomeone1);
+                addCleanTime(position, isSomeone1);
             }
-            Log.d(TAG, "isClean開始清洗add信号: 厕所"+position+",信号为:" + number);
-
+            Log.d(TAG, "isClean開始清洗add信号: 厕所" + position + ",信号为:" + number);
         }
-//        }
     }
 
     private void addCleanTime(int number, String isSomeone) {
@@ -1246,21 +1381,22 @@ public class MyService extends Service {
          *     将标志位变为0.,如果我为0 就不执行了。避免时间一直更新。
          *     存储当前的时间,到指定的集合中【标志位,0time】
          */
-//        Log.d(TAG, "addCleanTime: 为零isCleanaddCleanTime1");
         HoleInformation holeInformation = sHoleInformationList.get(number - 1);
         holeInformation.setBodySensor(isSomeone);
-//        Log.d(TAG, "为零isCleanaddCleanTime11: " + sHoleInformationList.size() + holeInformation.getState());
-//        Log.d(TAG, "为零isCleanaddCleanTime12: " + (number - 1));
+        holeInformation.setUserAndEmpty(true);
+        if (!isCleanOK) holeInformation.setUserStates("0");
         if (holeInformation.getState() != 1 && holeInformation.getState() != 3) {
             holeInformation.setState(1);//上厕所
             holeInformation.setTimeDuration(System.currentTimeMillis());//存储他上厕所的时间
+            holeInformation.setInBodySensor(false);//进厕所了,表示不靠人体传感器来清洗。
+            Log.d(TAG, "run: 重新上厕所了,那么我们就需要取消单纯靠人体传感器来执行了。");
         } else if (holeInformation.getState() == 1) {
             if (System.currentTimeMillis() - holeInformation.getTimeDuration() > 10000) {
+                holeInformation.setInBodySensor(false);//进厕所了,表示不靠人体传感器来清洗。
                 //將其標誌位上過廁所。
+                addTodayCleanCount(0, 1, 0);
                 holeInformation.setState(3);
-                // Log.d(TAG, "addCleanTime: 上厕所超过20秒");
-            } else {
-                //  Log.d(TAG, "addCleanTime: 上厕所没超过20秒");
+                //进入厕所了,那么我们需要统计。
             }
         }
     }
@@ -1285,38 +1421,53 @@ public class MyService extends Service {
          */
         HoleInformation holeInformation = sHoleInformationList.get(number - 1);
         holeInformation.setBodySensor(isSomeone);
+        holeInformation.setUserAndEmpty(false);
+        if (!isCleanOK) holeInformation.setUserStates("1");
+
         int state = holeInformation.getState();
         if (state == 3) {
+
             holeInformation.setState(4);
             holeInformation.setOutTimeDuration(System.currentTimeMillis());//存储他上厕所的时间
         } else if (holeInformation.getState() == 4) {
-            if (System.currentTimeMillis() - holeInformation.getOutTimeDuration() > 10000) {
+            if (System.currentTimeMillis() - holeInformation.getOutTimeDuration() > 5000) {
                 //上廁所超過20秒,那麼將狀態改為上廁所狀態。
-                Log.d(TAG, "为零isClean: " + sCleaningLocationList.size());
+                Log.d(TAG, "人体传感器为零isClean: " + sCleaningLocationList.size());
                 if (sCleaningLocationList.size() == 0) {
-                    //如果不包含,那么就走这里
-                    sCleaningLocationList.addLast(number);
-                    Log.d(TAG, "为零isCleannumber4: " + number);
-                    if (last != null) {
-                        if ((last == 1 || last == 2 || last == 3) && (number == 4 || number == 5 || number == 6)) {
-                            Log.d(TAG, "isClean: 開始复位1");
-                            mThreadPoolMyservice.stopWriteMM3();
-                            mThreadPoolMyservice.startWriteMM3("M3");
-                            return;
-                        }
+                    //如果人体传感器检测没人,那么就走如下的逻辑,如果有人,那么这里跳过。
+                    Log.d(TAG, number + "号厕所cleanPositionNumX20人体传感器isClean: " + holeInformation.getBodySensor());
+                    if (!"0".equals(holeInformation.getBodySensor())) {
+                        return;
                     }
-                    cleanCount++;//
-                    if ("1".equals(holeInformation.getBodySensor())) {
-                        sCleaningLocationList.removeFirst();
-                        Log.d(TAG, "holeInformation被移除了。: ");
-                    }else{
-                        cleanPositionNumX20(number);
+                    if (isAwait) {//为true,表示复位中
+                        addTodayCleanCount(0, 0, 1);
+                        sCleaningLocationList.addLast(number);
+                    } else {
+                        Log.d(TAG, "人体传感器不亮了" + holeInformation.getBodySensor());
+                        //如果不包含,那么就走这里
+                        Log.d(TAG, "addLastbodySensor: 3");
+                        sCleaningLocationList.addLast(number);
+                        Log.d(TAG, "为零isCleannumber4: " + number);
+                        if (last != null) {
+                            if ((last == 1 || last == 2 || last == 3) && (number == 4 || number == 5 || number == 6)) {
+                                Log.d(TAG, "isClean: 開始复位1");
+                                mThreadPoolMyservice.stopWriteMM3();
+                                mThreadPoolMyservice.startWriteMM3("M3");
+                                return;
+                            }
+                        }
+                        cleanCount++;
+                        //清洗次数增加
+                        addTodayCleanCount(1, 0, 1);
+                        cleanPositionNumX20(number, 4);
+                        Log.d(TAG, "isClean開始清洗add: " + number);
+                        Log.d(TAG, "addCleanTimeisClean: " + "開始清洗");
                     }
-                    Log.d(TAG, "isClean開始清洗add: " + number);
-                    Log.d(TAG, "addCleanTimeisClean: " + "開始清洗");
+                    holeInformation.setState(2);//改为2或者0都可以。
+
                 } else {
                     //那么我们就需要判断是否在清洗,通过一个标志位。清洗中,清洗完毕
-                    int index = 100;
+                    int index = 100;//如果已经存在,那么就移除后假如
                     for (int i = 0; i < sCleaningLocationList.size(); i++) {
                         Log.d(TAG, "isClean111: " + (sCleaningLocationList.get(i) == (number)) + "" + sCleaningLocationList.get(i) + (number));
                         if (sCleaningLocationList.get(i) == (number)) {
@@ -1327,16 +1478,19 @@ public class MyService extends Service {
                     }
                     if (index != 100) {
                         Log.d(TAG, "被移除了4: " + index);
+                        addTodayCleanCount(0, 0, 1);
                         sCleaningLocationList.remove(index);//如果移除后等于0,集合大小等于0,那么开始清洗。
+                        Log.d(TAG, "addLastbodySensor: 4");
                         sCleaningLocationList.addLast(number);
                     } else {
+                        addTodayCleanCount(0, 0, 1);
+                        Log.d(TAG, "addLastbodySensor: 5");
                         sCleaningLocationList.addLast(number);
                     }
                     Log.d(TAG, "addCleanTime: 清洗集合個數大於0:");
+                    holeInformation.setState(2);//改为2或者0都可以。
                 }
-                holeInformation.setState(2);//改为2或者0都可以。
-            } else {
-                Log.d(TAG, "addCleanTime进厕所没超过20秒 ");
+
             }
         } else if (holeInformation.getState() == 1) {
             if (holeInformation.getState() != 2) {
@@ -1346,7 +1500,8 @@ public class MyService extends Service {
         }
     }
 
-    private void cleanPositionNumX20(int data) {
+    private void cleanPositionNumX20(int data, int number) {
+        Log.d(TAG, "cleanPositionNumX20厕所: " + number);
         mThreadPoolMyservice.stopWriteDD120();
         mThreadPoolMyservice.startWriteDD120("D120", "000" + data);
     }
@@ -1455,6 +1610,7 @@ public class MyService extends Service {
     }
 
     private WarringBeanDao warringBeanDao;
+    private CleaningBeanDao cleaningBeanDao;
 
     /**
      * @param key
@@ -1654,9 +1810,3 @@ public class MyService extends Service {
         TimerUtil.stopTimerAndTimerTask(timerGetTime, timerTaskGetTime);
     }
 }
-
-//todo 重启触摸屏后回出现问题:有的已经在清洗了,但是安卓屏幕不认。所以就会开始清洗。
-/**
- * 如何优化呢?
- * 1.就需要
- */

+ 24 - 3
app/src/main/java/com/sunzee/ui/activity/HomeActivity.java

@@ -21,6 +21,7 @@ import android.text.TextUtils;
 import android.util.Log;
 import android.view.MenuItem;
 import android.view.View;
+import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -41,7 +42,6 @@ import com.sunzee.mvp.home.HomePresenter;
 import com.sunzee.mvp.home.HomeView;
 import com.sunzee.service.DownPresenter;
 import com.sunzee.service.MyService;
-import com.sunzee.thread.myservice.MyserviceTask;
 import com.sunzee.ui.dialog.ManagementSystemDialog;
 import com.sunzee.ui.dialog.CheckUpdatesDialog;
 import com.sunzee.ui.dialog.ShutdownDialog;
@@ -80,6 +80,7 @@ public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView
     private ImageView mIvShutownLogo;
     private PreventSpeedClickUtil mPreventSpeedClickUtil;
     private TextView mTvVersion1;
+    public static boolean isStartingUp = false;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -169,7 +170,7 @@ public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView
     }
 
     private void gotoAdvertisingActivity() {
-        startActivity(new Intent(HomeActivity.this, AdvertisingActivity.class));
+        startActivity(new Intent(HomeActivity.this, HomePageActivity.class));
         finish();
     }
 
@@ -428,11 +429,13 @@ public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView
             public void onClickListener(int type) {
                 switch (type) {
                     case R.id.btn_confirm:
+
                         //开机
                         //防止快速点击
                         if (!mPreventSpeedClickUtil.isFastClick()) {
                             return;
                         }
+                        isStartingUp = true;
                         stopTimerSet();
                         startTimerSet("M3");
                         //todo 清空数据
@@ -443,7 +446,24 @@ public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView
                                 MyService.sHoleInformationList.add(new HoleInformation(2, 0));//初始化
                             }
                         }
-
+                        break;
+                    case R.id.btn_allcleaning:
+                        if (!isStartingUp) {
+                            ToastUtil.showToast("你好,此操作需要在开机后才能操作");
+                            break;
+                        }
+                        //全蹲位清洗,需要在开机的状态才能执行。
+                        synchronized (MyService.sCleaningLocationList) {//多线程操作需要加上同步锁
+                            MyService.sCleaningLocationList.clear();
+                            for (int i = 1; i <=MyService.TOTAL_SUM; i++) {
+                                if (i==4) {
+                                    continue;
+                                }
+                                MyService. sCleaningLocationList.addFirst(i);
+                            }
+                            //开始清洗。
+                            EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
+                        }
                         break;
                 }
             }
@@ -486,6 +506,7 @@ public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView
                 if (name.equals("M3")) {
                     stopTimerSet();
                     ToastUtil.showToast(UiUtil.getStringRes(R.string.gjcg));
+
                 }
                 break;
             case nak:

+ 391 - 0
app/src/main/java/com/sunzee/ui/activity/HomePageActivity.java

@@ -0,0 +1,391 @@
+package com.sunzee.ui.activity;
+
+import android.annotation.SuppressLint;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.annotation.Nullable;
+import android.text.format.DateFormat;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.SurfaceView;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.hboxs.serialport.frame.ResponseFrame;
+import com.hboxs.serialport.message.Message;
+import com.hboxs.serialport.util.AsciiUtils;
+import com.sunzee.R;
+import com.sunzee.base.BaseApplication;
+import com.sunzee.base.MvpActivity;
+import com.sunzee.db.CleaningBeanDao;
+import com.sunzee.model.Heartbeat;
+import com.sunzee.model.HoleInformation;
+import com.sunzee.model.domain.CleaningBean;
+import com.sunzee.model.domain.ParameterBean;
+import com.sunzee.model.message.ApiMessageEvent;
+import com.sunzee.model.message.DownLoadMessageEvent;
+import com.sunzee.mvp.advertising.AdvertisingPresenter;
+import com.sunzee.mvp.advertising.AdvertisingView;
+import com.sunzee.mvp.homeactivity.HomeactivityPresenter;
+import com.sunzee.mvp.homeactivity.HomeactivityView;
+import com.sunzee.service.MyService;
+import com.sunzee.thread.advanceparameter.ThreadPoolAdvanceParameter;
+import com.sunzee.utils.GeTuiUtil;
+import com.sunzee.utils.HexadecimalUtil;
+import com.sunzee.utils.LongClickUtils;
+import com.sunzee.utils.SimplePlayerUtils;
+import com.sunzee.utils.ToastUtil;
+import com.sunzee.utils.UiUtil;
+import com.wuxiaolong.androidutils.library.LogUtil;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+import org.greenrobot.greendao.query.QueryBuilder;
+import org.greenrobot.greendao.query.WhereCondition;
+
+import java.io.File;
+import java.lang.ref.WeakReference;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * 厕所状态 activity
+ */
+public class HomePageActivity extends MvpActivity<HomeactivityPresenter> implements HomeactivityView {
+
+    private static final String TAG = "AdvertisingActivity";
+    private GeTuiUtil mGeTuiUtil;
+    private RelativeLayout mRlRoot;
+    private TextView mTvTime;
+    private MyHandler myHandler;
+    private TextView mTvEquipmentNo;
+    private ThreadPoolAdvanceParameter mPoolAdvanceParameter = new ThreadPoolAdvanceParameter();
+    private TextView tvDate;
+    private TextView tvWcToilets;
+    private TextView tvWcUser;
+    private TextView tvWcEmpty;
+    private int use;
+    private int empty;
+    private CleaningBean cleaningBean;
+    private TextView tvWashingTime;
+    private TextView tvIn;
+    private TextView tvOut;
+    private TextView tvToiletdiagram1;
+    private TextView tvToiletdiagram2;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_homeactivity);
+        EventBus.getDefault().register(this);
+        //打开个推
+        mGeTuiUtil = new GeTuiUtil(this);
+        mGeTuiUtil.geTui();
+        initView();
+        initEvent();
+        //获取实际屏幕参数
+        WindowManager manager = this.getWindowManager();
+        DisplayMetrics outMetrics = new DisplayMetrics();
+        manager.getDefaultDisplay().getMetrics(outMetrics);
+    }
+
+    private void initEvent() {
+        //长按事件
+        LongClickUtils.setLongClick(new Handler(), tvDate, 3000, new View.OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View v) {
+                Intent intent = new Intent(HomePageActivity.this, LoginActivity.class);
+                startActivity(intent);
+                finish();
+                return false;
+            }
+        });
+    }
+
+    private void initView() {
+        myHandler = new MyHandler(this);
+        mRlRoot = findViewById(R.id.rl_root);
+        mTvTime = findViewById(R.id.tv_time1);
+        tvDate = findViewById(R.id.tv_date);
+        tvWcToilets = findViewById(R.id.tv_wctoilets);
+        tvWcToilets.setText(MyService.TOTAL_SUM+"");
+        tvWcUser = findViewById(R.id.tv_wcuser);
+        tvWcEmpty = findViewById(R.id.tv_wcempty);
+        tvWashingTime = findViewById(R.id.tv_washingtime);
+        tvIn = findViewById(R.id.tv_in);
+        tvOut = findViewById(R.id.tv_out);
+        tvToiletdiagram1 = findViewById(R.id.tv_toiletdiagram1);
+        tvToiletdiagram2 = findViewById(R.id.tv_toiletdiagram2);
+        //设备编号只显示6位
+        mTvEquipmentNo = findViewById(R.id.tv_equipment_no1);
+        if (Heartbeat.deviceId != null && Heartbeat.deviceId.length() > 7) {
+            mTvEquipmentNo.setText( UiUtil.getStringRes(R.string.equipment)+(Heartbeat.deviceId != null ? Heartbeat.deviceId.substring(Heartbeat.deviceId.length() - 6) : ""));
+
+        }
+        startRefreshime();
+        startUserState();
+        //读取进阶参数
+        mPoolAdvanceParameter.stopAll();
+        mPoolAdvanceParameter.startALLRead();
+        mPoolAdvanceParameter.stopReadD403();
+        mPoolAdvanceParameter.startReadD403();
+     //   mvpPresenter.createBox(6);
+    }
+
+
+    @Override
+    public void updateTime(CharSequence sysTimeStr) {
+        mTvTime.setText(sysTimeStr);
+    }
+
+    @Override
+    public void getDataSuccess() {
+        String[] values = mPoolAdvanceParameter.getValues();
+        ArrayList<ParameterBean> parameterBeans = new ArrayList<>();
+        String[] paraAddress = {
+                "D426", "D427", "D428", "D429",
+                "D430", "D431"};
+        for (int i = 0; i < paraAddress.length; i++) {
+            parameterBeans.add(new ParameterBean(paraAddress[i], values[i]));
+        }
+        mvpPresenter.updateAdvanced(parameterBeans);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        mPoolAdvanceParameter.stopAll();
+        EventBus.getDefault().unregister(this);
+        myHandler.removeCallbacksAndMessages(null);
+        myHandler = null;
+        stopRefreshTime();
+    }
+
+    private long mPressTime = 0L;
+
+    /**
+     * 两次点击才能退出
+     *
+     * @param keyCode
+     * @param event
+     * @return
+     */
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
+            if (System.currentTimeMillis() - mPressTime < 1000) {
+                finish();
+            } else {
+                ToastUtil.showToast("再按一次退出");
+                mPressTime = System.currentTimeMillis();
+            }
+            return true;
+        }
+        return super.onKeyDown(keyCode, event);
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void event(Message messageEvent) {
+        switch (messageEvent.getType()) {
+            case connected:
+            case sendError:
+            case ack:
+                break;
+            case nak:
+                break;
+            case disconnected:
+                break;
+            case response:
+                ResponseFrame responseFrame = (ResponseFrame) messageEvent.getContent();
+                String name = messageEvent.getName();
+                if ("M600".equals(name)) {
+                    return;
+                }
+                if (responseFrame.isValidSum()) {
+                    //通过校验
+                    Log.d(TAG, "11event: " + name);
+                    String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
+                    ArrayList<String> results = HexadecimalUtil.flipString(result);
+                    if ("D403".equals(name)) {
+                        mPoolAdvanceParameter.stopReadD403();
+                        Log.d(TAG, "11event: " + (int) HexadecimalUtil.hex2dec(results.get(0)));
+                        mvpPresenter.sendPositionNum((int) HexadecimalUtil.hex2dec(results.get(0)));
+                    } else {
+                        mvpPresenter.setAdvanced(name, results, mPoolAdvanceParameter);
+                    }
+                }
+                break;
+        }
+    }
+
+    @Override
+    protected HomeactivityPresenter createPresenter() {
+        HomeactivityPresenter advertisingPresenter = new HomeactivityPresenter(this);
+        advertisingPresenter.requstCleanRule();
+        advertisingPresenter.requestCleanTimeAndRemaining();
+        return advertisingPresenter;
+    }
+
+    /**
+     * 主要用于更新系统时间
+     */
+    public static class MyHandler extends Handler {
+        //持有弱引用HandlerActivity,GC回收时会被回收掉.
+        private final WeakReference<HomePageActivity> mActivty;
+
+        public MyHandler(HomePageActivity activity) {
+            mActivty = new WeakReference<HomePageActivity>(activity);
+        }
+
+        @SuppressLint("ResourceAsColor")
+        @Override
+        public void handleMessage(android.os.Message msg) {
+            HomePageActivity activity = mActivty.get();
+            switch (msg.what) {
+                case 1:
+                    long sysTime = System.currentTimeMillis();//获取系统时间
+                    SimpleDateFormat myFmt = new SimpleDateFormat("yyyy年MM月dd日 EEEE HH:mm:ss");//时间显示格式
+                    String sysTimeStr = myFmt.format(sysTime);
+                    activity.tvDate.setText(sysTimeStr);
+                    break;
+                case 2://厕所的使用状态。
+                    //使用个数,空置个数
+                    activity.tvWcUser.setText(activity.use+"");
+                    activity.tvWcEmpty.setText(activity.empty+"");
+                    //厕所示意图
+                    if (MyService.sHoleInformationList.size()>=0) {
+                        if (MyService.sHoleInformationList.get(0).isUserAndEmpty()) {
+                            activity.tvToiletdiagram1.setBackgroundColor(activity.getResources().getColor(R.color.state_blue));
+                            activity.tvToiletdiagram1.setText("有人");
+                            activity.tvToiletdiagram1.setTextColor(Color.WHITE);
+                        }else{
+                            activity.tvToiletdiagram1.setBackgroundResource(R.drawable.icon9);
+                            activity.tvToiletdiagram1.setText("无人");
+                            activity.tvToiletdiagram1.setTextColor(activity.getResources().getColor(R.color.state_green));
+                        }
+                        if (MyService.sHoleInformationList.get(1).isUserAndEmpty()) {
+                            activity.tvToiletdiagram2.setBackgroundColor(activity.getResources().getColor(R.color.state_blue));
+                            activity.tvToiletdiagram2.setText("有人");
+                            activity.tvToiletdiagram2.setTextColor(Color.WHITE);
+                        }else{
+                            activity.tvToiletdiagram2.setBackgroundResource(R.drawable.icon9);
+                            activity.tvToiletdiagram2.setText("无人");
+                            activity.tvToiletdiagram2.setTextColor(activity.getResources().getColor(R.color.state_green));
+                        }
+                    }
+                    break;
+                case 3://清洗次数的读取。
+                    activity.tvIn.setText(activity.cleaningBean.getInCount());
+                    activity.tvOut.setText(activity.cleaningBean.getOutCount());
+                    activity.tvWashingTime.setText(activity.cleaningBean.getCleanCount());
+                    break;
+            }
+        }
+    }
+
+    private Timer timerGetTime;
+    private TimerTask timerGetTimerTak;
+
+    //时间日期的更新
+    private void startRefreshime() {
+        timerGetTime = new Timer();
+        timerGetTimerTak = new TimerTask() {
+            @Override
+            public void run() {
+                myHandler.sendEmptyMessage(1);
+            }
+        };
+        timerGetTime.schedule(timerGetTimerTak, 0, 1000);
+    }
+
+
+    private Timer timerUseState;
+    private TimerTask timerUseStateTimerTak;
+
+    //厕所使用状态的更新
+    private void startUserState() {
+        timerUseState = new Timer();
+        timerUseStateTimerTak = new TimerTask() {
+            @Override
+            public void run() {
+                //查看使用状态和空置状态
+                showUseEmptyWC();
+                //初始化数据 //取出数据 --- 查询数据库数据----- 取出今天的清洗次数
+                queryTodayCleanCount();
+            }
+        };
+        timerUseState.schedule(timerUseStateTimerTak, 0, 2000);
+    }
+
+    /**
+     * 查询今天的使用次数
+     */
+    private void queryTodayCleanCount() {
+        CleaningBean bean = mvpPresenter.queryTodayCleanCount();
+        if (bean != null) {
+            cleaningBean = bean;
+            myHandler.sendEmptyMessage(3);
+        }
+    }
+
+    /**
+     * 查看使用状态和空置状态
+     */
+    private void showUseEmptyWC() {
+        if (MyService.sHoleInformationList != null) {
+            use = 0;
+            empty = 0;
+            if (MyService.sCleaningLocationList != null) {
+                synchronized (MyService.sCleaningLocationList){
+                    for (int i = 0; i < MyService.sHoleInformationList.size(); i++) {
+                        HoleInformation holeInformation = MyService.sHoleInformationList.get(i);
+                        if (holeInformation.isUserAndEmpty()) {//有人
+                            use++;
+                        }else{                                  //无人
+                            empty++;
+                        }
+                        mvpPresenter.sendStatusOfToiletUse((i+1)+"号",holeInformation.getUserStates());
+                    }
+                    myHandler.sendEmptyMessage(2);
+                }
+            }
+        }
+    }
+
+
+
+    private void stopRefreshTime() {
+        if (timerGetTime != null) {
+            timerGetTime.cancel();
+            timerGetTime = null;
+        }
+        if (timerGetTimerTak != null) {
+            timerGetTimerTak.cancel();
+            timerGetTimerTak = null;
+        }
+
+        if (timerUseState != null) {
+            timerUseState.cancel();
+            timerUseState = null;
+        }
+    }
+}

+ 49 - 1
app/src/main/java/com/sunzee/ui/activity/LoginActivity.java

@@ -14,6 +14,9 @@ import com.sunzee.mvp.login.LoginPresenter;
 import com.sunzee.mvp.login.LoginView;
 import com.sunzee.utils.ToastUtil;
 
+import java.util.Timer;
+import java.util.TimerTask;
+
 /**
  * 登录界面 activity
  */
@@ -30,8 +33,14 @@ public class LoginActivity extends MvpActivity<LoginPresenter> implements LoginV
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_login);
         initView();
+        startTimeDown();
     }
 
+    @Override
+    protected void onDestroy() {
+        stopTimerDown();
+        super.onDestroy();
+    }
 
     private void initView() {
         mEtUserName = findViewById(R.id.et_username);
@@ -93,8 +102,47 @@ public class LoginActivity extends MvpActivity<LoginPresenter> implements LoginV
     }
 
     private void gotoAdvertisingActivity() {
-        startActivity(new Intent(LoginActivity.this, AdvertisingActivity.class));
+        startActivity(new Intent(LoginActivity.this, HomePageActivity.class));
         finish();
     }
 
+
+
+    private Timer countDownTimer;
+    private TimerTask timerTask;
+    private static int time = 120;
+
+    /**
+     * 开始倒计时
+     */
+    public void startTimeDown() {
+        time = 60;
+        stopTimerAndTimerTask(countDownTimer, timerTask);
+        countDownTimer = new Timer();
+        timerTask = new TimerTask() {
+            @Override
+            public void run() {
+                time--;
+                if (time < 0) {
+                    stopTimerDown();
+                    gotoAdvertisingActivity();
+                }
+            }
+        };
+        countDownTimer.schedule(timerTask, 0, 1000);
+    }
+
+    public void stopTimerDown() {
+        time = 60;
+        stopTimerAndTimerTask(countDownTimer, timerTask);
+    }
+
+    public void stopTimerAndTimerTask(Timer timer, TimerTask task) {
+        if (timer != null) {
+            task.cancel();
+            timer.cancel();
+            task = null;
+            timer = null;
+        }
+    }
 }

+ 24 - 13
app/src/main/java/com/sunzee/ui/dialog/ShutdownDialog.java

@@ -28,6 +28,7 @@ public class ShutdownDialog extends Dialog implements View.OnClickListener {
     private TextView tvContent;
     private Button btnConfirm;
     private ImageView IvQrCode;
+    private Button mBtnAllCleaning;
 
     public void setListener(DialogClickListener listener) {
         this.listener = listener;
@@ -48,7 +49,9 @@ public class ShutdownDialog extends Dialog implements View.OnClickListener {
         tvContent = findViewById(R.id.tv_content);
         btnConfirm = findViewById(R.id.btn_confirm);
         IvQrCode = findViewById(R.id.iv_qr_code);
+        mBtnAllCleaning = findViewById(R.id.btn_allcleaning);
         btnConfirm.setOnClickListener(this);
+        mBtnAllCleaning.setOnClickListener(this);
 
        /* int param = (int) SharedPreferencesUtils.getParam(Name.LANGUAGE_TYPE, -1);
         if (param != 1) {
@@ -89,19 +92,27 @@ public class ShutdownDialog extends Dialog implements View.OnClickListener {
 
     @Override
     public void onClick(View v) {
-        /**
-         * 1.如果==0,并且超過30秒
-         * ·我們需要重新開始,也就是可以開關機,也就是開
-         *
-         */
-        long openCloseFacility = (long) SharedPreferencesUtils.getParam("open_close_facility", (long) 0);
-        long data = System.currentTimeMillis() - openCloseFacility;
-        long shengyuData = openCloseFacility - System.currentTimeMillis();
-        if (openCloseFacility == 0 | data > 30000) {
-            listener.onClickListener(v.getId());
-            SharedPreferencesUtils.setParam("open_close_facility", System.currentTimeMillis());
-        } else {
-            ToastUtil.showToast(String.format(mContext.getString(R.string.no_continuous_oepn_close_chance), (30 - ((Math.abs(shengyuData) % (1000 * 60)) / 1000))));
+        switch (v.getId()){
+            case R.id.btn_allcleaning:
+                //全蹲位清洗
+                listener.onClickListener(v.getId());
+                break;
+            case R.id.btn_confirm:
+                /**
+                 * 1.如果==0,并且超過30秒
+                 * ·我們需要重新開始,也就是可以開關機,也就是開
+                 *
+                 */
+                long openCloseFacility = (long) SharedPreferencesUtils.getParam("open_close_facility", (long) 0);
+                long data = System.currentTimeMillis() - openCloseFacility;
+                long shengyuData = openCloseFacility - System.currentTimeMillis();
+                if (openCloseFacility == 0 | data > 30000) {
+                    listener.onClickListener(v.getId());
+                    SharedPreferencesUtils.setParam("open_close_facility", System.currentTimeMillis());
+                } else {
+                    ToastUtil.showToast(String.format(mContext.getString(R.string.no_continuous_oepn_close_chance), (30 - ((Math.abs(shengyuData) % (1000 * 60)) / 1000))));
+                }
+                break;
         }
         dismiss();
         return;

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

@@ -21,6 +21,7 @@ import com.sunzee.R;
 import com.sunzee.base.MvpFragment;
 import com.sunzee.mvp.homepage.HomePagePresenter;
 import com.sunzee.mvp.homepage.HomePageView;
+import com.sunzee.service.MyService;
 import com.sunzee.thread.homepage.ThreadPoolHomepage;
 import com.sunzee.ui.dialog.StartCleaningDialog;
 import com.sunzee.ui.view.CustomViewGrounp;
@@ -143,7 +144,7 @@ public class HomepageFragment extends MvpFragment<HomePagePresenter> implements
         //为控件设置数据
         mCustomViewGrounp = inflate.findViewById(R.id.cv_custom);
         List<String> list = new ArrayList<>();
-        for (int i = 0; i < 8; i++) {
+        for (int i = 0; i < MyService.TOTAL_SUM; i++) {//厕所个数可控。
             if (i == 6) {
                 list.add("走廊");
                 continue;

+ 22 - 0
app/src/main/res/drawable-xhdpi/shape_radio_thumb.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval"
+    android:useLevel="false"
+    >
+    <solid android:color="#011f4b" />
+
+    <stroke
+        android:width="10dp"
+        android:color="#FFA632" />
+
+    <size android:height="@dimen/dp_16"
+        android:width="@dimen/dp_16"
+        />
+    <corners
+        android:bottomLeftRadius="360dp"
+        android:bottomRightRadius="360dp"
+        android:topLeftRadius="360dp"
+        android:topRightRadius="360dp" />
+
+</shape>

BIN
app/src/main/res/drawable-xxxhdpi/icon1.png


BIN
app/src/main/res/drawable-xxxhdpi/icon2.png


BIN
app/src/main/res/drawable-xxxhdpi/icon3.png


BIN
app/src/main/res/drawable-xxxhdpi/icon4.png


BIN
app/src/main/res/drawable-xxxhdpi/icon5.png


BIN
app/src/main/res/drawable-xxxhdpi/icon6.png


BIN
app/src/main/res/drawable-xxxhdpi/icon7.png


BIN
app/src/main/res/drawable-xxxhdpi/icon8.png


BIN
app/src/main/res/drawable-xxxhdpi/icon9.png


+ 1 - 1
app/src/main/res/drawable/shape_clearorgle_rectangle.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <solid android:color="@color/orange"/>
+    <solid android:color="#ffad25"/>
     <corners android:radius="@dimen/dp_5"/>
 </shape>

+ 5 - 5
app/src/main/res/drawable/shape_radio_thumb.xml

@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
+
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="oval"
     android:useLevel="false"
     >
-
-    <solid android:color="@color/white" />
+    <solid android:color="#011f4b" />
 
     <stroke
-        android:width="3dp"
-        android:color="#EDA297" />
+        android:width="6dp"
+        android:color="#FFA632" />
 
     <size android:height="@dimen/dp_16"
         android:width="@dimen/dp_16"

+ 22 - 0
app/src/main/res/drawable/shape_radio_thumbblue.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval"
+    android:useLevel="false"
+    >
+    <solid android:color="#011f4b" />
+
+    <stroke
+        android:width="6dp"
+        android:color="#32A8FF" />
+
+    <size android:height="@dimen/dp_16"
+        android:width="@dimen/dp_16"
+        />
+    <corners
+        android:bottomLeftRadius="360dp"
+        android:bottomRightRadius="360dp"
+        android:topLeftRadius="360dp"
+        android:topRightRadius="360dp" />
+
+</shape>

+ 1 - 0
app/src/main/res/layout/activity_home.xml

@@ -23,6 +23,7 @@
             app:itemBackground="@color/white"
             app:itemTextAppearance="@style/Menu"
             app:menu="@menu/my_navigation_items"
+
             app:theme="@style/ItemHeight" />
 
 

+ 440 - 0
app/src/main/res/layout/activity_homeactivity.xml

@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#011f4b">
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="> 厕所示意图"
+        android:layout_alignLeft="@+id/ll_wcstate"
+        android:textSize="@dimen/sp_6"
+        android:layout_marginTop="@dimen/dp_2"
+        android:textColor="#bfc0c1"/>
+
+    <TextView
+        android:id="@+id/tv_equipment_no1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="设备编号:"
+        android:layout_alignParentBottom="true"
+        android:padding="@dimen/dp_2"
+        android:textSize="@dimen/sp_6"
+        android:layout_alignRight="@id/ll_useCount"
+        android:layout_alignBottom="@id/ll_useCount"
+        android:layout_marginTop="@dimen/dp_2"
+        android:textColor="#bfc0c1"/>
+
+    <LinearLayout
+        android:id="@+id/ll_wcstate"
+        android:layout_width="@dimen/dp_226"
+        android:layout_height="@dimen/dp_329"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="@dimen/dp_31"
+        android:background="@drawable/icon1"
+        android:paddingLeft="@dimen/dp_8"
+        android:orientation="horizontal" >
+
+        <TextView
+            android:id="@+id/tv_toiletdiagram1"
+            android:layout_width="@dimen/dp_104"
+            android:layout_height="@dimen/dp_148"
+            android:textColor="@color/state_green"
+            android:background="@drawable/icon9"
+            android:gravity="center"
+            android:textSize="@dimen/sp_14"
+            android:text="无人"/>
+        <TextView
+            android:id="@+id/tv_toiletdiagram2"
+            android:layout_width="@dimen/dp_104"
+            android:layout_height="@dimen/dp_148"
+            android:textColor="@color/state_green"
+            android:gravity="center"
+            android:background="@drawable/icon9"
+            android:textSize="@dimen/sp_14"
+            android:text="无人"/>
+    </LinearLayout>
+
+
+    <LinearLayout
+        android:id="@+id/ll_wccount"
+        android:layout_width="@dimen/dp_135"
+        android:layout_height="@dimen/dp_219"
+        android:layout_alignTop="@id/ll_wcstate"
+        android:layout_marginLeft="@dimen/dp_31"
+        android:layout_toRightOf="@id/ll_wcstate"
+        android:background="@drawable/icon2"
+        android:orientation="vertical">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/dp_10"
+            android:layout_marginTop="@dimen/dp_17"
+            android:text="今日清洗次数:"
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_10" />
+
+        <TextView
+            android:id="@+id/tv_washingtime"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/dp_17"
+            android:gravity="center"
+            android:text="0"
+            android:textColor="#32A8FF"
+            android:textSize="@dimen/sp_28" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/dp_10"
+            android:layout_marginTop="@dimen/dp_30"
+            android:text="剩余物料:"
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_10" />
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center">
+
+            <LinearLayout
+                android:layout_width="@dimen/dp_60"
+                android:layout_height="@dimen/dp_60"
+                android:background="@drawable/shape_radio_thumb"
+                android:gravity="center"
+                android:orientation="vertical">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="0%"
+                    android:textColor="#FFA632"
+                    android:textSize="@dimen/sp_14" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="消毒水"
+                    android:textColor="#FFA632"
+                    android:textSize="@dimen/sp_10" />
+            </LinearLayout>
+
+        </RelativeLayout>
+
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/tv_date"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignTop="@id/ll_wccount"
+        android:layout_marginLeft="@dimen/dp_20"
+        android:layout_toRightOf="@id/ll_wccount"
+        android:text="2020年11月17日 星期二 10:08"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_16" />
+
+    <LinearLayout
+        android:id="@+id/ll_ammonia"
+        android:gravity="center"
+        android:layout_marginTop="@dimen/dp_42"
+        android:layout_width="@dimen/dp_88"
+        android:layout_height="@dimen/dp_60"
+        android:layout_marginLeft="@dimen/dp_20"
+        android:layout_alignTop="@id/tv_date"
+        android:layout_toRightOf="@id/ll_wccount"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:layout_width="@dimen/dp_60"
+            android:layout_height="@dimen/dp_60"
+            android:background="@drawable/shape_radio_thumb"
+            android:gravity="center"
+            android:orientation="vertical">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="5.6PM"
+                android:textColor="#FFA632"
+                android:textSize="@dimen/sp_14" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="氨气"
+                android:textColor="#FFA632"
+                android:textSize="@dimen/sp_10" />
+        </LinearLayout>
+    </LinearLayout>
+
+
+    <LinearLayout
+        android:id="@+id/ll_environment"
+        android:gravity="center"
+        android:layout_marginTop="@dimen/dp_42"
+        android:layout_width="@dimen/dp_88"
+        android:layout_height="@dimen/dp_60"
+        android:layout_marginLeft="@dimen/dp_20"
+        android:layout_alignTop="@id/tv_date"
+        android:layout_toRightOf="@id/ll_ammonia"
+        android:orientation="vertical">
+
+        <LinearLayout
+
+            android:layout_width="@dimen/dp_60"
+            android:layout_height="@dimen/dp_60"
+            android:background="@drawable/shape_radio_thumbblue"
+            android:gravity="center"
+            android:orientation="vertical">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="优"
+                android:textColor="#32A8FF"
+                android:textSize="@dimen/sp_14" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="卫生评级"
+                android:textColor="#32A8FF"
+                android:textSize="@dimen/sp_10" />
+        </LinearLayout>
+    </LinearLayout>
+
+
+    <LinearLayout
+        android:id="@+id/ll_enter"
+        android:layout_width="@dimen/dp_88"
+        android:layout_height="@dimen/dp_96"
+        android:layout_alignBottom="@id/ll_wccount"
+        android:layout_marginLeft="@dimen/dp_20"
+        android:layout_toRightOf="@id/ll_wccount"
+        android:background="@drawable/icon8"
+        android:orientation="vertical">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="@dimen/dp_6"
+            android:text="今日合计进:"
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_8" />
+
+        <TextView
+            android:id="@+id/tv_in"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:text="0"
+            android:textColor="#32A8FF"
+            android:textSize="@dimen/dp_27" />
+
+    </LinearLayout>
+
+    <LinearLayout
+
+        android:layout_width="@dimen/dp_88"
+        android:layout_height="@dimen/dp_96"
+        android:layout_alignBottom="@id/ll_wccount"
+        android:layout_marginLeft="@dimen/dp_20"
+        android:layout_toRightOf="@id/ll_enter"
+        android:background="@drawable/icon8"
+        android:orientation="vertical">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="@dimen/dp_6"
+            android:text="今日合计出:"
+            android:textColor="#0DAB37"
+            android:textSize="@dimen/sp_8" />
+
+        <TextView
+            android:id="@+id/tv_out"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:text="0"
+            android:textColor="#0DAB37"
+            android:textSize="@dimen/dp_27" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/ll_useCount"
+        android:layout_width="@dimen/dp_358"
+        android:layout_height="@dimen/dp_98"
+        android:layout_alignParentBottom="true"
+        android:layout_marginLeft="@dimen/dp_31"
+        android:layout_marginBottom="@dimen/dp_15"
+        android:layout_toRightOf="@id/ll_wcstate"
+        android:background="@drawable/icon3"
+        android:gravity="center"
+        android:orientation="horizontal">
+
+        <LinearLayout
+            android:layout_width="@dimen/dp_94"
+            android:layout_height="@dimen/dp_56"
+            android:layout_marginRight="@dimen/dp_16"
+            android:background="@drawable/icon4"
+            android:gravity="center"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/tv_wctoilets"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="0"
+                android:textColor="@color/white"
+                android:textSize="@dimen/sp_14" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="卫生间总数"
+                android:textColor="@color/white"
+                android:textSize="@dimen/sp_14" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="@dimen/dp_94"
+            android:layout_height="@dimen/dp_56"
+            android:layout_marginRight="@dimen/dp_16"
+            android:background="@drawable/icon6"
+            android:gravity="center"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/tv_wcuser"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="0"
+                android:textColor="@color/white"
+                android:textSize="@dimen/sp_14" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="使用"
+                android:textColor="@color/white"
+                android:textSize="@dimen/sp_14" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="@dimen/dp_94"
+            android:layout_height="@dimen/dp_56"
+            android:background="@drawable/icon5"
+            android:gravity="center"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/tv_wcempty"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="0"
+                android:textColor="@color/white"
+                android:textSize="@dimen/sp_14" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="空置"
+                android:textColor="@color/white"
+                android:textSize="@dimen/sp_14" />
+
+        </LinearLayout>
+    </LinearLayout>
+
+    <ImageView
+        android:layout_width="@dimen/dp_40"
+        android:layout_height="@dimen/dp_16"
+        android:layout_marginLeft="@dimen/dp_10"
+        android:layout_marginTop="@dimen/dp_6"
+        android:src="@drawable/login_logo"
+        android:visibility="gone" />
+
+    <LinearLayout
+        android:id="@+id/ll_service"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:background="@drawable/shape_system_btn_rounded_rectangle"
+        android:orientation="vertical"
+        android:textColor="#767988"
+        android:visibility="gone">
+
+        <TextView
+            android:id="@+id/tv_servicecontact"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="@dimen/dp_5"
+            android:layout_marginBottom="@dimen/dp_1"
+            android:padding="@dimen/dp_2"
+            android:textColor="#767988"
+            android:textSize="@dimen/dp_5" />
+
+        <TextView
+            android:id="@+id/tv_serviceline"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:padding="@dimen/dp_2"
+            android:textColor="#767988"
+            android:textSize="@dimen/dp_5" />
+
+    </LinearLayout>
+
+    <RelativeLayout
+        android:id="@+id/rl_root"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/dp_40"
+        android:layout_alignParentRight="true"
+        android:visibility="gone">
+
+        <TextView
+            android:id="@+id/tv_time"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentLeft="true"
+            android:text="@string/current_time1"
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_8" />
+
+        <TextView
+            android:id="@+id/tv_time12"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_toRightOf="@id/tv_time"
+            android:gravity="center_vertical"
+            android:text="2019-05-05 18:00:00"
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_8" />
+
+        <TextView
+            android:id="@+id/tv_equipment_no"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@id/tv_time"
+            android:layout_alignParentLeft="true"
+            android:text="@string/equipment_no"
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_8" />
+
+        <TextView
+            android:id="@+id/tv_equipment_no12"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@id/tv_time"
+            android:layout_toRightOf="@id/tv_equipment_no"
+            android:gravity="center_vertical"
+            android:text="1234567856"
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_8" />
+    </RelativeLayout>
+</RelativeLayout>

+ 11 - 1
app/src/main/res/layout/dialog_shutdown.xml

@@ -50,11 +50,21 @@
                 android:layout_width="@dimen/dp_70"
                 android:layout_height="@dimen/dp_22"
                 android:layout_marginRight="@dimen/dp_10"
-                android:background="@drawable/shape_system_btn_rounded_rectangle"
+                android:background="@drawable/shape_clearblue_rectangle"
                 android:text="@string/open_now"
                 android:textColor="@color/white"
                 android:textSize="@dimen/dp_10" />
 
+            <Button
+                android:id="@+id/btn_allcleaning"
+                android:layout_width="@dimen/dp_70"
+                android:layout_height="@dimen/dp_22"
+                android:layout_marginRight="@dimen/dp_10"
+                android:background="@drawable/shape_clearorgle_rectangle"
+                android:text="@string/all_clean"
+                android:textColor="@color/white"
+                android:textSize="@dimen/dp_10" />
+
         </LinearLayout>
     </LinearLayout>
 </RelativeLayout>

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

@@ -482,4 +482,5 @@
     <string name="iox1">E轴原位传感器</string>
     <string name="jerk">急停</string>
     <string name="pointmove_speed">点动速度</string>
+    <string name="equipment">设备编号:</string>
 </resources>

+ 2 - 0
app/src/main/res/values/colors.xml

@@ -54,4 +54,6 @@
     <color name="bright_blue">#56b3fe</color>
     <color name="shallowblue">#ebeff6</color>
     <color name="c_transparent">#00000000</color>
+    <color name="state_blue">#32a8ff</color>
+    <color name="state_green">#0EB937</color>
 </resources>

+ 2 - 1
app/src/main/res/values/strings.xml

@@ -436,7 +436,7 @@
     <string name="mdbxinyongka">MDB信用卡</string>
     <string name="coin_pulse">币数脉冲除以x值</string>
     <string name="oldpas">原始密码不正确</string>
-    <string name="all_clean">全蹲位清洁</string>
+    <string name="all_clean">全蹲位清洁</string>
     <string name="debug_1">A轴正转(水平趋势)</string>
     <string name="debug_2">A轴反转(垂直趋势)</string>
     <string name="debug_3">喷水泵启动</string>
@@ -483,6 +483,7 @@
     <string name="iox1">E轴原位传感器</string>
     <string name="jerk">急停</string>
     <string name="pointmove_speed">点动速度</string>
+    <string name="equipment">设备编号:</string>
 
 
 </resources>