diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/LocationUtil.java b/common/src/main/java/com/xypower/common/LocationUtil.java similarity index 99% rename from mpmaster/src/main/java/com/xypower/mpmaster/LocationUtil.java rename to common/src/main/java/com/xypower/common/LocationUtil.java index 9ddce61c..89f94531 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/LocationUtil.java +++ b/common/src/main/java/com/xypower/common/LocationUtil.java @@ -1,4 +1,4 @@ -package com.xypower.mpmaster; +package com.xypower.common; import android.Manifest; import android.content.Context; diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/MainActivity.java b/mpmaster/src/main/java/com/xypower/mpmaster/MainActivity.java index 9c596e9c..3a1880a2 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/MainActivity.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/MainActivity.java @@ -133,33 +133,35 @@ public class MainActivity extends AppCompatActivity { public void onClick(View view) { // boolean gpsEnabled = LocationUtil.isGpsEnabled(MainActivity.this); // System.out.printf("g" + gpsEnabled); - LocationUtil.register(MainActivity.this, 0, 0, new LocationUtil.OnLocationChangeListener() { - @Override - public void getLastKnownLocation(Location location) { - Log.e("xyh", "onLocationChanged: " + location.getLatitude()); - } - - @Override - public void onLocationChanged(Location location) { - //位置信息变化时触发 - Log.e("xyh", "定位方式:" + location.getProvider()); - Log.e("xyh", "纬度:" + location.getLatitude()); - Log.e("xyh", "经度:" + location.getLongitude()); - Log.e("xyh", "海拔:" + location.getAltitude()); - Log.e("xyh", "时间:" + location.getTime()); - Log.e("xyh", "国家:" + LocationUtil.getCountryName(MainActivity.this, location.getLatitude(), location.getLongitude())); - Log.e("xyh", "获取地理位置:" + LocationUtil.getAddress(MainActivity.this, location.getLatitude(), location.getLongitude())); - Log.e("xyh", "所在地:" + LocationUtil.getLocality(MainActivity.this, location.getLatitude(), location.getLongitude())); - Log.e("xyh", "所在街道:" + LocationUtil.getStreet(MainActivity.this, location.getLatitude(), location.getLongitude())); - LocationUtil.unregister(); - - } - - @Override - public void onStatusChanged(String provider, int status, Bundle extras) { - System.out.println("dfsad"); - } - }); +// LocationUtil.register(MainActivity.this, 0, 0, new LocationUtil.OnLocationChangeListener() { +// @Override +// public void getLastKnownLocation(Location location) { +// Log.e("xyh", "onLocationChanged: " + location.getLatitude()); +// } +// +// @Override +// public void onLocationChanged(Location location) { +// //位置信息变化时触发 +// Log.e("xyh", "定位方式:" + location.getProvider()); +// Log.e("xyh", "纬度:" + location.getLatitude()); +// Log.e("xyh", "经度:" + location.getLongitude()); +// Log.e("xyh", "海拔:" + location.getAltitude()); +// Log.e("xyh", "时间:" + location.getTime()); +// Log.e("xyh", "国家:" + LocationUtil.getCountryName(MainActivity.this, location.getLatitude(), location.getLongitude())); +// Log.e("xyh", "获取地理位置:" + LocationUtil.getAddress(MainActivity.this, location.getLatitude(), location.getLongitude())); +// Log.e("xyh", "所在地:" + LocationUtil.getLocality(MainActivity.this, location.getLatitude(), location.getLongitude())); +// Log.e("xyh", "所在街道:" + LocationUtil.getStreet(MainActivity.this, location.getLatitude(), location.getLongitude())); +// LocationUtil.unregister(); +// +// } +// +// @Override +// public void onStatusChanged(String provider, int status, Bundle extras) { +// System.out.println("dfsad"); +// } +// }); + + SysApi.reboot(MainActivity.this); } }); diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java index dc7c367e..face8c5c 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java @@ -42,6 +42,10 @@ import com.xypower.mpmaster.sms.SmsSendReceiver; import org.json.JSONObject; import java.io.File; +import java.util.Arrays; +import java.util.Calendar; +import java.util.List; +import java.util.TimeZone; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; @@ -83,6 +87,7 @@ public class MpMasterService extends Service { public static final int CONNECTED = 10; public static final int NOT_CONNECTED = 0; } + private static int mStateService = STATE_SERVICE.NOT_CONNECTED; private boolean mMntnMode = false; @@ -120,6 +125,7 @@ public class MpMasterService extends Service { public MpMasterService() { } + @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. @@ -226,7 +232,7 @@ public class MpMasterService extends Service { mSmsSnedReceiver = new SmsSendReceiver(); IntentFilter intentFilter; intentFilter = new IntentFilter(SimUtil.SMS_SEND_ACTION); - registerReceiver(mSmsSnedReceiver,intentFilter); + registerReceiver(mSmsSnedReceiver, intentFilter); // AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); @@ -294,8 +300,7 @@ public class MpMasterService extends Service { } private void loadIccid() { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) - { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) { try { SubscriptionManager sm = SubscriptionManager.from(this); List sis = sm.getActiveSubscriptionInfoList(); @@ -410,8 +415,7 @@ public class MpMasterService extends Service { MicroPhotoContext.saveMasterConfig(getApplicationContext(), masterConfig); - logger.warning("MNTN Mode Changed from " + convertSwitch(oldMntnMode) + " to " + convertSwitch(mntnMode) - + " Quick Heartbeat from" + convertSwitch(oldQuickHbMode) + " to " + convertSwitch(quickHbMode)); + logger.warning("MNTN Mode Changed from " + convertSwitch(oldMntnMode) + " to " + convertSwitch(mntnMode) + " Quick Heartbeat from" + convertSwitch(oldQuickHbMode) + " to " + convertSwitch(quickHbMode)); } if (oldQuickHbMode != quickHbMode) { @@ -442,12 +446,15 @@ public class MpMasterService extends Service { public static class AlarmReceiver extends BroadcastReceiver { private MpMasterService mService; + public AlarmReceiver() { mService = null; } + public AlarmReceiver(MpMasterService service) { mService = service; } + public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (TextUtils.equals(ACTION_HEARTBEAT, action)) { @@ -480,24 +487,15 @@ public class MpMasterService extends Service { String cmd = intent.getStringExtra("cmd"); String msg = intent.getStringExtra("msg"); // Log.e("_otg_","cmd="+cmd); - if("write".equals(cmd)) - { + if ("write".equals(cmd)) { // int progress = Integer.parseInt(msg); - } - else if("update".equals(cmd)) - { + } else if ("update".equals(cmd)) { // int progress = Integer.parseInt(msg); - } - else if("info".equals(cmd)) - { + } else if ("info".equals(cmd)) { - } - else if("error".equals(cmd)) - { + } else if ("error".equals(cmd)) { mService.logger.warning("UPD OTA Failed"); - } - else if("success".equals(cmd)) - { + } else if ("success".equals(cmd)) { //confirm to reboot device ?? mService.logger.warning("UPD OTA Succeeded, will RESET dev"); Handler handler = new Handler(); @@ -528,11 +526,45 @@ public class MpMasterService extends Service { long timeout = mHeartbeatDuration; if (mMntnMode && mQuickHbMode) { timeout = mQuickHeartbeatDuration; + registerHeartbeatTimer(SystemClock.elapsedRealtime() + timeout * 1000); } else { - + long closestTime = 0; + if (mAbsHeartbeatTimes != null && mAbsHeartbeatTimes.length > 0) { + long currentTimeMillis = System.currentTimeMillis(); + long heartTimeMills = currentTimeMillis + timeout * 1000; + Arrays.sort(mAbsHeartbeatTimes); + for (int i = 0; i < mAbsHeartbeatTimes.length; i++) { + int mAbsHeartbeatTime = mAbsHeartbeatTimes[i]; + int hour = mAbsHeartbeatTime / 3600; + int leftsecond = mAbsHeartbeatTime % 3600; + int minute = leftsecond / 3600; + if (hour >= 24) { + return; + } + //设置提醒时间 + Calendar calendar = Calendar.getInstance(); + //这里时区需要设置一下,不然会有8个小时的时间差 + calendar.setTimeZone(TimeZone.getTimeZone("GMT+8")); + //设置每天为13:50点提醒 + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + long selecttime = calendar.getTimeInMillis(); + if (selecttime > currentTimeMillis && selecttime < heartTimeMills) { + closestTime = selecttime; + break; + } else { + if (i == (mAbsHeartbeatTimes.length - 1)) { + closestTime = heartTimeMills; + } + } + } + } + if (closestTime > 0) { + registerAbsHeartbeatTimer(closestTime); + } } - - registerHeartbeatTimer(SystemClock.elapsedRealtime() + timeout * 1000); } private void registerHeartbeatTimer(long triggerTime) { @@ -554,6 +586,25 @@ public class MpMasterService extends Service { alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, pendingIntent); } + private void registerAbsHeartbeatTimer(long triggerTime) { + + AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); + if (mPreviousHB != null) { + try { + alarmManager.cancel(mPreviousHB); + } catch (Exception ex) { + } + mPreviousHeartbeatTime = 0; + } + Intent alarmIntent = new Intent(); + alarmIntent.setAction(ACTION_HEARTBEAT); + PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0); + + mPreviousHB = pendingIntent; + mPreviousHeartbeatTime = triggerTime; + alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent); + } + @Override public int onStartCommand(Intent intent, int flags, int startId) { @@ -601,22 +652,20 @@ public class MpMasterService extends Service { private void connect() { // after 10 seconds its connected - mHander.postDelayed( - new Runnable() { - public void run() { - Log.d(TAG, "Bluetooth Low Energy device is connected!!"); - Toast.makeText(getApplicationContext(), "Connected!", Toast.LENGTH_SHORT).show(); - mStateService = STATE_SERVICE.CONNECTED; - startForeground(NOTIFICATION_ID_FOREGROUND_SERVICE, prepareNotification()); - } - }, 10000); + mHander.postDelayed(new Runnable() { + public void run() { + Log.d(TAG, "Bluetooth Low Energy device is connected!!"); + Toast.makeText(getApplicationContext(), "Connected!", Toast.LENGTH_SHORT).show(); + mStateService = STATE_SERVICE.CONNECTED; + startForeground(NOTIFICATION_ID_FOREGROUND_SERVICE, prepareNotification()); + } + }, 10000); } private Notification prepareNotification() { // handle build version above android oreo - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O && - mNotificationManager.getNotificationChannel(FOREGROUND_CHANNEL_ID) == null) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O && mNotificationManager.getNotificationChannel(FOREGROUND_CHANNEL_ID) == null) { CharSequence name = getString(R.string.text_name_notification); int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel(FOREGROUND_CHANNEL_ID, name, importance); @@ -661,14 +710,7 @@ public class MpMasterService extends Service { } else { notificationBuilder = new NotificationCompat.Builder(this); } - notificationBuilder - .setContent(remoteViews) - .setSmallIcon(R.mipmap.ic_launcher) - .setCategory(NotificationCompat.CATEGORY_SERVICE) - .setOnlyAlertOnce(true) - .setOngoing(true) - .setAutoCancel(true) - .setContentIntent(pendingIntent); + notificationBuilder.setContent(remoteViews).setSmallIcon(R.mipmap.ic_launcher).setCategory(NotificationCompat.CATEGORY_SERVICE).setOnlyAlertOnce(true).setOngoing(true).setAutoCancel(true).setContentIntent(pendingIntent); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { notificationBuilder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC); @@ -734,7 +776,7 @@ public class MpMasterService extends Service { File file = new File(tempPath); file.mkdirs(); final String filePath = tempPath + File.separator + "mp.apk"; - Thread th =new Thread(new Runnable() { + Thread th = new Thread(new Runnable() { @Override public void run() { @@ -767,8 +809,7 @@ public class MpMasterService extends Service { Intent intent = getApplicationContext().registerReceiver(null, intentFilter); int batteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); - int isCahrging = ((batteryStatus == BatteryManager.BATTERY_STATUS_CHARGING) || - (batteryStatus == BatteryManager.BATTERY_STATUS_FULL)) ? 1 : 0; + int isCahrging = ((batteryStatus == BatteryManager.BATTERY_STATUS_CHARGING) || (batteryStatus == BatteryManager.BATTERY_STATUS_FULL)) ? 1 : 0; int level = intent.getIntExtra("level", 0); ///电池剩余电量 int scale = intent.getIntExtra("scale", 0); ///获取电池满电量数值 @@ -785,15 +826,15 @@ public class MpMasterService extends Service { int bc = manager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW); level = manager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY); - float bcaVal = (bca < 0) ? ((-bca)/1000000000) : (bca / 1000000000); + float bcaVal = (bca < 0) ? ((-bca) / 1000000000) : (bca / 1000000000); sb.append("&BC=" + Float.toString(bcaVal)); - sb.append("&BV=" + Float.toString(((float)bv) / 1000)); + sb.append("&BV=" + Float.toString(((float) bv) / 1000)); sb.append("&BP=" + level); sb.append("&BS=" + scale); sb.append("&CS=" + isCahrging); - ConnectivityManager cm = (ConnectivityManager)getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); + ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); boolean isMetered = cm.isActiveNetworkMetered(); sb.append("&NS=" + (isMetered ? "1" : "0")); @@ -811,7 +852,7 @@ public class MpMasterService extends Service { } if (isXyPlatform) { - java.text.DecimalFormat fmt=new java.text.DecimalFormat("0.0"); + java.text.DecimalFormat fmt = new java.text.DecimalFormat("0.0"); double val = SysApi.getChargingVoltage() / 200.0; sb.append("&CV=" + fmt.format(val)); // ChargeVol *5/1000 @@ -875,9 +916,10 @@ public class MpMasterService extends Service { } public native static int getInt(int cmd); + public native static int[] getStats(long ts); ////////////////////////GPS//////////////////// - + } \ No newline at end of file diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/sms/SimUtil.java b/mpmaster/src/main/java/com/xypower/mpmaster/sms/SimUtil.java index 801bede1..c0cc4815 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/sms/SimUtil.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/sms/SimUtil.java @@ -16,6 +16,8 @@ import android.text.TextUtils; import androidx.core.app.ActivityCompat; +import org.json.JSONArray; + import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -37,7 +39,7 @@ public class SimUtil { public static String SMSTYPE = "smstype"; //短信解析 - public static SmsMessageModel analysisSMSInfo(Intent intent, Context context) { + public static void analysisSMSInfo(Intent intent, Context context) { SmsMessageModel smsInfo = getSMSInfo(intent); if (smsInfo != null) { String content = smsInfo.getContent(); @@ -45,16 +47,53 @@ public class SimUtil { String sender = smsInfo.getSender(); String sendmessage = ""; String sendtype = ""; + if (StringUtils.isEmpty(content)) { + return; + } if (content.contains(SmsTypeEnum.REBOOT1.value())) { sendmessage = content + " OK"; sendtype = SmsTypeEnum.REBOOT1.value(); } else if (content.contains(SmsTypeEnum.REBOOT2.value())) { sendmessage = content + " OK"; sendtype = SmsTypeEnum.REBOOT2.value(); + } else if (content.contains(SmsTypeEnum.SET_YW_SCHEDULE.value())) { + String packageName = context.getApplicationContext().getPackageName(); + 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 >= 1) { + String num = split2[0]; + Integer integer = StringUtils.convert2Int(num); + if (integer != null) { + if (integer == 0) {//删除所有运维 + UpdateSysConfigUtil.updateAbsHeartbeats(packageName, new JSONArray()); + } else { + JSONArray jsonArray = new JSONArray(); + int times = 0; + for (int i = 0; i < split2.length; i++) { + if (i == 0) { + continue; + } + String ts = split2[i]; + Integer time = StringUtils.convert2Int(ts); + if (i % 2 == 1) { + time = 0; + times = time * 3600; + } else { + times += time; + jsonArray.put(times); + } + } + } + } + } + } + sendmessage = content + " OK"; + sendtype = SmsTypeEnum.REBOOT2.value(); } sendSms(context, slot, sender, sendmessage, sendtype); } - return smsInfo; } //短信解析 diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/sms/SmsTypeEnum.java b/mpmaster/src/main/java/com/xypower/mpmaster/sms/SmsTypeEnum.java index 6b409ebd..acabc4c7 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/sms/SmsTypeEnum.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/sms/SmsTypeEnum.java @@ -2,7 +2,8 @@ package com.xypower.mpmaster.sms; public enum SmsTypeEnum { REBOOT1("yw+at+stw21"), REBOOT2("at+stw21"), //重启命令 - YW_SCHEDULE("yw+at+stw51"), //拍照时间表设置 + SET_YW_SCHEDULE("yw+at+stw51"), //拍照时间表设置 + GET_YW_SCHEDULE("yw+at+str51"), //查询拍照时间表 OPERATE("yw+at+stw52"), //运维开关 OPERATE_URL("yw+at+stw53"), //运维地址 ADB("yw+at+ds"), //开关adb diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/sms/StringUtils.java b/mpmaster/src/main/java/com/xypower/mpmaster/sms/StringUtils.java new file mode 100644 index 00000000..7c37245a --- /dev/null +++ b/mpmaster/src/main/java/com/xypower/mpmaster/sms/StringUtils.java @@ -0,0 +1,360 @@ +package com.xypower.mpmaster.sms; + + +import java.util.*; + +/** + * 字符串工具类 + * + * @author 晶晶 + */ +public class StringUtils { + /** + * 空字符串 + */ + private static final String NULLSTR = ""; + + /** + * 下划线 + */ + private static final char SEPARATOR = '_'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + * * @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) { + return object == null; + } + + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) { + return !isNull(object); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) { + return (str == null ? "" : str.trim()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) { + if (str == null) { + return NULLSTR; + } + + if (start < 0) { + start = str.length() + start; + } + + if (start < 0) { + start = 0; + } + if (start > str.length()) { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) { + if (str == null) { + return NULLSTR; + } + + if (end < 0) { + end = str.length() + end; + } + if (start < 0) { + start = str.length() + start; + } + + if (end > str.length()) { + end = str.length(); + } + + if (start > end) { + return NULLSTR; + } + + if (start < 0) { + start = 0; + } + if (end < 0) { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) { + if (str == null) { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean curreCharIsUpperCase = true; + // 下一字符是否大写 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (i > 0) { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } else { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) { + sb.append(SEPARATOR); + } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) { + if (str != null && strs != null) { + for (String s : strs) { + if (str.equalsIgnoreCase(trim(s))) { + return true; + } + } + } + return false; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } else if (!name.contains("_")) { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 例如:user_name->userName + */ + public static String toCamelCase(String s) { + if (s == null) { + return null; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + if (c == SEPARATOR) { + upperCase = true; + } else if (upperCase) { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } else { + sb.append(c); + } + } + return sb.toString(); + } + + + /** + * 按照=号切割字符串 + */ + public static String[] splitString1(String info) { + String[] temp = null; + temp = info.split("="); + return temp; + } + + /** + * 按照,号切割字符串 + */ + public static String[] splitString2(String info) { + String[] temp = null; + temp = info.split(","); + return temp; + } + + /** + * 将字符串转成Int类型 + */ + public static Integer convert2Int(String info) { + Integer integer = null; + try { + integer = Integer.valueOf(info); + // 使用转换后的整数 + } catch (NumberFormatException e) { + // 处理转换错误 + return null; + } + return integer; + } + + +} \ No newline at end of file diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/sms/UpdateSysConfigUtil.java b/mpmaster/src/main/java/com/xypower/mpmaster/sms/UpdateSysConfigUtil.java new file mode 100644 index 00000000..2d02b552 --- /dev/null +++ b/mpmaster/src/main/java/com/xypower/mpmaster/sms/UpdateSysConfigUtil.java @@ -0,0 +1,76 @@ +package com.xypower.mpmaster.sms; + +import android.content.Context; +import android.os.Environment; +import android.text.TextUtils; + +import com.xypower.common.JSONUtils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; + +public class UpdateSysConfigUtil { + + public static String SysConfigName = "data/Master.json"; + + //创建运维配置文件文件夹 + public static String buildAppDir(String packageurl) { + String path = Environment.getExternalStorageDirectory().getAbsolutePath(); + if (!path.endsWith(File.separator)) { + path += File.separator; + } + path += packageurl + File.separator; + File pathFile = new File(path); + if (!pathFile.exists() && !pathFile.mkdirs()) { + return null; + } + return path; + } + + //获取配置文件地址 + public static String getAppDir(String packageurl) { + String path = buildAppDir(packageurl); + path += SysConfigName; + return path; + } + + //修改运维时间表 + public static boolean updateAbsHeartbeats(String packageurl, JSONArray jsonArray) { + String path = getAppDir(packageurl); + JSONObject jsonObject = JSONUtils.loadJson(path); + try { + jsonObject.put("absHeartbeats", jsonArray); + } catch (JSONException e) { + throw new RuntimeException(e); + } + return JSONUtils.saveJson(path, jsonObject); + } + + //修改运维状态 TODO + public boolean updateMntn(String packageurl, String url) { + if (TextUtils.isEmpty(url)) { + return false; + } + String path = getAppDir(packageurl); + JSONObject jsonObject = JSONUtils.loadJson(path); + String oldUrl = null; + try { + oldUrl = jsonObject.getString("url"); + } catch (Exception ex) { + ex.printStackTrace(); + } + if (TextUtils.equals(url, oldUrl)) { + return true; + } + + try { + jsonObject.put("url", url); + } catch (Exception ex) { + ex.printStackTrace(); + } + return JSONUtils.saveJson(path, jsonObject); + } +}