package com.xypower.mpmaster.sms;


import android.Manifest;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.text.TextUtils;

import androidx.core.app.ActivityCompat;

import com.dev.devapi.api.SysApi;
import com.xypower.common.MicroPhotoContext;
import com.xypower.common.RegexUtil;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;


/*
 * 短信接收类
 *
 * */
public class SimUtil {
    public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
    public static final String SMS_DELIVER_ACTION = "android.provider.Telephony.SMS_DELIVER";

    //自定义ACTION常数 作为广播的IntentFilter识别常数
    public static String SMS_SEND_ACTION = "com.xypower.mpmaster.SMS_SEND_ACTION";

    public static String SMSTYPE = "smstype";

    public static String SMSIFCORRECT = "smsifcorrect";

    //短信解析
    public static void analysisSMSInfo(Intent intent, Context context) {
        SmsMessageModel smsInfo = getSMSInfo(intent);
        if (smsInfo != null) {
            String packageName = context.getApplicationContext().getPackageName();
            String content = smsInfo.getContent();
            int slot = smsInfo.getSlot();//那张卡收到的短信
            String sender = smsInfo.getSender();//收到的短信的手机号
            String sendmessage = "ERROR";//要回复的短信
            String sendtype = "";//收到的短信类型
            List<Integer> abslist = new ArrayList<>();//收到的短信内容拆分包装成数组
            boolean ifmessageCorrect = false;//用来判断收到的短信内容是否正确
            if (StringUtils.isEmpty(content)) {
                return;
            }
            if (content.contains(SmsTypeEnum.REBOOT1.value())) {
                ifmessageCorrect = true;
                sendtype = SmsTypeEnum.REBOOT1.value();
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.REBOOT2.value())) {
                ifmessageCorrect = true;
                sendtype = SmsTypeEnum.REBOOT2.value();
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.SET_YW_SCHEDULE.value())) {
                ifmessageCorrect = true;
                String[] split1 = StringUtils.splitString1(content);
                if (split1 != null && split1.length == 2) {
                    String s = split1[1];
                    String[] split2 = StringUtils.splitString2(s);
                    int spilt2len = split2.length;
                    if (split2 != null && spilt2len > 1 && spilt2len % 2 == 1) {
                        String num = split2[0];
                        Integer integer = StringUtils.convert2Int(num);
                        if (integer != null) {
                            if (integer == 0) {//删除所有运维
                                ifmessageCorrect = true;
                            } else {
                                if (spilt2len == integer * 2 + 1) {
                                    int times = 0;
                                    for (int i = 0; i < spilt2len; i++) {
                                        if (i == 0) {
                                            continue;
                                        }
                                        String ts = split2[i];
                                        Integer time = StringUtils.convert2Int(ts);
                                        if (i % 2 == 1) {
                                            if (time > 23) {
                                                ifmessageCorrect = false;
                                                break;
                                            }
                                            times = time * 60;
                                        } else {
                                            if (time > 59) {
                                                ifmessageCorrect = false;
                                                break;
                                            }
                                            times += time;
                                            abslist.add(times);
                                        }
                                    }
                                }
                            }
                            if (ifmessageCorrect) {
                                UpdateSysConfigUtil.setAbsHeartbeats(context, abslist);
                            }
                        }
                    }
                }
                sendtype = SmsTypeEnum.SET_YW_SCHEDULE.value();
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.GET_YW_SCHEDULE.value())) {
                ifmessageCorrect = true;
                List<Integer> absHeartbeats = UpdateSysConfigUtil.getAbsHeartbeats(context);
                if (absHeartbeats == null || absHeartbeats.size() == 0) {
                    sendmessage = SmsTypeEnum.GET_YW_SCHEDULE.value() + "=0";
                } else {
                    int length = absHeartbeats.size();
                    sendmessage = SmsTypeEnum.GET_YW_SCHEDULE.value() + "=" + length;
                    for (int i = 0; i < length; i++) {
                        int mAbsHeartbeatTime = 0;
                        mAbsHeartbeatTime = absHeartbeats.get(i);
                        int hour = mAbsHeartbeatTime / 60;
                        int minute = mAbsHeartbeatTime % 60;
                        sendmessage += "," + hour + "," + minute;
                    }
                }
            } else if (content.contains(SmsTypeEnum.SET_OPERATE.value())) {
                sendtype = SmsTypeEnum.SET_OPERATE.value();
                String[] split1 = StringUtils.splitString1(content);
                if (split1 != null && split1.length > 1) {
                    String s = split1[1];
                    Integer integer = StringUtils.convert2Int(s);
                    if (integer != null) {
                        if (integer == 0 || integer == 1) {
                            ifmessageCorrect = true;
                            UpdateSysConfigUtil.setMntnMode(context, integer);
                        }
                    }
                }
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.GET_OPERATE.value())) {
                sendtype = SmsTypeEnum.GET_OPERATE.value();
                ifmessageCorrect = true;
                int mntnMode = UpdateSysConfigUtil.getMntnMode(context);
                sendmessage = SmsTypeEnum.GET_OPERATE.value() + "=" + mntnMode;
            } else if (content.contains(SmsTypeEnum.SET_OPERATE_URL.value())) {
                sendtype = SmsTypeEnum.SET_OPERATE_URL.value();
                String[] split1 = StringUtils.splitString1(content);
                if (split1 != null && split1.length > 1) {
                    String s = split1[1];
                    String[] split2 = StringUtils.splitString2(s);
                    if (split2 != null && split2.length >= 2) {
                        String ipAddress = split2[0];
                        String port = split2[1];
                        boolean b = RegexUtil.checkIpAddress(ipAddress);
                        if (b) {
                            Integer integer = StringUtils.convert2Int(port);
                            if (integer != null) {
                                ifmessageCorrect = true;
                                UpdateSysConfigUtil.setMntnServer(context, ipAddress, integer);
                            }
                        }
                    }
                }
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.GET_OPERATE_URL.value())) {
                sendtype = SmsTypeEnum.GET_OPERATE_URL.value();
                ifmessageCorrect = true;
                String mntnServer = UpdateSysConfigUtil.getMntnServer(context);
                sendmessage = SmsTypeEnum.GET_OPERATE_URL.value() + "=" + mntnServer;
            } else if (content.contains(SmsTypeEnum.UPDATE.value())) {
                sendtype = SmsTypeEnum.UPDATE.value();
                String[] split1 = StringUtils.splitString1(content);
                if (split1 != null && split1.length == 2) {
                    ifmessageCorrect = true;
                    String s = split1[1];
                    DownloadUtils downloadUtils = new DownloadUtils(context.getApplicationContext(), s, "test.app");
                }
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.SET_CMDID.value())) {
                sendtype = SmsTypeEnum.SET_CMDID.value();
                String[] split1 = StringUtils.splitString1(content);
                if (split1 != null && split1.length > 1) {
                    ifmessageCorrect = true;
                    String cmdid = split1[1];
                    UpdateSysConfigUtil.setCmdid(context, cmdid);   //
                }
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.GET_CMDID.value())) {
                sendtype = SmsTypeEnum.GET_CMDID.value();
                ifmessageCorrect = true;
                String cmdid = UpdateSysConfigUtil.getCmdid(context);
                String serialNo = UpdateSysConfigUtil.getSerialNo();
                sendmessage = SmsTypeEnum.GET_CMDID.value() + "=" + serialNo + "," + cmdid;
            } else if (content.contains(SmsTypeEnum.SET_IP.value())) {
                sendtype = SmsTypeEnum.SET_IP.value();
                String[] split1 = StringUtils.splitString1(content);
                if (split1 != null && split1.length > 1) {
                    String s = split1[1];
                    String[] split2 = StringUtils.splitString2(s);
                    if (split2 != null && (split2.length == 2 || split2.length == 4)) {
                        String server;
                        Integer integer;
                        server = split2[0];
                        String port = split2[1];
                        integer = StringUtils.convert2Int(port);
                        Integer utcp = -1;
                        Integer encrypto = -1;
                        if (integer != null) {
                            ifmessageCorrect = true;
                            if (split2.length == 4) {
                                String s1 = split2[2];
                                utcp = StringUtils.convert2Int(s1);
                                utcp = getUtcp(utcp);
                                String s2 = split2[3];
                                encrypto = StringUtils.convert2Int(s2);
                                encrypto = getEncrypto(encrypto);
                                if (utcp == -1 || encrypto == -1) {
                                    ifmessageCorrect = false;
                                }
                            }
                        }
                        if (ifmessageCorrect) {
                            UpdateSysConfigUtil.setIP(context, server, integer, utcp, encrypto);
                        }
                    }
                }
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.GET_IP.value())) {
                sendtype = SmsTypeEnum.GET_IP.value();
                ifmessageCorrect = true;
                String ip = UpdateSysConfigUtil.getIP(context);
                sendmessage = SmsTypeEnum.GET_IP.value() + "=" + ip;
            } else if (content.contains(SmsTypeEnum.SET_OSD.value())) {
                sendtype = SmsTypeEnum.SET_OSD.value();
                String[] split1 = StringUtils.splitString1(content);
                sendmessage = getSendString(content, ifmessageCorrect);
                if (split1 != null && split1.length == 2) {
                    ifmessageCorrect = true;
                    HashMap<String, String> osdmap = new HashMap<>();
                    String s = split1[1];
                    String[] split2 = StringUtils.splitString2(s);
                    int spilt2len = split2.length;
                    if (split2 != null && spilt2len > 1 && spilt2len % 2 == 1) {
                        String num = split2[0];
                        Integer integer = StringUtils.convert2Int(num);
                        if (integer != null) {
                            for (int i = 0; i < spilt2len; i++) {
                                if (i == 0) {
                                    continue;
                                }
                                if (i % 2 == 1) {
                                    if ((i + 1) <= spilt2len) {
                                        String s1 = split2[i];
                                        Integer position = StringUtils.convert2Int(s1);
                                        if (position != null) {
                                            if (position == 1) {
                                                osdmap.put(UpdateSysConfigUtil.leftTop, split2[i + 1]);
                                            } else if (position == 2) {
                                                osdmap.put(UpdateSysConfigUtil.rightTop, split2[i + 1]);
                                            } else if (position == 3) {
                                                osdmap.put(UpdateSysConfigUtil.leftBottom, split2[i + 1]);
                                            } else if (position == 4) {
                                                osdmap.put(UpdateSysConfigUtil.rightBottom, split2[i + 1]);
                                            } else {
                                                ifmessageCorrect = false;
                                            }
                                        } else {
                                            ifmessageCorrect = false;
                                        }
                                    } else {
                                        ifmessageCorrect = false;
                                    }
                                }
                            }
                            if (integer == 0) {//所有通道
                                ifmessageCorrect = true;
                                MicroPhotoContext.AppConfig mpAppConfig = MicroPhotoContext.getMpAppConfig(context);
                                int channelnum = mpAppConfig.channels;
                                if (channelnum != 0) {
                                    if (ifmessageCorrect) {
                                        for (int i = 1; i <= channelnum; i++) {
                                            UpdateSysConfigUtil.setChannelOSD(i, osdmap);
                                        }
                                    }
                                }
                            } else {
                                if (ifmessageCorrect) {
                                    UpdateSysConfigUtil.setChannelOSD(integer, osdmap);
                                }
                            }

                        }
                    }
                }
            } else if (content.contains(SmsTypeEnum.GET_OSD.value())) {
                sendtype = SmsTypeEnum.GET_OSD.value();
                String[] split = StringUtils.splitString1(content);
                if (split != null && split.length == 2) {
                    sendmessage = SmsTypeEnum.GET_OSD.value() + "=";
                    ifmessageCorrect = true;
                    Integer channel = StringUtils.convert2Int(split[0]);
                    HashMap<String, String> channelOSD = UpdateSysConfigUtil.getChannelOSD(channel);
                    String leftTop = channelOSD.get(UpdateSysConfigUtil.leftTop);
                    String rightTop = channelOSD.get(UpdateSysConfigUtil.rightTop);
                    String leftBottom = channelOSD.get(UpdateSysConfigUtil.leftBottom);
                    String rightBottom = channelOSD.get(UpdateSysConfigUtil.rightBottom);
                    if (leftTop != null && StringUtils.isNotEmpty(leftTop)) {
                        sendmessage += "1," + leftTop;
                    }
                    if (rightTop != null && StringUtils.isNotEmpty(rightTop)) {
                        sendmessage += "2," + rightTop;
                    }
                    if (leftBottom != null && StringUtils.isNotEmpty(leftBottom)) {
                        sendmessage += "3" + leftBottom;
                    }
                    if (rightBottom != null && StringUtils.isNotEmpty(rightBottom)) {
                        sendmessage += "4," + leftTop;
                    }
                }
            } else if (content.contains(SmsTypeEnum.SET_PHOTO_SCHEDULE_LIST.value())) {
                sendtype = SmsTypeEnum.SET_PHOTO_SCHEDULE_LIST.value();
                String[] split1 = StringUtils.splitString1(content);
                if (split1 != null && split1.length > 1) {
                    String s = split1[1];
                    String[] split2 = StringUtils.splitString2(s);
                    if (split2 != null && split2.length == 2) {
                        Integer channel = StringUtils.convert2Int(split2[0]);
                        if (channel != null) {
                            ifmessageCorrect = true;
                            String msg = split2[1];
                            UpdateSysConfigUtil.setPhotoSchedules(channel, msg);
                        }
                    }
                }
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.GET_PHOTO_SCHEDULE_LIST.value())) {
                sendtype = SmsTypeEnum.GET_PHOTO_SCHEDULE_LIST.value();
                ifmessageCorrect = true;
                String[] split1 = StringUtils.splitString1(content);
                if (split1 != null && split1.length == 2) {
                    Integer channel = StringUtils.convert2Int(split1[1]);
                    String photoSchedules = UpdateSysConfigUtil.getPhotoSchedules(channel);
                    sendmessage = SmsTypeEnum.GET_PHOTO_SCHEDULE_LIST.value() + "=" + photoSchedules;
                }
            } else if (content.contains(SmsTypeEnum.SET_RESOLUTION.value())) {
                sendtype = SmsTypeEnum.SET_RESOLUTION.value();
                String[] split1 = StringUtils.splitString1(content);
                if (split1 != null && split1.length > 1) {
                    String s = split1[1];
                    String[] split2 = StringUtils.splitString1(s);
                    if (split2 != null && split2.length == 5) {
                        Integer channel = StringUtils.convert2Int(split2[0]);
                        Integer resolutionCX = StringUtils.convert2Int(split2[1]);
                        Integer resolutionCY = StringUtils.convert2Int(split2[2]);
                        Integer videoCX = StringUtils.convert2Int(split2[3]);
                        Integer videoCY = StringUtils.convert2Int(split2[4]);
                        if (channel != null && resolutionCX != null && resolutionCY != null && videoCX != null && videoCY != null) {
                            ifmessageCorrect = true;
                            UpdateSysConfigUtil.setChannelResolution(channel, resolutionCX, resolutionCY, videoCX, videoCY);
                            UpdateSysConfigUtil.restartApp(context);
                        }
                    }
                }
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.GET_RESOLUTION.value())) {
                sendtype = SmsTypeEnum.GET_RESOLUTION.value();
                ifmessageCorrect = true;
                String[] split = StringUtils.splitString1(content);
                Integer channel = StringUtils.convert2Int(split[0]);
                HashMap<String, Integer> hashMap = UpdateSysConfigUtil.getChannelResolution(channel);
                Integer resolutionCX = hashMap.get("resolutionCX");
                Integer resolutionCY = hashMap.get("resolutionCY");
                Integer videoCX = hashMap.get("videoCX");
                Integer videoCY = hashMap.get("videoCY");
                sendmessage = SmsTypeEnum.GET_RESOLUTION.value() + "=" + resolutionCX + "," + resolutionCY + "," + videoCX + "," + videoCY;
            } else if (content.contains(SmsTypeEnum.TAKE_PHOTO.value())) {
                sendtype = SmsTypeEnum.TAKE_PHOTO.value();
                ifmessageCorrect = true;
                String[] split = StringUtils.splitString1(content);
                if (split != null && split.length == 3) {
                    ifmessageCorrect = true;
                    Integer channel = StringUtils.convert2Int(split[0]);
                    Integer preset = StringUtils.convert2Int(split[1]);
                    Integer type = StringUtils.convert2Int(split[2]);
                    if (channel != null) {
                        boolean photoOrVideo;
                        if (type == 0) {
                            photoOrVideo = true;
                        } else {
                            photoOrVideo = false;
                        }
                        UpdateSysConfigUtil.takePhotoOrVideo(context, channel, preset, photoOrVideo);
                    }
                    sendmessage = getSendString(content, ifmessageCorrect);
                }
            } else if (content.contains(SmsTypeEnum.SET_HEART.value())) {
                sendtype = SmsTypeEnum.SET_HEART.value();
                String[] split1 = StringUtils.splitString1(content);
                if (split1 != null && split1.length == 2) {
                    ifmessageCorrect = true;
                    String s = split1[1];
                    Integer integer = StringUtils.convert2Int(s);
                    UpdateSysConfigUtil.setHB(context, integer);
                }
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.GET_HEART.value())) {
                sendtype = SmsTypeEnum.GET_HEART.value();
                ifmessageCorrect = true;
                int hb = UpdateSysConfigUtil.getHB(context);
                sendmessage = SmsTypeEnum.GET_HEART.value() + "=" + hb;
            } else if (content.contains(SmsTypeEnum.SET_TP.value())) {
                sendtype = SmsTypeEnum.SET_TP.value();
                String[] split1 = StringUtils.splitString1(content);
                if (split1 != null && split1.length == 2) {
                    ifmessageCorrect = true;
                    String s = split1[1];
                    Integer integer = StringUtils.convert2Int(s);
                    UpdateSysConfigUtil.setTB(context, integer);
                }
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.GET_TP.value())) {
                sendtype = SmsTypeEnum.GET_TP.value();
                ifmessageCorrect = true;
                int tb = UpdateSysConfigUtil.getTB(context);
                sendmessage = SmsTypeEnum.GET_TP.value() + "=" + tb;
            } else if (content.contains(SmsTypeEnum.SET_PACKAGE.value())) {
                sendtype = SmsTypeEnum.SET_PACKAGE.value();
                String[] split1 = StringUtils.splitString1(content);
                if (split1 != null && split1.length == 2) {
                    ifmessageCorrect = true;
                    String s = split1[1];
                    Integer integer = StringUtils.convert2Int(s);
                    UpdateSysConfigUtil.setPackage(context, integer);
                }
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.GET_PACKAGE.value())) {
                sendtype = SmsTypeEnum.GET_PACKAGE.value();
                ifmessageCorrect = true;
                int aPackage = UpdateSysConfigUtil.getPackage(context);
                sendmessage = SmsTypeEnum.GET_PACKAGE.value() + "=" + aPackage;
            } else if (content.contains(SmsTypeEnum.CLEAR_PHOTO.value())) {
                sendtype = SmsTypeEnum.CLEAR_PHOTO.value();
                ifmessageCorrect = true;
                UpdateSysConfigUtil.clearHistoryPic(context);
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.CLEAR_LOG.value())) {
                sendtype = SmsTypeEnum.CLEAR_LOG.value();
                ifmessageCorrect = true;
                UpdateSysConfigUtil.clearHistoryLogs(context);
                sendmessage = getSendString(content, ifmessageCorrect);
            } else if (content.contains(SmsTypeEnum.CLEAR_ALL.value())) {
                sendtype = SmsTypeEnum.CLEAR_ALL.value();
                ifmessageCorrect = true;
                UpdateSysConfigUtil.clearHistoryPic(context);
                UpdateSysConfigUtil.clearHistoryLogs(context);
                sendmessage = getSendString(content, ifmessageCorrect);
            }
            if (ifmessageCorrect) {
                sendSms(context, slot, sender, sendmessage, sendtype, ifmessageCorrect);
            }
        }

    }

    private static int getUtcp(Integer utcp) {
        int apputcp = -1;
        //短信文档中  0：udp  1:tcp  app应用中  0：tcp 1:udp  所以需要转换一下
        if (utcp != null && (utcp == 0 || utcp == 1)) {
            if (utcp == 0) {
                apputcp = 1;
            } else if (utcp == 1) {
                apputcp = 0;
            }
        }
        return apputcp;
    }

    private static int getEncrypto(Integer encrypto) {
        int appencrypto = -1;
        //短信文档中  1：密文,2：明文 3：不加密  app应用中   0：不加密 1：明文  2：加密  所以需要转换一下
        if (encrypto != null && (encrypto == 1 || encrypto == 2 || encrypto == 3)) {
            if (encrypto == 1) {
                appencrypto = 2;
            } else if (encrypto == 2) {
                appencrypto = 1;
            } else if (encrypto == 3) {
                appencrypto = 0;
            }
        }
        return appencrypto;
    }

    private static String getSendString(String content, boolean ifmessageCorrect) {
        String sendmessage;
        String menssageBack = "";
        if (ifmessageCorrect) {
            menssageBack = " OK";
        } else {
            menssageBack = " ERROR";
        }
        sendmessage = content + menssageBack;
        return sendmessage;
    }

    //短信解析
    public static SmsMessageModel getSMSInfo(Intent intent) {
        SmsMessageModel smsMessageModel = new SmsMessageModel();
        String action = intent.getAction();
        if (SMS_RECEIVED_ACTION.equals(action) || SMS_DELIVER_ACTION.equals(action)) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                StringBuilder content = new StringBuilder();
                String sender = "";
                String dateContent = "";
                Object[] pdus = (Object[]) bundle.get("pdus");
                if (pdus != null && pdus.length > 0) {
                    SmsMessage[] messages = new SmsMessage[pdus.length];
                    for (int i = 0; i < pdus.length; i++) {
                        byte[] pdu = (byte[]) pdus[i];
                        messages[i] = SmsMessage.createFromPdu(pdu);
                    }
                    for (SmsMessage message : messages) {
                        content.append(message.getMessageBody());// 得到短信内容
                        // 得到发信息的号码
                        sender = message.getOriginatingAddress();
                        Date date = new Date(message.getTimestampMillis());
                        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        format.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
                        dateContent = format.format(date);
                    }
                    int smsSlot = getSmsSlot(bundle);
                    smsMessageModel.setContent(content.toString());
                    smsMessageModel.setSender(sender);
                    smsMessageModel.setDateContent(dateContent);
                    smsMessageModel.setSlot(smsSlot);
                }
            }
        }
        return smsMessageModel;
    }

    //获取是哪个sim卡收到短信
    private static int getSmsSlot(Bundle bundle) {
        int slot = -1;
        Set<String> keySet = bundle.keySet();
        for (String key : keySet) {
            if (key.toLowerCase().contains("slot") || key.toLowerCase().contains("sim")) {
                String value = bundle.getString(key, "-1");
                if (value.equals("0") | value.equals("1") | value.equals("2")) {
                    slot = bundle.getInt(key, -1);
                }
                break;
            }
        }
        return slot;
    }

    //指定sim卡位置发送短信
    public static void sendSms(Context mContext, int slot, String sender, String message, String value, boolean ifmessageCorrect) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            SubscriptionManager localSubscriptionManager = SubscriptionManager.from(mContext);
            if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            if (localSubscriptionManager.getActiveSubscriptionInfoCount() > 1) {
                List localList = localSubscriptionManager.getActiveSubscriptionInfoList();
                boolean doubleSim = isDoubleSim(mContext);
                SubscriptionInfo simInfoAnother = null;
                if (doubleSim) {
                    if (localList != null && localList.size() > 1) {
                        SubscriptionInfo simInfo1 = (SubscriptionInfo) localList.get(0);
                        SubscriptionInfo simInfo2 = (SubscriptionInfo) localList.get(1);
                        if (slot == 0) {
                            simInfoAnother = simInfo1;
                        } else {
                            simInfoAnother = simInfo2;
                        }
                    }
                }
                Intent itSend = new Intent(SMS_SEND_ACTION);
                itSend.putExtra(SMSTYPE, value);
                itSend.putExtra(SMSIFCORRECT, ifmessageCorrect);
//                itSend.putExtra(SMSDATA, (Serializable) jsonArray);
                //sendIntent参数为传送后接受的广播信息PendingIntent
                PendingIntent sendPI = PendingIntent.getBroadcast(mContext, 0, itSend, 0);

//                Intent itDeliver = new Intent(SMS_DELIVERED_ACTION);
                //deliveryIntent参数为传送后接受的广播信息PendingIntent
//                PendingIntent deliverPI = PendingIntent.getBroadcast(mContext,0,itDeliver,0);
                if (simInfoAnother != null) {
                    SmsManager.getSmsManagerForSubscriptionId(simInfoAnother.getSubscriptionId()).sendTextMessage(sender, null, message, sendPI, null);
                }
            }
        }
    }


    //判断是否是双卡
    public static boolean isDoubleSim(Context mContext) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            SubscriptionManager manager = SubscriptionManager.from(mContext);
            if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
            int count = manager.getActiveSubscriptionInfoCount();
            if (count == 2) {
                return true;
            }
        }
        return false;
    }

    //通过卡槽id获取sim卡的信息0代码卡槽1，1代表卡槽2
    public static String getSlotIdInfo(Context mContext, int slotId) {
        String info = "";
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            SubscriptionManager manager = SubscriptionManager.from(mContext);
            if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                return "";
            }
            SubscriptionInfo subInfo = manager.getActiveSubscriptionInfoForSimSlotIndex(slotId);
            if (subInfo != null) {
                info = subInfo.getCarrierName().toString();
            }
        }
        return info;
    }

    //判断手机中是否装了双卡
    public static boolean isHasDoubleSim(Context mContext) {
        try {
            if (isDoubleSim(mContext)) {
                List<ModelSlotAndSub> slotAndSubs = getModelSlot(mContext);
                if (slotAndSubs != null && slotAndSubs.size() == 2) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }


    //判断是否拥有该权限
    public static boolean IsHasPermission(Context mContext, String permission) {
        if (mContext != null) {
            if (ActivityCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        } else {
            return false;
        }
        return true;
    }


    //申请该权限
    public static void requestOnePermission(Activity activity, String permission, int permissionCode) {
        if (activity != null) {
            activity.requestPermissions(new String[]{permission}, permissionCode);
        }
    }


    //获取icc用来判断
    public static int getIcc(String iccid, List<ModelSlotAndSub> slotAndSubs) {
        int icc = 0;
        if (slotAndSubs != null && slotAndSubs.size() >= 2 && !TextUtils.isEmpty(iccid)) {
            if (iccid.startsWith(slotAndSubs.get(0).iccid)) {
                icc = 1;
            } else if (iccid.startsWith(slotAndSubs.get(1).iccid)) {
                icc = 2;
            } else {
                if (iccid.equals(slotAndSubs.get(0).subId)) {
                    icc = 1;
                } else if (iccid.equals(slotAndSubs.get(1).subId)) {
                    icc = 2;
                } else {
                    icc = 0;
                }
            }
        }
        return icc;
    }

    /**
     * 获取来自那张卡 即卡1 还是卡2
     *
     * @param mContext
     * @param subID
     * @return
     */
    public static int getSlot(Context mContext, String subID) {
        return getIcc(subID, getModelSlot(mContext));
    }

    //获取对应的卡槽ID和iccID 关联
    private static List<ModelSlotAndSub> getModelSlot(Context mContext) {
        List<ModelSlotAndSub> data = new ArrayList<>();
        ModelSlotAndSub modelSlotAndSub = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            SubscriptionManager subscriptionManager = SubscriptionManager.from(mContext);
            if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
                List<SubscriptionInfo> mSubcriptionInfos = subscriptionManager.getActiveSubscriptionInfoList();
                if (mSubcriptionInfos != null) {
                    for (int i = 0; i < mSubcriptionInfos.size(); i++) {
                        SubscriptionInfo info = mSubcriptionInfos.get(i);
                        if (info != null) {
                            modelSlotAndSub = new ModelSlotAndSub();
                            modelSlotAndSub.subId = info.getSubscriptionId() + "";
                            modelSlotAndSub.simSlot = info.getSimSlotIndex() + 1 + "";
                            modelSlotAndSub.iccid = info.getIccId();
                            data.add(modelSlotAndSub);
                        }
                    }
                    if (data != null && data.size() == 2) {
                        if (!TextUtils.isEmpty(data.get(0).simSlot) && !TextUtils.isEmpty(data.get(1).simSlot)) {
                            int simSlot1 = Integer.valueOf(data.get(0).simSlot);
                            int simSlot2 = Integer.valueOf(data.get(1).simSlot);
                            if (simSlot1 > simSlot2) {
                                ModelSlotAndSub modelSlotAndSub1 = data.get(1);
                                data.remove(data.get(1));
                                data.add(0, modelSlotAndSub1);
                            }
                        }
                    }
                }
            }
        }
        return data;
    }

}