first commit
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Project exclude paths
|
||||||
|
/.gradle/
|
||||||
|
.DS_Store
|
15
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
*.iml
|
||||||
|
.gradle
|
||||||
|
/local.properties
|
||||||
|
/.idea/caches
|
||||||
|
/.idea/libraries
|
||||||
|
/.idea/modules.xml
|
||||||
|
/.idea/workspace.xml
|
||||||
|
/.idea/navEditor.xml
|
||||||
|
/.idea/assetWizardSettings.xml
|
||||||
|
.DS_Store
|
||||||
|
/build
|
||||||
|
/captures
|
||||||
|
.externalNativeBuild
|
||||||
|
.cxx
|
||||||
|
local.properties
|
346
.idea/assetWizardSettings.xml
generated
Normal file
@@ -0,0 +1,346 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="WizardSettings">
|
||||||
|
<option name="children">
|
||||||
|
<map>
|
||||||
|
<entry key="imageWizard">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="children">
|
||||||
|
<map>
|
||||||
|
<entry key="confirmationStep">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="resourceDirectory" value="main" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="imageAssetPanel">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="children">
|
||||||
|
<map>
|
||||||
|
<entry key="actionbar">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="children">
|
||||||
|
<map>
|
||||||
|
<entry key="clipArt">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
<entry key="imagePath" value="/private/var/folders/zk/0sxgvrg50kdg3pypqyb1md1m0000gn/T/ic_android_black_24dp.xml" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="text">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="textAsset">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="launcher">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="children">
|
||||||
|
<map>
|
||||||
|
<entry key="foregroundClipArt">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="imagePath" value="/private/var/folders/zk/0sxgvrg50kdg3pypqyb1md1m0000gn/T/ic_android_black_24dp.xml" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="foregroundImage">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
<entry key="imagePath" value="$PROJECT_DIR$/app/src/main/res/drawable/ic_baseline_bug_report.xml" />
|
||||||
|
<entry key="scalingPercent" value="60" />
|
||||||
|
<entry key="trimmed" value="true" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="foregroundText">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="foregroundTextAsset">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="backgroundAssetType" value="COLOR" />
|
||||||
|
<entry key="backgroundColor" value="ff4400" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="launcherLegacy">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="children">
|
||||||
|
<map>
|
||||||
|
<entry key="clipArt">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
<entry key="imagePath" value="/private/var/folders/zk/0sxgvrg50kdg3pypqyb1md1m0000gn/T/ic_android_black_24dp.xml" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="text">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="textAsset">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="notification">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="children">
|
||||||
|
<map>
|
||||||
|
<entry key="clipArt">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
<entry key="imagePath" value="/private/var/folders/zk/0sxgvrg50kdg3pypqyb1md1m0000gn/T/ic_android_black_24dp.xml" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="text">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="textAsset">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="tvBanner">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="children">
|
||||||
|
<map>
|
||||||
|
<entry key="foregroundText">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="tvChannel">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="children">
|
||||||
|
<map>
|
||||||
|
<entry key="foregroundClipArt">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="imagePath" value="/private/var/folders/zk/0sxgvrg50kdg3pypqyb1md1m0000gn/T/ic_android_black_24dp.xml" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="foregroundImage">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="foregroundText">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="foregroundTextAsset">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="color" value="000000" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="vectorWizard">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="children">
|
||||||
|
<map>
|
||||||
|
<entry key="vectorAssetStep">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="children">
|
||||||
|
<map>
|
||||||
|
<entry key="clipartAsset">
|
||||||
|
<value>
|
||||||
|
<PersistentState>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="url" value="file:$USER_HOME$/Library/Android/sdk/icons/material/materialicons/info/baseline_info_24.xml" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
<option name="values">
|
||||||
|
<map>
|
||||||
|
<entry key="outputName" value="ic_baseline_info" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</PersistentState>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
6
.idea/compiler.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CompilerConfiguration">
|
||||||
|
<bytecodeTargetLevel target="11" />
|
||||||
|
</component>
|
||||||
|
</project>
|
20
.idea/gradle.xml
generated
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="GradleMigrationSettings" migrationVersion="1" />
|
||||||
|
<component name="GradleSettings">
|
||||||
|
<option name="linkedExternalProjectsSettings">
|
||||||
|
<GradleProjectSettings>
|
||||||
|
<option name="testRunner" value="GRADLE" />
|
||||||
|
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="gradleJvm" value="Embedded JDK" />
|
||||||
|
<option name="modules">
|
||||||
|
<set>
|
||||||
|
<option value="$PROJECT_DIR$" />
|
||||||
|
<option value="$PROJECT_DIR$/app" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
</GradleProjectSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
10
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
|
||||||
|
<option name="processCode" value="true" />
|
||||||
|
<option name="processLiterals" value="true" />
|
||||||
|
<option name="processComments" value="true" />
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
15
.idea/libraries/Gradle__androidx_activity_activity_1_2_4_aar.xml
generated
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.activity:activity:1.2.4@aar">
|
||||||
|
<ANNOTATIONS>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/ff7fddaea4f5dc9e017114fd1f0e5657/transformed/activity-1.2.4/annotations.zip!/" />
|
||||||
|
</ANNOTATIONS>
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/ff7fddaea4f5dc9e017114fd1f0e5657/transformed/activity-1.2.4/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/ff7fddaea4f5dc9e017114fd1f0e5657/transformed/activity-1.2.4/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.activity/activity/1.2.4/2572345ff3e71e4e97140b01423cb80765b5b3e5/activity-1.2.4-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
11
.idea/libraries/Gradle__androidx_annotation_annotation_1_3_0.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.annotation:annotation:1.3.0">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.3.0/21f49f5f9b85fc49de712539f79123119740595/annotation-1.3.0.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.3.0/661529c7dfdacef81b03e6dd27e5daa73793a9b2/annotation-1.3.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_1_0_aar.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.annotation:annotation-experimental:1.1.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/b3bfe042dcb85fbf512d7ae4f3a60502/transformed/annotation-experimental-1.1.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/b3bfe042dcb85fbf512d7ae4f3a60502/transformed/annotation-experimental-1.1.0/res" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/b3bfe042dcb85fbf512d7ae4f3a60502/transformed/annotation-experimental-1.1.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation-experimental/1.1.0/238eb640abf1ca6c952c7cd2e9423fe7f715713f/annotation-experimental-1.1.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
16
.idea/libraries/Gradle__androidx_appcompat_appcompat_1_4_1_aar.xml
generated
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.appcompat:appcompat:1.4.1@aar">
|
||||||
|
<ANNOTATIONS>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/e87bd43d330ada434c250dca1f230975/transformed/appcompat-1.4.1/annotations.zip!/" />
|
||||||
|
</ANNOTATIONS>
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/e87bd43d330ada434c250dca1f230975/transformed/appcompat-1.4.1/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/e87bd43d330ada434c250dca1f230975/transformed/appcompat-1.4.1/res" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/e87bd43d330ada434c250dca1f230975/transformed/appcompat-1.4.1/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.appcompat/appcompat/1.4.1/f9e48179ea0c6ac0080a277b9383f74523f56aa2/appcompat-1.4.1-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_4_1_aar.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.appcompat:appcompat-resources:1.4.1@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/633c5188cc9894c171f04484b6147556/transformed/appcompat-resources-1.4.1/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/633c5188cc9894c171f04484b6147556/transformed/appcompat-resources-1.4.1/res" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/633c5188cc9894c171f04484b6147556/transformed/appcompat-resources-1.4.1/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.appcompat/appcompat-resources/1.4.1/8f78838745a125dea62514f7b4f70e8776a6244e/appcompat-resources-1.4.1-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
11
.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.arch.core:core-common:2.1.0">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.1.0/b3152fc64428c9354344bd89848ecddc09b6f07e/core-common-2.1.0.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.1.0/80ac2d7c8e6400ce2fbc663cd1a7e1cbef38c4b8/core-common-2.1.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.arch.core:core-runtime:2.0.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/3cb87a4d7522372012d361f1f1c3ba48/transformed/core-runtime-2.0.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/3cb87a4d7522372012d361f1f1c3ba48/transformed/core-runtime-2.0.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-runtime/2.0.0/bc41b287c95bc50a3cd27cb1b7cfb301805ba7f1/core-runtime-2.0.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.arch.core:core-runtime:2.1.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/aedc6423499d7cac5a50807f9496470e/transformed/core-runtime-2.1.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/aedc6423499d7cac5a50807f9496470e/transformed/core-runtime-2.1.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-runtime/2.1.0/f19886651c9946b39f83d8c184fd0e2ce9f43c16/core-runtime-2.1.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
11
.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.collection:collection:1.1.0">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.collection/collection/1.1.0/1f27220b47669781457de0d600849a5de0e89909/collection-1.1.0.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.collection/collection/1.1.0/bae67b0019fbb38498198fcc2d0282a340b71c5b/collection-1.1.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
16
.idea/libraries/Gradle__androidx_core_core_1_7_0_aar.xml
generated
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.core:core:1.7.0@aar">
|
||||||
|
<ANNOTATIONS>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/72b2915e73cf37e5e7463ddcdb0a0107/transformed/core-1.7.0/annotations.zip!/" />
|
||||||
|
</ANNOTATIONS>
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/72b2915e73cf37e5e7463ddcdb0a0107/transformed/core-1.7.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/72b2915e73cf37e5e7463ddcdb0a0107/transformed/core-1.7.0/res" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/72b2915e73cf37e5e7463ddcdb0a0107/transformed/core-1.7.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.core/core/1.7.0/f1c3685231d49092ae301932de1481d9b7a9e025/core-1.7.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.cursoradapter:cursoradapter:1.0.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/3c2177ac1e7b2c7e0698186a45040366/transformed/cursoradapter-1.0.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/3c2177ac1e7b2c7e0698186a45040366/transformed/cursoradapter-1.0.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.cursoradapter/cursoradapter/1.0.0/1e323083b41c31fd4d45510dfce50614963c3c6c/cursoradapter-1.0.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.customview:customview:1.0.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/b3f7f1a2db15549da9a6815cc2327aef/transformed/customview-1.0.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/b3f7f1a2db15549da9a6815cc2327aef/transformed/customview-1.0.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.customview/customview/1.0.0/61f6a717d144dff3a6bda413d9abeeb2bca71581/customview-1.0.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
15
.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml
generated
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.drawerlayout:drawerlayout:1.0.0@aar">
|
||||||
|
<ANNOTATIONS>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/474f450235d7f0ef2d512a6c9fdcebb0/transformed/drawerlayout-1.0.0/annotations.zip!/" />
|
||||||
|
</ANNOTATIONS>
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/474f450235d7f0ef2d512a6c9fdcebb0/transformed/drawerlayout-1.0.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/474f450235d7f0ef2d512a6c9fdcebb0/transformed/drawerlayout-1.0.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.drawerlayout/drawerlayout/1.0.0/9ecd4ecb7da215ba4c5c3e00bf8d290dad6f2bc5/drawerlayout-1.0.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
16
.idea/libraries/Gradle__androidx_fragment_fragment_1_3_6_aar.xml
generated
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.fragment:fragment:1.3.6@aar">
|
||||||
|
<ANNOTATIONS>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/dc4f34dd93938f8cbeba9983c19d2e5d/transformed/fragment-1.3.6/annotations.zip!/" />
|
||||||
|
</ANNOTATIONS>
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/dc4f34dd93938f8cbeba9983c19d2e5d/transformed/fragment-1.3.6/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/dc4f34dd93938f8cbeba9983c19d2e5d/transformed/fragment-1.3.6/res" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/dc4f34dd93938f8cbeba9983c19d2e5d/transformed/fragment-1.3.6/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.fragment/fragment/1.3.6/25ece06338d39da1fdc9d8488aa57b5014866918/fragment-1.3.6-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.interpolator:interpolator:1.0.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/f99a7047836f7e8890b3d1788f61d16f/transformed/interpolator-1.0.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/f99a7047836f7e8890b3d1788f61d16f/transformed/interpolator-1.0.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.interpolator/interpolator/1.0.0/fefd5e3cbc479b6b4a9532d05688a1e659e8d3d2/interpolator-1.0.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
11
.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_4_0.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.lifecycle:lifecycle-common:2.4.0">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.4.0/1fdb7349701e9cf2f0a69fc10642b6fef6bb3e12/lifecycle-common-2.4.0.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.4.0/29609e3d01eaafd06c688c5366154174cf686c12/lifecycle-common-2.4.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.lifecycle:lifecycle-livedata:2.0.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/634811c3fe27114dcfddbdfc40697d30/transformed/lifecycle-livedata-2.0.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/634811c3fe27114dcfddbdfc40697d30/transformed/lifecycle-livedata-2.0.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-livedata/2.0.0/740ce61935bd789380c01178bd8ce402402ebd2f/lifecycle-livedata-2.0.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.lifecycle:lifecycle-livedata-core:2.3.1@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/63103388a5da8a8773b80940fb1a6306/transformed/lifecycle-livedata-core-2.3.1/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/63103388a5da8a8773b80940fb1a6306/transformed/lifecycle-livedata-core-2.3.1/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-livedata-core/2.3.1/38ecd5651d87b6db994df01f93fc72d6e59b846a/lifecycle-livedata-core-2.3.1-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_1_aar.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.lifecycle:lifecycle-runtime:2.3.1@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/29d1052046ade280414a278045d70da0/transformed/lifecycle-runtime-2.3.1/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/29d1052046ade280414a278045d70da0/transformed/lifecycle-runtime-2.3.1/res" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/29d1052046ade280414a278045d70da0/transformed/lifecycle-runtime-2.3.1/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-runtime/2.3.1/ae7040cf314de81d20ac69f28f5ab6c9a2c0d1ab/lifecycle-runtime-2.3.1-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_4_0_aar.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.lifecycle:lifecycle-runtime:2.4.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/854ea43dad3782672630e1d66ab44386/transformed/lifecycle-runtime-2.4.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/854ea43dad3782672630e1d66ab44386/transformed/lifecycle-runtime-2.4.0/res" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/854ea43dad3782672630e1d66ab44386/transformed/lifecycle-runtime-2.4.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-runtime/2.4.0/ae7040cf314de81d20ac69f28f5ab6c9a2c0d1ab/lifecycle-runtime-2.4.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.lifecycle:lifecycle-viewmodel:2.3.1@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/caf5722f648937a9f70639b3c84f2880/transformed/lifecycle-viewmodel-2.3.1/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/caf5722f648937a9f70639b3c84f2880/transformed/lifecycle-viewmodel-2.3.1/res" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/caf5722f648937a9f70639b3c84f2880/transformed/lifecycle-viewmodel-2.3.1/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-viewmodel/2.3.1/55d6fa3541ca02167b0bd62a16fbdaec2a71622/lifecycle-viewmodel-2.3.1-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/b60f4d1b13682bb6dc24bbbe1183fff2/transformed/lifecycle-viewmodel-savedstate-2.3.1/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/b60f4d1b13682bb6dc24bbbe1183fff2/transformed/lifecycle-viewmodel-savedstate-2.3.1/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-viewmodel-savedstate/2.3.1/411f92301435123d502de27b6f3262c062f3bd7a/lifecycle-viewmodel-savedstate-2.3.1-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.loader:loader:1.0.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/45f6e341cdf0c3068d8ba4557e463820/transformed/loader-1.0.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/45f6e341cdf0c3068d8ba4557e463820/transformed/loader-1.0.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.loader/loader/1.0.0/b9ef587f3e46c7fe5b00264989764e43ff45cada/loader-1.0.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.savedstate:savedstate:1.1.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/cf41aa5d0999ed6188b40660c16ce919/transformed/savedstate-1.1.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/cf41aa5d0999ed6188b40660c16ce919/transformed/savedstate-1.1.0/res" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/cf41aa5d0999ed6188b40660c16ce919/transformed/savedstate-1.1.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.savedstate/savedstate/1.1.0/73464c2c55129727354a95ffa91dc9c2cf0c78b/savedstate-1.1.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
14
.idea/libraries/Gradle__androidx_test_core_1_4_0_aar.xml
generated
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.test:core:1.4.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/530684afcb063b92856794081c808deb/transformed/core-1.4.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/530684afcb063b92856794081c808deb/transformed/core-1.4.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test/core/1.4.0/96b4d161def059d92989a352500d05d215c33d5e/core-1.4.0-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test/core/1.4.0/2ba6b5cb5392cc99bdc6fb1f188c95497358fb62/core-1.4.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
14
.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_4_0_aar.xml
generated
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.test.espresso:espresso-core:3.4.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/25b87a74d132ecf259cad4eb1c6e187f/transformed/espresso-core-3.4.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/25b87a74d132ecf259cad4eb1c6e187f/transformed/espresso-core-3.4.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test.espresso/espresso-core/3.4.0/527848e2722cd3ada150b991c0e620ec4f0a8b/espresso-core-3.4.0-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test.espresso/espresso-core/3.4.0/8c2dc35c200b749281e0fbdc1262359e19a99cc3/espresso-core-3.4.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
14
.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_4_0_aar.xml
generated
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.test.espresso:espresso-idling-resource:3.4.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/4ad575eecb739b04fd0f9363a434919d/transformed/espresso-idling-resource-3.4.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/4ad575eecb739b04fd0f9363a434919d/transformed/espresso-idling-resource-3.4.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test.espresso/espresso-idling-resource/3.4.0/69a300fcf8de2c433672d07a6c436a19dfb9b8f9/espresso-idling-resource-3.4.0-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test.espresso/espresso-idling-resource/3.4.0/80fd2aa3695bf9e0383d53f2f39016960a0156a6/espresso-idling-resource-3.4.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
14
.idea/libraries/Gradle__androidx_test_ext_junit_1_1_3_aar.xml
generated
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.test.ext:junit:1.1.3@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/18f92a88878eead949c7f51d69cf0f88/transformed/junit-1.1.3/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/18f92a88878eead949c7f51d69cf0f88/transformed/junit-1.1.3/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test.ext/junit/1.1.3/f138cf897cc1e024dd714073df04f2425d845104/junit-1.1.3-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test.ext/junit/1.1.3/cdf059d469527681d62d3330131eb875b77911d5/junit-1.1.3-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
14
.idea/libraries/Gradle__androidx_test_monitor_1_4_0_aar.xml
generated
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.test:monitor:1.4.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/48bb8bfbe072e4520ed48f531a4f9787/transformed/monitor-1.4.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/48bb8bfbe072e4520ed48f531a4f9787/transformed/monitor-1.4.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test/monitor/1.4.0/2770e38fa6d39242c2fa2e9d2ca3275b1d9debd8/monitor-1.4.0-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test/monitor/1.4.0/5d892d39aae695079e3ecc7a841336ff3aeaf40/monitor-1.4.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
14
.idea/libraries/Gradle__androidx_test_runner_1_4_0_aar.xml
generated
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.test:runner:1.4.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/deb47eff8fcf0f86502169d2d4a391cc/transformed/runner-1.4.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/deb47eff8fcf0f86502169d2d4a391cc/transformed/runner-1.4.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test/runner/1.4.0/aee6a62a26d9b413dadc1732e66cc4ef3bcf9d61/runner-1.4.0-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test/runner/1.4.0/11ef580a9f2ea2fba4d060a3121506197bd6b183/runner-1.4.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_test_services_storage_1_4_0_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.test.services:storage:1.4.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/2564ef0868cf1d1465af6406d9835a99/transformed/storage-1.4.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/2564ef0868cf1d1465af6406d9835a99/transformed/storage-1.4.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.test.services/storage/1.4.0/27088f46bc0ab94523a20ccc56aa27e142662396/storage-1.4.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.vectordrawable:vectordrawable:1.1.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/36cd5a67e1376b887bbdf36e81817506/transformed/vectordrawable-1.1.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/36cd5a67e1376b887bbdf36e81817506/transformed/vectordrawable-1.1.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.vectordrawable/vectordrawable/1.1.0/1e0694477eed874c50c54b547cc3e5a62a57a62b/vectordrawable-1.1.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.vectordrawable:vectordrawable-animated:1.1.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/b1cee440f11994ce6e9f5f15372365ba/transformed/vectordrawable-animated-1.1.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/b1cee440f11994ce6e9f5f15372365ba/transformed/vectordrawable-animated-1.1.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.vectordrawable/vectordrawable-animated/1.1.0/871a7705cd03bc246947638c712cdd11378233ff/vectordrawable-animated-1.1.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.versionedparcelable:versionedparcelable:1.1.1@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/e3830581dd8c0d21eab866f373570bc5/transformed/versionedparcelable-1.1.1/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/e3830581dd8c0d21eab866f373570bc5/transformed/versionedparcelable-1.1.1/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.versionedparcelable/versionedparcelable/1.1.1/d9085927216387af679d18b6f472bc0fc5c7cc81/versionedparcelable-1.1.1-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
12
.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: androidx.viewpager:viewpager:1.0.0@aar">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/transforms-3/42febb75154f2490d556930cb5ce1693/transformed/viewpager-1.0.0/jars/classes.jar!/" />
|
||||||
|
<root url="file://$USER_HOME$/.gradle/caches/transforms-3/42febb75154f2490d556930cb5ce1693/transformed/viewpager-1.0.0/AndroidManifest.xml" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.viewpager/viewpager/1.0.0/db045f92188b9d247d5f556866f8861ab68528f0/viewpager-1.0.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
9
.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1.xml
generated
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: com.google.code.findbugs:jsr305:2.0.1">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/2.0.1/516c03b21d50a644d538de0f0369c620989cd8f0/jsr305-2.0.1.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES />
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__com_highcapable_yukihookapi_api_1_0_86.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: com.highcapable.yukihookapi:api:1.0.86">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.highcapable.yukihookapi/api/1.0.86/f1152098a27bddbd98e9c2039feaae0b86f8a114/api-1.0.86.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.highcapable.yukihookapi/api/1.0.86/e172b99b8e0f1b8a67cec2c411f015efca3f5802/api-1.0.86-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.highcapable.yukihookapi/api/1.0.86/71b0345f5384456654d2767a33b02eeb748f7c26/api-1.0.86-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: com.squareup:javawriter:2.1.1">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javawriter/2.1.1/67ff45d9ae02e583d0f9b3432a5ebbe05c30c966/javawriter-2.1.1.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javawriter/2.1.1/f591a105db78771d0a1e7a277b3747556c528c22/javawriter-2.1.1-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javawriter/2.1.1/5b31387d839a5cdaf5b6de3990da01f7f2b963c5/javawriter-2.1.1-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
11
.idea/libraries/Gradle__de_robv_android_xposed_api_82.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: de.robv.android.xposed:api:82">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/de.robv.android.xposed/api/82/35866b507b360d4789ff389ad7386b6e8bbf6cc4/api-82.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/de.robv.android.xposed/api/82/2030f71764b06b2f39fa1a85660690aa834cfd84/api-82-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__javax_inject_javax_inject_1.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: javax.inject:javax.inject:1">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/javax.inject/javax.inject/1/6975da39a7040257bd51d21a231b76c915872d38/javax.inject-1.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/javax.inject/javax.inject/1/70ec961c25111ed9015d1af77772d96383c2d238/javax.inject-1-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/javax.inject/javax.inject/1/a00123f261762a7c5e0ec916a2c7c8298d29c400/javax.inject-1-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
16
.idea/libraries/Gradle__junit_junit_4_12.xml
generated
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: junit:junit:4.12">
|
||||||
|
<ANNOTATIONS>
|
||||||
|
<root url="jar://$USER_HOME$/.m2/repository/org/jetbrains/externalAnnotations/junit/junit/4.12-an1/junit-4.12-an1-annotations.zip!/" />
|
||||||
|
</ANNOTATIONS>
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/2973d150c0dc1fefe998f834810d68f278ea58ec/junit-4.12.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/941a8be4506c65f0a9001c08812fb7da1e505e21/junit-4.12-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/a6c32b40bf3d76eca54e3c601e5d1470c86fcdfa/junit-4.12-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
16
.idea/libraries/Gradle__junit_junit_4_13_2.xml
generated
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: junit:junit:4.13.2">
|
||||||
|
<ANNOTATIONS>
|
||||||
|
<root url="jar://$USER_HOME$/.m2/repository/org/jetbrains/externalAnnotations/junit/junit/4.12-an1/junit-4.12-an1-annotations.zip!/" />
|
||||||
|
</ANNOTATIONS>
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/junit/junit/4.13.2/8ac9e16d933b6fb43bc7f576336b8f4d7eb5ba12/junit-4.13.2.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/junit/junit/4.13.2/f2f3f384dacd2ade2ddf7aa7e0f4360dfee38672/junit-4.13.2-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/junit/junit/4.13.2/33987872a811fe4d4001ed494b07854822257f42/junit-4.13.2-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: org.hamcrest:hamcrest-core:1.3">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/ad09811315f1d4f5756986575b0ea16b99cd686f/hamcrest-core-1.3-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/1dc37250fbc78e23a65a67fbbaf71d2e9cbc3c0b/hamcrest-core-1.3-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: org.hamcrest:hamcrest-integration:1.3">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-integration/1.3/5de0c73fef18917cd85d0ab70bb23818685e4dfd/hamcrest-integration-1.3.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-integration/1.3/cc5884d4138d3376f574f6a3992acceedfc37bea/hamcrest-integration-1.3-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-integration/1.3/ae7787a563e6a1b1f17fd4ac43be3a3c8830cfda/hamcrest-integration-1.3-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: org.hamcrest:hamcrest-library:1.3">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-library/1.3/4785a3c21320980282f9f33d0d1264a69040538f/hamcrest-library-1.3.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-library/1.3/4324046c5f99f3dc91b5370899fa3ae65fd137d2/hamcrest-library-1.3-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-library/1.3/47a7ee46628ab7133129cd7cef1e92657bc275e/hamcrest-library-1.3-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: org.jetbrains:annotations:13.0">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/73368c3b0887f3adc2c2730dd1b95d7c3781aaf3/annotations-13.0-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/5991ca87ef1fb5544943d9abc5a9a37583fabe03/annotations-13.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_6_21.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.6.21">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.6.21/11ef67f1900634fd951bad28c53ec957fabbe5b8/kotlin-stdlib-1.6.21.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.6.21/5b8f86fea035328fc9e8c660773037a3401ce25f/kotlin-stdlib-1.6.21-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.6.21/bc58085192d5abb48080e3670915133715a33ce0/kotlin-stdlib-1.6.21-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_6_21.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21" type="kotlin.common">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.6.21/5e5b55c26dbc80372a920aef60eb774b714559b8/kotlin-stdlib-common-1.6.21.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.6.21/5b8f86fea035328fc9e8c660773037a3401ce25f/kotlin-stdlib-common-1.6.21-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.6.21/4161056305b7cdaf52a6fd0c051b06ad03f9bd49/kotlin-stdlib-common-1.6.21-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_6_21.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.6.21/568c1b78a8e17a4f35b31f0a74e2916095ed74c2/kotlin-stdlib-jdk7-1.6.21.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.6.21/5b8f86fea035328fc9e8c660773037a3401ce25f/kotlin-stdlib-jdk7-1.6.21-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.6.21/78b7fc534a411952d7579a61d02b70fdd34aa56c/kotlin-stdlib-jdk7-1.6.21-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_6_21.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.6.21/eeb4d60d75e9ea9c11200d52974e522793b14fba/kotlin-stdlib-jdk8-1.6.21.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.6.21/5b8f86fea035328fc9e8c660773037a3401ce25f/kotlin-stdlib-jdk8-1.6.21-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.6.21/2cb762c1a14a3a958fd18d29f59491fa300e42d4/kotlin-stdlib-jdk8-1.6.21-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
22
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DesignSurface">
|
||||||
|
<option name="filePathToZoomLevelMap">
|
||||||
|
<map>
|
||||||
|
<entry key="app/src/main/res/drawable/ic_baseline_bug_report.xml" value="0.2295" />
|
||||||
|
<entry key="app/src/main/res/drawable/ic_baseline_bug_report_24.xml" value="0.2295" />
|
||||||
|
<entry key="app/src/main/res/drawable/ic_baseline_close.xml" value="0.2295" />
|
||||||
|
<entry key="app/src/main/res/drawable/ic_baseline_close_24.xml" value="0.2295" />
|
||||||
|
<entry key="app/src/main/res/drawable/ic_baseline_eject_24.xml" value="0.2295" />
|
||||||
|
<entry key="app/src/main/res/drawable/ic_baseline_feedback_24.xml" value="0.2295" />
|
||||||
|
<entry key="app/src/main/res/drawable/ic_baseline_info.xml" value="0.2295" />
|
||||||
|
<entry key="app/src/main/res/drawable/ic_baseline_info_24.xml" value="0.2295" />
|
||||||
|
<entry key="app/src/main/res/drawable/ic_baseline_refresh.xml" value="0.2295" />
|
||||||
|
<entry key="app/src/main/res/drawable/ic_baseline_refresh_24.xml" value="0.2295" />
|
||||||
|
<entry key="app/src/main/res/drawable/ic_launcher_background.xml" value="0.2295" />
|
||||||
|
<entry key="app/src/main/res/layout/activity_main.xml" value="0.42291666666666666" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="11" project-jdk-type="JavaSDK" />
|
||||||
|
</project>
|
12
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/modules/AppErrorsTracking.iml" filepath="$PROJECT_DIR$/.idea/modules/AppErrorsTracking.iml" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/modules/app/AppErrorsTracking.app.iml" filepath="$PROJECT_DIR$/.idea/modules/app/AppErrorsTracking.app.iml" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/modules/app/AppErrorsTracking.app.androidTest.iml" filepath="$PROJECT_DIR$/.idea/modules/app/AppErrorsTracking.app.androidTest.iml" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/modules/app/AppErrorsTracking.app.main.iml" filepath="$PROJECT_DIR$/.idea/modules/app/AppErrorsTracking.app.main.iml" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/modules/app/AppErrorsTracking.app.unitTest.iml" filepath="$PROJECT_DIR$/.idea/modules/app/AppErrorsTracking.app.unitTest.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
6
.idea/vcs.xml
generated
Normal file
@@ -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>
|
184
.idea/workspace.xml
generated
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="AndroidLayouts">
|
||||||
|
<shared>
|
||||||
|
<config />
|
||||||
|
</shared>
|
||||||
|
</component>
|
||||||
|
<component name="AutoImportSettings">
|
||||||
|
<option name="autoReloadType" value="NONE" />
|
||||||
|
</component>
|
||||||
|
<component name="ChangeListManager">
|
||||||
|
<list default="true" id="244dd63c-e260-4e57-8056-1e1bfe6d37b8" name="Changes" comment="first commit" />
|
||||||
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
|
</component>
|
||||||
|
<component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[HA1DS4D7]" />
|
||||||
|
<component name="ExternalProjectsData">
|
||||||
|
<projectState path="$PROJECT_DIR$">
|
||||||
|
<ProjectState />
|
||||||
|
</projectState>
|
||||||
|
</component>
|
||||||
|
<component name="FileTemplateManagerImpl">
|
||||||
|
<option name="RECENT_TEMPLATES">
|
||||||
|
<list>
|
||||||
|
<option value="Interface" />
|
||||||
|
<option value="Class" />
|
||||||
|
<option value="Kotlin Class" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="Git.Settings">
|
||||||
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||||
|
</component>
|
||||||
|
<component name="GitSEFilterConfiguration">
|
||||||
|
<file-type-list>
|
||||||
|
<filtered-out-file-type name="LOCAL_BRANCH" />
|
||||||
|
<filtered-out-file-type name="REMOTE_BRANCH" />
|
||||||
|
<filtered-out-file-type name="TAG" />
|
||||||
|
<filtered-out-file-type name="COMMIT_BY_MESSAGE" />
|
||||||
|
</file-type-list>
|
||||||
|
</component>
|
||||||
|
<component name="MarkdownSettingsMigration">
|
||||||
|
<option name="stateVersion" value="1" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectId" id="28g3gU33GmC73nlyOD9ynbhnUEm" />
|
||||||
|
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent">
|
||||||
|
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
|
||||||
|
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
|
||||||
|
<property name="RunOnceActivity.cidr.known.project.marker" value="true" />
|
||||||
|
<property name="android-custom-view/Users/fankes/Library/Android/sdk/sources/android-31/android/widget/LinearLayout.java_SELECTED" value="LinearLayout" />
|
||||||
|
<property name="cidr.known.project.marker" value="true" />
|
||||||
|
<property name="dart.analysis.tool.window.visible" value="false" />
|
||||||
|
<property name="last_opened_file_path" value="$PROJECT_DIR$/app/src/main/java/com/fankes/apperrorstracking/utils/factory" />
|
||||||
|
<property name="settings.editor.selected.configurable" value="project.propVCSSupport.DirectoryMappings" />
|
||||||
|
<property name="show.migrate.to.gradle.popup" value="false" />
|
||||||
|
</component>
|
||||||
|
<component name="RecentsManager">
|
||||||
|
<key name="CopyFile.RECENT_KEYS">
|
||||||
|
<recent name="$PROJECT_DIR$/app/src/main/java/com/fankes/apperrorstracking/utils/factory" />
|
||||||
|
<recent name="$PROJECT_DIR$/app/src/main/java/com/fankes/apperrorstracking/utils" />
|
||||||
|
<recent name="$PROJECT_DIR$/app/src/main/res/values" />
|
||||||
|
</key>
|
||||||
|
<key name="CopyClassDialog.RECENTS_KEY">
|
||||||
|
<recent name="android.os" />
|
||||||
|
</key>
|
||||||
|
</component>
|
||||||
|
<component name="RunManager">
|
||||||
|
<configuration name="app" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
|
||||||
|
<module name="AppErrorsTracking.app.main" />
|
||||||
|
<option name="DEPLOY" value="true" />
|
||||||
|
<option name="DEPLOY_APK_FROM_BUNDLE" value="false" />
|
||||||
|
<option name="DEPLOY_AS_INSTANT" value="false" />
|
||||||
|
<option name="ARTIFACT_NAME" value="" />
|
||||||
|
<option name="PM_INSTALL_OPTIONS" value="" />
|
||||||
|
<option name="ALL_USERS" value="false" />
|
||||||
|
<option name="ALWAYS_INSTALL_WITH_PM" value="false" />
|
||||||
|
<option name="CLEAR_APP_STORAGE" value="false" />
|
||||||
|
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
|
||||||
|
<option name="ACTIVITY_EXTRA_FLAGS" value="" />
|
||||||
|
<option name="MODE" value="do_nothing" />
|
||||||
|
<option name="CLEAR_LOGCAT" value="false" />
|
||||||
|
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
|
||||||
|
<option name="INSPECTION_WITHOUT_ACTIVITY_RESTART" value="false" />
|
||||||
|
<option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" />
|
||||||
|
<option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
|
||||||
|
<option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
|
||||||
|
<option name="DEBUGGER_TYPE" value="Auto" />
|
||||||
|
<Auto>
|
||||||
|
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
|
||||||
|
<option name="SHOW_STATIC_VARS" value="true" />
|
||||||
|
<option name="WORKING_DIR" value="" />
|
||||||
|
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
|
||||||
|
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
|
||||||
|
</Auto>
|
||||||
|
<Hybrid>
|
||||||
|
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
|
||||||
|
<option name="SHOW_STATIC_VARS" value="true" />
|
||||||
|
<option name="WORKING_DIR" value="" />
|
||||||
|
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
|
||||||
|
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
|
||||||
|
</Hybrid>
|
||||||
|
<Java />
|
||||||
|
<Native>
|
||||||
|
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
|
||||||
|
<option name="SHOW_STATIC_VARS" value="true" />
|
||||||
|
<option name="WORKING_DIR" value="" />
|
||||||
|
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
|
||||||
|
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
|
||||||
|
</Native>
|
||||||
|
<Profilers>
|
||||||
|
<option name="ADVANCED_PROFILING_ENABLED" value="false" />
|
||||||
|
<option name="STARTUP_PROFILING_ENABLED" value="false" />
|
||||||
|
<option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
|
||||||
|
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Java/Kotlin Method Sample (legacy)" />
|
||||||
|
<option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" />
|
||||||
|
<option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
|
||||||
|
<option name="PROFILING_MODE" value="NOT_SET" />
|
||||||
|
</Profilers>
|
||||||
|
<option name="DEEP_LINK" value="" />
|
||||||
|
<option name="ACTIVITY_CLASS" value="" />
|
||||||
|
<option name="SEARCH_ACTIVITY_IN_GLOBAL_SCOPE" value="false" />
|
||||||
|
<option name="SKIP_ACTIVITY_VALIDATION" value="false" />
|
||||||
|
<method v="2">
|
||||||
|
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
<configuration default="true" type="JetRunConfigurationType">
|
||||||
|
<method v="2">
|
||||||
|
<option name="Make" enabled="true" />
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
<configuration default="true" type="KotlinStandaloneScriptRunConfigurationType">
|
||||||
|
<option name="filePath" />
|
||||||
|
<method v="2">
|
||||||
|
<option name="Make" enabled="true" />
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
|
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||||
|
<component name="TaskManager">
|
||||||
|
<task active="true" id="Default" summary="Default task">
|
||||||
|
<changelist id="244dd63c-e260-4e57-8056-1e1bfe6d37b8" name="Changes" comment="" />
|
||||||
|
<created>1651624512624</created>
|
||||||
|
<option name="number" value="Default" />
|
||||||
|
<option name="presentableId" value="Default" />
|
||||||
|
<updated>1651624512624</updated>
|
||||||
|
</task>
|
||||||
|
<task id="LOCAL-00001" summary="first commit">
|
||||||
|
<created>1651859135240</created>
|
||||||
|
<option name="number" value="00001" />
|
||||||
|
<option name="presentableId" value="LOCAL-00001" />
|
||||||
|
<option name="project" value="LOCAL" />
|
||||||
|
<updated>1651859135240</updated>
|
||||||
|
</task>
|
||||||
|
<option name="localTasksCounter" value="2" />
|
||||||
|
<servers />
|
||||||
|
</component>
|
||||||
|
<component name="Vcs.Log.Tabs.Properties">
|
||||||
|
<option name="TAB_STATES">
|
||||||
|
<map>
|
||||||
|
<entry key="MAIN">
|
||||||
|
<value>
|
||||||
|
<State />
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="VcsManagerConfiguration">
|
||||||
|
<option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
|
||||||
|
<option name="CHECK_NEW_TODO" value="false" />
|
||||||
|
<ignored-roots>
|
||||||
|
<path value="$PROJECT_DIR$" />
|
||||||
|
</ignored-roots>
|
||||||
|
<MESSAGE value="first commit" />
|
||||||
|
<option name="LAST_COMMIT_MESSAGE" value="first commit" />
|
||||||
|
</component>
|
||||||
|
</project>
|
66
README.md
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# AppErrorsTracking
|
||||||
|
|
||||||
|
**应用异常跟踪**
|
||||||
|
|
||||||
|
Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
|
||||||
|
为原生 FC 对话框增加更多功能并修复国内定制 ROM 删除 FC 对话框的问题,给 Android 开发者带来更好的体验。
|
||||||
|
|
||||||
|
## Project Reason
|
||||||
|
|
||||||
|
我实在是不能理解,国内 ROM 除了 MIUI(稳定版除外) 都选择了删除应用程序崩溃的对话框(FC 对话框),我曾以为这一直是一个特性,直到我去反编译了系统框架,才确认确实是被删掉了。
|
||||||
|
|
||||||
|
难道产品经理认为,让用户看不到错误,应用直接闪退,逃避就是最好的解决方案吗,还是说<u>另有隐情</u>呢?
|
||||||
|
|
||||||
|
## Feature
|
||||||
|
|
||||||
|
此项目为 Xposed 模块,可用在任何 Android 系统中,目前仅在 **LSPosed** 中测试通过。
|
||||||
|
|
||||||
|
- 重新定制应用崩溃错误对话框
|
||||||
|
|
||||||
|
- “错误详情”按钮功能,可查看具体的异常堆栈
|
||||||
|
|
||||||
|
- “应用信息”按钮功能(原生功能),点击可打开当前崩溃的应用详情页面
|
||||||
|
|
||||||
|
- “重新启动”按钮功能(原生功能),在首次崩溃可点击按钮重新启动应用
|
||||||
|
|
||||||
|
- “屡次停止运行”显示(原生功能)
|
||||||
|
|
||||||
|
- 对话框支持 Android 10 及以上系统的深色模式
|
||||||
|
|
||||||
|
## Future
|
||||||
|
|
||||||
|
此项目依然在开发中,现在未解决的问题和包含的问题如下
|
||||||
|
|
||||||
|
- “错误详情”按钮现在是无效的,还在开发
|
||||||
|
|
||||||
|
- 后台进程可能依然会弹出崩溃对话框且开发者选项里的设置无效,还在排查
|
||||||
|
|
||||||
|
- 无法启动后台进程和服务,是否在一定条件隐藏“重新打开”按钮的问题
|
||||||
|
|
||||||
|
- 暂不支持国际化语言,Chinese only
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
- [AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.html)
|
||||||
|
|
||||||
|
```
|
||||||
|
Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
```
|
||||||
|
|
||||||
|
Powered by [YukiHookAPI](https://github.com/fankes/YukiHookAPI)
|
||||||
|
|
||||||
|
版权所有 © 2019-2022 Fankes Studio(qzmmcn@163.com)
|
15
app/.gitignore
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
*.iml
|
||||||
|
.gradle
|
||||||
|
/local.properties
|
||||||
|
/.idea/caches
|
||||||
|
/.idea/libraries
|
||||||
|
/.idea/modules.xml
|
||||||
|
/.idea/workspace.xml
|
||||||
|
/.idea/navEditor.xml
|
||||||
|
/.idea/assetWizardSettings.xml
|
||||||
|
.DS_Store
|
||||||
|
/build
|
||||||
|
/captures
|
||||||
|
.externalNativeBuild
|
||||||
|
.cxx
|
||||||
|
local.properties
|
76
app/build.gradle
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'org.jetbrains.kotlin.android'
|
||||||
|
id 'com.google.devtools.ksp' version '1.6.21-1.0.5'
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace 'com.fankes.apperrorstracking'
|
||||||
|
compileSdk 31
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('../keystore/public')
|
||||||
|
storePassword '123456'
|
||||||
|
keyAlias 'public'
|
||||||
|
keyPassword '123456'
|
||||||
|
v1SigningEnabled true
|
||||||
|
v2SigningEnabled true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId "com.fankes.apperrorstracking"
|
||||||
|
minSdk 21
|
||||||
|
targetSdk 31
|
||||||
|
versionCode rootProject.ext.appVersionCode
|
||||||
|
versionName rootProject.ext.appVersionName
|
||||||
|
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled rootProject.ext.enableR8
|
||||||
|
signingConfig signingConfigs.debug
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility JavaVersion.VERSION_11
|
||||||
|
targetCompatibility JavaVersion.VERSION_11
|
||||||
|
}
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = '11'
|
||||||
|
freeCompilerArgs = [
|
||||||
|
'-Xno-param-assertions',
|
||||||
|
'-Xno-call-assertions',
|
||||||
|
'-Xno-receiver-assertions'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 移除无效耗时 lint Task */
|
||||||
|
tasks.whenTaskAdded {
|
||||||
|
task -> if (task.name == "lintVitalRelease") task.enabled = false
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 移除无效耗时 lint Task */
|
||||||
|
tasks.whenTaskAdded {
|
||||||
|
task -> if (task.name == "lintVitalAnalyzeRelease") task.enabled = false
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 移除无效耗时 lint Task */
|
||||||
|
tasks.whenTaskAdded {
|
||||||
|
task -> if (task.name == "lintVitalReportRelease") task.enabled = false
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnly 'de.robv.android.xposed:api:82'
|
||||||
|
implementation 'com.highcapable.yukihookapi:api:1.0.86'
|
||||||
|
ksp 'com.highcapable.yukihookapi:ksp-xposed:1.0.86'
|
||||||
|
implementation 'androidx.appcompat:appcompat:1.4.1'
|
||||||
|
testImplementation 'junit:junit:4.13.2'
|
||||||
|
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||||
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||||
|
}
|
40
app/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-ignorewarnings
|
||||||
|
-optimizationpasses 10
|
||||||
|
-dontusemixedcaseclassnames
|
||||||
|
-dontoptimize
|
||||||
|
-verbose
|
||||||
|
-overloadaggressively
|
||||||
|
-allowaccessmodification
|
||||||
|
-adaptclassstrings
|
||||||
|
-adaptresourcefilenames
|
||||||
|
-adaptresourcefilecontents
|
||||||
|
|
||||||
|
-renamesourcefileattribute P
|
||||||
|
-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
|
||||||
|
public static *** throwUninitializedProperty(...);
|
||||||
|
public static *** throwUninitializedPropertyAccessException(...);
|
||||||
|
}
|
@@ -0,0 +1,24 @@
|
|||||||
|
package com.fankes.apperrorstracking
|
||||||
|
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
|
||||||
|
import org.junit.Assert.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instrumented test, which will execute on an Android device.
|
||||||
|
*
|
||||||
|
* See [testing documentation](http://d.android.com/tools/testing).
|
||||||
|
*/
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class ExampleInstrumentedTest {
|
||||||
|
@Test
|
||||||
|
fun useAppContext() {
|
||||||
|
// Context of the app under test.
|
||||||
|
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||||
|
assertEquals("com.fankes.apperrorstracking", appContext.packageName)
|
||||||
|
}
|
||||||
|
}
|
25
app/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppErrorsTracking">
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="xposedmodule"
|
||||||
|
android:value="true" />
|
||||||
|
<meta-data
|
||||||
|
android:name="xposeddescription"
|
||||||
|
android:value="为原生 FC 对话框增加更多功能并修复国内定制 ROM 删除 FC 对话框的问题,给 Android 开发者带来更好的体验。\n开发者:酷安 @星夜不荟" />
|
||||||
|
<meta-data
|
||||||
|
android:name="xposedminversion"
|
||||||
|
android:value="93" />
|
||||||
|
<meta-data
|
||||||
|
android:name="xposedscope"
|
||||||
|
android:resource="@array/module_scope" />
|
||||||
|
</application>
|
||||||
|
</manifest>
|
1
app/src/main/assets/xposed_init
Normal file
@@ -0,0 +1 @@
|
|||||||
|
com.fankes.apperrorstracking.hook.AppErrorsTracking
|
1
app/src/main/assets/yukihookapi_init
Normal file
@@ -0,0 +1 @@
|
|||||||
|
com.fankes.apperrorstracking.hook.HookEntry
|
BIN
app/src/main/ic_launcher-playstore.png
Normal file
After Width: | Height: | Size: 8.6 KiB |
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
package com.fankes.apperrorstracking.hook
|
||||||
|
|
||||||
|
import com.fankes.apperrorstracking.hook.entity.FrameworkHooker
|
||||||
|
import com.highcapable.yukihookapi.annotation.xposed.InjectYukiHookWithXposed
|
||||||
|
import com.highcapable.yukihookapi.hook.factory.configs
|
||||||
|
import com.highcapable.yukihookapi.hook.factory.encase
|
||||||
|
import com.highcapable.yukihookapi.hook.xposed.proxy.IYukiHookXposedInit
|
||||||
|
|
||||||
|
@InjectYukiHookWithXposed(entryClassName = "AppErrorsTracking")
|
||||||
|
class HookEntry : IYukiHookXposedInit {
|
||||||
|
|
||||||
|
override fun onInit() = configs {
|
||||||
|
debugTag = "AppErrorsTracking"
|
||||||
|
isDebug = false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onHook() = encase { loadSystem(FrameworkHooker()) }
|
||||||
|
}
|
@@ -0,0 +1,180 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
@file:Suppress("DEPRECATION", "UseCompatLoadingForDrawables")
|
||||||
|
|
||||||
|
package com.fankes.apperrorstracking.hook.entity
|
||||||
|
|
||||||
|
import android.app.AlertDialog
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.pm.ApplicationInfo
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.os.Message
|
||||||
|
import android.view.Gravity
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.view.WindowManager
|
||||||
|
import android.widget.ImageView
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import android.widget.TextView
|
||||||
|
import com.fankes.apperrorstracking.R
|
||||||
|
import com.fankes.apperrorstracking.utils.drawable.drawabletoolbox.DrawableBuilder
|
||||||
|
import com.fankes.apperrorstracking.utils.factory.dp
|
||||||
|
import com.fankes.apperrorstracking.utils.factory.isSystemInDarkMode
|
||||||
|
import com.fankes.apperrorstracking.utils.factory.openApp
|
||||||
|
import com.fankes.apperrorstracking.utils.factory.openSelfSetting
|
||||||
|
import com.highcapable.yukihookapi.hook.bean.VariousClass
|
||||||
|
import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker
|
||||||
|
import com.highcapable.yukihookapi.hook.factory.field
|
||||||
|
import com.highcapable.yukihookapi.hook.factory.method
|
||||||
|
import com.highcapable.yukihookapi.hook.log.loggerE
|
||||||
|
import com.highcapable.yukihookapi.hook.type.android.MessageClass
|
||||||
|
|
||||||
|
class FrameworkHooker : YukiBaseHooker() {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
private const val AppErrorsClass = "com.android.server.am.AppErrors"
|
||||||
|
|
||||||
|
private const val AppErrorResultClass = "com.android.server.am.AppErrorResult"
|
||||||
|
|
||||||
|
private const val AppErrorDialog_DataClass = "com.android.server.am.AppErrorDialog\$Data"
|
||||||
|
|
||||||
|
private const val ProcessRecordClass = "com.android.server.am.ProcessRecord"
|
||||||
|
|
||||||
|
private val ErrorDialogControllerClass = VariousClass(
|
||||||
|
"com.android.server.am.ProcessRecord\$ErrorDialogController",
|
||||||
|
"com.android.server.am.ErrorDialogController"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建对话框按钮
|
||||||
|
* @param context 实例
|
||||||
|
* @param drawableId 按钮图标
|
||||||
|
* @param content 按钮文本
|
||||||
|
* @param it 点击事件回调
|
||||||
|
* @return [LinearLayout]
|
||||||
|
*/
|
||||||
|
private fun createButtonItem(context: Context, drawableId: Int, content: String, it: () -> Unit) =
|
||||||
|
LinearLayout(context).apply {
|
||||||
|
background = DrawableBuilder().rounded().cornerRadius(15.dp(context)).ripple().rippleColor(0xFFAAAAAA.toInt()).build()
|
||||||
|
gravity = Gravity.CENTER or Gravity.START
|
||||||
|
layoutParams =
|
||||||
|
ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
|
||||||
|
addView(ImageView(context).apply {
|
||||||
|
setImageDrawable(moduleAppResources.getDrawable(drawableId))
|
||||||
|
layoutParams = ViewGroup.LayoutParams(25.dp(context), 25.dp(context))
|
||||||
|
setColorFilter(if (context.isSystemInDarkMode) Color.WHITE else Color.BLACK)
|
||||||
|
})
|
||||||
|
addView(View(context).apply { layoutParams = ViewGroup.LayoutParams(15.dp(context), 0) })
|
||||||
|
addView(TextView(context).apply {
|
||||||
|
text = content
|
||||||
|
textSize = 16f
|
||||||
|
setTextColor(if (context.isSystemInDarkMode) 0xFFDDDDDD.toInt() else 0xFF777777.toInt())
|
||||||
|
})
|
||||||
|
setPadding(19.dp(context), 16.dp(context), 19.dp(context), 16.dp(context))
|
||||||
|
setOnClickListener { it() }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onHook() {
|
||||||
|
/** 干掉原生错误对话框 - 如果有 */
|
||||||
|
ErrorDialogControllerClass.hook {
|
||||||
|
injectMember {
|
||||||
|
method {
|
||||||
|
name = "hasCrashDialogs"
|
||||||
|
emptyParam()
|
||||||
|
}
|
||||||
|
replaceToTrue()
|
||||||
|
}
|
||||||
|
injectMember {
|
||||||
|
method {
|
||||||
|
name = "showCrashDialogs"
|
||||||
|
paramCount = 1
|
||||||
|
}
|
||||||
|
intercept()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/** 注入自定义错误对话框 */
|
||||||
|
AppErrorsClass.hook {
|
||||||
|
injectMember {
|
||||||
|
method {
|
||||||
|
name = "handleShowAppErrorUi"
|
||||||
|
param(MessageClass)
|
||||||
|
}
|
||||||
|
afterHook {
|
||||||
|
/** 当前实例 */
|
||||||
|
val context = field { name = "mContext" }.get(instance).cast<Context>() ?: return@afterHook
|
||||||
|
|
||||||
|
/** 错误数据 */
|
||||||
|
val errData = args().first().cast<Message>()?.obj
|
||||||
|
|
||||||
|
/** 错误结果 */
|
||||||
|
val errResult = AppErrorResultClass.clazz.method {
|
||||||
|
name = "get"
|
||||||
|
emptyParam()
|
||||||
|
}.get(AppErrorDialog_DataClass.clazz.field {
|
||||||
|
name = "result"
|
||||||
|
}.get(errData).any()).int()
|
||||||
|
|
||||||
|
/** 当前 APP 信息 */
|
||||||
|
val appInfo = ProcessRecordClass.clazz.field { name = "info" }
|
||||||
|
.get(AppErrorDialog_DataClass.clazz.field { name = "proc" }
|
||||||
|
.get(errData).any()).cast<ApplicationInfo>() ?: ApplicationInfo()
|
||||||
|
|
||||||
|
/** 是否短时内重复错误 */
|
||||||
|
val isRepeating = AppErrorDialog_DataClass.clazz.field { name = "repeating" }.get(errData).boolean()
|
||||||
|
/** 判断在后台就不显示对话框 */
|
||||||
|
if (errResult == -2) return@afterHook
|
||||||
|
/** 创建自定义对话框 */
|
||||||
|
AlertDialog.Builder(
|
||||||
|
context, if (context.isSystemInDarkMode)
|
||||||
|
android.R.style.Theme_Material_Dialog
|
||||||
|
else android.R.style.Theme_Material_Light_Dialog
|
||||||
|
).create().apply {
|
||||||
|
setTitle("${appInfo.loadLabel(context.packageManager)} ${if (isRepeating) "屡次停止运行" else "已停止运行"}")
|
||||||
|
setView(LinearLayout(context).apply {
|
||||||
|
orientation = LinearLayout.VERTICAL
|
||||||
|
addView(createButtonItem(context, R.drawable.ic_baseline_info, content = "应用信息") {
|
||||||
|
cancel()
|
||||||
|
context.openSelfSetting(packageName = appInfo.packageName)
|
||||||
|
})
|
||||||
|
if (isRepeating)
|
||||||
|
addView(createButtonItem(context, R.drawable.ic_baseline_close, content = "关闭应用") { cancel() })
|
||||||
|
else addView(createButtonItem(context, R.drawable.ic_baseline_refresh, content = "重新打开") {
|
||||||
|
cancel()
|
||||||
|
context.openApp(appInfo.packageName)
|
||||||
|
})
|
||||||
|
addView(createButtonItem(context, R.drawable.ic_baseline_bug_report, content = "错误详情") {
|
||||||
|
// TODO 待开发
|
||||||
|
})
|
||||||
|
setPadding(6.dp(context), 15.dp(context), 6.dp(context), 6.dp(context))
|
||||||
|
})
|
||||||
|
/** 只有 SystemUid 才能响应系统级别的对话框 */
|
||||||
|
window?.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)
|
||||||
|
}.show()
|
||||||
|
/** 打印错误日志 */
|
||||||
|
loggerE(msg = "Process \"${appInfo.packageName}\" has crashed, isRepeating --> $isRepeating")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,292 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
@file:Suppress("SameParameterValue")
|
||||||
|
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.graphics.drawable.Drawable
|
||||||
|
import android.graphics.drawable.GradientDrawable
|
||||||
|
import android.graphics.drawable.RippleDrawable
|
||||||
|
import android.graphics.drawable.RotateDrawable
|
||||||
|
import android.os.Build
|
||||||
|
import java.lang.reflect.Field
|
||||||
|
import java.lang.reflect.Method
|
||||||
|
|
||||||
|
private val gradientState = resolveGradientState()
|
||||||
|
|
||||||
|
private fun resolveGradientState(): Class<*> {
|
||||||
|
val classes = GradientDrawable::class.java.declaredClasses
|
||||||
|
for (singleClass in classes) {
|
||||||
|
if (singleClass.simpleName == "GradientState") return singleClass
|
||||||
|
}
|
||||||
|
throw RuntimeException("GradientState could not be found in thisAny GradientDrawable implementation")
|
||||||
|
}
|
||||||
|
|
||||||
|
private val rotateState = resolveRotateState()
|
||||||
|
|
||||||
|
private fun resolveRotateState(): Class<*> {
|
||||||
|
val classes = RotateDrawable::class.java.declaredClasses
|
||||||
|
for (singleClass in classes) {
|
||||||
|
if (singleClass.simpleName == "RotateState") return singleClass
|
||||||
|
}
|
||||||
|
throw RuntimeException("RotateState could not be found in thisAny RotateDrawable implementation")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(SecurityException::class, NoSuchFieldException::class)
|
||||||
|
private fun resolveField(source: Class<*>, fieldName: String): Field {
|
||||||
|
val field = source.getDeclaredField(fieldName)
|
||||||
|
field.isAccessible = true
|
||||||
|
return field
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(SecurityException::class, NoSuchMethodException::class)
|
||||||
|
private fun resolveMethod(
|
||||||
|
source: Class<*>,
|
||||||
|
methodName: String,
|
||||||
|
vararg parameterTypes: Class<*>
|
||||||
|
): Method {
|
||||||
|
val method = source.getDeclaredMethod(methodName, *parameterTypes)
|
||||||
|
method.isAccessible = true
|
||||||
|
return method
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setInnerRadius(drawable: GradientDrawable, value: Int) {
|
||||||
|
try {
|
||||||
|
val innerRadius = resolveField(gradientState, "mInnerRadius")
|
||||||
|
innerRadius.setInt(drawable.constantState, value)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setInnerRadiusRatio(drawable: GradientDrawable, value: Float) {
|
||||||
|
try {
|
||||||
|
val innerRadius = resolveField(gradientState, "mInnerRadiusRatio")
|
||||||
|
innerRadius.setFloat(drawable.constantState, value)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setThickness(drawable: GradientDrawable, value: Int) {
|
||||||
|
try {
|
||||||
|
val innerRadius = resolveField(gradientState, "mThickness")
|
||||||
|
innerRadius.setInt(drawable.constantState, value)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setThicknessRatio(drawable: GradientDrawable, value: Float) {
|
||||||
|
try {
|
||||||
|
val innerRadius = resolveField(gradientState, "mThicknessRatio")
|
||||||
|
innerRadius.setFloat(drawable.constantState, value)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setUseLevelForShape(drawable: GradientDrawable, value: Boolean) {
|
||||||
|
try {
|
||||||
|
val useLevelForShape = resolveField(gradientState, "mUseLevelForShape")
|
||||||
|
useLevelForShape.setBoolean(drawable.constantState, value)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("ObsoleteSdkInt")
|
||||||
|
fun setOrientation(drawable: GradientDrawable, value: GradientDrawable.Orientation) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
||||||
|
drawable.orientation = value
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
val orientation = resolveField(gradientState, "mOrientation")
|
||||||
|
orientation.set(drawable.constantState, value)
|
||||||
|
val rectIdDirty = resolveField(GradientDrawable::class.java, "mRectIsDirty")
|
||||||
|
rectIdDirty.setBoolean(drawable, true)
|
||||||
|
drawable.invalidateSelf()
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("ObsoleteSdkInt")
|
||||||
|
fun setColors(drawable: GradientDrawable, value: IntArray) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
||||||
|
drawable.colors = value
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
val colors = resolveField(gradientState, "mColors")
|
||||||
|
colors.set(drawable.constantState, value)
|
||||||
|
drawable.invalidateSelf()
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setGradientRadiusType(drawable: GradientDrawable, value: Int) {
|
||||||
|
try {
|
||||||
|
val type = resolveField(gradientState, "mGradientRadiusType")
|
||||||
|
type.setInt(drawable.constantState, value)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setGradientRadius(drawable: GradientDrawable, value: Float) {
|
||||||
|
try {
|
||||||
|
val gradientRadius = resolveField(gradientState, "mGradientRadius")
|
||||||
|
gradientRadius.setFloat(drawable.constantState, value)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setStrokeColor(drawable: GradientDrawable, value: Int) {
|
||||||
|
try {
|
||||||
|
val type = resolveField(gradientState, "mStrokeColor")
|
||||||
|
type.setInt(drawable.constantState, value)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setDrawable(rotateDrawable: RotateDrawable, drawable: Drawable) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
rotateDrawable.drawable = drawable
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
val drawableField = resolveField(rotateState, "mDrawable")
|
||||||
|
val stateField = resolveField(RotateDrawable::class.java, "mState")
|
||||||
|
drawableField.set(stateField.get(rotateDrawable), drawable)
|
||||||
|
drawable.callback = rotateDrawable
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setPivotX(rotateDrawable: RotateDrawable, value: Float) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
rotateDrawable.pivotX = value
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
val pivotXField = resolveField(rotateState, "mPivotX")
|
||||||
|
pivotXField.setFloat(rotateDrawable.constantState, value)
|
||||||
|
val pivotXRelField = resolveField(rotateState, "mPivotXRel")
|
||||||
|
pivotXRelField.setBoolean(rotateDrawable.constantState, true)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setPivotY(rotateDrawable: RotateDrawable, value: Float) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
rotateDrawable.pivotY = value
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
val pivotYField = resolveField(rotateState, "mPivotY")
|
||||||
|
pivotYField.setFloat(rotateDrawable.constantState, value)
|
||||||
|
val pivotYRelField = resolveField(rotateState, "mPivotYRel")
|
||||||
|
pivotYRelField.setBoolean(rotateDrawable.constantState, true)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setFromDegrees(rotateDrawable: RotateDrawable, value: Float) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
rotateDrawable.fromDegrees = value
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
val fromDegreesField = resolveField(rotateState, "mFromDegrees")
|
||||||
|
fromDegreesField.setFloat(rotateDrawable.constantState, value)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setToDegrees(rotateDrawable: RotateDrawable, value: Float) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
rotateDrawable.toDegrees = value
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
val toDegreesField = resolveField(rotateState, "mToDegrees")
|
||||||
|
toDegreesField.setFloat(rotateDrawable.constantState, value)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setRadius(rippleDrawable: RippleDrawable, value: Int) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
rippleDrawable.radius = value
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
val setRadiusMethod =
|
||||||
|
resolveMethod(RippleDrawable::class.java, "setMaxRadius", Int::class.java)
|
||||||
|
setRadiusMethod.invoke(rippleDrawable, value)
|
||||||
|
} catch (e: NoSuchFieldException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} catch (e: IllegalAccessException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
class Constants {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val DEFAULT_COLOR = 0xFFBA68C8.toInt()
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,489 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
@file:Suppress("unused", "MemberVisibilityCanBePrivate")
|
||||||
|
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
import android.content.res.ColorStateList
|
||||||
|
import android.graphics.drawable.Drawable
|
||||||
|
import android.graphics.drawable.GradientDrawable
|
||||||
|
import android.util.StateSet
|
||||||
|
import java.util.*
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
|
|
||||||
|
class DrawableBuilder {
|
||||||
|
|
||||||
|
private var properties = DrawableProperties()
|
||||||
|
private var order: AtomicInteger = AtomicInteger(1)
|
||||||
|
private var transformsMap = TreeMap<Int, (Drawable) -> Drawable>()
|
||||||
|
private var baseDrawable: Drawable? = null
|
||||||
|
|
||||||
|
fun batch(properties: DrawableProperties) = apply { this.properties = properties.copy() }
|
||||||
|
fun baseDrawable(drawable: Drawable) = apply { baseDrawable = drawable }
|
||||||
|
|
||||||
|
// <shape>
|
||||||
|
fun shape(shape: Int) = apply { properties.shape = shape }
|
||||||
|
|
||||||
|
fun rectangle() = apply { shape(GradientDrawable.RECTANGLE) }
|
||||||
|
fun oval() = apply { shape(GradientDrawable.OVAL) }
|
||||||
|
fun line() = apply { shape(GradientDrawable.LINE) }
|
||||||
|
fun ring() = apply { shape(GradientDrawable.RING) }
|
||||||
|
fun innerRadius(innerRadius: Int) = apply { properties.innerRadius = innerRadius }
|
||||||
|
fun innerRadiusRatio(innerRadiusRatio: Float) =
|
||||||
|
apply { properties.innerRadiusRatio = innerRadiusRatio }
|
||||||
|
|
||||||
|
fun thickness(thickness: Int) = apply { properties.thickness = thickness }
|
||||||
|
fun thicknessRatio(thicknessRatio: Float) = apply { properties.thicknessRatio = thicknessRatio }
|
||||||
|
|
||||||
|
fun useLevelForRing(use: Boolean = true) = apply { properties.useLevelForRing = use }
|
||||||
|
|
||||||
|
// <corner>
|
||||||
|
fun cornerRadius(cornerRadius: Int) = apply { properties.cornerRadius = cornerRadius }
|
||||||
|
|
||||||
|
fun topLeftRadius(topLeftRadius: Int) = apply { properties.topLeftRadius = topLeftRadius }
|
||||||
|
fun topRightRadius(topRightRadius: Int) = apply { properties.topRightRadius = topRightRadius }
|
||||||
|
fun bottomRightRadius(bottomRightRadius: Int) =
|
||||||
|
apply { properties.bottomRightRadius = bottomRightRadius }
|
||||||
|
|
||||||
|
fun bottomLeftRadius(bottomLeftRadius: Int) =
|
||||||
|
apply { properties.bottomLeftRadius = bottomLeftRadius }
|
||||||
|
|
||||||
|
fun rounded() = apply { cornerRadius(Int.MAX_VALUE) }
|
||||||
|
fun cornerRadii(
|
||||||
|
topLeftRadius: Int,
|
||||||
|
topRightRadius: Int,
|
||||||
|
bottomRightRadius: Int,
|
||||||
|
bottomLeftRadius: Int
|
||||||
|
) = apply {
|
||||||
|
topLeftRadius(topLeftRadius); topRightRadius(topRightRadius); bottomRightRadius(
|
||||||
|
bottomRightRadius
|
||||||
|
); bottomLeftRadius(bottomLeftRadius)
|
||||||
|
}
|
||||||
|
|
||||||
|
// <gradient>
|
||||||
|
|
||||||
|
fun gradient(useGradient: Boolean = true) = apply { properties.useGradient = useGradient }
|
||||||
|
|
||||||
|
fun gradientType(type: Int) = apply { properties.type = type }
|
||||||
|
fun linearGradient() = apply { gradientType(GradientDrawable.LINEAR_GRADIENT) }
|
||||||
|
fun radialGradient() = apply { gradientType(GradientDrawable.RADIAL_GRADIENT) }
|
||||||
|
fun sweepGradient() = apply { gradientType(GradientDrawable.SWEEP_GRADIENT) }
|
||||||
|
fun angle(angle: Int) = apply { properties.angle = angle }
|
||||||
|
fun centerX(centerX: Float) = apply { properties.centerX = centerX }
|
||||||
|
fun centerY(centerY: Float) = apply { properties.centerY = centerY }
|
||||||
|
fun center(centerX: Float, centerY: Float) = apply { centerX(centerX); centerY(centerY) }
|
||||||
|
|
||||||
|
fun useCenterColor(useCenterColor: Boolean = true) =
|
||||||
|
apply { properties.useCenterColor = useCenterColor }
|
||||||
|
|
||||||
|
fun startColor(startColor: Int) = apply { properties.startColor = startColor }
|
||||||
|
fun centerColor(centerColor: Int) = apply {
|
||||||
|
properties.centerColor = centerColor
|
||||||
|
useCenterColor(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun endColor(endColor: Int) = apply { properties.endColor = endColor }
|
||||||
|
fun gradientColors(startColor: Int, endColor: Int, centerColor: Int?) = apply {
|
||||||
|
startColor(startColor); endColor(endColor)
|
||||||
|
useCenterColor(centerColor != null)
|
||||||
|
centerColor?.let {
|
||||||
|
centerColor(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun gradientRadiusType(gradientRadiusType: Int) =
|
||||||
|
apply { properties.gradientRadiusType = gradientRadiusType }
|
||||||
|
|
||||||
|
fun gradientRadius(gradientRadius: Float) = apply { properties.gradientRadius = gradientRadius }
|
||||||
|
fun gradientRadius(radius: Float, type: Int) =
|
||||||
|
apply { gradientRadius(radius); gradientRadiusType(type) }
|
||||||
|
|
||||||
|
fun gradientRadiusInPixel(radius: Float) =
|
||||||
|
apply { gradientRadius(radius); gradientRadiusType(DrawableProperties.RADIUS_TYPE_PIXELS) }
|
||||||
|
|
||||||
|
fun gradientRadiusInFraction(radius: Float) =
|
||||||
|
apply { gradientRadius(radius); gradientRadiusType(DrawableProperties.RADIUS_TYPE_FRACTION) }
|
||||||
|
|
||||||
|
fun useLevelForGradient(use: Boolean) = apply { properties.useLevelForGradient = use }
|
||||||
|
fun useLevelForGradient() = apply { useLevelForGradient(true) }
|
||||||
|
|
||||||
|
// <size>
|
||||||
|
fun width(width: Int) = apply { properties.width = width }
|
||||||
|
|
||||||
|
fun height(height: Int) = apply { properties.height = height }
|
||||||
|
fun size(width: Int, height: Int) = apply { width(width); height(height) }
|
||||||
|
fun size(size: Int) = apply { width(size).height(size) }
|
||||||
|
|
||||||
|
// <solid>
|
||||||
|
fun solidColor(solidColor: Int) = apply { properties.solidColor = solidColor }
|
||||||
|
|
||||||
|
private var solidColorPressed: Int? = null
|
||||||
|
fun solidColorPressed(color: Int?) = apply { solidColorPressed = color }
|
||||||
|
private var solidColorPressedWhenRippleUnsupported: Int? = null
|
||||||
|
fun solidColorPressedWhenRippleUnsupported(color: Int?) =
|
||||||
|
apply { solidColorPressedWhenRippleUnsupported = color }
|
||||||
|
|
||||||
|
private var solidColorDisabled: Int? = null
|
||||||
|
fun solidColorDisabled(color: Int?) = apply { solidColorDisabled = color }
|
||||||
|
private var solidColorSelected: Int? = null
|
||||||
|
fun solidColorSelected(color: Int?) = apply { solidColorSelected = color }
|
||||||
|
fun solidColorStateList(colorStateList: ColorStateList) =
|
||||||
|
apply { properties.solidColorStateList = colorStateList }
|
||||||
|
|
||||||
|
// <stroke>
|
||||||
|
fun strokeWidth(strokeWidth: Int) = apply { properties.strokeWidth = strokeWidth }
|
||||||
|
|
||||||
|
fun strokeColor(strokeColor: Int) = apply { properties.strokeColor = strokeColor }
|
||||||
|
private var strokeColorPressed: Int? = null
|
||||||
|
fun strokeColorPressed(color: Int?) = apply { strokeColorPressed = color }
|
||||||
|
private var strokeColorDisabled: Int? = null
|
||||||
|
fun strokeColorDisabled(color: Int?) = apply { strokeColorDisabled = color }
|
||||||
|
private var strokeColorSelected: Int? = null
|
||||||
|
fun strokeColorSelected(color: Int?) = apply { strokeColorSelected = color }
|
||||||
|
fun strokeColorStateList(colorStateList: ColorStateList) =
|
||||||
|
apply { properties.strokeColorStateList = colorStateList }
|
||||||
|
|
||||||
|
fun dashWidth(dashWidth: Int) = apply { properties.dashWidth = dashWidth }
|
||||||
|
fun dashGap(dashGap: Int) = apply { properties.dashGap = dashGap }
|
||||||
|
fun hairlineBordered() = apply { strokeWidth(1) }
|
||||||
|
fun shortDashed() = apply { dashWidth(12).dashGap(12) }
|
||||||
|
fun mediumDashed() = apply { dashWidth(24).dashGap(24) }
|
||||||
|
fun longDashed() = apply { dashWidth(36).dashGap(36) }
|
||||||
|
fun dashed() = apply { mediumDashed() }
|
||||||
|
|
||||||
|
// <rotate>
|
||||||
|
private var rotateOrder = 0
|
||||||
|
|
||||||
|
|
||||||
|
fun rotate(boolean: Boolean = true) = apply {
|
||||||
|
properties.useRotate = boolean
|
||||||
|
rotateOrder = if (boolean) {
|
||||||
|
order.getAndIncrement()
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun pivotX(pivotX: Float) = apply { properties.pivotX = pivotX }
|
||||||
|
fun pivotY(pivotY: Float) = apply { properties.pivotY = pivotY }
|
||||||
|
fun pivot(pivotX: Float, pivotY: Float) = apply { pivotX(pivotX).pivotY(pivotY) }
|
||||||
|
fun fromDegrees(degrees: Float) = apply { properties.fromDegrees = degrees }
|
||||||
|
fun toDegrees(degrees: Float) = apply { properties.toDegrees = degrees }
|
||||||
|
fun degrees(fromDegrees: Float, toDegrees: Float) =
|
||||||
|
apply { fromDegrees(fromDegrees).toDegrees(toDegrees) }
|
||||||
|
|
||||||
|
fun degrees(degrees: Float) = apply { fromDegrees(degrees).toDegrees(degrees) }
|
||||||
|
fun rotate(fromDegrees: Float, toDegrees: Float) =
|
||||||
|
apply { rotate().fromDegrees(fromDegrees).toDegrees(toDegrees) }
|
||||||
|
|
||||||
|
fun rotate(degrees: Float) = apply { rotate().degrees(degrees) }
|
||||||
|
|
||||||
|
// <scale>
|
||||||
|
private var scaleOrder = 0
|
||||||
|
|
||||||
|
|
||||||
|
fun scale(boolean: Boolean = true) = apply {
|
||||||
|
properties.useScale = boolean
|
||||||
|
scaleOrder = if (boolean) {
|
||||||
|
order.getAndIncrement()
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun scaleLevel(level: Int) = apply { properties.scaleLevel = level }
|
||||||
|
fun scaleGravity(gravity: Int) = apply { properties.scaleGravity = gravity }
|
||||||
|
fun scaleWidth(scale: Float) = apply { properties.scaleWidth = scale }
|
||||||
|
fun scaleHeight(scale: Float) = apply { properties.scaleHeight = scale }
|
||||||
|
fun scale(scale: Float) = apply { scale().scaleWidth(scale).scaleHeight(scale) }
|
||||||
|
fun scale(scaleWidth: Float, scaleHeight: Float) =
|
||||||
|
apply { scale().scaleWidth(scaleWidth).scaleHeight(scaleHeight) }
|
||||||
|
|
||||||
|
// flip
|
||||||
|
|
||||||
|
fun flip(boolean: Boolean = true) = apply { properties.useFlip = boolean }
|
||||||
|
|
||||||
|
fun orientation(orientation: Int) = apply { properties.orientation = orientation }
|
||||||
|
fun flipVertical() = apply { flip().orientation(FlipDrawable.ORIENTATION_VERTICAL) }
|
||||||
|
|
||||||
|
// <ripple>
|
||||||
|
|
||||||
|
fun ripple(boolean: Boolean = true) = apply { properties.useRipple = boolean }
|
||||||
|
|
||||||
|
fun rippleColor(color: Int) = apply { properties.rippleColor = color }
|
||||||
|
fun rippleColorStateList(colorStateList: ColorStateList) =
|
||||||
|
apply { properties.rippleColorStateList = colorStateList }
|
||||||
|
|
||||||
|
fun rippleRadius(radius: Int) = apply { properties.rippleRadius = radius }
|
||||||
|
|
||||||
|
fun build(): Drawable {
|
||||||
|
if (baseDrawable != null) {
|
||||||
|
return wrap(baseDrawable!!)
|
||||||
|
}
|
||||||
|
|
||||||
|
var drawable: Drawable
|
||||||
|
|
||||||
|
// fall back when ripple is unavailable on devices with API < 21
|
||||||
|
if (shouldFallbackRipple()) {
|
||||||
|
if (solidColorPressedWhenRippleUnsupported != null) {
|
||||||
|
solidColorPressed(solidColorPressedWhenRippleUnsupported)
|
||||||
|
} else {
|
||||||
|
solidColorPressed(properties.rippleColor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needStateListDrawable()) {
|
||||||
|
drawable = StateListDrawableBuilder()
|
||||||
|
.pressed(buildPressedDrawable())
|
||||||
|
.disabled(buildDisabledDrawable())
|
||||||
|
.selected(buildSelectedDrawable())
|
||||||
|
.normal(buildNormalDrawable())
|
||||||
|
.build()
|
||||||
|
} else {
|
||||||
|
drawable = GradientDrawable()
|
||||||
|
setupGradientDrawable(drawable)
|
||||||
|
}
|
||||||
|
drawable = wrap(drawable)
|
||||||
|
return drawable
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getSolidColorStateList(): ColorStateList {
|
||||||
|
if (properties.solidColorStateList != null) {
|
||||||
|
return properties.solidColorStateList!!
|
||||||
|
}
|
||||||
|
|
||||||
|
val states = mutableListOf<IntArray>()
|
||||||
|
val colors = mutableListOf<Int>()
|
||||||
|
|
||||||
|
solidColorPressed?.let {
|
||||||
|
states.add(intArrayOf(android.R.attr.state_pressed))
|
||||||
|
colors.add(it)
|
||||||
|
}
|
||||||
|
solidColorDisabled?.let {
|
||||||
|
states.add(intArrayOf(-android.R.attr.state_enabled))
|
||||||
|
colors.add(it)
|
||||||
|
}
|
||||||
|
solidColorSelected?.let {
|
||||||
|
states.add(intArrayOf(android.R.attr.state_selected))
|
||||||
|
colors.add(it)
|
||||||
|
}
|
||||||
|
states.add(StateSet.WILD_CARD)
|
||||||
|
colors.add(properties.solidColor)
|
||||||
|
|
||||||
|
return ColorStateList(states.toTypedArray(), colors.toIntArray())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getStrokeColorStateList(): ColorStateList {
|
||||||
|
if (properties.strokeColorStateList != null) {
|
||||||
|
return properties.strokeColorStateList!!
|
||||||
|
}
|
||||||
|
|
||||||
|
val states = mutableListOf<IntArray>()
|
||||||
|
val colors = mutableListOf<Int>()
|
||||||
|
|
||||||
|
strokeColorPressed?.let {
|
||||||
|
states.add(intArrayOf(android.R.attr.state_pressed))
|
||||||
|
colors.add(it)
|
||||||
|
}
|
||||||
|
strokeColorDisabled?.let {
|
||||||
|
states.add(intArrayOf(-android.R.attr.state_enabled))
|
||||||
|
colors.add(it)
|
||||||
|
}
|
||||||
|
strokeColorSelected?.let {
|
||||||
|
states.add(intArrayOf(android.R.attr.state_selected))
|
||||||
|
colors.add(it)
|
||||||
|
}
|
||||||
|
states.add(StateSet.WILD_CARD)
|
||||||
|
colors.add(properties.strokeColor)
|
||||||
|
|
||||||
|
return ColorStateList(states.toTypedArray(), colors.toIntArray())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildPressedDrawable(): Drawable? {
|
||||||
|
if (solidColorPressed == null && strokeColorPressed == null) return null
|
||||||
|
|
||||||
|
val pressedDrawable = GradientDrawable()
|
||||||
|
setupGradientDrawable(pressedDrawable)
|
||||||
|
solidColorPressed?.let {
|
||||||
|
pressedDrawable.setColor(it)
|
||||||
|
}
|
||||||
|
strokeColorPressed?.let {
|
||||||
|
setStrokeColor(pressedDrawable, it)
|
||||||
|
}
|
||||||
|
return pressedDrawable
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildDisabledDrawable(): Drawable? {
|
||||||
|
if (solidColorDisabled == null && strokeColorDisabled == null) return null
|
||||||
|
|
||||||
|
val disabledDrawable = GradientDrawable()
|
||||||
|
setupGradientDrawable(disabledDrawable)
|
||||||
|
solidColorDisabled?.let {
|
||||||
|
disabledDrawable.setColor(it)
|
||||||
|
}
|
||||||
|
strokeColorDisabled?.let {
|
||||||
|
setStrokeColor(disabledDrawable, it)
|
||||||
|
}
|
||||||
|
return disabledDrawable
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildSelectedDrawable(): Drawable? {
|
||||||
|
if (solidColorSelected == null && strokeColorSelected == null) return null
|
||||||
|
|
||||||
|
val selectedDrawable = GradientDrawable()
|
||||||
|
setupGradientDrawable(selectedDrawable)
|
||||||
|
solidColorSelected?.let {
|
||||||
|
selectedDrawable.setColor(it)
|
||||||
|
}
|
||||||
|
strokeColorSelected?.let {
|
||||||
|
setStrokeColor(selectedDrawable, it)
|
||||||
|
}
|
||||||
|
return selectedDrawable
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildNormalDrawable(): Drawable {
|
||||||
|
val pressedDrawable = GradientDrawable()
|
||||||
|
setupGradientDrawable(pressedDrawable)
|
||||||
|
return pressedDrawable
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupGradientDrawable(drawable: GradientDrawable) {
|
||||||
|
properties.apply {
|
||||||
|
drawable.shape = shape
|
||||||
|
if (shape == GradientDrawable.RING) {
|
||||||
|
setInnerRadius(drawable, innerRadius)
|
||||||
|
setInnerRadiusRatio(drawable, innerRadiusRatio)
|
||||||
|
setThickness(drawable, thickness)
|
||||||
|
setThicknessRatio(drawable, thicknessRatio)
|
||||||
|
setUseLevelForShape(drawable, useLevelForRing)
|
||||||
|
}
|
||||||
|
drawable.cornerRadii = getCornerRadii()
|
||||||
|
if (useGradient) {
|
||||||
|
drawable.gradientType = type
|
||||||
|
setGradientRadiusType(drawable, gradientRadiusType)
|
||||||
|
setGradientRadius(drawable, gradientRadius)
|
||||||
|
drawable.setGradientCenter(centerX, centerY)
|
||||||
|
setOrientation(drawable, getOrientation())
|
||||||
|
setColors(drawable, getColors())
|
||||||
|
drawable.useLevel = useLevelForGradient
|
||||||
|
} else {
|
||||||
|
drawable.color = getSolidColorStateList()
|
||||||
|
}
|
||||||
|
drawable.setSize(width, height)
|
||||||
|
drawable.setStroke(
|
||||||
|
strokeWidth,
|
||||||
|
getStrokeColorStateList(),
|
||||||
|
dashWidth.toFloat(),
|
||||||
|
dashGap.toFloat()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun needStateListDrawable(): Boolean {
|
||||||
|
return (hasStrokeColorStateList() || (!properties.useGradient && hasSolidColorStateList()))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun needRotateDrawable(): Boolean {
|
||||||
|
return properties.useRotate &&
|
||||||
|
!(properties.pivotX == 0.5f && properties.pivotY == 0.5f
|
||||||
|
&& properties.fromDegrees == 0f && properties.toDegrees == 0f)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun needScaleDrawable(): Boolean {
|
||||||
|
return properties.useScale
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun wrap(drawable: Drawable): Drawable {
|
||||||
|
var wrappedDrawable = drawable
|
||||||
|
|
||||||
|
if (rotateOrder > 0) {
|
||||||
|
transformsMap[rotateOrder] = ::wrapRotateIfNeeded
|
||||||
|
}
|
||||||
|
if (scaleOrder > 0) {
|
||||||
|
transformsMap[scaleOrder] = ::wrapScaleIfNeeded
|
||||||
|
}
|
||||||
|
|
||||||
|
for (action in transformsMap.values) {
|
||||||
|
wrappedDrawable = action.invoke(wrappedDrawable)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (properties.useFlip) {
|
||||||
|
wrappedDrawable = FlipDrawableBuilder()
|
||||||
|
.drawable(wrappedDrawable)
|
||||||
|
.orientation(properties.orientation)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isRippleSupported() && properties.useRipple) {
|
||||||
|
wrappedDrawable = RippleDrawableBuilder()
|
||||||
|
.drawable(wrappedDrawable)
|
||||||
|
.color(properties.rippleColor)
|
||||||
|
.colorStateList(properties.rippleColorStateList)
|
||||||
|
.radius(properties.rippleRadius)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
return wrappedDrawable
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun shouldFallbackRipple(): Boolean {
|
||||||
|
return properties.useRipple && !isRippleSupported()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isRippleSupported() = true
|
||||||
|
|
||||||
|
private fun wrapRotateIfNeeded(drawable: Drawable): Drawable {
|
||||||
|
if (!needRotateDrawable()) return drawable
|
||||||
|
|
||||||
|
with(properties) {
|
||||||
|
return RotateDrawableBuilder()
|
||||||
|
.drawable(drawable)
|
||||||
|
.pivotX(pivotX)
|
||||||
|
.pivotY(pivotY)
|
||||||
|
.fromDegrees(fromDegrees)
|
||||||
|
.toDegrees(toDegrees)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun wrapScaleIfNeeded(drawable: Drawable): Drawable {
|
||||||
|
if (!needScaleDrawable()) return drawable
|
||||||
|
|
||||||
|
with(properties) {
|
||||||
|
return ScaleDrawableBuilder()
|
||||||
|
.drawable(drawable)
|
||||||
|
.level(scaleLevel)
|
||||||
|
.scaleGravity(scaleGravity)
|
||||||
|
.scaleWidth(scaleWidth)
|
||||||
|
.scaleHeight(scaleHeight)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hasSolidColorStateList(): Boolean {
|
||||||
|
return solidColorPressed != null || solidColorDisabled != null || solidColorSelected != null
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hasStrokeColorStateList(): Boolean {
|
||||||
|
return strokeColorPressed != null || strokeColorDisabled != null || strokeColorSelected != null
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,221 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
@file:Suppress("SetterBackingFieldAssignment", "unused")
|
||||||
|
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
import android.content.res.ColorStateList
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.graphics.drawable.Drawable
|
||||||
|
import android.graphics.drawable.GradientDrawable
|
||||||
|
import android.os.Parcel
|
||||||
|
import android.os.Parcelable
|
||||||
|
import android.view.Gravity
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
data class DrawableProperties(
|
||||||
|
|
||||||
|
// <shape>
|
||||||
|
@JvmField var shape: Int = GradientDrawable.RECTANGLE,
|
||||||
|
@JvmField var innerRadius: Int = -1,
|
||||||
|
@JvmField var innerRadiusRatio: Float = 9f,
|
||||||
|
@JvmField var thickness: Int = -1,
|
||||||
|
@JvmField var thicknessRatio: Float = 3f,
|
||||||
|
@JvmField var useLevelForRing: Boolean = false,
|
||||||
|
|
||||||
|
// <corner>
|
||||||
|
private var _cornerRadius: Int = 0,
|
||||||
|
@JvmField var topLeftRadius: Int = 0,
|
||||||
|
@JvmField var topRightRadius: Int = 0,
|
||||||
|
@JvmField var bottomRightRadius: Int = 0,
|
||||||
|
@JvmField var bottomLeftRadius: Int = 0,
|
||||||
|
|
||||||
|
// <gradient>
|
||||||
|
@JvmField var useGradient: Boolean = false,
|
||||||
|
@JvmField var type: Int = GradientDrawable.RADIAL_GRADIENT,
|
||||||
|
@JvmField var angle: Int = 0,
|
||||||
|
@JvmField var centerX: Float = 0.5f,
|
||||||
|
@JvmField var centerY: Float = 0.5f,
|
||||||
|
@JvmField var useCenterColor: Boolean = false,
|
||||||
|
@JvmField var startColor: Int = Constants.DEFAULT_COLOR,
|
||||||
|
@JvmField var centerColor: Int? = null,
|
||||||
|
@JvmField var endColor: Int = 0x7FFFFFFF,
|
||||||
|
@JvmField var gradientRadiusType: Int = RADIUS_TYPE_FRACTION,
|
||||||
|
@JvmField var gradientRadius: Float = 0.5f,
|
||||||
|
@JvmField var useLevelForGradient: Boolean = false,
|
||||||
|
|
||||||
|
// <size>
|
||||||
|
@JvmField var width: Int = -1,
|
||||||
|
@JvmField var height: Int = -1,
|
||||||
|
|
||||||
|
// <solid>
|
||||||
|
@JvmField var solidColor: Int = Color.TRANSPARENT,
|
||||||
|
@JvmField var solidColorStateList: ColorStateList? = null,
|
||||||
|
|
||||||
|
// <stroke>
|
||||||
|
@JvmField var strokeWidth: Int = 0,
|
||||||
|
@JvmField var strokeColor: Int = Color.DKGRAY,
|
||||||
|
@JvmField var strokeColorStateList: ColorStateList? = null,
|
||||||
|
@JvmField var dashWidth: Int = 0,
|
||||||
|
@JvmField var dashGap: Int = 0,
|
||||||
|
|
||||||
|
// <rotate>
|
||||||
|
@JvmField var useRotate: Boolean = false,
|
||||||
|
@JvmField var pivotX: Float = 0.5f,
|
||||||
|
@JvmField var pivotY: Float = 0.5f,
|
||||||
|
@JvmField var fromDegrees: Float = 0f,
|
||||||
|
@JvmField var toDegrees: Float = 0f,
|
||||||
|
|
||||||
|
// <scale>
|
||||||
|
@JvmField var useScale: Boolean = false,
|
||||||
|
@JvmField var scaleLevel: Int = 10000,
|
||||||
|
@JvmField var scaleGravity: Int = Gravity.CENTER,
|
||||||
|
@JvmField var scaleWidth: Float = 0f,
|
||||||
|
@JvmField var scaleHeight: Float = 0f,
|
||||||
|
|
||||||
|
// flip
|
||||||
|
@JvmField var useFlip: Boolean = false,
|
||||||
|
@JvmField var orientation: Int = FlipDrawable.ORIENTATION_HORIZONTAL,
|
||||||
|
|
||||||
|
// ripple
|
||||||
|
@JvmField var useRipple: Boolean = false,
|
||||||
|
@JvmField var rippleColor: Int = Constants.DEFAULT_COLOR,
|
||||||
|
@JvmField var rippleColorStateList: ColorStateList? = null,
|
||||||
|
@JvmField var rippleRadius: Int = -1
|
||||||
|
) : Serializable {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val RADIUS_TYPE_PIXELS = 0
|
||||||
|
const val RADIUS_TYPE_FRACTION = 1
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val CREATOR = object : Parcelable.Creator<DrawableProperties> {
|
||||||
|
override fun createFromParcel(parcel: Parcel): DrawableProperties {
|
||||||
|
return DrawableProperties(parcel)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun newArray(size: Int): Array<DrawableProperties?> {
|
||||||
|
return arrayOfNulls(size)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var cornerRadius: Int = _cornerRadius
|
||||||
|
set(value) {
|
||||||
|
_cornerRadius = value
|
||||||
|
topLeftRadius = value
|
||||||
|
topRightRadius = value
|
||||||
|
bottomRightRadius = value
|
||||||
|
bottomLeftRadius = value
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(parcel: Parcel) : this(
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readFloat(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readFloat(),
|
||||||
|
parcel.readByte() != 0.toByte(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readByte() != 0.toByte(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readFloat(),
|
||||||
|
parcel.readFloat(),
|
||||||
|
parcel.readByte() != 0.toByte(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readValue(Int::class.java.classLoader) as? Int,
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readFloat(),
|
||||||
|
parcel.readByte() != 0.toByte(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readParcelable(ColorStateList::class.java.classLoader),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readParcelable(ColorStateList::class.java.classLoader),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readByte() != 0.toByte(),
|
||||||
|
parcel.readFloat(),
|
||||||
|
parcel.readFloat(),
|
||||||
|
parcel.readFloat(),
|
||||||
|
parcel.readFloat(),
|
||||||
|
parcel.readByte() != 0.toByte(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readFloat(),
|
||||||
|
parcel.readFloat(),
|
||||||
|
parcel.readByte() != 0.toByte(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readByte() != 0.toByte(),
|
||||||
|
parcel.readInt(),
|
||||||
|
parcel.readParcelable(ColorStateList::class.java.classLoader),
|
||||||
|
parcel.readInt()
|
||||||
|
)
|
||||||
|
|
||||||
|
fun copy(): DrawableProperties {
|
||||||
|
val parcel = Parcel.obtain()
|
||||||
|
parcel.setDataPosition(0)
|
||||||
|
val properties = CREATOR.createFromParcel(parcel)
|
||||||
|
parcel.recycle()
|
||||||
|
return properties
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getCornerRadii(): FloatArray {
|
||||||
|
return floatArrayOf(
|
||||||
|
topLeftRadius.toFloat(), topLeftRadius.toFloat(),
|
||||||
|
topRightRadius.toFloat(), topRightRadius.toFloat(),
|
||||||
|
bottomRightRadius.toFloat(), bottomRightRadius.toFloat(),
|
||||||
|
bottomLeftRadius.toFloat(), bottomLeftRadius.toFloat()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getOrientation(): GradientDrawable.Orientation {
|
||||||
|
val orientation: GradientDrawable.Orientation = when (val angle = this.angle % 360) {
|
||||||
|
0 -> GradientDrawable.Orientation.LEFT_RIGHT
|
||||||
|
45 -> GradientDrawable.Orientation.BL_TR
|
||||||
|
90 -> GradientDrawable.Orientation.BOTTOM_TOP
|
||||||
|
135 -> GradientDrawable.Orientation.BR_TL
|
||||||
|
180 -> GradientDrawable.Orientation.RIGHT_LEFT
|
||||||
|
225 -> GradientDrawable.Orientation.TR_BL
|
||||||
|
270 -> GradientDrawable.Orientation.TOP_BOTTOM
|
||||||
|
315 -> GradientDrawable.Orientation.TL_BR
|
||||||
|
else -> throw IllegalArgumentException("Unsupported angle: $angle")
|
||||||
|
}
|
||||||
|
return orientation
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getColors(): IntArray {
|
||||||
|
return if (useCenterColor && centerColor != null) {
|
||||||
|
intArrayOf(startColor, centerColor!!, endColor)
|
||||||
|
} else intArrayOf(startColor, endColor)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun materialization(): Drawable = DrawableBuilder().batch(this).build()
|
||||||
|
}
|
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
import android.graphics.drawable.Drawable
|
||||||
|
|
||||||
|
abstract class DrawableWrapperBuilder<T : DrawableWrapperBuilder<T>> {
|
||||||
|
|
||||||
|
protected var drawable: Drawable? = null
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
fun drawable(drawable: Drawable): T = apply { this.drawable = drawable } as T
|
||||||
|
|
||||||
|
abstract fun build(): Drawable
|
||||||
|
}
|
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
@file:Suppress("DEPRECATION", "CanvasSize")
|
||||||
|
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
import android.graphics.Canvas
|
||||||
|
import android.graphics.ColorFilter
|
||||||
|
import android.graphics.Rect
|
||||||
|
import android.graphics.drawable.Drawable
|
||||||
|
|
||||||
|
class FlipDrawable(
|
||||||
|
private var drawable: Drawable,
|
||||||
|
private var orientation: Int = ORIENTATION_HORIZONTAL
|
||||||
|
) : Drawable() {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val ORIENTATION_HORIZONTAL = 0
|
||||||
|
const val ORIENTATION_VERTICAL = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun draw(canvas: Canvas) {
|
||||||
|
val saveCount = canvas.save()
|
||||||
|
if (orientation == ORIENTATION_VERTICAL) {
|
||||||
|
canvas.scale(1f, -1f, (canvas.width / 2).toFloat(), (canvas.height / 2).toFloat())
|
||||||
|
} else {
|
||||||
|
canvas.scale(-1f, 1f, (canvas.width / 2).toFloat(), (canvas.height / 2).toFloat())
|
||||||
|
}
|
||||||
|
drawable.bounds = Rect(0, 0, canvas.width, canvas.height)
|
||||||
|
drawable.draw(canvas)
|
||||||
|
canvas.restoreToCount(saveCount)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onLevelChange(level: Int): Boolean {
|
||||||
|
drawable.level = level
|
||||||
|
invalidateSelf()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getIntrinsicWidth(): Int {
|
||||||
|
return drawable.intrinsicWidth
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getIntrinsicHeight(): Int {
|
||||||
|
return drawable.intrinsicHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setAlpha(alpha: Int) {
|
||||||
|
drawable.alpha = alpha
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getOpacity(): Int {
|
||||||
|
return drawable.opacity
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setColorFilter(colorFilter: ColorFilter?) {
|
||||||
|
drawable.colorFilter = colorFilter
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
import android.graphics.drawable.Drawable
|
||||||
|
|
||||||
|
class FlipDrawableBuilder : DrawableWrapperBuilder<FlipDrawableBuilder>() {
|
||||||
|
|
||||||
|
private var orientation: Int = FlipDrawable.ORIENTATION_HORIZONTAL
|
||||||
|
|
||||||
|
fun orientation(orientation: Int) = apply { this.orientation = orientation }
|
||||||
|
|
||||||
|
override fun build(): Drawable {
|
||||||
|
return FlipDrawable(drawable!!, orientation)
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,181 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
import android.graphics.drawable.Drawable
|
||||||
|
import android.graphics.drawable.LayerDrawable
|
||||||
|
import android.os.Build
|
||||||
|
import android.view.Gravity
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
|
||||||
|
class LayerDrawableBuilder {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val DIMEN_UNDEFINED = Int.MIN_VALUE
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
private var paddingMode = LayerDrawable.PADDING_MODE_NEST
|
||||||
|
private var paddingLeft = 0
|
||||||
|
private var paddingTop = 0
|
||||||
|
private var paddingRight = 0
|
||||||
|
private var paddingBottom = 0
|
||||||
|
private var paddingStart = 0
|
||||||
|
private var paddingEnd = 0
|
||||||
|
private val layers = ArrayList<Layer>()
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
fun paddingMode(mode: Int) = apply { paddingMode = mode }
|
||||||
|
fun paddingLeft(padding: Int) = apply { paddingLeft = padding }
|
||||||
|
fun paddingTop(padding: Int) = apply { paddingTop = padding }
|
||||||
|
fun paddingRight(padding: Int) = apply { paddingRight = padding }
|
||||||
|
fun paddingBottom(padding: Int) = apply { paddingBottom = padding }
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.M)
|
||||||
|
fun paddingStart(padding: Int) = apply { paddingStart = padding }
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.M)
|
||||||
|
fun paddingEnd(padding: Int) = apply { paddingEnd = padding }
|
||||||
|
fun padding(padding: Int) = apply {
|
||||||
|
paddingLeft(padding).paddingTop(padding).paddingRight(padding).paddingBottom(padding)
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.M)
|
||||||
|
fun paddingRelative(padding: Int) = apply {
|
||||||
|
paddingStart(padding).paddingTop(padding).paddingEnd(padding).paddingBottom(padding)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun add(drawable: Drawable) = apply { layers.add(Layer(drawable)) }
|
||||||
|
|
||||||
|
fun width(width: Int) = apply { layers.last().width = width }
|
||||||
|
fun height(height: Int) = apply { layers.last().height = height }
|
||||||
|
|
||||||
|
fun insetLeft(inset: Int) = apply { layers.last().insetLeft = inset }
|
||||||
|
fun insetTop(inset: Int) = apply { layers.last().insetTop = inset }
|
||||||
|
fun insetRight(inset: Int) = apply { layers.last().insetRight = inset }
|
||||||
|
fun insetBottom(inset: Int) = apply { layers.last().insetBottom = inset }
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.M)
|
||||||
|
fun insetStart(inset: Int) = apply { layers.last().insetStart = inset }
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.M)
|
||||||
|
fun insetEnd(inset: Int) = apply { layers.last().insetEnd = inset }
|
||||||
|
fun inset(inset: Int) =
|
||||||
|
apply { insetLeft(inset).insetTop(inset).insetRight(inset).insetBottom(inset) }
|
||||||
|
|
||||||
|
fun inset(insetLeft: Int, insetTop: Int, insetRight: Int, insetBottom: Int) = apply {
|
||||||
|
insetLeft(insetLeft).insetTop(insetTop).insetRight(insetRight).insetBottom(insetBottom)
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.M)
|
||||||
|
fun insetRelative(inset: Int) =
|
||||||
|
apply { insetStart(inset).insetTop(inset).insetEnd(inset).insetBottom(inset) }
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.M)
|
||||||
|
fun insetRelative(insetStart: Int, insetTop: Int, insetEnd: Int, insetBottom: Int) = apply {
|
||||||
|
insetStart(insetStart).insetTop(insetTop).insetEnd(insetEnd).insetBottom(insetBottom)
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.M)
|
||||||
|
fun gravity(gravity: Int) = apply { layers.last().gravity = gravity }
|
||||||
|
|
||||||
|
fun modify(
|
||||||
|
index: Int, drawable: Drawable,
|
||||||
|
width: Int = DIMEN_UNDEFINED,
|
||||||
|
height: Int = DIMEN_UNDEFINED,
|
||||||
|
insetLeft: Int = DIMEN_UNDEFINED,
|
||||||
|
insetTop: Int = DIMEN_UNDEFINED,
|
||||||
|
insetRight: Int = DIMEN_UNDEFINED,
|
||||||
|
insetBottom: Int = DIMEN_UNDEFINED,
|
||||||
|
insetStart: Int = DIMEN_UNDEFINED,
|
||||||
|
insetEnd: Int = DIMEN_UNDEFINED
|
||||||
|
) =
|
||||||
|
apply {
|
||||||
|
val layer = layers[index]
|
||||||
|
layer.drawable = drawable
|
||||||
|
if (width != DIMEN_UNDEFINED) layer.width = width
|
||||||
|
if (height != DIMEN_UNDEFINED) layer.height = height
|
||||||
|
if (insetLeft != DIMEN_UNDEFINED) layer.insetLeft = insetLeft
|
||||||
|
if (insetTop != DIMEN_UNDEFINED) layer.insetTop = insetTop
|
||||||
|
if (insetRight != DIMEN_UNDEFINED) layer.insetRight = insetRight
|
||||||
|
if (insetBottom != DIMEN_UNDEFINED) layer.insetBottom = insetBottom
|
||||||
|
if (insetStart != DIMEN_UNDEFINED) layer.insetStart = insetStart
|
||||||
|
if (insetEnd != DIMEN_UNDEFINED) layer.insetEnd = insetEnd
|
||||||
|
}
|
||||||
|
|
||||||
|
fun build(): LayerDrawable {
|
||||||
|
val layerDrawable = LayerDrawable(layers.map { it -> it.drawable }.toTypedArray())
|
||||||
|
for (i in 0 until layers.size) {
|
||||||
|
val layer = layers[i]
|
||||||
|
layerDrawable.setLayerInset(
|
||||||
|
i,
|
||||||
|
layer.insetLeft,
|
||||||
|
layer.insetTop,
|
||||||
|
layer.insetRight,
|
||||||
|
layer.insetBottom
|
||||||
|
)
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
if (layer.insetStart != DIMEN_UNDEFINED || layer.insetEnd != DIMEN_UNDEFINED) {
|
||||||
|
layerDrawable.setLayerInsetRelative(
|
||||||
|
i,
|
||||||
|
layer.insetStart,
|
||||||
|
layer.insetTop,
|
||||||
|
layer.insetEnd,
|
||||||
|
layer.insetBottom
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layerDrawable.setId(i, i)
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
layerDrawable.setLayerGravity(i, layer.gravity)
|
||||||
|
layerDrawable.setLayerInsetStart(i, layer.insetStart)
|
||||||
|
layerDrawable.setLayerInsetEnd(i, layer.insetEnd)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layerDrawable.paddingMode = paddingMode
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
layerDrawable.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom)
|
||||||
|
if (paddingStart != DIMEN_UNDEFINED || paddingEnd != DIMEN_UNDEFINED) {
|
||||||
|
layerDrawable.setPaddingRelative(
|
||||||
|
paddingStart,
|
||||||
|
paddingTop,
|
||||||
|
paddingEnd,
|
||||||
|
paddingBottom
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return layerDrawable
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class Layer(var drawable: Drawable) {
|
||||||
|
var gravity: Int = Gravity.NO_GRAVITY
|
||||||
|
var width: Int = -1
|
||||||
|
var height: Int = -1
|
||||||
|
var insetLeft: Int = 0
|
||||||
|
var insetTop: Int = 0
|
||||||
|
var insetRight: Int = 0
|
||||||
|
var insetBottom: Int = 0
|
||||||
|
var insetStart: Int = DIMEN_UNDEFINED
|
||||||
|
var insetEnd: Int = DIMEN_UNDEFINED
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
import android.graphics.Path
|
||||||
|
import android.graphics.drawable.ShapeDrawable
|
||||||
|
import android.graphics.drawable.shapes.PathShape
|
||||||
|
|
||||||
|
class PathShapeDrawableBuilder {
|
||||||
|
|
||||||
|
private var path: Path? = null
|
||||||
|
private var pathStandardWidth: Float = 100f
|
||||||
|
private var pathStandardHeight: Float = 100f
|
||||||
|
private var width: Int = -1
|
||||||
|
private var height: Int = -1
|
||||||
|
|
||||||
|
fun path(path: Path, pathStandardWidth: Float, pathStandardHeight: Float) = apply {
|
||||||
|
this.path = path
|
||||||
|
this.pathStandardWidth = pathStandardWidth
|
||||||
|
this.pathStandardHeight = pathStandardHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
fun width(width: Int) = apply { this.width = width }
|
||||||
|
fun height(height: Int) = apply { this.height = height }
|
||||||
|
fun size(size: Int) = apply { width(size).height(size) }
|
||||||
|
|
||||||
|
fun build(custom: ((shapeDrawable: ShapeDrawable) -> Unit)? = null): ShapeDrawable {
|
||||||
|
val shapeDrawable = ShapeDrawable()
|
||||||
|
if (path == null || width <= 0 || height <= 0) {
|
||||||
|
return shapeDrawable
|
||||||
|
}
|
||||||
|
val pathShape = PathShape(path!!, pathStandardWidth, pathStandardHeight)
|
||||||
|
|
||||||
|
shapeDrawable.shape = pathShape
|
||||||
|
shapeDrawable.intrinsicWidth = width
|
||||||
|
shapeDrawable.intrinsicHeight = height
|
||||||
|
if (custom != null) {
|
||||||
|
custom(shapeDrawable)
|
||||||
|
}
|
||||||
|
return shapeDrawable
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
import android.content.res.ColorStateList
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.graphics.drawable.*
|
||||||
|
import android.util.StateSet
|
||||||
|
|
||||||
|
class RippleDrawableBuilder : DrawableWrapperBuilder<RippleDrawableBuilder>() {
|
||||||
|
|
||||||
|
private var color: Int = Constants.DEFAULT_COLOR
|
||||||
|
private var colorStateList: ColorStateList? = null
|
||||||
|
private var radius: Int = -1
|
||||||
|
|
||||||
|
fun color(color: Int) = apply { this.color = color }
|
||||||
|
fun colorStateList(colorStateList: ColorStateList?) =
|
||||||
|
apply { this.colorStateList = colorStateList }
|
||||||
|
|
||||||
|
fun radius(radius: Int) = apply { this.radius = radius }
|
||||||
|
|
||||||
|
override fun build(): Drawable {
|
||||||
|
var drawable = this.drawable!!
|
||||||
|
val colorStateList = this.colorStateList ?: ColorStateList(
|
||||||
|
arrayOf(StateSet.WILD_CARD),
|
||||||
|
intArrayOf(color)
|
||||||
|
)
|
||||||
|
|
||||||
|
var mask = if (drawable is DrawableContainer) drawable.getCurrent() else drawable
|
||||||
|
if (mask is ShapeDrawable) {
|
||||||
|
val state = mask.getConstantState()
|
||||||
|
if (state != null) {
|
||||||
|
val temp = state.newDrawable().mutate() as ShapeDrawable
|
||||||
|
temp.paint.color = Color.BLACK
|
||||||
|
mask = temp
|
||||||
|
}
|
||||||
|
} else if (mask is GradientDrawable) {
|
||||||
|
val state = mask.getConstantState()
|
||||||
|
if (state != null) {
|
||||||
|
val temp = state.newDrawable().mutate() as GradientDrawable
|
||||||
|
temp.setColor(Color.BLACK)
|
||||||
|
mask = temp
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mask = ColorDrawable(Color.BLACK)
|
||||||
|
}
|
||||||
|
|
||||||
|
val rippleDrawable = RippleDrawable(colorStateList, drawable, mask)
|
||||||
|
setRadius(rippleDrawable, radius)
|
||||||
|
rippleDrawable.invalidateSelf()
|
||||||
|
drawable = rippleDrawable
|
||||||
|
return drawable
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
import android.graphics.drawable.Drawable
|
||||||
|
import android.graphics.drawable.RotateDrawable
|
||||||
|
|
||||||
|
class RotateDrawableBuilder : DrawableWrapperBuilder<RotateDrawableBuilder>() {
|
||||||
|
|
||||||
|
private var pivotX: Float = 0.5f
|
||||||
|
private var pivotY: Float = 0.5f
|
||||||
|
private var fromDegrees: Float = 0f
|
||||||
|
private var toDegrees: Float = 360f
|
||||||
|
|
||||||
|
fun pivotX(x: Float) = apply { pivotX = x }
|
||||||
|
fun pivotY(y: Float) = apply { pivotY = y }
|
||||||
|
fun fromDegrees(degree: Float) = apply { fromDegrees = degree }
|
||||||
|
fun toDegrees(degree: Float) = apply { toDegrees = degree }
|
||||||
|
|
||||||
|
override fun build(): Drawable {
|
||||||
|
val rotateDrawable = RotateDrawable()
|
||||||
|
drawable?.let {
|
||||||
|
setDrawable(rotateDrawable, it)
|
||||||
|
apply {
|
||||||
|
setPivotX(rotateDrawable, pivotX)
|
||||||
|
setPivotY(rotateDrawable, pivotY)
|
||||||
|
setFromDegrees(rotateDrawable, fromDegrees)
|
||||||
|
setToDegrees(rotateDrawable, toDegrees)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rotateDrawable
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
import android.graphics.drawable.Drawable
|
||||||
|
import android.graphics.drawable.ScaleDrawable
|
||||||
|
import android.view.Gravity
|
||||||
|
|
||||||
|
class ScaleDrawableBuilder : DrawableWrapperBuilder<ScaleDrawableBuilder>() {
|
||||||
|
|
||||||
|
private var level: Int = 10000
|
||||||
|
private var scaleGravity = Gravity.CENTER
|
||||||
|
private var scaleWidth: Float = 0f
|
||||||
|
private var scaleHeight: Float = 0f
|
||||||
|
|
||||||
|
fun level(level: Int) = apply { this.level = level }
|
||||||
|
fun scaleGravity(gravity: Int) = apply { this.scaleGravity = gravity }
|
||||||
|
fun scaleWidth(scale: Float) = apply { this.scaleWidth = scale }
|
||||||
|
fun scaleHeight(scale: Float) = apply { this.scaleHeight = scale }
|
||||||
|
|
||||||
|
override fun build(): Drawable {
|
||||||
|
val scaleDrawable = ScaleDrawable(drawable, scaleGravity, scaleWidth, scaleHeight)
|
||||||
|
scaleDrawable.level = level
|
||||||
|
return scaleDrawable
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
package com.fankes.apperrorstracking.utils.drawable.drawabletoolbox
|
||||||
|
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.graphics.drawable.ColorDrawable
|
||||||
|
import android.graphics.drawable.Drawable
|
||||||
|
import android.graphics.drawable.StateListDrawable
|
||||||
|
import android.util.StateSet
|
||||||
|
|
||||||
|
class StateListDrawableBuilder {
|
||||||
|
|
||||||
|
private var pressed: Drawable? = null
|
||||||
|
private var disabled: Drawable? = null
|
||||||
|
private var selected: Drawable? = null
|
||||||
|
private var normal: Drawable = ColorDrawable(Color.TRANSPARENT)
|
||||||
|
|
||||||
|
fun pressed(pressed: Drawable?) = apply { this.pressed = pressed }
|
||||||
|
fun disabled(disabled: Drawable?) = apply { this.disabled = disabled }
|
||||||
|
fun selected(selected: Drawable?) = apply { this.selected = selected }
|
||||||
|
fun normal(normal: Drawable) = apply { this.normal = normal }
|
||||||
|
|
||||||
|
fun build(): StateListDrawable {
|
||||||
|
val stateListDrawable = StateListDrawable()
|
||||||
|
setupStateListDrawable(stateListDrawable)
|
||||||
|
return stateListDrawable
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupStateListDrawable(stateListDrawable: StateListDrawable) {
|
||||||
|
pressed?.let {
|
||||||
|
stateListDrawable.addState(intArrayOf(android.R.attr.state_pressed), it)
|
||||||
|
}
|
||||||
|
disabled?.let {
|
||||||
|
stateListDrawable.addState(intArrayOf(-android.R.attr.state_enabled), it)
|
||||||
|
}
|
||||||
|
selected?.let {
|
||||||
|
stateListDrawable.addState(intArrayOf(android.R.attr.state_selected), it)
|
||||||
|
}
|
||||||
|
stateListDrawable.addState(StateSet.WILD_CARD, normal)
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/KitsunePie/AppErrorsTracking
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/5/7.
|
||||||
|
*/
|
||||||
|
@file:Suppress("DEPRECATION", "PrivateApi", "unused", "ObsoleteSdkInt")
|
||||||
|
|
||||||
|
package com.fankes.apperrorstracking.utils.factory
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import android.net.Uri
|
||||||
|
import android.provider.Settings
|
||||||
|
import android.widget.Toast
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统深色模式是否开启
|
||||||
|
* @return [Boolean] 是否开启
|
||||||
|
*/
|
||||||
|
val Context.isSystemInDarkMode get() = (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统深色模式是否没开启
|
||||||
|
* @return [Boolean] 是否开启
|
||||||
|
*/
|
||||||
|
inline val Context.isNotSystemInDarkMode get() = !isSystemInDarkMode
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp 转换为 pxInt
|
||||||
|
* @param context 使用的实例
|
||||||
|
* @return [Int]
|
||||||
|
*/
|
||||||
|
fun Number.dp(context: Context) = dpFloat(context).toInt()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp 转换为 pxFloat
|
||||||
|
* @param context 使用的实例
|
||||||
|
* @return [Float]
|
||||||
|
*/
|
||||||
|
fun Number.dpFloat(context: Context) = toFloat() * context.resources.displayMetrics.density
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跳转 APP 自身设置界面
|
||||||
|
* @param packageName 包名
|
||||||
|
*/
|
||||||
|
fun Context.openSelfSetting(packageName: String = this.packageName) = runCatching {
|
||||||
|
startActivity(Intent().apply {
|
||||||
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
|
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
|
||||||
|
data = Uri.fromParts("package", packageName, null)
|
||||||
|
})
|
||||||
|
}.onFailure { Toast.makeText(this, "无法打开 $packageName 的设置界面", Toast.LENGTH_SHORT).show() }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动指定 APP
|
||||||
|
* @param packageName 包名
|
||||||
|
*/
|
||||||
|
fun Context.openApp(packageName: String = this.packageName) = runCatching {
|
||||||
|
startActivity(packageManager.getLaunchIntentForPackage(packageName)?.apply {
|
||||||
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
|
})
|
||||||
|
}.onFailure { Toast.makeText(this, "无法启动 $packageName", Toast.LENGTH_SHORT).show() }
|
10
app/src/main/res/drawable/ic_baseline_bug_report.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="#ffffff"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_baseline_close.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="#000000"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_baseline_info.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="#000000"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_baseline_refresh.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="#000000"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z" />
|
||||||
|
</vector>
|
170
app/src/main/res/drawable/ic_launcher_background.xml
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
android:viewportHeight="108">
|
||||||
|
<path
|
||||||
|
android:fillColor="#3DDC84"
|
||||||
|
android:pathData="M0,0h108v108h-108z" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M9,0L9,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,0L19,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M29,0L29,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M39,0L39,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M49,0L49,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M59,0L59,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M69,0L69,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M79,0L79,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M89,0L89,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M99,0L99,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,9L108,9"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,19L108,19"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,29L108,29"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,39L108,39"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,49L108,49"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,59L108,59"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,69L108,69"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,79L108,79"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,89L108,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,99L108,99"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,29L89,29"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,39L89,39"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,49L89,49"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,59L89,59"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,69L89,69"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,79L89,79"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M29,19L29,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M39,19L39,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M49,19L49,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M59,19L59,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M69,19L69,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M79,19L79,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
</vector>
|
15
app/src/main/res/drawable/ic_launcher_foreground.xml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
android:viewportHeight="108"
|
||||||
|
android:tint="#ffffff">
|
||||||
|
<group android:scaleX="2.1731708"
|
||||||
|
android:scaleY="2.1731708"
|
||||||
|
android:translateX="27.921951"
|
||||||
|
android:translateY="27.921951">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z" />
|
||||||
|
</group>
|
||||||
|
</vector>
|
BIN
app/src/main/res/mipmap-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 4.4 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 3.8 KiB |