completed alarm power off.
authorTrillGates <williamtrillgates@gmail.com>
Fri, 9 Apr 2021 12:21:35 +0000 (20:21 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Fri, 9 Apr 2021 12:21:35 +0000 (20:21 +0800)
app/src/main/java/com/enqualcomm/support/Constants.java
app/src/main/java/com/enqualcomm/support/CoreService.java
app/src/main/java/com/enqualcomm/support/utils/AlarmHelper.java
app/src/main/java/com/ic/protocols/protocol_fzd.java

index adcfabb..4ca2376 100644 (file)
@@ -232,6 +232,7 @@ public interface Constants {
     String OTHER_ALARM_END = "com.enqualcomm.support.OTHER_ALARM_END";
 
     String OTHER_ALARM_START = "com.enqualcomm.support.OTHER_ALARM_START";
+    String ALARM_POWER_OFF = "com.ic.power.ACTION_ALARM_POWER_OFF";
 
     String OTHER_HEARTRATE_ALARM_END = "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_END";
 
index d03d73a..a243d17 100644 (file)
@@ -85,6 +85,7 @@ import static com.enqualcomm.support.Constants.ACTION_LOCATION_ALARM;
 import static com.enqualcomm.support.Constants.ACTION_QUERY_WEATHER;
 import static com.enqualcomm.support.Constants.ACTION_SEND_EMEGENCY_LOCATION_START;
 import static com.enqualcomm.support.Constants.ACTION_SEND_EMEGENCY_LOCATION_STOP;
+import static com.enqualcomm.support.Constants.ALARM_POWER_OFF;
 import static com.enqualcomm.support.Constants.FROM_ALARM;
 import static com.enqualcomm.support.Constants.FROM_SERVER;
 import static com.enqualcomm.support.Constants.HEARTBEAT_ALARM;
@@ -1338,6 +1339,26 @@ public class CoreService extends Service {
                 antiservice.check_ant_event();
             } else if (ACTION_CHECK_CUTOFF_EVENT.equals(paramIntent.getAction())) {
                 antiservice.check_cut_event();
+            } else if (ALARM_POWER_OFF.equals(paramIntent.getAction())) {
+                //收到定时关机闹钟指令
+                //先设置下一次的,然后再去关机
+                int hour = paramIntent.getIntExtra("hour", -1);
+                int min = paramIntent.getIntExtra("min", -1);
+                Context context = runtime.getContextProxy().context;
+                Intent intent = new Intent(context, CoreService.class);
+                intent.putExtra("hour", hour);
+                intent.putExtra("min", min);
+                PendingIntent pendingIntent = PendingIntent.getService(context,
+                        0, intent,
+                        PendingIntent.FLAG_UPDATE_CURRENT);
+                AlarmHelper.setPowerOffAlarm(context, pendingIntent, hour, min);
+                //关机
+                mHandler.postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        Util.shutdown();
+                    }
+                }, 1000);
             }
             this.invokeHandlerServiceChain.processUserRequest(paramIntent, this.connection, this.runtime);
 
index 8ade8f1..34527d4 100644 (file)
@@ -20,7 +20,7 @@ public class AlarmHelper {
     private static final long ONE_WEEK = 604800000L;\r
 \r
     private static Method setImpl;\r
-    \r
+\r
     static {\r
         try {\r
             setImpl = AlarmManager.class.getDeclaredMethod("setImpl", new Class[]{int.class, long.class, long.class, long.class, PendingIntent.class, android.os.WorkSource.class});\r
@@ -96,7 +96,7 @@ public class AlarmHelper {
 \r
     public static void setRealTimeAlarmInSeconds(Context context, int seconds, String actionname) {\r
         AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);\r
-        Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class);\r
+        Intent intent = new Intent(context, CoreService.class);\r
         intent.setAction(actionname);\r
         PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);\r
         alarmManager.cancel(pendingIntent);\r
@@ -108,11 +108,13 @@ public class AlarmHelper {
         alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, l + (seconds * 1000), pendingIntent);\r
     }\r
 \r
-    public static void setTimeAlarm(Context context, int hour, int minutes, String paramString) {\r
+    public static void setTimeAlarm(Context context, int hour, int minutes, String action) {\r
         AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);\r
-        Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class);\r
-        intent.setAction(paramString);\r
-        PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);\r
+        Intent intent = new Intent(context, CoreService.class);\r
+        intent.setAction(action);\r
+        PendingIntent pendingIntent = PendingIntent.getService(context,\r
+                0, intent,\r
+                PendingIntent.FLAG_UPDATE_CURRENT);\r
         long l3 = System.currentTimeMillis();\r
         Calendar calendar = Calendar.getInstance();\r
         calendar.set(Calendar.HOUR_OF_DAY, hour);\r
@@ -126,6 +128,24 @@ public class AlarmHelper {
         alarmManager.setExact(AlarmManager.RTC_WAKEUP, l1, pendingIntent);\r
     }\r
 \r
+\r
+    public static void setPowerOffAlarm(Context context, PendingIntent pendingIntent, int hour, int min) {\r
+        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);\r
+        long l3 = System.currentTimeMillis();\r
+        Calendar calendar = Calendar.getInstance();\r
+        calendar.set(Calendar.HOUR_OF_DAY, hour);\r
+        calendar.set(Calendar.MINUTE, min);\r
+        calendar.set(Calendar.SECOND, 0);\r
+        long l2 = calendar.getTimeInMillis();\r
+        long l1 = l2;\r
+        if (l2 < l3)\r
+            l1 = l2 + ONE_DAY;\r
+        alarmManager.cancel(pendingIntent);\r
+        //设置闹钟\r
+        alarmManager.setExact(AlarmManager.RTC_WAKEUP, l1, pendingIntent);\r
+    }\r
+\r
+\r
     public static void setNextWeekAlarm(AlarmManager mAlarmManager, long timeStamp, PendingIntent pendingIntent) {\r
         //周期为下一周\r
         timeStamp += ONE_WEEK;\r
index 5be328e..c499443 100644 (file)
@@ -3,6 +3,8 @@ package com.ic.protocols;
 import android.Manifest;
 import android.annotation.SuppressLint;
 import android.annotation.TargetApi;
+import android.app.AlarmManager;
+import android.app.PendingIntent;
 import android.bluetooth.BluetoothAdapter;
 import android.content.ComponentName;
 import android.content.ContentResolver;
@@ -39,6 +41,7 @@ import com.enqualcomm.support.provider.FZDMembersProvider;
 import com.enqualcomm.support.provider.FZDMessageProvider;
 import com.enqualcomm.support.provider.FZDSettingsProvider;
 import com.enqualcomm.support.service.HeartRateManager;
+import com.enqualcomm.support.utils.AlarmHelper;
 import com.enqualcomm.support.utils.CameraUtil;
 import com.enqualcomm.support.utils.Connection;
 import com.enqualcomm.support.utils.ICLogger;
@@ -61,6 +64,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.UUID;
 
+import static com.enqualcomm.support.Constants.ALARM_POWER_OFF;
 import static com.enqualcomm.support.Constants.FROM_SERVER;
 import static com.enqualcomm.support.Constants.contact;
 import static com.enqualcomm.support.LocationClient.LOCATION_MODE;
@@ -420,7 +424,7 @@ public class protocol_fzd {
         TALK,//向对方发起音视频聊天
         UNKNOWN_CMD,
         MESSAGE/*文字消息*/,
-        profile//情景模式
+        profile,//情景模式
     }
 
     private static HashMap<CMD_TYPE, String> cmdMap = null;
@@ -1262,7 +1266,6 @@ public class protocol_fzd {
     }
 
     public void handlePOWEROFF(Connection connection) {
-
         connection.send(POWEROFF());
     }
 
@@ -1459,19 +1462,24 @@ public class protocol_fzd {
                 break;
             case KA:
                 ICLogger.i("服务器收到心跳包KA");
-                mConnection.DeliverCMDMessageToSystem("heartbeat", cmd);//通知下面线程状态变化
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("heartbeat", cmd);
                 break;
             case AL:
-                mConnection.DeliverCMDMessageToSystem("AL", cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                //通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                mConnection.DeliverCMDMessageToSystem("AL", cmd);
                 break;
             case PRACTICE:
-                mConnection.DeliverCMDMessageToSystem("PRACTICE", cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                //通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                mConnection.DeliverCMDMessageToSystem("PRACTICE", cmd);
                 break;
             case UD:
-                mConnection.DeliverCMDMessageToSystem("UD", cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                //通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                mConnection.DeliverCMDMessageToSystem("UD", cmd);
                 break;
             case UD2:
-                mConnection.DeliverCMDMessageToSystem("UD2", cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                //通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+                mConnection.DeliverCMDMessageToSystem("UD2", cmd);
                 break;
             case PING:
                 handlePing(mRuntime, data);
@@ -1480,12 +1488,14 @@ public class protocol_fzd {
             case CR:
                 //立即定位指令(长链接有效)
                 handleCR(mConnection);
-                mConnection.DeliverCMDMessageToSystem("StartLocate", cmd);//通知下面线程状态变化
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("StartLocate", cmd);
                 break;
             case UPLOAD:
                 //设置工作模式
                 handleUPLOAD(mConnection, mRuntime, cmd, data);
-                mConnection.DeliverCMDMessageToSystem("setWorkMod", cmd);//通知下面线程状态变化
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("setWorkMod", cmd);
             case SOS:
                 //收到设置SOS号码
                 handleSOS(mConnection, mRuntime, cmd, data);
@@ -1499,8 +1509,9 @@ public class protocol_fzd {
             case POWEROFF:
                 //收到关机
                 handlePOWEROFF(mConnection);
-                ICLogger.i("收到服务器关机命令BP31");
-                mConnection.DeliverCMDMessageToSystem("poweroff", cmd);//通知下面线程状态变化
+                ICLogger.i("收到服务器关机命令POWEROFF");
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("poweroff", cmd);
                 break;
             case hrtstart:
                 handleHrtstart(mConnection);
@@ -1554,7 +1565,8 @@ public class protocol_fzd {
             case FIND:
                 //收到查找设备消息
                 handleFIND(mConnection);
-                mConnection.DeliverCMDMessageToSystem("findDev", cmd);//通知下面线程状态变化
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("findDev", cmd);
                 break;
             case MESSAGE:
                 handleMESSAGE(mConnection, data);
@@ -1666,12 +1678,78 @@ public class protocol_fzd {
                 handleProfile(cmd, data, mRuntime);
                 mConnection.DeliverCMDMessageToSystem("profile", cmd);
                 break;
+            case BOOTOFF:
+                ICLogger.d("收到开关机时间设置指令");
+                handleBOOTOFF(cmd, data, mRuntime);
+                mConnection.DeliverCMDMessageToSystem("BOOTOFF", cmd);
+                break;
         }
         return ret;
 
     }
 
 
+    private static final String BOOT_OFF_ACTION_OFF = "0";
+    private static final String BOOT_OFF_ACTION_ON = "1";
+    private static final long ONE_DAY = 86400000L;
+
+
+    /**
+     * 设置开关机时间
+     * <p>
+     * 平台发送: [XT*YYYYYYYYYYYYYYY*LEN*BOOTOFF,
+     * 开关(0 关,1 开),开机时间,关机时间]
+     * 例:[XT*334588000000156*LEN* BOOTOFF,1,07:10,21:00]
+     *
+     * @param cmd
+     * @param data
+     * @param mRuntime
+     */
+    private void handleBOOTOFF(String cmd, String data, Runtime mRuntime) {
+        //解析数据
+        String[] split = data.split(CMDSPLIT);
+        if (split.length == 3) {
+            try {
+                //3部分内容
+                //1,07:10,21:00
+                String action = split[0];
+                String powerOnTime = split[1];
+                String powerOffTime = split[2];
+                ICLogger.d(" action==> " + action);
+                ICLogger.d(" powerOnTime==> " + powerOnTime);
+                ICLogger.d(" powerOffTime==> " + powerOffTime);
+                Context context = mRuntime.getContextProxy()
+                        .context;
+                AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+                if (alarmManager == null) {
+                    ICLogger.d("alarmManager is null...");
+                    return;
+                }
+                Intent intent = new Intent(context, CoreService.class);
+                intent.setAction(ALARM_POWER_OFF);
+                PendingIntent pendingIntent = PendingIntent.getService(context,
+                        0, intent,
+                        PendingIntent.FLAG_UPDATE_CURRENT);
+                if (BOOT_OFF_ACTION_OFF.equals(action)) {
+                    //取消闹钟
+                    alarmManager.cancel(pendingIntent);
+                } else if (BOOT_OFF_ACTION_ON.equals(action)) {
+                    String[] powerOffTimes = powerOffTime.split(":");
+                    int hour = Integer.parseInt(powerOffTimes[0]);
+                    int min = Integer.parseInt(powerOffTimes[0]);
+                    intent.putExtra("hour", hour);
+                    intent.putExtra("min", min);
+                    AlarmHelper.setPowerOffAlarm(context, pendingIntent, hour, min);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        //无法实现定时开机
+        //可以实现定时关机
+        //TODO:设置一个闹钟,到了直接执行关机指令
+    }
+
     //响铃和震动
     private static final int PROFILE_MODE_RING_AND_VIBRATE = 1;
     //响铃
@@ -1696,6 +1774,10 @@ public class protocol_fzd {
         AudioManager audioManager =
                 (AudioManager) mRuntime.getContextProxy()
                         .context.getSystemService(Context.AUDIO_SERVICE);
+        if (audioManager == null) {
+            ICLogger.d("audioManager == > is null");
+            return;
+        }
         //对data进行判断
         try {
             int type = Integer.parseInt(data);