Parcourir la source

1.增加报警读取

Tony il y a 5 ans
Parent
commit
f94c5f969e
58 fichiers modifiés avec 2254 ajouts et 121 suppressions
  1. 2 1
      app/build.gradle
  2. 5 0
      app/src/main/AndroidManifest.xml
  3. 125 0
      app/src/main/java/com/sunzee/adapter/RvAlarmAdapter.java
  4. 33 1
      app/src/main/java/com/sunzee/base/BaseApplication.java
  5. 103 0
      app/src/main/java/com/sunzee/db/DaoMaster.java
  6. 72 0
      app/src/main/java/com/sunzee/db/DaoSession.java
  7. 170 0
      app/src/main/java/com/sunzee/db/LocalOrderBeanDao.java
  8. 148 0
      app/src/main/java/com/sunzee/db/OrderBeanDao.java
  9. 150 0
      app/src/main/java/com/sunzee/db/WarringBeanDao.java
  10. 5 0
      app/src/main/java/com/sunzee/model/Global.java
  11. 20 0
      app/src/main/java/com/sunzee/model/domain/AddAlarmRecordBean.java
  12. 41 0
      app/src/main/java/com/sunzee/model/domain/ErrorBean.java
  13. 92 0
      app/src/main/java/com/sunzee/model/domain/LocalOrderBean.java
  14. 67 0
      app/src/main/java/com/sunzee/model/domain/OrderBean.java
  15. 59 0
      app/src/main/java/com/sunzee/model/domain/WarringBean.java
  16. 42 2
      app/src/main/java/com/sunzee/mvp/advertising/AdvertisingPresenter.java
  17. 14 0
      app/src/main/java/com/sunzee/mvp/alarmrecord/AlarmRecordPresenter.java
  18. 4 0
      app/src/main/java/com/sunzee/mvp/alarmrecord/AlarmRecordView.java
  19. 33 0
      app/src/main/java/com/sunzee/receiver/TimedCleaningTaskAlarmReceiver.java
  20. 8 0
      app/src/main/java/com/sunzee/retrofit/ApiStores.java
  21. 34 6
      app/src/main/java/com/sunzee/service/MyIntentService.java
  22. 318 16
      app/src/main/java/com/sunzee/service/MyService.java
  23. 21 6
      app/src/main/java/com/sunzee/ui/activity/AdvertisingActivity.java
  24. 1 1
      app/src/main/java/com/sunzee/ui/activity/HomeActivity.java
  25. 14 1
      app/src/main/java/com/sunzee/ui/activity/LoginActivity.java
  26. 1 1
      app/src/main/java/com/sunzee/ui/dialog/ManagementSystemDialog.java
  27. 1 3
      app/src/main/java/com/sunzee/ui/dialog/NormalDialog.java
  28. 4 5
      app/src/main/java/com/sunzee/ui/dialog/ResultDialog.java
  29. 1 3
      app/src/main/java/com/sunzee/ui/dialog/ShutdownDialog.java
  30. 116 0
      app/src/main/java/com/sunzee/ui/dialog/WarringDialog.java
  31. 1 1
      app/src/main/java/com/sunzee/ui/fragment/AdvanceParameterFragment.java
  32. 38 2
      app/src/main/java/com/sunzee/ui/fragment/AlarmRecordFragment.java
  33. 1 1
      app/src/main/java/com/sunzee/ui/fragment/DebugFragment.java
  34. 1 1
      app/src/main/java/com/sunzee/ui/fragment/GeneralParameterFragment.java
  35. 1 1
      app/src/main/java/com/sunzee/ui/fragment/HomepageFragment.java
  36. 1 1
      app/src/main/java/com/sunzee/ui/fragment/LanguageSetFragment.java
  37. 1 1
      app/src/main/java/com/sunzee/ui/fragment/OtherFragment.java
  38. 1 1
      app/src/main/java/com/sunzee/ui/fragment/PasswordResetFragment.java
  39. 1 1
      app/src/main/java/com/sunzee/ui/fragment/ShowMaterialFragment.java
  40. 1 1
      app/src/main/java/com/sunzee/ui/fragment/StatisticsFragment.java
  41. 1 1
      app/src/main/java/com/sunzee/utils/AdvacedUtil.java
  42. 130 0
      app/src/main/java/com/sunzee/utils/AlarmManagerUtil.java
  43. 138 0
      app/src/main/java/com/sunzee/utils/CustomDecoration.java
  44. 1 2
      app/src/main/java/com/sunzee/utils/DensityUtil.java
  45. 3 0
      app/src/main/java/com/sunzee/utils/GeTuiUtil.java
  46. 0 2
      app/src/main/java/com/sunzee/utils/HexadecimalUtil.java
  47. 1 3
      app/src/main/java/com/sunzee/utils/LongClickUtils.java
  48. 34 23
      app/src/main/java/com/sunzee/utils/SimplePlayerUtils.java
  49. 0 2
      app/src/main/java/com/sunzee/utils/TimeUtil.java
  50. 0 1
      app/src/main/java/com/sunzee/utils/ToastUtil.java
  51. 0 1
      app/src/main/java/com/sunzee/utils/UiUtil.java
  52. 15 0
      app/src/main/res/drawable/shape_line_left.xml
  53. 15 0
      app/src/main/res/drawable/shape_line_right.xml
  54. 21 5
      app/src/main/res/layout/activity_login.xml
  55. 94 0
      app/src/main/res/layout/dialog_text.xml
  56. 6 6
      app/src/main/res/layout/fragment_alarm_record.xml
  57. 39 0
      app/src/main/res/layout/item_alarm.xml
  58. 5 18
      app/src/main/res/values/strings.xml

+ 2 - 1
app/build.gradle

@@ -40,6 +40,7 @@ ext {
     eventbusversion = "3.2.0"
     filedownloader = '1.7.6'
     hawkVersion = '2.0.1'
+    greendaoVersion='3.2.2'
 }
 
 dependencies {
@@ -75,5 +76,5 @@ dependencies {
     implementation "com.orhanobut:hawk:$hawkVersion"
 
     implementation "com.liulishuo.filedownloader:library:$filedownloader"
-
+    implementation "org.greenrobot:greendao:$greendaoVersion"
 }

+ 5 - 0
app/src/main/AndroidManifest.xml

@@ -82,6 +82,11 @@
                 <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
             </intent-filter>
         </receiver>
+        <receiver android:name=".receiver.TimedCleaningTaskAlarmReceiver">
+            <intent-filter>
+                <action android:name="android.intent.action.Timed_Cleaning_Task" />
+            </intent-filter>
+        </receiver>
     </application>
 
 </manifest>

+ 125 - 0
app/src/main/java/com/sunzee/adapter/RvAlarmAdapter.java

@@ -0,0 +1,125 @@
+package com.sunzee.adapter;
+
+import android.annotation.SuppressLint;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.sunzee.R;
+import com.sunzee.model.domain.WarringBean;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author whw
+ * @time 2019/3/21
+ * @Description 报警记录适配器
+ */
+public class RvAlarmAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+    private List<WarringBean> datas;
+
+    public void setItemListener(ItemMaintainClickListener listener) {
+        this.listener = listener;
+    }
+
+    private ItemMaintainClickListener listener;
+
+    public RvAlarmAdapter(List<WarringBean> datas) {
+        this.datas = datas;
+    }
+
+    private static final int TYPE_HEADER = 0;
+    private static final int TYPE_NORMAL = 1;
+
+
+    @NonNull
+    @Override
+    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
+        View inflate;
+        if(viewType==TYPE_HEADER){
+            inflate = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_alarm, viewGroup, false);
+            return  new RvAlarmAdapter.ViewHolderHeader(inflate);
+        }
+        inflate = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_alarm, viewGroup, false);
+        return new RvAlarmAdapter.ViewHolder(inflate);
+    }
+
+
+
+    @Override
+    public int getItemViewType(int position) {
+        //头布局
+        if (position == 0) return TYPE_HEADER;
+        return TYPE_NORMAL;
+    }
+
+    @SuppressLint("ResourceAsColor")
+    @Override
+    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) {
+        if (viewHolder instanceof ViewHolderHeader){
+            ViewHolderHeader viewHolderHeader= (ViewHolderHeader) viewHolder;
+            viewHolderHeader.tvTime.setTextColor(R.color.logo_blue);
+            viewHolderHeader.tvThingError.setTextColor(R.color.logo_blue);
+            viewHolderHeader.tvRemark.setTextColor(R.color.logo_blue);
+        }else {
+            ViewHolder viewHolderNormal= (ViewHolder) viewHolder;
+            viewHolderNormal.tvTime.setTextColor(R.color.colorGray);
+            viewHolderNormal.tvThingError.setTextColor(R.color.colorGray);
+            viewHolderNormal.tvRemark.setTextColor(R.color.colorGray);
+            WarringBean warringBean = datas.get(i - 1);
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
+            Date curDate = new Date(warringBean.getTime());
+            String time = formatter.format(curDate);
+            viewHolderNormal.tvTime.setText(time);
+            viewHolderNormal.tvThingError.setText(warringBean.getThingError());
+            viewHolderNormal.tvRemark.setText(warringBean.getRemark());
+        }
+    }
+
+    @Override
+    public int getItemCount() {
+        return datas.size()+1;
+    }
+
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+        TextView tvTime;
+        TextView tvThingError;
+        TextView tvRemark;
+
+        public ViewHolder(@NonNull View itemView) {
+            super(itemView);
+            tvTime=itemView.findViewById(R.id.tv_time);
+            tvThingError=itemView.findViewById(R.id.tv_error_thing);
+            tvRemark = itemView.findViewById(R.id.tv_remark);
+        }
+    }
+
+
+    public static class ViewHolderHeader extends RecyclerView.ViewHolder {
+        TextView tvTime;
+        TextView tvThingError;
+        TextView tvRemark;
+
+        public ViewHolderHeader(@NonNull View itemView) {
+            super(itemView);
+            tvTime=itemView.findViewById(R.id.tv_time);
+            tvThingError=itemView.findViewById(R.id.tv_error_thing);
+            tvRemark = itemView.findViewById(R.id.tv_remark);
+        }
+    }
+    public interface ItemMaintainClickListener {
+        /**
+         * @param view 控件
+         * @param position 位置
+         *
+         */
+        void onItemListener(View view, int position);
+
+    }
+}

+ 33 - 1
app/src/main/java/com/sunzee/base/BaseApplication.java

@@ -3,11 +3,14 @@ package com.sunzee.base;
 import android.app.Application;
 import android.content.Context;
 import android.content.Intent;
+import android.database.sqlite.SQLiteDatabase;
 import android.os.Bundle;
 
 import com.hboxs.serialport.SerialPortDevice;
 import com.hboxs.serialport.SerialPortManager;
 import com.orhanobut.hawk.Hawk;
+import com.sunzee.db.DaoMaster;
+import com.sunzee.db.DaoSession;
 import com.sunzee.model.Heartbeat;
 import com.sunzee.model.domain.Name;
 import com.sunzee.service.MyService;
@@ -20,12 +23,17 @@ import com.sunzee.utils.SharedPreferencesUtils;
 public class BaseApplication extends Application {
 
     public static Context mContext;
-
+    public static BaseApplication instances;
+    private DaoMaster.DevOpenHelper mHelper;
+    private SQLiteDatabase db;
+    private DaoMaster mDaoMaster;
+    private DaoSession mDaoSession;
 
     @Override
     public void onCreate() {
         super.onCreate();
         mContext = this;
+        instances = this;
         Hawk.init(this).build();
         Heartbeat.deviceId = FileUtil.getDeviceId();
         Heartbeat.managerId = (String) SharedPreferencesUtils.getParam(Name.SYSTEM_ID, "");
@@ -33,6 +41,7 @@ public class BaseApplication extends Application {
         SerialPortManager.getInstance().open(device);
         startMyService();
         firstHeartbeat();
+        setDatabase();
     }
 
     /**
@@ -55,5 +64,28 @@ public class BaseApplication extends Application {
         return mContext;
     }
 
+    //------------------------数据库
+    public static BaseApplication getInstances() {
+        return instances;
+    }
+
+    /**
+     * 设置greenDAO
+     */
+    private void setDatabase() {
+        // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
+        // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO已经帮你做了。
+        // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
+        // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
+        mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
+        db = mHelper.getWritableDatabase();
+        // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
+        mDaoMaster = new DaoMaster(db);
+        mDaoSession = mDaoMaster.newSession();
+    }
+
+    public DaoSession getDaoSession() {
+        return mDaoSession;
+    }
 
 }

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

@@ -0,0 +1,103 @@
+package com.sunzee.db;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteDatabase.CursorFactory;
+import android.util.Log;
+
+import org.greenrobot.greendao.AbstractDaoMaster;
+import org.greenrobot.greendao.database.Database;
+import org.greenrobot.greendao.database.DatabaseOpenHelper;
+import org.greenrobot.greendao.database.StandardDatabase;
+import org.greenrobot.greendao.identityscope.IdentityScopeType;
+
+
+// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
+
+/**
+ * Master of DAO (schema version 2): knows all DAOs.
+ */
+public class DaoMaster extends AbstractDaoMaster {
+    public static final int SCHEMA_VERSION = 2;
+
+    /** Creates underlying database table using DAOs. */
+    public static void createAllTables(Database db, boolean ifNotExists) {
+        LocalOrderBeanDao.createTable(db, ifNotExists);
+        OrderBeanDao.createTable(db, ifNotExists);
+        WarringBeanDao.createTable(db, ifNotExists);
+    }
+
+    /** Drops underlying database table using DAOs. */
+    public static void dropAllTables(Database db, boolean ifExists) {
+        LocalOrderBeanDao.dropTable(db, ifExists);
+        OrderBeanDao.dropTable(db, ifExists);
+        WarringBeanDao.dropTable(db, ifExists);
+    }
+
+    /**
+     * WARNING: Drops all table on Upgrade! Use only during development.
+     * Convenience method using a {@link DevOpenHelper}.
+     */
+    public static DaoSession newDevSession(Context context, String name) {
+        Database db = new DevOpenHelper(context, name).getWritableDb();
+        DaoMaster daoMaster = new DaoMaster(db);
+        return daoMaster.newSession();
+    }
+
+    public DaoMaster(SQLiteDatabase db) {
+        this(new StandardDatabase(db));
+    }
+
+    public DaoMaster(Database db) {
+        super(db, SCHEMA_VERSION);
+        registerDaoClass(LocalOrderBeanDao.class);
+        registerDaoClass(OrderBeanDao.class);
+        registerDaoClass(WarringBeanDao.class);
+    }
+
+    public DaoSession newSession() {
+        return new DaoSession(db, IdentityScopeType.Session, daoConfigMap);
+    }
+
+    public DaoSession newSession(IdentityScopeType type) {
+        return new DaoSession(db, type, daoConfigMap);
+    }
+
+    /**
+     * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} -
+     */
+    public static abstract class OpenHelper extends DatabaseOpenHelper {
+        public OpenHelper(Context context, String name) {
+            super(context, name, SCHEMA_VERSION);
+        }
+
+        public OpenHelper(Context context, String name, CursorFactory factory) {
+            super(context, name, factory, SCHEMA_VERSION);
+        }
+
+        @Override
+        public void onCreate(Database db) {
+            Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
+            createAllTables(db, false);
+        }
+    }
+
+    /** WARNING: Drops all table on Upgrade! Use only during development. */
+    public static class DevOpenHelper extends OpenHelper {
+        public DevOpenHelper(Context context, String name) {
+            super(context, name);
+        }
+
+        public DevOpenHelper(Context context, String name, CursorFactory factory) {
+            super(context, name, factory);
+        }
+
+        @Override
+        public void onUpgrade(Database db, int oldVersion, int newVersion) {
+            Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
+            dropAllTables(db, true);
+            onCreate(db);
+        }
+    }
+
+}

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

@@ -0,0 +1,72 @@
+package com.sunzee.db;
+
+import com.sunzee.model.domain.LocalOrderBean;
+import com.sunzee.model.domain.OrderBean;
+import com.sunzee.model.domain.WarringBean;
+
+import org.greenrobot.greendao.AbstractDao;
+import org.greenrobot.greendao.AbstractDaoSession;
+import org.greenrobot.greendao.database.Database;
+import org.greenrobot.greendao.identityscope.IdentityScopeType;
+import org.greenrobot.greendao.internal.DaoConfig;
+
+import java.util.Map;
+
+// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
+
+/**
+ * {@inheritDoc}
+ * 
+ * @see org.greenrobot.greendao.AbstractDaoSession
+ */
+public class DaoSession extends AbstractDaoSession {
+
+    private final DaoConfig localOrderBeanDaoConfig;
+    private final DaoConfig orderBeanDaoConfig;
+    private final DaoConfig warringBeanDaoConfig;
+
+    private final LocalOrderBeanDao localOrderBeanDao;
+    private final OrderBeanDao orderBeanDao;
+    private final WarringBeanDao warringBeanDao;
+
+    public DaoSession(Database db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig>
+            daoConfigMap) {
+        super(db);
+
+        localOrderBeanDaoConfig = daoConfigMap.get(LocalOrderBeanDao.class).clone();
+        localOrderBeanDaoConfig.initIdentityScope(type);
+
+        orderBeanDaoConfig = daoConfigMap.get(OrderBeanDao.class).clone();
+        orderBeanDaoConfig.initIdentityScope(type);
+
+        warringBeanDaoConfig = daoConfigMap.get(WarringBeanDao.class).clone();
+        warringBeanDaoConfig.initIdentityScope(type);
+
+        localOrderBeanDao = new LocalOrderBeanDao(localOrderBeanDaoConfig, this);
+        orderBeanDao = new OrderBeanDao(orderBeanDaoConfig, this);
+        warringBeanDao = new WarringBeanDao(warringBeanDaoConfig, this);
+
+        registerDao(LocalOrderBean.class, localOrderBeanDao);
+        registerDao(OrderBean.class, orderBeanDao);
+        registerDao(WarringBean.class, warringBeanDao);
+    }
+    
+    public void clear() {
+        localOrderBeanDaoConfig.clearIdentityScope();
+        orderBeanDaoConfig.clearIdentityScope();
+        warringBeanDaoConfig.clearIdentityScope();
+    }
+
+    public LocalOrderBeanDao getLocalOrderBeanDao() {
+        return localOrderBeanDao;
+    }
+
+    public OrderBeanDao getOrderBeanDao() {
+        return orderBeanDao;
+    }
+
+    public WarringBeanDao getWarringBeanDao() {
+        return warringBeanDao;
+    }
+
+}

+ 170 - 0
app/src/main/java/com/sunzee/db/LocalOrderBeanDao.java

@@ -0,0 +1,170 @@
+package com.sunzee.db;
+
+import android.database.Cursor;
+import android.database.sqlite.SQLiteStatement;
+
+import com.sunzee.model.domain.LocalOrderBean;
+
+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 "LOCAL_ORDER_BEAN".
+*/
+public class LocalOrderBeanDao extends AbstractDao<LocalOrderBean, Long> {
+
+    public static final String TABLENAME = "LOCAL_ORDER_BEAN";
+
+    /**
+     * Properties of entity LocalOrderBean.<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 Name = new Property(1, String.class, "name", false, "name");
+        public final static Property Price = new Property(2, double.class, "price", false, "price");
+        public final static Property PayType = new Property(3, int.class, "payType", false, "paytype");
+        public final static Property Sn = new Property(4, String.class, "sn", false, "sn");
+        public final static Property Time = new Property(5, String.class, "time", false, "time");
+    }
+
+
+    public LocalOrderBeanDao(DaoConfig config) {
+        super(config);
+    }
+    
+    public LocalOrderBeanDao(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 + "\"LOCAL_ORDER_BEAN\" (" + //
+                "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id
+                "\"name\" TEXT," + // 1: name
+                "\"price\" REAL NOT NULL ," + // 2: price
+                "\"paytype\" INTEGER NOT NULL ," + // 3: payType
+                "\"sn\" TEXT," + // 4: sn
+                "\"time\" TEXT);"); // 5: time
+    }
+
+    /** Drops the underlying database table. */
+    public static void dropTable(Database db, boolean ifExists) {
+        String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"LOCAL_ORDER_BEAN\"";
+        db.execSQL(sql);
+    }
+
+    @Override
+    protected final void bindValues(DatabaseStatement stmt, LocalOrderBean entity) {
+        stmt.clearBindings();
+ 
+        Long id = entity.getId();
+        if (id != null) {
+            stmt.bindLong(1, id);
+        }
+ 
+        String name = entity.getName();
+        if (name != null) {
+            stmt.bindString(2, name);
+        }
+        stmt.bindDouble(3, entity.getPrice());
+        stmt.bindLong(4, entity.getPayType());
+ 
+        String sn = entity.getSn();
+        if (sn != null) {
+            stmt.bindString(5, sn);
+        }
+ 
+        String time = entity.getTime();
+        if (time != null) {
+            stmt.bindString(6, time);
+        }
+    }
+
+    @Override
+    protected final void bindValues(SQLiteStatement stmt, LocalOrderBean entity) {
+        stmt.clearBindings();
+ 
+        Long id = entity.getId();
+        if (id != null) {
+            stmt.bindLong(1, id);
+        }
+ 
+        String name = entity.getName();
+        if (name != null) {
+            stmt.bindString(2, name);
+        }
+        stmt.bindDouble(3, entity.getPrice());
+        stmt.bindLong(4, entity.getPayType());
+ 
+        String sn = entity.getSn();
+        if (sn != null) {
+            stmt.bindString(5, sn);
+        }
+ 
+        String time = entity.getTime();
+        if (time != null) {
+            stmt.bindString(6, time);
+        }
+    }
+
+    @Override
+    public Long readKey(Cursor cursor, int offset) {
+        return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
+    }    
+
+    @Override
+    public LocalOrderBean readEntity(Cursor cursor, int offset) {
+        LocalOrderBean entity = new LocalOrderBean( //
+            cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id
+            cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // name
+            cursor.getDouble(offset + 2), // price
+            cursor.getInt(offset + 3), // payType
+            cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // sn
+            cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // time
+        );
+        return entity;
+    }
+     
+    @Override
+    public void readEntity(Cursor cursor, LocalOrderBean entity, int offset) {
+        entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
+        entity.setName(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1));
+        entity.setPrice(cursor.getDouble(offset + 2));
+        entity.setPayType(cursor.getInt(offset + 3));
+        entity.setSn(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4));
+        entity.setTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5));
+     }
+    
+    @Override
+    protected final Long updateKeyAfterInsert(LocalOrderBean entity, long rowId) {
+        entity.setId(rowId);
+        return rowId;
+    }
+    
+    @Override
+    public Long getKey(LocalOrderBean entity) {
+        if(entity != null) {
+            return entity.getId();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public boolean hasKey(LocalOrderBean entity) {
+        return entity.getId() != null;
+    }
+
+    @Override
+    protected final boolean isEntityUpdateable() {
+        return true;
+    }
+    
+}

+ 148 - 0
app/src/main/java/com/sunzee/db/OrderBeanDao.java

@@ -0,0 +1,148 @@
+package com.sunzee.db;
+
+import android.database.Cursor;
+import android.database.sqlite.SQLiteStatement;
+
+import com.sunzee.model.domain.OrderBean;
+
+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 "ORDER_BEAN".
+*/
+public class OrderBeanDao extends AbstractDao<OrderBean, Long> {
+
+    public static final String TABLENAME = "ORDER_BEAN";
+
+    /**
+     * Properties of entity OrderBean.<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 Name = new Property(1, String.class, "name", false, "NAME");
+        public final static Property Type = new Property(2, int.class, "type", false, "TYPE");
+        public final static Property Price = new Property(3, double.class, "price", false, "PRICE");
+        public final static Property Time = new Property(4, long.class, "time", false, "TIME");
+    }
+
+
+    public OrderBeanDao(DaoConfig config) {
+        super(config);
+    }
+    
+    public OrderBeanDao(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 + "\"ORDER_BEAN\" (" + //
+                "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id
+                "\"NAME\" TEXT," + // 1: name
+                "\"TYPE\" INTEGER NOT NULL ," + // 2: type
+                "\"PRICE\" REAL NOT NULL ," + // 3: price
+                "\"TIME\" INTEGER NOT NULL );"); // 4: time
+    }
+
+    /** Drops the underlying database table. */
+    public static void dropTable(Database db, boolean ifExists) {
+        String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"ORDER_BEAN\"";
+        db.execSQL(sql);
+    }
+
+    @Override
+    protected final void bindValues(DatabaseStatement stmt, OrderBean entity) {
+        stmt.clearBindings();
+ 
+        Long id = entity.getId();
+        if (id != null) {
+            stmt.bindLong(1, id);
+        }
+ 
+        String name = entity.getName();
+        if (name != null) {
+            stmt.bindString(2, name);
+        }
+        stmt.bindLong(3, entity.getType());
+        stmt.bindDouble(4, entity.getPrice());
+        stmt.bindLong(5, entity.getTime());
+    }
+
+    @Override
+    protected final void bindValues(SQLiteStatement stmt, OrderBean entity) {
+        stmt.clearBindings();
+ 
+        Long id = entity.getId();
+        if (id != null) {
+            stmt.bindLong(1, id);
+        }
+ 
+        String name = entity.getName();
+        if (name != null) {
+            stmt.bindString(2, name);
+        }
+        stmt.bindLong(3, entity.getType());
+        stmt.bindDouble(4, entity.getPrice());
+        stmt.bindLong(5, entity.getTime());
+    }
+
+    @Override
+    public Long readKey(Cursor cursor, int offset) {
+        return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
+    }    
+
+    @Override
+    public OrderBean readEntity(Cursor cursor, int offset) {
+        OrderBean entity = new OrderBean( //
+            cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id
+            cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // name
+            cursor.getInt(offset + 2), // type
+            cursor.getDouble(offset + 3), // price
+            cursor.getLong(offset + 4) // time
+        );
+        return entity;
+    }
+     
+    @Override
+    public void readEntity(Cursor cursor, OrderBean entity, int offset) {
+        entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
+        entity.setName(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1));
+        entity.setType(cursor.getInt(offset + 2));
+        entity.setPrice(cursor.getDouble(offset + 3));
+        entity.setTime(cursor.getLong(offset + 4));
+     }
+    
+    @Override
+    protected final Long updateKeyAfterInsert(OrderBean entity, long rowId) {
+        entity.setId(rowId);
+        return rowId;
+    }
+    
+    @Override
+    public Long getKey(OrderBean entity) {
+        if(entity != null) {
+            return entity.getId();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public boolean hasKey(OrderBean entity) {
+        return entity.getId() != null;
+    }
+
+    @Override
+    protected final boolean isEntityUpdateable() {
+        return true;
+    }
+    
+}

+ 150 - 0
app/src/main/java/com/sunzee/db/WarringBeanDao.java

@@ -0,0 +1,150 @@
+package com.sunzee.db;
+
+import android.database.Cursor;
+import android.database.sqlite.SQLiteStatement;
+
+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 "WARRING_BEAN".
+*/
+public class WarringBeanDao extends AbstractDao<WarringBean, Long> {
+
+    public static final String TABLENAME = "WARRING_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 ThingError = new Property(2, String.class, "thingError", false, "ERROR");
+        public final static Property Remark = new Property(3, String.class, "remark", false, "REMARK");
+    }
+
+
+    public WarringBeanDao(DaoConfig config) {
+        super(config);
+    }
+    
+    public WarringBeanDao(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 + "\"WARRING_BEAN\" (" + //
+                "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id
+                "\"TIME\" INTEGER NOT NULL ," + // 1: time
+                "\"ERROR\" TEXT," + // 2: thingError
+                "\"REMARK\" TEXT);"); // 3: remark
+    }
+
+    /** Drops the underlying database table. */
+    public static void dropTable(Database db, boolean ifExists) {
+        String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"WARRING_BEAN\"";
+        db.execSQL(sql);
+    }
+
+    @Override
+    protected final void bindValues(DatabaseStatement stmt, WarringBean entity) {
+        stmt.clearBindings();
+ 
+        Long id = entity.getId();
+        if (id != null) {
+            stmt.bindLong(1, id);
+        }
+        stmt.bindLong(2, entity.getTime());
+ 
+        String thingError = entity.getThingError();
+        if (thingError != null) {
+            stmt.bindString(3, thingError);
+        }
+ 
+        String remark = entity.getRemark();
+        if (remark != null) {
+            stmt.bindString(4, remark);
+        }
+    }
+
+    @Override
+    protected final void bindValues(SQLiteStatement stmt, WarringBean entity) {
+        stmt.clearBindings();
+ 
+        Long id = entity.getId();
+        if (id != null) {
+            stmt.bindLong(1, id);
+        }
+        stmt.bindLong(2, entity.getTime());
+ 
+        String thingError = entity.getThingError();
+        if (thingError != null) {
+            stmt.bindString(3, thingError);
+        }
+ 
+        String remark = entity.getRemark();
+        if (remark != null) {
+            stmt.bindString(4, remark);
+        }
+    }
+
+    @Override
+    public Long readKey(Cursor cursor, int offset) {
+        return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
+    }    
+
+    @Override
+    public WarringBean readEntity(Cursor cursor, int offset) {
+        WarringBean entity = new WarringBean( //
+            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
+        );
+        return entity;
+    }
+     
+    @Override
+    public void readEntity(Cursor cursor, WarringBean entity, int offset) {
+        entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
+        entity.setTime(cursor.getLong(offset + 1));
+        entity.setThingError(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2));
+        entity.setRemark(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));
+     }
+    
+    @Override
+    protected final Long updateKeyAfterInsert(WarringBean entity, long rowId) {
+        entity.setId(rowId);
+        return rowId;
+    }
+    
+    @Override
+    public Long getKey(WarringBean entity) {
+        if(entity != null) {
+            return entity.getId();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public boolean hasKey(WarringBean entity) {
+        return entity.getId() != null;
+    }
+
+    @Override
+    protected final boolean isEntityUpdateable() {
+        return true;
+    }
+    
+}

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

@@ -0,0 +1,5 @@
+package com.sunzee.model;
+
+public class Global {
+    public static int alarmNumber = 0;
+}

+ 20 - 0
app/src/main/java/com/sunzee/model/domain/AddAlarmRecordBean.java

@@ -0,0 +1,20 @@
+package com.sunzee.model.domain;
+
+/**
+ * @author whw
+ * @time 2019/4/9
+ * @Description 报警记录
+ */
+public class AddAlarmRecordBean {
+    private String alarmContent;
+    private String clientId;
+    private String occurrenceTime;
+    private String remark;
+
+    public AddAlarmRecordBean(String alarmContent, String clientId, String occurrenceTime, String remark) {
+        this.alarmContent = alarmContent;
+        this.clientId = clientId;
+        this.occurrenceTime = occurrenceTime;
+        this.remark = remark;
+    }
+}

+ 41 - 0
app/src/main/java/com/sunzee/model/domain/ErrorBean.java

@@ -0,0 +1,41 @@
+package com.sunzee.model.domain;
+
+/**
+ * @author whw
+ * @time 2019/3/21
+ * @Description 报警记录实体类
+ */
+public class ErrorBean {
+
+    private String time;
+    private String thingError;
+    private String remark;
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public String getThingError() {
+        return thingError;
+    }
+
+    public void setThingError(String thingError) {
+        this.thingError = thingError;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+
+
+
+}

+ 92 - 0
app/src/main/java/com/sunzee/model/domain/LocalOrderBean.java

@@ -0,0 +1,92 @@
+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;
+
+@Entity
+public class LocalOrderBean {
+
+    @Id(autoincrement = true)
+    private Long id;
+
+    //@Property:设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = "name")
+    @Property(nameInDb = "name")
+    private String name;
+
+    @Property(nameInDb = "price")
+    private double price;
+
+    @Property(nameInDb = "paytype")
+    private int payType;
+
+    @Property(nameInDb = "sn")
+    private String sn;
+
+    @Property(nameInDb = "time")
+    private String time;
+
+    @Generated(hash = 1075047697)
+    public LocalOrderBean(Long id, String name, double price, int payType,
+                          String sn, String time) {
+        this.id = id;
+        this.name = name;
+        this.price = price;
+        this.payType = payType;
+        this.sn = sn;
+        this.time = time;
+    }
+
+    @Generated(hash = 1839645560)
+    public LocalOrderBean() {
+    }
+
+    public Long getId() {
+        return this.id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public double getPrice() {
+        return this.price;
+    }
+
+    public void setPrice(double price) {
+        this.price = price;
+    }
+
+    public int getPayType() {
+        return this.payType;
+    }
+
+    public void setPayType(int payType) {
+        this.payType = payType;
+    }
+
+    public String getSn() {
+        return this.sn;
+    }
+
+    public void setSn(String sn) {
+        this.sn = sn;
+    }
+
+    public String getTime() {
+        return this.time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+}

+ 67 - 0
app/src/main/java/com/sunzee/model/domain/OrderBean.java

@@ -0,0 +1,67 @@
+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 OrderBean {
+    @Id(autoincrement = true)
+    private Long id;
+    @Property(nameInDb = "NAME")
+    private String name;
+    @Property(nameInDb = "TYPE")
+    private int type;
+    @Property(nameInDb = "PRICE")
+    private double price;
+    @Property(nameInDb = "TIME")
+    private long time;
+    @Generated(hash = 429738597)
+    public OrderBean(Long id, String name, int type, double price, long time) {
+        this.id = id;
+        this.name = name;
+        this.type = type;
+        this.price = price;
+        this.time = time;
+    }
+    @Generated(hash = 1725534308)
+    public OrderBean() {
+    }
+    public Long getId() {
+        return this.id;
+    }
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public String getName() {
+        return this.name;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+    public int getType() {
+        return this.type;
+    }
+    public void setType(int type) {
+        this.type = type;
+    }
+    public double getPrice() {
+        return this.price;
+    }
+    public void setPrice(double price) {
+        this.price = price;
+    }
+    public long getTime() {
+        return this.time;
+    }
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+}

+ 59 - 0
app/src/main/java/com/sunzee/model/domain/WarringBean.java

@@ -0,0 +1,59 @@
+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 WarringBean {
+    @Id(autoincrement = true)
+    private Long id;
+    @Property(nameInDb = "TIME")
+    private long time;
+    @Property(nameInDb = "ERROR")
+    private String thingError;
+    @Property(nameInDb = "REMARK")
+    private String remark;
+    @Generated(hash = 1416434038)
+    public WarringBean(Long id, long time, String thingError, String remark) {
+        this.id = id;
+        this.time = time;
+        this.thingError = thingError;
+        this.remark = remark;
+    }
+    @Generated(hash = 1927309366)
+    public WarringBean() {
+    }
+    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 getThingError() {
+        return this.thingError;
+    }
+    public void setThingError(String thingError) {
+        this.thingError = thingError;
+    }
+    public String getRemark() {
+        return this.remark;
+    }
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+
+}

+ 42 - 2
app/src/main/java/com/sunzee/mvp/advertising/AdvertisingPresenter.java

@@ -1,11 +1,19 @@
 package com.sunzee.mvp.advertising;
 
 import android.os.Environment;
+import android.text.TextUtils;
 import android.util.Log;
 
 import com.orhanobut.hawk.Hawk;
+import com.sunzee.base.BaseActivity;
+import com.sunzee.base.BaseApplication;
 import com.sunzee.base.BasePresenter;
+import com.sunzee.model.Global;
+import com.sunzee.model.Heartbeat;
+import com.sunzee.model.HttpResult;
 import com.sunzee.model.domain.GetAdBean;
+import com.sunzee.retrofit.ApiCallback;
+import com.sunzee.utils.AlarmManagerUtil;
 import com.sunzee.utils.FileUtil;
 import com.wuxiaolong.androidutils.library.LogUtil;
 
@@ -31,7 +39,7 @@ public class AdvertisingPresenter extends BasePresenter<AdvertisingView> {
 
     //--------------------------------------------------------------------------广告 start----------------------------------------------------------------------------------------------
     public void play() {
-
+        requstCleanRule();
         //2.读文件的数据
         int leftFileSize = leftVideoImageFile();
         int rightFileSize = rightVideoImageFile();
@@ -63,7 +71,7 @@ public class AdvertisingPresenter extends BasePresenter<AdvertisingView> {
      */
     private int rightVideoImageFile() {
         showOut = Hawk.get("show_out", new HashMap<Integer, GetAdBean>());
-        Log.d(TAG, "show_out rightVideoImageFile: "+showOut);
+        Log.d(TAG, "show_out rightVideoImageFile: " + showOut);
         this.allFiles = FileUtil.getAllFiles(Environment.getExternalStorageDirectory().getPath() + "/rightvideoimg/", "");
         //判断是否为空
         if (this.allFiles == null || this.allFiles.length <= 0) {
@@ -221,4 +229,36 @@ public class AdvertisingPresenter extends BasePresenter<AdvertisingView> {
     }
 
     //--------------------------------------------------------------------------广告 end----------------------------------------------------------------------------------------------
+
+    private 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();
+                Log.d(TAG, "onSuccess: " + 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, "onSuccess: "+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) {
+            }
+
+            @Override
+            public void onFinish() {
+            }
+        });
+    }
 }

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

@@ -1,6 +1,12 @@
 package com.sunzee.mvp.alarmrecord;
 
+import com.sunzee.base.BaseApplication;
 import com.sunzee.base.BasePresenter;
+import com.sunzee.db.WarringBeanDao;
+import com.sunzee.model.domain.WarringBean;
+
+import java.util.Collections;
+import java.util.List;
 
 /**
  * 报警记录界面 presenter
@@ -9,4 +15,12 @@ public class AlarmRecordPresenter extends BasePresenter<AlarmRecordView> {
     public AlarmRecordPresenter(AlarmRecordView view) {
         attachView(view);
     }
+
+    public void getAlarmData() {
+        WarringBeanDao warringBeanDao = BaseApplication.getInstances().getDaoSession().getWarringBeanDao();
+        List<WarringBean> warringBeans = warringBeanDao.loadAll();
+        Collections.reverse(warringBeans);
+        mvpView.showData(warringBeans);
+    }
+    //todo 好像没有销毁。attachview
 }

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

@@ -1,9 +1,13 @@
 package com.sunzee.mvp.alarmrecord;
 
 import com.sunzee.base.BaseView;
+import com.sunzee.model.domain.WarringBean;
+
+import java.util.List;
 
 /**
  * 报警记录界面 view
  */
 public interface AlarmRecordView extends BaseView {
+    void showData(List<WarringBean> warringBeans);
 }

+ 33 - 0
app/src/main/java/com/sunzee/receiver/TimedCleaningTaskAlarmReceiver.java

@@ -0,0 +1,33 @@
+package com.sunzee.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import com.sunzee.model.message.ApiMessageEvent;
+import com.sunzee.utils.AlarmManagerUtil;
+
+import org.greenrobot.eventbus.EventBus;
+
+/**
+ * 监听并启动定时清洗任务广播.
+ */
+public class TimedCleaningTaskAlarmReceiver extends BroadcastReceiver {
+    private static final String TAG = "TimedCleaningTaskAlarmR";
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        // TODO Auto-generated method stub
+        String msg = intent.getStringExtra("msg");
+        long intervalMillis = intent.getLongExtra("intervalMillis", 0);
+        if (intervalMillis != 0) {
+            AlarmManagerUtil.setAlarmTime(context, System.currentTimeMillis() + intervalMillis,
+                    intent);
+        }
+        // todo 定时清洗的逻辑
+        Log.d(TAG, "onReceive: "+msg);
+        EventBus.getDefault().post(new ApiMessageEvent("startClean", "闹钟响了26"));
+    }
+
+
+}

+ 8 - 0
app/src/main/java/com/sunzee/retrofit/ApiStores.java

@@ -69,4 +69,12 @@ public interface ApiStores {
     //上传进阶参数
     @POST()
     Observable<HttpResult<String>> updateParamApi(@Url String url, @Body RequestBody body);
+
+    //请求清洗规则
+    @GET("api/app_synchro/synchroIndex/cleanRule.htm")
+    Observable<HttpResult<String>> cleanRule(@QueryMap Map<String, String> params);
+
+    //上传报警记录
+    @POST("api/app_alarmRecord/alarmRecodeIndex/addAlarmRecord.htm")
+    Observable<HttpResult<String>> addAlarmRecord(@Body RequestBody body);
 }

+ 34 - 6
app/src/main/java/com/sunzee/service/MyIntentService.java

@@ -20,6 +20,8 @@ import com.igexin.sdk.message.GTCmdMessage;
 import com.igexin.sdk.message.GTNotificationMessage;
 import com.igexin.sdk.message.GTTransmitMessage;
 import com.orhanobut.hawk.Hawk;
+import com.sunzee.base.BaseApplication;
+import com.sunzee.model.Global;
 import com.sunzee.model.Heartbeat;
 import com.sunzee.model.HttpResult;
 import com.sunzee.model.domain.GeTuiBean;
@@ -30,6 +32,7 @@ import com.sunzee.model.message.ApiMessageEvent;
 import com.sunzee.retrofit.ApiCallback;
 import com.sunzee.retrofit.ApiClient;
 import com.sunzee.retrofit.ApiStores;
+import com.sunzee.utils.AlarmManagerUtil;
 import com.sunzee.utils.SharedPreferencesUtils;
 import com.wuxiaolong.androidutils.library.LogUtil;
 
@@ -125,6 +128,10 @@ public class MyIntentService extends GTIntentService {
                 //更新参数。
                 updataParam(gson, geTuiBean, kind);
                 break;
+            case "updateRule":
+                //更新定时清洗的任务
+                updataCleanRule(gson, geTuiBean, kind);
+                break;
             //不需要更新广告了,而是更具规则来下载广告。
 //            case "push":
 //                LogUtil.d(TAG, "push: ");
@@ -139,6 +146,31 @@ public class MyIntentService extends GTIntentService {
 
     }
 
+    private void updataCleanRule(Gson gson, GeTuiBean geTuiBean, String kind) {
+        String times = geTuiBean.getKind_data();
+
+        Log.d(TAG, "闹钟响了26onSuccess: " + times);
+        if (!TextUtils.isEmpty(times)) {
+            String[] Alltime = times.split("\\,");
+            //如果之前的数据和现在的数据,数量相同,或者之前的数据小于现在的数据,,那么不清除直接替换。
+            //不可能为0。
+            if (Global.alarmNumber>Alltime.length) {
+                for (int i = 0; i <Global.alarmNumber ; i++) {
+                    AlarmManagerUtil.cancelAlarm(BaseApplication.getContext(),AlarmManagerUtil.ALARM_ACTION,i);
+                }
+            }
+            Global.alarmNumber = Alltime.length;
+            for (int i = 0; i < Alltime.length; i++) {
+                String[] data = Alltime[i].split(":");
+                for (String datum : data) {
+                    Log.d(TAG, "onSuccess: " + datum);
+                }
+                //设置定时闹钟
+                AlarmManagerUtil.setAlarm(BaseApplication.getContext(), 1, Integer.valueOf(data[0]), Integer.valueOf(data[1]), Integer.valueOf(data[2]), i, 0, "闹钟响了26");
+            }
+        }
+    }
+
     private void updataParam(Gson gson, GeTuiBean geTuiBean, String kind) {
         String[] split = geTuiBean.getKind_data().split(":");
         String address = split[0];
@@ -189,7 +221,7 @@ public class MyIntentService extends GTIntentService {
         timerWrite.schedule(timerTaskWrite, 0, 1000);
 
     }
-    
+
 
     private Timer timerSet;
     private TimerTask timerTaskSet;
@@ -403,10 +435,6 @@ public class MyIntentService extends GTIntentService {
     }
 
 
-//    @Subscribe(threadMode = ThreadMode.MAIN)
-//    public void event(ApiMessageEvent messageEvent) {
-//    }
-
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void event(Message messageEvent) {
         switch (messageEvent.getType()) {
@@ -420,7 +448,7 @@ public class MyIntentService extends GTIntentService {
                 Log.d(TAG, "event: 写入成功");
                 stopRst(timerRst, timerTaskRst);
                 stopSet(timerSet, timerTaskSet);
-                stopWrite(timerWrite,timerTaskWrite);
+                stopWrite(timerWrite, timerTaskWrite);
                 Log.d(TAG, "event: ack");
                 break;
             case nak:

+ 318 - 16
app/src/main/java/com/sunzee/service/MyService.java

@@ -10,31 +10,44 @@ import android.content.Intent;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
+import android.os.Handler;
 import android.os.IBinder;
 import android.os.SystemClock;
 import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
 import android.text.TextUtils;
 import android.util.Log;
+import android.view.WindowManager;
 
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
+import com.hboxs.serialport.SerialPortSendQueue;
+import com.hboxs.serialport.frame.ReadCommandFrame;
+import com.hboxs.serialport.frame.ResponseFrame;
+import com.hboxs.serialport.message.Message;
+import com.hboxs.serialport.util.AsciiUtils;
 import com.orhanobut.hawk.Hawk;
 import com.sunzee.R;
 import com.sunzee.base.BaseApplication;
+import com.sunzee.db.WarringBeanDao;
 import com.sunzee.model.Heartbeat;
 import com.sunzee.model.HttpResult;
+import com.sunzee.model.domain.AddAlarmRecordBean;
+import com.sunzee.model.domain.ErrorBean;
 import com.sunzee.model.domain.GetAdBean;
 import com.sunzee.model.domain.HeartbeatBean;
 import com.sunzee.model.domain.Name;
 import com.sunzee.model.domain.TimeRuleBean;
+import com.sunzee.model.domain.WarringBean;
 import com.sunzee.model.message.ApiMessageEvent;
 import com.sunzee.model.message.DownLoadMessageEvent;
 import com.sunzee.receiver.Alarmreceiver;
 import com.sunzee.retrofit.ApiCallback;
 import com.sunzee.retrofit.ApiClient;
 import com.sunzee.retrofit.ApiStores;
+import com.sunzee.ui.dialog.WarringDialog;
 import com.sunzee.utils.FileUtil;
+import com.sunzee.utils.HexadecimalUtil;
 import com.sunzee.utils.SharedPreferencesUtils;
 import com.sunzee.utils.TimeUtil;
 import com.sunzee.utils.ToastUtil;
@@ -46,8 +59,10 @@ import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
 import java.io.File;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -63,9 +78,6 @@ import okhttp3.RequestBody;
 
 public class MyService extends Service {
     private static final String TAG = "MyService";
-    //心跳
-    private Timer timerHeartbeat;
-    private TimerTask taskHeartbeat;
 
     @Nullable
     @Override
@@ -78,6 +90,8 @@ public class MyService extends Service {
         super.onCreate();
         Log.d(TAG, "MyServiceonCreate: ");
         EventBus.getDefault().register(this);
+        // setError( UiUtil.getStringRes(R.string.warring_lutoujiare), true);
+
     }
 
     @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@@ -136,13 +150,25 @@ public class MyService extends Service {
         PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
         //ELAPSED_REALTIME_WAKEUP表示让定时任务的出发时间从系统开机算起,并且会唤醒CPU。
         manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
-
+        if (warringDialog == null) {
+            warringBeanDao = BaseApplication.getInstances().getDaoSession().getWarringBeanDao();
+        }
+        startRead();
         return super.onStartCommand(intent, flags, startId);
         //进程保活相关
-
         //return START_STICKY ;
     }
 
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        EventBus.getDefault().unregister(this);
+    }
+
+    //------------------------------------------------------------------------心跳 start---------------------------------
+    private Timer timerHeartbeat;
+    private TimerTask taskHeartbeat;
+
     /**
      * 开始心跳
      */
@@ -153,13 +179,11 @@ public class MyService extends Service {
             @Override
             public void run() {
                 //经纬度不为0
-//                if (Heartbeat.latitude != 0 && Heartbeat.longitude != 0) {
                 //系统管理不为空
                 String managerId = (String) SharedPreferencesUtils.getParam(Name.SYSTEM_ID, "");
                 if (managerId != null && !TextUtils.isEmpty(managerId)) {
-                    //  sendHeart();
+                    sendHeart();
                 }
-
             }
         };
         timerHeartbeat.schedule(taskHeartbeat, 1000, 1000 * 60 * 5);
@@ -216,6 +240,7 @@ public class MyService extends Service {
         });
     }
 
+
     /**
      * 检测心跳数据以及开始心跳
      */
@@ -241,13 +266,9 @@ public class MyService extends Service {
             timerHeartbeat = null;
         }
     }
+    //------------------------------------------------------------------------心跳 end---------------------------------
 
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        EventBus.getDefault().unregister(this);
-    }
-
+    //——-----------------------------------------------------------------------请求 start------------------------------
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void event(ApiMessageEvent messageEvent) {
         switch (messageEvent.getName()) {
@@ -260,6 +281,10 @@ public class MyService extends Service {
                 Log.d(TAG, "event: DOWNKOADADCID");
                 downAdvertising((String) messageEvent.getData());
                 break;
+            case "startClean":
+                Log.d(TAG, "onReceive:闹钟响了26 " + messageEvent.getData());
+                //开始清洗。全蹲位。
+                break;
             default:
                 break;
 
@@ -294,7 +319,7 @@ public class MyService extends Service {
                         }
                         getAdRuleId("1");
                         Hawk.put("showAdA", getAdBeansA);
-                        Log.d(TAG, "GTIntentService:getAdBeansA2 "+getAdBeansA);
+                        Log.d(TAG, "GTIntentService:getAdBeansA2 " + getAdBeansA);
                         //推送给购买页和制作页更新
                         EventBus.getDefault().post(new DownLoadMessageEvent(DownLoadMessageEvent.Type.downloadAll, "", -1));
                         return;
@@ -386,7 +411,9 @@ public class MyService extends Service {
 
         }
     }
+    //——-----------------------------------------------------------------------请求 end------------------------------
 
+    //_------------------------------------------------------------------------广告 start---------------------------------
     //要显示的棉花糖广告<index,name>
     private Map<Integer, GetAdBean> showSugar;
     //要显示的外接广告<index,name>
@@ -554,7 +581,7 @@ public class MyService extends Service {
             if (corporationAdBeans.size() <= 0) {
                 LogUtil.e(TAG, "onNext: 推送过来的A屏数据相同,不下载");
                 Hawk.put("showAdA", getAdBeansA);
-                Log.d(TAG, "GTIntentService:getAdBeansA 1"+getAdBeansA);
+                Log.d(TAG, "GTIntentService:getAdBeansA 1" + getAdBeansA);
                 //todo
 //                if (syncDialog != null) {
 //                    syncDiaLogUtil.setAdState(R.string.sync_success);
@@ -710,5 +737,280 @@ public class MyService extends Service {
         bundle.putInt("scrrentype", getAdBean.getScreenType());
         downloadApkIntent.putExtra("download", bundle);
         getApplicationContext().startService(downloadApkIntent);
+
+    }
+    //------------------------------------------------------------------------广告 end---------------------------------
+
+    //-----------------------------------------------------------------------报警 start---------------------------------
+    private Timer timerM600;
+    private TimerTask taskM600;
+
+    /**
+     * 开始读取报警
+     */
+    private void startRead() {
+        SerialPortSendQueue.clear();
+        timerM600 = new Timer();
+        taskM600 = new TimerTask() {
+            @Override
+            public void run() {
+                SerialPortSendQueue.sendCommand(new ReadCommandFrame("M600", 8), 600, "M600");
+            }
+        };
+        timerM600.schedule(taskM600, 0, 1000);
+    }
+
+    /**
+     * 停止读取报警
+     */
+    private void stopRead() {
+        if (timerM600 != null) {
+            taskM600.cancel();
+            timerM600.cancel();
+            timerM600 = null;
+        }
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void event(Message messageEvent) {
+        switch (messageEvent.getType()) {
+            case connected:
+                break;
+            case sendError:
+                break;
+            case ack:
+                break;
+            case nak:
+                break;
+            case disconnected:
+                ToastUtil.showToast(messageEvent.getContent().toString());
+                break;
+            case response:
+                ResponseFrame responseFrame = (ResponseFrame) messageEvent.getContent();
+                if (responseFrame.isValidSum()) {
+                    //通过校验
+                    //1 获取本地存储的报警记录
+                    //2 将本地的报警记录进行对比
+                    //3 若没有的进行添加以及上传 没有的不管他
+                    //4 最好走完将他覆盖
+                    if (messageEvent.getName().equals("M600")) {
+                        try {
+                            String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
+                            Log.d(TAG, "resultM600=" + result + ";name" + messageEvent.getName());
+                            List<String> strList = HexadecimalUtil.getStrList(result, 4);
+                            if (result.length() != 16) {
+                                return;
+                            }
+                            StringBuilder sb = new StringBuilder();
+                            for (int i = 0, len = strList.size(); i < len; i++) {
+                                String list = strList.get(i);
+                                String s1 = HexadecimalUtil.hexStringToByte(list);
+                                String s2 = HexadecimalUtil.flipString(s1, 8);
+                                sb.append(s2);
+                            }
+                            String s1 = sb.toString();
+                            List<String> lis = Arrays.asList(s1.split(""));
+                            ArrayList<String> list = new ArrayList(lis);
+                            list.remove(0);
+                            Log.d(TAG, "listevent: " + list);
+                            showErrorDialog(list);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                    break;
+                }
+        }
     }
+
+    private boolean isOpenReadWarring = true;
+    private List<String> errorListM600;
+    //前进阻碍
+    private boolean isadvance;
+    //下降阻碍
+    private boolean isdecline;
+
+    private void showErrorDialog(ArrayList<String> list) {
+        String json = (String) SharedPreferencesUtils.getParam("error_list_M600", "");
+        Gson gson = new Gson();
+        errorListM600 = gson.fromJson(json, new TypeToken<List<String>>() {
+        }.getType());
+        if (errorListM600 == null) {
+            errorListM600 = new ArrayList<>();
+        }
+
+        ArrayList<String> errorList1 = new ArrayList<>();
+        if (list.get(0).equals("1")) {
+            //M600
+            if (!isadvance) {
+                showDialog(R.string.warring_forward_obstaclesM600);
+                setError(0, UiUtil.getStringRes(R.string.warring_forward_obstaclesM600), errorList1, errorListM600, true);
+                isadvance = true;
+            }
+        } else if (list.get(0).equals("0")) {
+            //警告解除 弹窗消失
+            if (isadvance) {
+                if (warringDialog != null) {
+                    warringDialog.dismiss();
+                    isadvance = false;
+                    //延迟三秒再设置。
+                    new Handler().postDelayed(new Runnable() {
+                        @Override
+                        public void run() {
+                            SharedPreferencesUtils.setParam("isOpenReadWarring", true);
+                        }
+                    }, 3000);
+                }
+            }
+        }
+        if (list.get(1).equals("1")) {
+            if (!isdecline) {
+                //M601
+                showDialog(R.string.warring_falling_blockM601);
+                setError(1, UiUtil.getStringRes(R.string.warring_falling_blockM601), errorList1, errorListM600, true);
+                isdecline = true;
+            }
+        } else if (list.get(1).equals("0")) {
+            //警告解除 弹窗消失
+            if (isdecline) {
+                if (warringDialog != null) {
+                    warringDialog.dismiss();
+                    isdecline = false;
+                    //延迟三秒再设置。
+                    new Handler().postDelayed(new Runnable() {
+                        @Override
+                        public void run() {
+                            SharedPreferencesUtils.setParam("isOpenReadWarring", true);
+                        }
+                    }, 3000);
+
+                }
+            }
+        }
+
+        if (list.get(2).equals("1")) {
+            //M602
+            boolean isOpenReadWarring = (boolean) SharedPreferencesUtils.getParam("isOpenReadWarring", true);
+            if (isOpenReadWarring) {
+                showDialog(R.string.warring_x_axis_stepM602);
+                setError(2, UiUtil.getStringRes(R.string.warring_x_axis_stepM602), errorList1, errorListM600, false);
+            }
+        }
+        if (list.get(3).equals("1")) {
+            //M603
+            boolean isOpenReadWarring = (boolean) SharedPreferencesUtils.getParam("isOpenReadWarring", true);
+            if (isOpenReadWarring) {
+                showDialog(R.string.warring_y_axis_stepM603);
+                setError(3, UiUtil.getStringRes(R.string.warring_y_axis_stepM603), errorList1, errorListM600, false);
+            }
+        }
+
+        String s = gson.toJson(errorList1);
+        SharedPreferencesUtils.setParam("error_list_M600", s);
+    }
+
+    private WarringDialog warringDialog;
+
+    private void showDialog(int strId) {
+        SharedPreferencesUtils.setParam("isOpenReadWarring", false);
+        isOpenReadWarring = (boolean) SharedPreferencesUtils.getParam("isOpenReadWarring", true);
+        if (warringDialog == null) {
+            warringDialog = new WarringDialog(this);
+        }
+        warringDialog.setTvContent(strId);
+        warringDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+        if (!warringDialog.isShowing()) {
+            warringDialog.show();
+        }
+
+
+    }
+
+    private WarringBeanDao warringBeanDao;
+
+    /**
+     * @param key
+     * @param reason
+     * @param errorList1 新建的
+     * @param errorListM 存在本地的
+     */
+    public void setError(int key, String reason, ArrayList<String> errorList1, List<String> errorListM, boolean isM660) {
+        long date = System.currentTimeMillis();
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date curDate = new Date(date);
+        String time = formatter.format(curDate);
+        ErrorBean errorBean = new ErrorBean();
+        errorBean.setTime(time);
+        errorBean.setThingError(reason);
+        errorBean.setRemark("");
+
+        AddAlarmRecordBean addAlarmRecordBean = new AddAlarmRecordBean(reason, Heartbeat.deviceId, time, "");
+        WarringBean warringBean = new WarringBean();
+        warringBean.setTime(date);
+        warringBean.setThingError(reason);
+        warringBeanDao.insert(warringBean);
+        errorList1.add(key + "");
+        if (errorListM == null) {
+            //只用于上传M666
+            Log.d(TAG + "22", "setError: 上传");
+            Gson gson = new Gson();
+            String json = gson.toJson(addAlarmRecordBean);
+            RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json);
+//            //上传到服务器
+            addSubscription(apiStores.addAlarmRecord(body), new ApiCallback<HttpResult<String>>() {
+                @Override
+                public void onSuccess(HttpResult<String> model) {
+                    if (model.getData() != null) {
+                        Log.d(TAG, "onSuccess: " + model);
+                        Log.d("AddAlarmRecordApi", "onNext: " + model.getData());
+                    }
+                }
+
+                @Override
+                public void onFailure(String msg) {
+
+                }
+
+                @Override
+                public void onFinish() {
+
+                }
+            });
+            return;
+        }
+        if (!errorListM.contains(key + "")) {
+            //不包含,上传
+            Log.d(TAG + "22", "setError: 上传");
+
+            Gson gson = new Gson();
+            String json = gson.toJson(addAlarmRecordBean);
+
+            RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json);
+
+            //上传到服务器
+            addSubscription(apiStores.addAlarmRecord(body), new ApiCallback<HttpResult<String>>() {
+                @Override
+                public void onSuccess(HttpResult<String> model) {
+                    Log.d(TAG, "onSuccess: " + model);
+                    if (model.getData() != null) {
+                        Log.d("AddAlarmRecordApi", "onNext: " + model.getData());
+                    }
+                }
+
+                @Override
+                public void onFailure(String msg) {
+
+                }
+
+                @Override
+                public void onFinish() {
+
+                }
+            });
+        } else {
+            Log.d(TAG + "22", "setError: 不上传");
+        }
+    }
+    //-----------------------------------------------------------------------报警 end---------------------------------
+
 }

+ 21 - 6
app/src/main/java/com/sunzee/ui/activity/AdvertisingActivity.java

@@ -8,6 +8,7 @@ import android.text.format.DateFormat;
 import android.util.Log;
 import android.view.SurfaceView;
 import android.view.View;
+import android.view.WindowManager;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
@@ -19,6 +20,8 @@ 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.ui.dialog.WarringDialog;
+import com.sunzee.utils.AlarmManagerUtil;
 import com.sunzee.utils.GeTuiUtil;
 import com.sunzee.utils.LongClickUtils;
 import com.sunzee.utils.SimplePlayerUtils;
@@ -29,12 +32,13 @@ import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
 import java.io.File;
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Timer;
 import java.util.TimerTask;
 
 /**
- * 广告界面
+ * 广告界面 activity
  */
 public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> implements AdvertisingView {
 
@@ -51,7 +55,7 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
     private TextView mTvTime;
     private MyHandler myHandler;
     private TextView mTvEquipmentNo;
-
+    private WarringDialog warringDialog;
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -61,7 +65,7 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
         mGeTuiUtil.geTui();
         initView();
         initEvent();
-
+        AlarmManagerUtil.setAlarm(this, 1, 12, 16, 0, 6, 0, "闹钟响了32");
     }
 
     private void initEvent() {
@@ -77,7 +81,7 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
     }
 
     private void initView() {
-        myHandler = new MyHandler();
+        myHandler = new MyHandler(this);
         mAdSurfaceView = findViewById(R.id.sf_cor_ad);
         mAdImageview = findViewById(R.id.iv_cor_ad);
         mAdbSurfaceView = findViewById(R.id.sf_cor_adb);
@@ -94,7 +98,10 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
         mRightsimplePlayer = new SimplePlayerUtils(mAdSurfaceView);
         mRightsimplePlayer.setImageView(mAdImageview);
         mLeftsimplePlayer = new SimplePlayerUtils(mAdbSurfaceView);
+        mLeftsimplePlayer.CloseVolume();
         mLeftsimplePlayer.setImageView(mAdbImageview);
+        LogUtil.d(TAG, "setup: " + mRightsimplePlayer);
+        LogUtil.d(TAG, "setup: " + mLeftsimplePlayer);
         play();
         startRefreshime();
     }
@@ -113,6 +120,7 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
     @Override
     public void playRight(ArrayList<File> playFile) {
         mRightsimplePlayer.setFileData(playFile);
+
         mRightsimplePlayer.playVideo();
     }
 
@@ -168,15 +176,22 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
         return new AdvertisingPresenter(this);
     }
 
-    public class MyHandler extends Handler {
+    public static class MyHandler extends Handler {
+        //持有弱引用HandlerActivity,GC回收时会被回收掉.
+        private final WeakReference<AdvertisingActivity> mActivty;
+
+        public MyHandler(AdvertisingActivity activity) {
+            mActivty = new WeakReference<AdvertisingActivity>(activity);
+        }
 
         @Override
         public void handleMessage(android.os.Message msg) {
+            AdvertisingActivity activity = mActivty.get();
             switch (msg.what) {
                 case 1:
                     long sysTime = System.currentTimeMillis();//获取系统时间
                     CharSequence sysTimeStr = DateFormat.format("yyyy-MM-dd HH:mm:ss", sysTime);//时间显示格式
-                    mTvTime.setText(sysTimeStr);
+                    activity.mTvTime.setText(sysTimeStr);
                     break;
             }
         }

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

@@ -48,7 +48,7 @@ import org.greenrobot.eventbus.ThreadMode;
 import java.io.File;
 
 /**
- * 后台首页 page
+ * 后台首页 activity
  */
 public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView, View.OnClickListener, DownPresenter.ProgressUpdate {
 

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

@@ -15,7 +15,7 @@ import com.sunzee.mvp.login.LoginView;
 import com.sunzee.utils.ToastUtil;
 
 /**
- * 登录界面
+ * 登录界面 activity
  */
 public class LoginActivity extends MvpActivity<LoginPresenter> implements LoginView, View.OnClickListener {
 
@@ -23,6 +23,7 @@ public class LoginActivity extends MvpActivity<LoginPresenter> implements LoginV
     private EditText mEtUserPassword;
     private TextView mTvUuserLogin;
     private View mLlHideKeyMap;
+    private TextView mTvBak;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -31,14 +32,17 @@ public class LoginActivity extends MvpActivity<LoginPresenter> implements LoginV
         initView();
     }
 
+
     private void initView() {
         mEtUserName = findViewById(R.id.et_username);
         mEtUserPassword = findViewById(R.id.et_userpassword);
         mEtUserPassword.requestFocus();
         mTvUuserLogin = findViewById(R.id.tv_userlogin);
         mLlHideKeyMap = findViewById(R.id.ll_hidekeymap);
+        mTvBak = findViewById(R.id.tv_back);
         mTvUuserLogin.setOnClickListener(this);
         mLlHideKeyMap.setOnClickListener(this);
+        mTvBak.setOnClickListener(this);
     }
 
     @Override
@@ -82,6 +86,15 @@ public class LoginActivity extends MvpActivity<LoginPresenter> implements LoginV
                 //登录功能,只需要提供字符串就可以进行一个判断。
                 mvpPresenter.login(mEtUserName.getText().toString().trim(), mEtUserPassword.getText().toString().trim());
                 break;
+            case R.id.tv_back:
+                gotoAdvertisingActivity();
+                break;
         }
     }
+
+    private void gotoAdvertisingActivity() {
+        startActivity(new Intent(LoginActivity.this, AdvertisingActivity.class));
+        finish();
+    }
+
 }

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

@@ -12,7 +12,7 @@ import android.widget.Toast;
 import com.sunzee.R;
 
 /**
- * 连接服务器的对话框
+ * 连接服务器的对话框 dialog
  */
 public class ManagementSystemDialog extends Dialog {
     //在构造方法里提前加载了样式

+ 1 - 3
app/src/main/java/com/sunzee/ui/dialog/NormalDialog.java

@@ -16,9 +16,7 @@ import com.sunzee.utils.SharedPreferencesUtils;
 import com.sunzee.utils.UiUtil;
 
 /**
- * @author whw
- * @time 2019/3/13
- * @Description 普通样式弹框
+ * 通用对话框 dialog[检查更新]
  */
 public class NormalDialog extends Dialog implements View.OnClickListener {
 

+ 4 - 5
app/src/main/java/com/sunzee/ui/dialog/ResultDialog.java

@@ -10,21 +10,20 @@ import com.sunzee.R;
 
 
 /**
- * Created by MinKin
- * 2018/12/25
+ * 通用 dialog
  */
 public class ResultDialog extends Dialog {
 
     TextView tvResult;
 
     public ResultDialog(@NonNull Context context, Activity activity) {
-        super(context,R.style.DialogBgD);//加载样式
+        super(context, R.style.DialogBgD);//加载样式
         setContentView(R.layout.dialog_normal);
         initView();
     }
 
     protected void initView() {
-        tvResult=findViewById(R.id.tv_result);
+        tvResult = findViewById(R.id.tv_result);
     }
 
     public void onViewClicked() {
@@ -34,7 +33,7 @@ public class ResultDialog extends Dialog {
     /**
      * 设置结果
      */
-    public void setResult(String result){
+    public void setResult(String result) {
         tvResult.setText(result);
     }
 }

+ 1 - 3
app/src/main/java/com/sunzee/ui/dialog/ShutdownDialog.java

@@ -17,9 +17,7 @@ import com.sunzee.utils.ToastUtil;
 import com.sunzee.utils.UiUtil;
 
 /**
- * @author whw
- * @time 2019/3/13
- * @Description 普通样式弹框
+ * 开关机对话框 dialog
  */
 public class ShutdownDialog extends Dialog implements View.OnClickListener {
 

+ 116 - 0
app/src/main/java/com/sunzee/ui/dialog/WarringDialog.java

@@ -0,0 +1,116 @@
+package com.sunzee.ui.dialog;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Handler;
+import android.support.annotation.NonNull;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.sunzee.R;
+import com.sunzee.utils.LongClickUtils;
+import com.sunzee.utils.UiUtil;
+import com.wuxiaolong.androidutils.library.LogUtil;
+
+/**
+ * @Description 警报框
+ */
+public class WarringDialog extends Dialog {
+    private Context mContext;
+    private TextView tvContent;
+    private TextView tvContent1;
+    private Button btnDimiss, btnDimiss1;
+    private boolean isTouch;
+    private ImageView mIvImg;
+
+    public WarringDialog(@NonNull Context context) {
+        super(context, R.style.DialogBgD);//加载样式
+        mContext = context;
+        setContentView(R.layout.dialog_text);
+        initView();
+        initEvent();
+    }
+
+    private void initEvent() {
+        //长按3秒
+        LongClickUtils.setLongClick(new Handler(), mIvImg, 3000, new View.OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View v) {
+                dismiss();
+                return false;
+            }
+        });
+    }
+
+    private void initView() {
+        tvContent = findViewById(R.id.tv_content);
+        tvContent1 = findViewById(R.id.tv_content1);
+        btnDimiss = findViewById(R.id.btn_dimiss);
+        btnDimiss1 = findViewById(R.id.btn_dimiss1);
+        mIvImg = findViewById(R.id.iv_img);
+    }
+
+    public void setIvImag(int resId) {
+    }
+
+    @Override
+    public void show() {
+        super.show();
+        isTouch = false;
+        LogUtil.d("WarringDialog", "show");
+    }
+    public void setTvContent(int strId) {
+        tvContent.setText(strId);
+//        switch (strId) {
+//            case R.string.warring_gunhechugun:
+//                mIvImg.setImageResource(R.drawable.warring_gunhequegunbaojing);
+//                break;
+//            case R.string.warring_gunhequegunbaojing:
+//                mIvImg.setImageResource(R.drawable.warring_gunhequegunbaojing);
+//                break;
+//            case R.string.warring_qshqs:
+//                mIvImg.setImageResource(R.drawable.warring_qshqs);
+//                break;
+//            case R.string.warring_fsm:
+//                mIvImg.setImageResource(R.drawable.warring_fsm);
+//                break;
+//            case R.string.warring_qbt:
+//                mIvImg.setImageResource(R.drawable.warring_qbt);
+//                break;
+//            case R.string.warring_qht:
+//                mIvImg.setImageResource(R.drawable.warring_qht);
+//                break;
+//            case R.string.warring_qhuangt:
+//                mIvImg.setImageResource(R.drawable.warring_qhuangt);
+//                break;
+//            case R.string.warring_qlt:
+//                mIvImg.setImageResource(R.drawable.warring_qlt);
+//                break;
+//            case R.string.warring_sbfw:
+//                mIvImg.setImageResource(R.drawable.warring_sbfw);
+//                break;
+//            case R.string.warring_wcqg:
+//                mIvImg.setImageResource(R.drawable.warring_wcqg);
+//                break;
+//            case R.string.warring_gdjc:
+//                mIvImg.setImageResource(R.drawable.warring_gdjc);
+//                break;
+//            case R.string.warring_qbcqjc:
+//                mIvImg.setImageResource(R.drawable.warring_qbcqjc);
+//                break;
+//            default:
+//                mIvImg.setImageResource(R.drawable.bb);
+//                break;
+//        }
+//        String contactsNum = (String) SharedPreferencesUtils.getParam(Name.CONTACTS_NUM, "");
+//        String contactsName = (String) SharedPreferencesUtils.getParam(Name.CONTACTS_NAME, "");
+        tvContent1.setText(UiUtil.getStringRes(R.string.warring_content1) /*+ contactsName + "-" + contactsNum*/);
+    }
+
+    @Override
+    public void dismiss() {
+        super.dismiss();
+    }
+}

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

@@ -39,7 +39,7 @@ import org.greenrobot.eventbus.ThreadMode;
 import java.util.ArrayList;
 
 /**
- * 进阶参数界面
+ * 进阶参数界面 fragment
  */
 public class AdvanceParameterFragment extends MvpFragment<AdvanceParameterPresenter> implements AdvanceParameterView {
 

+ 38 - 2
app/src/main/java/com/sunzee/ui/fragment/AlarmRecordFragment.java

@@ -3,30 +3,60 @@ package com.sunzee.ui.fragment;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
 import com.sunzee.R;
+import com.sunzee.adapter.RvAlarmAdapter;
+import com.sunzee.base.BaseApplication;
 import com.sunzee.base.MvpFragment;
+import com.sunzee.model.domain.WarringBean;
 import com.sunzee.mvp.alarmrecord.AlarmRecordPresenter;
 import com.sunzee.mvp.alarmrecord.AlarmRecordView;
+import com.sunzee.utils.CustomDecoration;
+
+import java.util.List;
 
 /**
- * 报警记录界面
+ * 报警记录界面 fragment
  */
 public class AlarmRecordFragment extends MvpFragment<AlarmRecordPresenter> implements AlarmRecordView {
 
+    private RecyclerView mRvAlarm;
+
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
         View inflate = inflater.inflate(R.layout.fragment_alarm_record, container, false);
+        initView(inflate);
         return inflate;
     }
 
+    private void initView(View inflate) {
+        mRvAlarm = inflate.findViewById(R.id.rv_alarm);
+        LinearLayoutManager layoutManager = new LinearLayoutManager(BaseApplication.getContext());
+        mRvAlarm.setLayoutManager(layoutManager);
+        mRvAlarm.addItemDecoration(new CustomDecoration(BaseApplication.getContext(), LinearLayoutManager.VERTICAL,2));
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mvpPresenter.getAlarmData();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+
+    }
+
     @Override
     protected AlarmRecordPresenter createPresenter() {
-        return null;
+        return new AlarmRecordPresenter(this);
     }
 
     @Override
@@ -38,4 +68,10 @@ public class AlarmRecordFragment extends MvpFragment<AlarmRecordPresenter> imple
     public void hideLoading() {
 
     }
+
+    @Override
+    public void showData(List<WarringBean> warringBeans) {
+        RvAlarmAdapter adapter=new RvAlarmAdapter(warringBeans);
+        mRvAlarm.setAdapter(adapter);
+    }
 }

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

@@ -36,7 +36,7 @@ import java.util.Arrays;
 import java.util.List;
 
 /**
- * 调试页界面
+ * 调试页界面 fragment
  */
 public class DebugFragment extends MvpFragment<DebugPresenter> implements DebugView {
     private final int[] paraName = {

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

@@ -32,7 +32,7 @@ import org.greenrobot.eventbus.ThreadMode;
 import java.util.ArrayList;
 
 /**
- * 通用参数界面
+ * 通用参数界面 fragment
  */
 public class GeneralParameterFragment extends MvpFragment<GeneralParameterPresenter> implements GeneralParameterView {
     private final int[] paraName = {R.string.all_clean};

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

@@ -13,7 +13,7 @@ import com.sunzee.mvp.homepage.HomePagePresenter;
 import com.sunzee.mvp.homepage.HomePageView;
 
 /**
- * 首页界面
+ * 首页界面 fragment
  */
 public class HomepageFragment extends MvpFragment<HomePagePresenter> implements HomePageView {
 

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

@@ -13,7 +13,7 @@ import com.sunzee.mvp.languageset.LanguageSetPresenter;
 import com.sunzee.mvp.languageset.LanguageSetView;
 
 /**
- * 语言设置界面
+ * 语言设置界面 fragment
  */
 public class LanguageSetFragment extends MvpFragment<LanguageSetPresenter> implements LanguageSetView {
 

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

@@ -13,7 +13,7 @@ import com.sunzee.mvp.other.OtherPresenter;
 import com.sunzee.mvp.other.OtherView;
 
 /**
- * 其他页界面
+ * 其他页界面 fragment
  */
 public class OtherFragment extends MvpFragment<OtherPresenter> implements OtherView {
 

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

@@ -22,7 +22,7 @@ import com.sunzee.utils.ToastUtil;
 import com.sunzee.utils.UiUtil;
 
 /**
- * 重置密码界面
+ * 重置密码界面 fragment
  */
 public class PasswordResetFragment extends MvpFragment<PasswordResetPresenter> implements PasswordResetView, View.OnClickListener {
 

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

@@ -13,7 +13,7 @@ import com.sunzee.mvp.showmaterial.ShowMaterialPresenter;
 import com.sunzee.mvp.showmaterial.ShowMaterialView;
 
 /**
- * 查看物料界面
+ * 查看物料界面 fragment
  */
 public class ShowMaterialFragment extends MvpFragment<ShowMaterialPresenter> implements ShowMaterialView {
 

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

@@ -13,7 +13,7 @@ import com.sunzee.mvp.statistics.StatisticsPresenter;
 import com.sunzee.mvp.statistics.StatisticsView;
 
 /**
- * 数据统计界面
+ * 数据统计界面 fragment
  */
 public class StatisticsFragment extends MvpFragment<StatisticsPresenter> implements StatisticsView {
 

+ 1 - 1
app/src/main/java/com/sunzee/utils/AdvacedUtil.java

@@ -8,7 +8,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * 进阶参数的参数的16 17 18 22 23 24 的读写
+ * 进阶参数 进制转换
  */
 public class AdvacedUtil {
 

+ 130 - 0
app/src/main/java/com/sunzee/utils/AlarmManagerUtil.java

@@ -0,0 +1,130 @@
+package com.sunzee.utils;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.util.Log;
+
+import java.util.Calendar;
+
+/**
+ * AlarmManager定时闹钟任务工具类[和timer的定时任务不一样]
+ */
+public class AlarmManagerUtil {
+    public static final String ALARM_ACTION = "android.intent.action.Timed_Cleaning_Task";
+
+    public static void setAlarmTime(Context context, long timeInMillis, Intent intent) {
+        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+        PendingIntent sender = PendingIntent.getBroadcast(context, intent.getIntExtra("id", 0),
+                intent, PendingIntent.FLAG_CANCEL_CURRENT);
+        int interval = (int) intent.getLongExtra("intervalMillis", 0);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+            am.setWindow(AlarmManager.RTC_WAKEUP, timeInMillis, interval, sender);
+        }
+    }
+
+    private static final String TAG = "AlarmManagerUtil";
+    public static void cancelAlarm(Context context, String action, int id) {
+        Intent intent = new Intent(action);
+        Log.d(TAG, "cancelAlarm: context:"+context+";id:"+id+";action:"+action);
+        PendingIntent pi = PendingIntent.getBroadcast(context, id, intent, PendingIntent
+                .FLAG_CANCEL_CURRENT);
+        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+        am.cancel(pi);
+    }
+
+    /**
+     * @param flag            周期性时间间隔的标志,flag = 0 表示一次性的闹钟, flag = 1 表示每天提醒的闹钟(1天的时间间隔),flag = 2
+     *                        表示按周每周提醒的闹钟(一周的周期性时间间隔)
+     * @param hour            时
+     * @param minute          分
+     * @param id              闹钟的id
+     * @param week            week=0表示一次性闹钟或者按天的周期性闹钟,非0 的情况下是几就代表以周为周期性的周几的闹钟
+     * @param tips            闹钟提示信息
+     */
+    public static void setAlarm(Context context, int flag, int hour, int minute, int second, int id, int
+            week, String tips) {
+        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+        Calendar calendar = Calendar.getInstance();
+        long intervalMillis = 0;
+        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get
+                (Calendar.DAY_OF_MONTH), hour, minute, second);
+        if (flag == 0) {
+            intervalMillis = 0;
+        } else if (flag == 1) {
+            intervalMillis = 24 * 3600 * 1000;
+        } else if (flag == 2) {
+            intervalMillis = 24 * 3600 * 1000 * 7;
+        }
+        Intent intent = new Intent(ALARM_ACTION);
+        intent.putExtra("intervalMillis", intervalMillis);
+        intent.putExtra("msg", tips);
+        intent.putExtra("id", id);
+        PendingIntent sender = PendingIntent.getBroadcast(context, id, intent, PendingIntent
+                .FLAG_CANCEL_CURRENT);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+            am.setWindow(AlarmManager.RTC_WAKEUP, calMethod(week, calendar.getTimeInMillis()),
+                    intervalMillis, sender);
+        } else {
+            if (flag == 0) {
+                am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
+            } else {
+                am.setRepeating(AlarmManager.RTC_WAKEUP, calMethod(week, calendar.getTimeInMillis
+                        ()), intervalMillis, sender);
+            }
+        }
+    }
+
+
+    /**
+     * @param weekflag 传入的是周几
+     * @param dateTime 传入的是时间戳(设置当天的年月日+从选择框拿来的时分秒)
+     * @return 返回起始闹钟时间的时间戳
+     */
+    private static long calMethod(int weekflag, long dateTime) {
+        long time = 0;
+        //weekflag == 0表示是按天为周期性的时间间隔或者是一次行的,weekfalg非0时表示每周几的闹钟并以周为时间间隔
+        if (weekflag != 0) {
+            Calendar c = Calendar.getInstance();
+            int week = c.get(Calendar.DAY_OF_WEEK);
+            if (1 == week) {
+                week = 7;
+            } else if (2 == week) {
+                week = 1;
+            } else if (3 == week) {
+                week = 2;
+            } else if (4 == week) {
+                week = 3;
+            } else if (5 == week) {
+                week = 4;
+            } else if (6 == week) {
+                week = 5;
+            } else if (7 == week) {
+                week = 6;
+            }
+
+            if (weekflag == week) {
+                if (dateTime > System.currentTimeMillis()) {
+                    time = dateTime;
+                } else {
+                    time = dateTime + 7 * 24 * 3600 * 1000;
+                }
+            } else if (weekflag > week) {
+                time = dateTime + (weekflag - week) * 24 * 3600 * 1000;
+            } else if (weekflag < week) {
+                time = dateTime + (weekflag - week + 7) * 24 * 3600 * 1000;
+            }
+        } else {
+            if (dateTime > System.currentTimeMillis()) {
+                time = dateTime;
+            } else {
+                time = dateTime + 24 * 3600 * 1000;
+            }
+        }
+        return time;
+    }
+
+
+}

+ 138 - 0
app/src/main/java/com/sunzee/utils/CustomDecoration.java

@@ -0,0 +1,138 @@
+package com.sunzee.utils;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+import com.sunzee.R;
+
+/**
+ * @author whw
+ * @time 2019/3/18
+ * @Description 作用
+ */
+public class CustomDecoration extends RecyclerView.ItemDecoration {
+
+    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
+    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
+    private Drawable mDivider;
+    private int mOrientation;
+    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
+    /**
+     * 分割线缩进值
+     */
+    private int inset;
+    private Paint paint;
+    private int mDividerHeight;  //分割线高度
+
+    /**
+     * @param context * @param orientation layout的方向  * @param drawable  引入的drawable的ID  * @param inset    分割线缩进值
+     */
+    public CustomDecoration(Context context, int orientation, int inset) {
+        final TypedArray a = context.obtainStyledAttributes(ATTRS);
+        mDivider = a.getDrawable(0);
+        a.recycle();
+        paint = new Paint();
+        paint.setColor(context.getResources().getColor(R.color.white));
+        paint.setStyle(Paint.Style.FILL);
+        paint.setAntiAlias(true);
+        mDividerHeight=inset;
+        setOrientation(orientation);
+    }
+
+    public void setOrientation(int orientation) {
+        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
+            throw new IllegalArgumentException("invalid orientation");
+        }
+        mOrientation = orientation;
+    }
+
+    @Override
+    public void onDraw(Canvas c, RecyclerView parent) {
+        if (mOrientation == VERTICAL_LIST) {
+            drawVertical(c, parent);
+        } else {
+            drawHorizontal(c, parent);
+        }
+    }
+
+    private void drawVertical(Canvas c, RecyclerView parent) {
+        final int left = parent.getPaddingLeft();
+        final int right = parent.getWidth() - parent.getPaddingRight();
+        final int childCount = parent.getChildCount();
+        //最后一个item不画分割线
+        for (int i = 1; i < childCount - 1; i++) {
+            final View child = parent.getChildAt(i);
+            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
+            final int top = child.getBottom() + params.bottomMargin;
+            final int bottom = top + mDivider.getIntrinsicHeight();
+            if (inset > 0) {
+                c.drawRect(left, top, right, bottom, paint);
+                mDivider.setBounds(left + inset, top, right - inset, bottom);
+            } else {
+                mDivider.setBounds(left, top, right, bottom);
+            }
+            mDivider.draw(c);
+        }
+    }
+
+    private void drawHorizontal(Canvas c, RecyclerView parent) {
+        final int top = parent.getPaddingTop();
+        final int bottom = parent.getHeight() - parent.getPaddingBottom();
+        final int childCount = parent.getChildCount();
+        for (int i = 0; i < childCount - 1; i++) {
+            final View child = parent.getChildAt(i);
+            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
+            final int left = child.getRight() + params.rightMargin;
+            final int right = left + mDivider.getIntrinsicHeight();
+            mDivider.setBounds(left, top, right, bottom);
+            mDivider.draw(c);
+        }
+    }
+
+//    //由于Divider也有宽高,每一个Item需要向下或者向右偏移
+//    @Override
+//    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
+//        if (mOrientation == VERTICAL_LIST) {
+//            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
+//        } else {
+//            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
+//        }
+//    }
+
+    /**
+     *获取分割线尺寸
+     * 可以去掉任意位置的尺寸
+     */
+
+    @Override
+    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
+        super.getItemOffsets(outRect, view, parent, state);
+
+        int childAdapterPosition = parent.getChildAdapterPosition(view);
+
+        int lastCount = parent.getAdapter().getItemCount() - 1;
+
+//        if (childAdapterPosition == 0) {
+//            outRect.set(0, 0, 0, 0);
+//            return;
+//        }
+
+        if (childAdapterPosition == lastCount) {
+            outRect.set(0, 0, 0, 0);
+            return;
+        }
+        outRect.set(0, 0, 0, mDividerHeight);
+
+    }
+
+
+
+
+}

+ 1 - 2
app/src/main/java/com/sunzee/utils/DensityUtil.java

@@ -4,8 +4,7 @@ package com.sunzee.utils;
 import com.sunzee.base.BaseApplication;
 
 /**
- * 设备信息
- * Created by MinKin
+ * 单位准换
  */
 public class DensityUtil {
 

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

@@ -14,6 +14,9 @@ import com.sunzee.service.MyPushService;
 
 import java.io.File;
 
+/**
+ * 个推工具类
+ */
 public class GeTuiUtil {
 
     private Activity activity;

+ 0 - 2
app/src/main/java/com/sunzee/utils/HexadecimalUtil.java

@@ -7,8 +7,6 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * @author whw
- * @time 2019/3/4
  * @Description 进制操作工具类
  */
 public class HexadecimalUtil {

+ 1 - 3
app/src/main/java/com/sunzee/utils/LongClickUtils.java

@@ -5,9 +5,7 @@ import android.view.MotionEvent;
 import android.view.View;
 
 /**
- * @author whw
- * @time 2019/3/6
- * @Description 长按事件监听
+ * 长按事件监听
  */
 public class LongClickUtils {
 

+ 34 - 23
app/src/main/java/com/sunzee/utils/SimplePlayerUtils.java

@@ -4,6 +4,8 @@ import android.annotation.SuppressLint;
 import android.media.MediaPlayer;
 import android.os.Handler;
 import android.os.Message;
+import android.text.format.DateFormat;
+import android.util.Log;
 import android.view.Surface;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
@@ -13,9 +15,11 @@ import android.widget.ImageView;
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.request.RequestOptions;
 import com.sunzee.base.BaseApplication;
+import com.sunzee.ui.activity.AdvertisingActivity;
 import com.wuxiaolong.androidutils.library.LogUtil;
 
 import java.io.File;
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Timer;
@@ -26,13 +30,11 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.functions.Consumer;
 import io.reactivex.schedulers.Schedulers;
 
-//import com.bumptech.glide.Glide;
-//import com.bumptech.glide.request.RequestOptions;
-
+/**
+ * 视频图片播放工具类
+ */
 public class SimplePlayerUtils implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {
-
     private SurfaceView mSurfaceView;
-
     private ImageView mImageView;
     private Surface surface;
     private static final String TAG = "SimplePlayer";
@@ -43,24 +45,31 @@ public class SimplePlayerUtils implements MediaPlayer.OnPreparedListener, MediaP
     private int index;
     private Timer mTimer;
     private TimerTask mTimerTask;
-    private String mPath;
+    private static String mPath;
+    private final MyHandler mHandler;
 
     public SimplePlayerUtils(SurfaceView surfaceView) {
         this.mSurfaceView = surfaceView;
+        mHandler = new MyHandler();
+        LogUtil.d(TAG, "setup: " + mHandler);
         setup();
     }
 
+    public void CloseVolume() {
+        iMediaPlayer.setVolume(0, 0);
+    }
+
     public void setImageView(ImageView imageView) {
         mImageView = imageView;
     }
 
     private void setup() {
         iMediaPlayer = new MediaPlayer();
+        LogUtil.d(TAG, "setup: " + iMediaPlayer);
         if (mSurfaceView != null) {
             holder = mSurfaceView.getHolder();
             holder.addCallback(new SimplePlayerUtils.SimplayerCallBack());
         }
-
         iMediaPlayer.setOnPreparedListener(this);
         iMediaPlayer.setOnCompletionListener(this);
         iMediaPlayer.setOnErrorListener(this);
@@ -87,7 +96,7 @@ public class SimplePlayerUtils implements MediaPlayer.OnPreparedListener, MediaP
         mPath = urlLinkedList.get(index).getAbsolutePath();
         String[] format = mPath.split("\\.");
         if (format[1].equals("mp4")) {
-            handle.sendEmptyMessage(1);
+            mHandler.sendEmptyMessage(1);
             try {
                 Flowable.just(mPath)
                         .subscribeOn(AndroidSchedulers.mainThread())
@@ -102,7 +111,7 @@ public class SimplePlayerUtils implements MediaPlayer.OnPreparedListener, MediaP
                                 try {
                                     if (iMediaPlayer.isPlaying()) {
                                         error = false;
-                                        LogUtil.d(TAG + "i", "isPlaying");
+                                        LogUtil.d(TAG + "accepti", "isPlaying");
                                         iMediaPlayer.stop();
                                     }
                                     iMediaPlayer.reset();
@@ -125,21 +134,22 @@ public class SimplePlayerUtils implements MediaPlayer.OnPreparedListener, MediaP
                 LogUtil.e(TAG, "异常 -1:" + e.toString());
             }
         } else if (format[1].equals("png")) {
-            handle.sendEmptyMessage(2);
+            //为视频还没播放完就结束了,所以我们需要这关闭视频。否则回出现问题的
+            mHandler.sendEmptyMessage(2);
+            if (iMediaPlayer.isPlaying()) {
+                error = false;
+                LogUtil.d(TAG + "accepti", "isPlaying");
+                iMediaPlayer.stop();
+            }
+            iMediaPlayer.reset();
             startPlayImg();
         }
 
     }
 
-    public MediaPlayer getPlayer() {
-        return iMediaPlayer;
-    }
-
-
     public void onDestroy() {
         LogUtil.d(TAG + "i", "onDestroy");
         error = true;
-        handle.removeCallbacksAndMessages(null);
         if (iMediaPlayer != null) {
             iMediaPlayer.release();
             iMediaPlayer.setOnCompletionListener(null);
@@ -152,6 +162,7 @@ public class SimplePlayerUtils implements MediaPlayer.OnPreparedListener, MediaP
             surface = null;
         }
         stopPlayImg(mTimer, mTimerTask);
+        mHandler.removeCallbacksAndMessages(null);
     }
 
     @Override
@@ -210,11 +221,12 @@ public class SimplePlayerUtils implements MediaPlayer.OnPreparedListener, MediaP
                     index = 0;
                 }
                 playVideo();
+
             }
         };
 
         //播放10秒
-        mTimer.schedule(mTimerTask, 1000 * 5);
+        mTimer.schedule(mTimerTask, 1000 * 10);
     }
 
     /**
@@ -225,15 +237,14 @@ public class SimplePlayerUtils implements MediaPlayer.OnPreparedListener, MediaP
             task.cancel();
             timer.purge();
             timer.cancel();
+            timer = null;
+            task = null;
         }
     }
 
-    public Handler handle = new Handler() {
-
-        @SuppressLint("HandlerLeak")
+    public class MyHandler extends Handler {
         @Override
-        public void handleMessage(Message msg) {
-            super.handleMessage(msg);
+        public void handleMessage(android.os.Message msg) {
             switch (msg.what) {
                 case 1:
                     mImageView.setVisibility(View.GONE);
@@ -249,5 +260,5 @@ public class SimplePlayerUtils implements MediaPlayer.OnPreparedListener, MediaP
                     break;
             }
         }
-    };
+    }
 }

+ 0 - 2
app/src/main/java/com/sunzee/utils/TimeUtil.java

@@ -11,8 +11,6 @@ import java.util.Calendar;
 import java.util.Date;
 
 /**
- * @author whw
- * @time 2019/4/9
  * @Description 时间工具类
  */
 public class TimeUtil {

+ 0 - 1
app/src/main/java/com/sunzee/utils/ToastUtil.java

@@ -8,7 +8,6 @@ import com.sunzee.base.BaseApplication;
 
 /**
  * 吐司工具类
- * Created By MinKin.
  */
 public class ToastUtil {
 

+ 0 - 1
app/src/main/java/com/sunzee/utils/UiUtil.java

@@ -9,7 +9,6 @@ import java.lang.reflect.Field;
 
 /**
  * 获取字符串、颜色
- * Created By MinKin.
  */
 public class UiUtil {
 

+ 15 - 0
app/src/main/res/drawable/shape_line_left.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape>
+            <solid android:color="@color/logo_blue" />
+        </shape>
+    </item>
+    <!--    想保留哪一边就设置哪一边边框,列如只有下边框:bottom="0.7dp",相应的有上top="",left="",right=""    -->
+    <item android:left="1dp">
+        <shape>
+            <solid android:color="@color/white" />//整个框背景颜色
+        </shape>
+    </item>
+
+</layer-list>

+ 15 - 0
app/src/main/res/drawable/shape_line_right.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape>
+            <solid android:color="@color/logo_blue" />//边框颜色
+        </shape>
+    </item>
+    <!--    想保留哪一边就设置哪一边边框,列如只有下边框:bottom="0.7dp",相应的有上top="",left="",right=""    -->
+    <item android:right="1dp">
+        <shape>
+            <solid android:color="@color/white" />//整个框背景颜色
+        </shape>
+    </item>
+
+</layer-list>

+ 21 - 5
app/src/main/res/layout/activity_login.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
@@ -9,6 +10,7 @@
         android:layout_height="match_parent">
 
         <LinearLayout
+
             android:layout_width="0dp"
             android:layout_height="match_parent"
             android:layout_marginLeft="@dimen/dp_46"
@@ -57,8 +59,8 @@
                 android:layout_marginRight="@dimen/dp_50"
                 android:hint="@string/enter_password"
                 android:lines="1"
-                android:text="123456"
                 android:paddingBottom="@dimen/dp_10"
+                android:text="123456"
                 android:textColor="@color/gray"
                 android:textColorHint="@color/gray"
                 android:textSize="@dimen/sp_10" />
@@ -73,14 +75,28 @@
                 android:text="@string/login"
                 android:textColor="@color/white"
                 android:textSize="@dimen/sp_15" />
-
+            <TextView
+                android:layout_gravity="right"
+                android:layout_alignParentBottom="true"
+                android:id="@+id/tv_back"
+                android:layout_width="@dimen/dp_50"
+                android:layout_marginRight="@dimen/dp_10"
+                android:layout_marginTop="@dimen/dp_45"
+                android:layout_height="@dimen/dp_20"
+                android:background="@drawable/shape_login_rounded_rectangle"
+                android:gravity="center"
+                android:text="返回上一级"
+                android:textColor="@color/white"
+                android:textSize="@dimen/sp_6"
+                tools:ignore="NotSibling" />
         </LinearLayout>
 
         <ImageView
-
+            android:id="@+id/ll_left"
             android:layout_width="@dimen/dp_315"
             android:layout_height="match_parent"
             android:src="@drawable/login_leftlogo" />
     </LinearLayout>
 
-</LinearLayout>
+
+</RelativeLayout>

+ 94 - 0
app/src/main/res/layout/dialog_text.xml

@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerInParent="true"
+        android:background="@drawable/shape_btn_back"
+        android:gravity="center_horizontal"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/tv_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/dp_10"
+            android:text="@string/warring_msg"
+            android:textColor="@color/colorOrange"
+            android:textSize="@dimen/dp_10" />
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="@dimen/dp_10"
+            android:orientation="horizontal">
+
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:layout_marginRight="@dimen/dp_10">
+
+                <ImageView
+                    android:id="@+id/iv_img"
+                    android:layout_width="@dimen/dp_50"
+                    android:layout_height="@dimen/dp_50"
+                    android:layout_gravity="center"
+                    android:gravity="center"
+                    android:src="@drawable/back_icon" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/tv_content"
+                    android:layout_width="@dimen/dp_140"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center_horizontal"
+                    android:layout_marginTop="@dimen/dp_10"
+                    android:gravity="center_horizontal"
+                    android:text="@string/warring_content"
+                    android:textColor="@color/colorGray"
+                    android:textSize="@dimen/dp_10" />
+
+                <TextView
+                    android:id="@+id/tv_content1"
+                    android:layout_width="@dimen/dp_120"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:gravity="center"
+                    android:text="@string/warring_content1"
+                    android:textColor="@color/colorGray"
+                    android:textSize="@dimen/dp_10" />
+            </LinearLayout>
+        </LinearLayout>
+
+    </LinearLayout>
+
+    <Button
+        android:id="@+id/btn_dimiss"
+        android:layout_width="@dimen/dp_100"
+        android:layout_height="@dimen/dp_50"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginRight="@dimen/dp_10"
+        android:background="@color/c_transparent" />
+
+    <Button
+        android:id="@+id/btn_dimiss1"
+        android:layout_width="@dimen/dp_100"
+        android:layout_height="@dimen/dp_50"
+        android:layout_alignParentLeft="true"
+        android:layout_marginLeft="@dimen/dp_10"
+        android:background="@color/c_transparent" />
+
+
+</RelativeLayout>

+ 6 - 6
app/src/main/res/layout/fragment_alarm_record.xml

@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/shallowblue"
     android:padding="@dimen/dp_5">
 
-    <TextView
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/rv_alarm"
+        android:layout_margin="@dimen/dp_10"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:gravity="center"
-        android:text="@string/alarm_record" />
+        android:layout_height="wrap_content" />
 
-</android.support.constraint.ConstraintLayout>
+</RelativeLayout>

+ 39 - 0
app/src/main/res/layout/item_alarm.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:orientation="horizontal"
+    android:background="@color/white"
+    android:layout_height="@dimen/dp_20">
+
+
+    <TextView
+        android:paddingLeft="@dimen/dp_10"
+        android:gravity="center_vertical"
+        android:background="@drawable/shape_line_right"
+        android:text="@string/time"
+        android:textSize="@dimen/sp_6"
+        android:id="@+id/tv_time"
+        android:layout_width="@dimen/dp_120"
+        android:layout_height="@dimen/dp_20" />
+
+    <TextView
+        android:paddingLeft="@dimen/dp_10"
+        android:gravity="center_vertical"
+        android:background="@drawable/shape_line_right"
+        android:text="@string/error_thing"
+        android:textSize="@dimen/sp_6"
+        android:id="@+id/tv_error_thing"
+        android:layout_width="@dimen/dp_168"
+        android:layout_height="@dimen/dp_20" />
+
+    <TextView
+        android:paddingLeft="@dimen/dp_10"
+        android:gravity="center_vertical"
+        android:text="@string/remark"
+        android:textSize="@dimen/sp_6"
+        android:id="@+id/tv_remark"
+        android:layout_weight="1"
+        android:layout_width="0dp"
+        android:layout_height="@dimen/dp_20" />
+
+</LinearLayout>

+ 5 - 18
app/src/main/res/values/strings.xml

@@ -437,24 +437,11 @@
     <string name="get_data">正在获取数据中...</string>
     <string name="get_update">更新成功,正在获取数据...</string>
 
-    <string name="warring_redianoukailu">No.1热电偶开路</string>
-    <string name="warring_lutoujiare">No.2炉头加热异常</string>
-    <string name="warring_jitinganxia">No.3急停按下</string>
-    <string name="warring_lutouzhuangdongyichang">No.4炉头转动异常</string>
-    <string name="warring_gunhequegunbaojing">No.5棍盒缺棍</string>
-    <string name="warring_gunhechugun">No.6棍盒出棍检测异常</string>
-    <string name="warring_beiyong">No.7备用异常</string>
-    <string name="warring_qbcqjc">No.8气泵吹气检测异常</string>
-    <string name="warring_qshqs">No.9清水盒缺水</string>
-    <string name="warring_fsm">No.10废水满警告</string>
-    <string name="warring_qbt">No.11缺白糖警告</string>
-    <string name="warring_qht">No.12缺红糖警告</string>
-    <string name="warring_qhuangt">No.13缺黄糖警告</string>
-    <string name="warring_qlt">No.14缺蓝糖警告</string>
-    <string name="warring_sbfw">No.15设备复位超时异常</string>
-    <string name="warring_wcqg">No.16二次取棍异常</string>
-
-    <string name="warring_gdjc">No.17供电检测异常</string>
+    <string name="warring_forward_obstaclesM600">No.1 前进有阻碍</string>
+    <string name="warring_falling_blockM601">No.2 下降有阻碍</string>
+    <string name="warring_x_axis_stepM602">No.3 X轴丢步</string>
+    <string name="warring_y_axis_stepM603">No.4 Y轴丢步</string>
+
 
     <string name="describe">描述</string>
     <string name="make_failed">制作失败,请联系客服人员电话:</string>