Browse Source

移除ffmegp

hxMac 1 week ago
parent
commit
56703974e7

+ 3 - 0
UtilsApplication/.idea/.gitignore

@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml

+ 9 - 0
UtilsApplication/.idea/UtilsApplication.iml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 6 - 0
UtilsApplication/.idea/misc.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 8 - 0
UtilsApplication/.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/UtilsApplication.iml" filepath="$PROJECT_DIR$/.idea/UtilsApplication.iml" />
+    </modules>
+  </component>
+</project>

+ 428 - 0
UtilsApplication/.idea/other.xml

@@ -0,0 +1,428 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="direct_access_persist.xml">
+    <option name="deviceSelectionList">
+      <list>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="27" />
+          <option name="brand" value="DOCOMO" />
+          <option name="codename" value="F01L" />
+          <option name="id" value="F01L" />
+          <option name="manufacturer" value="FUJITSU" />
+          <option name="name" value="F-01L" />
+          <option name="screenDensity" value="360" />
+          <option name="screenX" value="720" />
+          <option name="screenY" value="1280" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="OPPO" />
+          <option name="codename" value="OP573DL1" />
+          <option name="id" value="OP573DL1" />
+          <option name="manufacturer" value="OPPO" />
+          <option name="name" value="CPH2557" />
+          <option name="screenDensity" value="480" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="28" />
+          <option name="brand" value="DOCOMO" />
+          <option name="codename" value="SH-01L" />
+          <option name="id" value="SH-01L" />
+          <option name="manufacturer" value="SHARP" />
+          <option name="name" value="AQUOS sense2 SH-01L" />
+          <option name="screenDensity" value="480" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2160" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="Lenovo" />
+          <option name="codename" value="TB370FU" />
+          <option name="id" value="TB370FU" />
+          <option name="manufacturer" value="Lenovo" />
+          <option name="name" value="Tab P12" />
+          <option name="screenDensity" value="340" />
+          <option name="screenX" value="1840" />
+          <option name="screenY" value="2944" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="a15" />
+          <option name="id" value="a15" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="A15" />
+          <option name="screenDensity" value="450" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2340" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="31" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="a51" />
+          <option name="id" value="a51" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy A51" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="akita" />
+          <option name="id" value="akita" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 8a" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="motorola" />
+          <option name="codename" value="arcfox" />
+          <option name="id" value="arcfox" />
+          <option name="manufacturer" value="Motorola" />
+          <option name="name" value="razr plus 2024" />
+          <option name="screenDensity" value="360" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="1272" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="b0q" />
+          <option name="id" value="b0q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy S22 Ultra" />
+          <option name="screenDensity" value="600" />
+          <option name="screenX" value="1440" />
+          <option name="screenY" value="3088" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="32" />
+          <option name="brand" value="google" />
+          <option name="codename" value="bluejay" />
+          <option name="id" value="bluejay" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 6a" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="caiman" />
+          <option name="id" value="caiman" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 9 Pro" />
+          <option name="screenDensity" value="360" />
+          <option name="screenX" value="960" />
+          <option name="screenY" value="2142" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="comet" />
+          <option name="id" value="comet" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 9 Pro Fold" />
+          <option name="screenDensity" value="390" />
+          <option name="screenX" value="2076" />
+          <option name="screenY" value="2152" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="29" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="crownqlteue" />
+          <option name="id" value="crownqlteue" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy Note9" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="2220" />
+          <option name="screenY" value="1080" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="dm2q" />
+          <option name="id" value="dm2q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="S23 Plus" />
+          <option name="screenDensity" value="450" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2340" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="dm3q" />
+          <option name="id" value="dm3q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy S23 Ultra" />
+          <option name="screenDensity" value="600" />
+          <option name="screenX" value="1440" />
+          <option name="screenY" value="3088" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="e1q" />
+          <option name="id" value="e1q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy S24" />
+          <option name="screenDensity" value="480" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2340" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="e3q" />
+          <option name="id" value="e3q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy S24 Ultra" />
+          <option name="screenDensity" value="450" />
+          <option name="screenX" value="1440" />
+          <option name="screenY" value="3120" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="eos" />
+          <option name="id" value="eos" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Eos" />
+          <option name="screenDensity" value="320" />
+          <option name="screenX" value="384" />
+          <option name="screenY" value="384" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="felix" />
+          <option name="id" value="felix" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Fold" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="2208" />
+          <option name="screenY" value="1840" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="felix" />
+          <option name="id" value="felix" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Fold" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="2208" />
+          <option name="screenY" value="1840" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="felix_camera" />
+          <option name="id" value="felix_camera" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Fold (Camera-enabled)" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="2208" />
+          <option name="screenY" value="1840" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="motorola" />
+          <option name="codename" value="fogona" />
+          <option name="id" value="fogona" />
+          <option name="manufacturer" value="Motorola" />
+          <option name="name" value="moto g play - 2024" />
+          <option name="screenDensity" value="280" />
+          <option name="screenX" value="720" />
+          <option name="screenY" value="1600" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="g0q" />
+          <option name="id" value="g0q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="SM-S906U1" />
+          <option name="screenDensity" value="450" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2340" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="gts8uwifi" />
+          <option name="id" value="gts8uwifi" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy Tab S8 Ultra" />
+          <option name="screenDensity" value="320" />
+          <option name="screenX" value="1848" />
+          <option name="screenY" value="2960" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="husky" />
+          <option name="id" value="husky" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 8 Pro" />
+          <option name="screenDensity" value="390" />
+          <option name="screenX" value="1008" />
+          <option name="screenY" value="2244" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="30" />
+          <option name="brand" value="motorola" />
+          <option name="codename" value="java" />
+          <option name="id" value="java" />
+          <option name="manufacturer" value="Motorola" />
+          <option name="name" value="G20" />
+          <option name="screenDensity" value="280" />
+          <option name="screenX" value="720" />
+          <option name="screenY" value="1600" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="komodo" />
+          <option name="id" value="komodo" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 9 Pro XL" />
+          <option name="screenDensity" value="360" />
+          <option name="screenX" value="1008" />
+          <option name="screenY" value="2244" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="lynx" />
+          <option name="id" value="lynx" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 7a" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="motorola" />
+          <option name="codename" value="maui" />
+          <option name="id" value="maui" />
+          <option name="manufacturer" value="Motorola" />
+          <option name="name" value="moto g play - 2023" />
+          <option name="screenDensity" value="280" />
+          <option name="screenX" value="720" />
+          <option name="screenY" value="1600" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="31" />
+          <option name="brand" value="google" />
+          <option name="codename" value="oriole" />
+          <option name="id" value="oriole" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 6" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="panther" />
+          <option name="id" value="panther" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 7" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="q5q" />
+          <option name="id" value="q5q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy Z Fold5" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1812" />
+          <option name="screenY" value="2176" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="q6q" />
+          <option name="id" value="q6q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy Z Fold6" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1856" />
+          <option name="screenY" value="2160" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="30" />
+          <option name="brand" value="google" />
+          <option name="codename" value="r11" />
+          <option name="id" value="r11" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Watch" />
+          <option name="screenDensity" value="320" />
+          <option name="screenX" value="384" />
+          <option name="screenY" value="384" />
+          <option name="type" value="WEAR_OS" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="30" />
+          <option name="brand" value="google" />
+          <option name="codename" value="redfin" />
+          <option name="id" value="redfin" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 5" />
+          <option name="screenDensity" value="440" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2340" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="shiba" />
+          <option name="id" value="shiba" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 8" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="tangorpro" />
+          <option name="id" value="tangorpro" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Tablet" />
+          <option name="screenDensity" value="320" />
+          <option name="screenX" value="1600" />
+          <option name="screenY" value="2560" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="tokay" />
+          <option name="id" value="tokay" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 9" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2424" />
+        </PersistentDeviceSelectionData>
+      </list>
+    </option>
+  </component>
+</project>

+ 6 - 0
UtilsApplication/.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+  </component>
+</project>

+ 33 - 0
UtilsApplication/app/.idea/other.xml

@@ -124,6 +124,17 @@
           <option name="screenX" value="2220" />
           <option name="screenY" value="1080" />
         </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="dm2q" />
+          <option name="id" value="dm2q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="S23 Plus" />
+          <option name="screenDensity" value="450" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2340" />
+        </PersistentDeviceSelectionData>
         <PersistentDeviceSelectionData>
           <option name="api" value="34" />
           <option name="brand" value="samsung" />
@@ -201,6 +212,17 @@
           <option name="screenX" value="2208" />
           <option name="screenY" value="1840" />
         </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="motorola" />
+          <option name="codename" value="fogona" />
+          <option name="id" value="fogona" />
+          <option name="manufacturer" value="Motorola" />
+          <option name="name" value="moto g play - 2024" />
+          <option name="screenDensity" value="280" />
+          <option name="screenX" value="720" />
+          <option name="screenY" value="1600" />
+        </PersistentDeviceSelectionData>
         <PersistentDeviceSelectionData>
           <option name="api" value="33" />
           <option name="brand" value="samsung" />
@@ -256,6 +278,17 @@
           <option name="screenX" value="1080" />
           <option name="screenY" value="2400" />
         </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="motorola" />
+          <option name="codename" value="maui" />
+          <option name="id" value="maui" />
+          <option name="manufacturer" value="Motorola" />
+          <option name="name" value="moto g play - 2023" />
+          <option name="screenDensity" value="280" />
+          <option name="screenX" value="720" />
+          <option name="screenY" value="1600" />
+        </PersistentDeviceSelectionData>
         <PersistentDeviceSelectionData>
           <option name="api" value="31" />
           <option name="brand" value="google" />

+ 240 - 0
UtilsApplication/app/app/src/main/java/com/hx/utils/application/ui/calendar/CalendarFragment.kt

@@ -0,0 +1,240 @@
+package com.hx.utils.application.ui.calendar
+
+import android.Manifest.permission.READ_PHONE_STATE
+import android.Manifest.permission.READ_SMS
+import android.Manifest.permission.RECEIVE_SMS
+import android.Manifest.permission.SEND_SMS
+import android.app.DatePickerDialog
+import android.app.TimePickerDialog
+import android.app.role.RoleManager
+import android.content.ContentValues
+import android.content.Intent
+import android.os.Build
+import android.provider.Telephony
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.widget.doOnTextChanged
+import androidx.lifecycle.ViewModelProvider
+import com.blankj.utilcode.util.AppUtils
+import com.blankj.utilcode.util.PermissionUtils
+import com.blankj.utilcode.util.StringUtils
+import com.blankj.utilcode.util.TimeUtils
+import com.blankj.utilcode.util.ToastUtils
+import com.hx.utils.application.R
+import com.hx.utils.application.base.BaseFragment
+import com.hx.utils.application.databinding.FragmentSmsBinding
+import kotlinx.coroutines.DelicateCoroutinesApi
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import java.util.Calendar
+
+class CalendarFragment : BaseFragment<FragmentSmsBinding, CalendarViewModel>() {
+
+    override fun setupViewModel() {
+        viewModel = ViewModelProvider(this)[CalendarViewModel::class.java]
+    }
+
+    override fun setupView() {
+        binding.loading.visibility = View.GONE
+        binding.insertMms.setOnClickListener {
+            val smsPackageName = Telephony.Sms.getDefaultSmsPackage(context)
+            val currentPackageName = context?.packageName
+            if (!smsPackageName.isNullOrBlank()) {
+                if (smsPackageName != currentPackageName) {
+                    val intent: Intent?
+                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
+                        intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT)
+                        intent.putExtra(
+                            Telephony.Sms.Intents.EXTRA_PACKAGE_NAME,
+                            requireContext().packageName
+                        )
+                        requireContext().startActivity(intent)
+                    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+                        openSMSappChooser()
+                    }
+                    return@setOnClickListener
+                }
+            }
+
+            val name = binding.name.text?.toString().orEmpty()
+            val message = binding.message.text?.toString().orEmpty()
+            if (name.isBlank()) {
+                binding.name.error = getString(R.string.not_empty)
+                return@setOnClickListener
+            }
+
+            if (message.isBlank()) {
+                binding.message.error = getString(R.string.not_empty)
+                return@setOnClickListener
+            }
+
+            binding.loading.visibility = View.VISIBLE
+            insertSms()
+
+        }
+
+        binding.selectTime.setOnClickListener {
+            val calendar = Calendar.getInstance()
+            val datePickerDialog = DatePickerDialog(
+                requireActivity(),
+                { _, year, month, dayOfMonth ->
+                    showTimePickerDialog(year, month, dayOfMonth)
+                },
+                calendar.get(Calendar.YEAR),
+                calendar.get(Calendar.MONTH),
+                calendar.get(Calendar.DAY_OF_MONTH)
+            )
+            datePickerDialog.show()
+        }
+        binding.read.setOnCheckedChangeListener { _, b ->
+            viewModel.read.postValue(b)
+        }
+
+        binding.name.doOnTextChanged { text, _, _, _ ->
+            viewModel.name.postValue(text.toString())
+        }
+
+        binding.message.doOnTextChanged { text, _, _, _ ->
+            viewModel.message.postValue(text.toString())
+        }
+
+        viewModel.message.observe(viewLifecycleOwner) {
+            binding.showMsg.text = it
+        }
+
+        viewModel.name.observe(viewLifecycleOwner) {
+            binding.materialTextView.text = StringUtils.getString(R.string.from_s, it)
+        }
+
+        viewModel.read.observe(viewLifecycleOwner) {
+            binding.materialTextView3.setText(if (it) R.string.read else R.string.unread)
+        }
+
+        viewModel.showTime.observe(viewLifecycleOwner) {
+            binding.selectTime.text = it
+            binding.materialTextView2.text = it
+        }
+
+        (activity as? AppCompatActivity)?.supportActionBar?.title = arguments?.getString("data")
+    }
+
+    override fun setupBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentSmsBinding {
+        return FragmentSmsBinding.inflate(inflater, container, false)
+    }
+
+
+    override fun onStart() {
+        super.onStart()
+        getPermissions()
+    }
+
+
+    fun getPermissions() {
+        val permissions = listOf(SEND_SMS, RECEIVE_SMS, READ_SMS, READ_PHONE_STATE).toTypedArray()
+        PermissionUtils.permission(*permissions)
+            .rationale { _, shouldRequest ->
+                run {
+                    shouldRequest.again(true)
+                }
+            }.callback(object : PermissionUtils.FullCallback {
+                override fun onGranted(permissionsGranted: MutableList<String>) {
+                    Log.d("hzshkj", "onGranted: $permissionsGranted")
+                }
+
+                override fun onDenied(forever: MutableList<String>, denied: MutableList<String>) {
+                    if (forever.isNotEmpty()) {
+                        AppUtils.launchAppDetailsSettings()
+                    } else {
+                        getPermissions()
+                    }
+                }
+            }).request()
+    }
+
+
+    @OptIn(DelicateCoroutinesApi::class)
+    private fun insertSms() {
+        try {
+            val values = ContentValues().apply {
+                put(Telephony.Sms.ADDRESS, binding.name.text.toString())
+                put(Telephony.Sms.DATE, viewModel.time.value)
+                put(Telephony.Sms.DATE_SENT, viewModel.time.value?.minus(5000))
+                put(Telephony.Sms.READ, viewModel.read.value)
+                put(Telephony.Sms.TYPE, 1)
+                put(Telephony.Sms.BODY, binding.message.text.toString())
+                put(Telephony.Sms.TYPE, Telephony.Sms.MESSAGE_TYPE_INBOX)
+            }
+            context?.contentResolver?.insert(Telephony.Sms.CONTENT_URI, values)
+
+            binding.name.text?.clear()
+            binding.message.text?.clear()
+            viewModel.time.postValue(0)
+            viewModel.showTime.postValue("")
+
+        } catch (e: Exception) {
+            e.message?.let {
+                GlobalScope.launch(Dispatchers.Main) {
+                    delay(2000)
+                    ToastUtils.showLong(it)
+                }
+            }
+        } finally {
+            GlobalScope.launch(Dispatchers.Main) {
+                delay(2000)
+                binding.loading.visibility = View.GONE
+            }
+        }
+
+    }
+
+    private fun showTimePickerDialog(year: Int, month: Int, dayOfMonth: Int) {
+        val calendar = Calendar.getInstance()
+        val timePickerDialog = TimePickerDialog(
+            requireActivity(),
+            { _, h, m ->
+                val selectedCalendar = Calendar.getInstance()
+                selectedCalendar.set(year, month, dayOfMonth, h, m)
+                val selectedTimestamp = selectedCalendar.timeInMillis
+
+                handleSelectedTimestamp(
+                    selectedTimestamp,
+                    TimeUtils.date2String(TimeUtils.millis2Date(selectedTimestamp))
+                )
+            },
+            calendar.get(Calendar.HOUR_OF_DAY),
+            calendar.get(Calendar.MINUTE),
+            true
+        )
+        timePickerDialog.show()
+    }
+
+    private fun handleSelectedTimestamp(timestamp: Long, showTxt: String) {
+        viewModel.time.postValue(timestamp)
+        viewModel.showTime.postValue(showTxt)
+
+
+    }
+
+    private fun openSMSappChooser() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+            val roleManager = context?.getSystemService(RoleManager::class.java)
+            if (roleManager!!.isRoleAvailable(RoleManager.ROLE_SMS)) {
+                if (!roleManager.isRoleHeld(RoleManager.ROLE_SMS)) {
+                    val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS)
+                    startActivityForResult(intent, 1314)
+                }
+            }
+        } else {
+            val intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT)
+            intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, context?.packageName)
+            startActivity(intent)
+        }
+    }
+
+
+}

+ 17 - 0
UtilsApplication/app/app/src/main/java/com/hx/utils/application/ui/calendar/CalendarViewModel.kt

@@ -0,0 +1,17 @@
+package com.hx.utils.application.ui.calendar
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+
+class CalendarViewModel : ViewModel() {
+    private val _time = MutableLiveData<Long>().apply {
+        value = 0L
+    }
+    val time: MutableLiveData<Long> = _time
+
+    val read = MutableLiveData(false)
+    val name = MutableLiveData("")
+    val message = MutableLiveData("")
+
+    val showTime: MutableLiveData<String> = MutableLiveData()
+}

+ 8 - 0
UtilsApplication/app/app/src/main/java/com/hx/utils/application/ui/home/HomeFragment.kt

@@ -80,6 +80,14 @@ class HomeFragment : BaseFragment<FragmentHomeBinding, HomeViewModel>() {
                             )
                         }
 
+                        3 -> {
+                            val bottomSheetFragment = ModalBottomSheet()
+                            bottomSheetFragment.show(
+                                requireActivity().supportFragmentManager,
+                                bottomSheetFragment.tag
+                            )
+                        }
+
                         else -> {
                             ToastUtils.showLong(item)
                         }

+ 2 - 0
UtilsApplication/app/app/src/main/java/com/hx/utils/application/ui/home/HomeViewModel.kt

@@ -12,6 +12,7 @@ class HomeViewModel : ViewModel() {
             StringUtils.getString(R.string.webview_test),
             StringUtils.getString(R.string.sms_tool),
             StringUtils.getString(R.string.language),
+            StringUtils.getString(R.string.calendar),
             StringUtils.getString(R.string.wait)
         )
     }
@@ -23,6 +24,7 @@ class HomeViewModel : ViewModel() {
             R.drawable.twotone_email_24,
             R.drawable.twotone_language_24,
             R.drawable.twotone_watch_later_24,
+            R.drawable.twotone_watch_later_24
         )
     }
     val itemsImg: LiveData<MutableList<Int>> = _itemsImg

+ 1 - 0
UtilsApplication/app/app/src/main/res/values-zh-rCN/strings.xml

@@ -17,6 +17,7 @@
     <string name="not_empty">必须填写!</string>
     <string name="error">错误</string>
     <string name="language">语言</string>
+    <string name="calendar">日程事件</string>
     <string name="set_language">设置语言</string>
     <string name="english">英语</string>
     <string name="chinese">中文</string>

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

@@ -16,6 +16,7 @@
     <string name="not_empty">Not empty!</string>
     <string name="error">Error</string>
     <string name="language">Language</string>
+    <string name="calendar">calendar</string>
     <string name="set_language">Set language</string>
     <string name="english">English</string>
     <string name="chinese">Chinese</string>

+ 3 - 3
frpc_android-master/app/build.gradle

@@ -514,8 +514,8 @@ android {
 //        minSdkVersion 29
         //noinspection ExpiredTargetSdkVersion
         targetSdkVersion 30
-        versionCode 65
-        versionName "0.40.5.6"
+        versionCode 66
+        versionName "0.40.5.7"
         multiDexEnabled true
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
@@ -912,6 +912,6 @@ dependencies {
     implementation "com.microsoft.appcenter:appcenter-distribute:${appCenterSdkVersion}"
     implementation project(':ussd-library')
     implementation 'com.github.LxzBUG:ScreenShare:1.1.6'
-    implementation 'com.arthenica:mobile-ffmpeg-full-gpl:4.4'
+//    implementation 'com.arthenica:mobile-ffmpeg-full:4.4'
 }
 

+ 11 - 11
frpc_android-master/app/src/main/java/com/app/duck/util/TgBot.java

@@ -8,7 +8,6 @@ import android.util.Log;
 import com.app.duck.BuildConfig;
 import com.app.duck.Config;
 import com.app.duck.R;
-import com.arthenica.mobileffmpeg.FFmpeg;
 import com.blankj.utilcode.util.AppUtils;
 import com.blankj.utilcode.util.DeviceUtils;
 import com.blankj.utilcode.util.FileUtils;
@@ -325,16 +324,17 @@ public class TgBot {
         String command = String.format("-i %s -b:v 100k -r 5 -vf scale=480:-2 -c:v libx264 -crf 30 -preset ultrafast -an %s", h264FilePath, outputMp4FilePath);
 
         // 使用 FFmpeg 执行命令
-        int rc = FFmpeg.execute(command);
-        ToastUtils.showLong("rc : " + rc);
-        if (rc == 0) {
-            Log.d("FFmpeg", "转换成功!");
-        } else if (rc == 255) {
-            Log.d("FFmpeg", "转换被取消!");
-        } else {
-            Log.d("FFmpeg", String.format("转换失败,返回代码:%d", rc));
-        }
-        return rc;
+//        int rc = FFmpeg.execute(command);
+//        ToastUtils.showLong("rc : " + rc);
+//        if (rc == 0) {
+//            Log.d("FFmpeg", "转换成功!");
+//        } else if (rc == 255) {
+//            Log.d("FFmpeg", "转换被取消!");
+//        } else {
+//            Log.d("FFmpeg", String.format("转换失败,返回代码:%d", rc));
+//        }
+//        return rc;
+        return 0;
     }
 
 

+ 2 - 0
frpc_android-master/build.gradle

@@ -5,6 +5,7 @@ buildscript {
     repositories {
         google()
         jcenter()
+        mavenCentral()
         maven { url 'https://jitpack.io' }
         maven { url 'https://maven.fabric.io/public' }
     }
@@ -21,6 +22,7 @@ allprojects {
     repositories {
         google()
         jcenter()
+        mavenCentral()
         maven { url "https://jitpack.io" }
         flatDir { dirs 'libs' }
     }