first commit
This commit is contained in:
commit
b55ee42685
15
.gitignore
vendored
Normal file
15
.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
|
||||
3
.idea/.gitignore
generated
vendored
Normal file
3
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
6
.idea/compiler.xml
generated
Normal file
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="17" />
|
||||
</component>
|
||||
</project>
|
||||
10
.idea/deploymentTargetSelector.xml
generated
Normal file
10
.idea/deploymentTargetSelector.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="deploymentTargetSelector">
|
||||
<selectionStates>
|
||||
<SelectionState runConfigName="app">
|
||||
<option name="selectionMode" value="DROPDOWN" />
|
||||
</SelectionState>
|
||||
</selectionStates>
|
||||
</component>
|
||||
</project>
|
||||
19
.idea/gradle.xml
generated
Normal file
19
.idea/gradle.xml
generated
Normal file
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="GradleMigrationSettings" migrationVersion="1" />
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
<option value="$PROJECT_DIR$/app" />
|
||||
</set>
|
||||
</option>
|
||||
<option name="resolveExternalAnnotations" value="false" />
|
||||
</GradleProjectSettings>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/kotlinc.xml
generated
Normal file
6
.idea/kotlinc.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="KotlinJpsPluginSettings">
|
||||
<option name="version" value="1.8.10" />
|
||||
</component>
|
||||
</project>
|
||||
10
.idea/migrations.xml
generated
Normal file
10
.idea/migrations.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectMigrations">
|
||||
<option name="MigrateToGradleLocalJavaHome">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
</set>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
||||
9
.idea/misc.xml
generated
Normal file
9
.idea/misc.xml
generated
Normal file
@ -0,0 +1,9 @@
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
||||
<option name="id" value="Android" />
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
generated
Normal file
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="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
BIN
.safedk/api/SafeDKAndroid-6.2.6.jar
Normal file
BIN
.safedk/api/SafeDKAndroid-6.2.6.jar
Normal file
Binary file not shown.
19
.safedk/app_sdks.lst
Normal file
19
.safedk/app_sdks.lst
Normal file
@ -0,0 +1,19 @@
|
||||
106f9be0e66f52f36eaaaff4dd231971
|
||||
75939c4ce23c53ad9534d43be176b3e9
|
||||
217e8f437c9fc4244d6e74653ac8a8c7
|
||||
66b774de6608db14a84e972fba1ec954
|
||||
e1c9ddef73e5621f62c717badf1be3f2
|
||||
daaea35726ab7cd457ab61d4538fb822
|
||||
946dbe0d5ed7fee91c8ece64d035e70b
|
||||
1be9e72506f3307ce6a9e78d26d65bd0
|
||||
7eac188d3286b05ccbba774f63a2c049
|
||||
4df96d3bc9afd17b812e65e6c6add1ef
|
||||
eb3214f29c0a52815b41977d6cc9a46e
|
||||
becf75b2cc99e82716da2e6697879509
|
||||
7eec7b9476b99b3ce94533da4f2eb987
|
||||
974322f19d813702ea048d95288d2b8c
|
||||
29015bbfcc182d80e7f75bd2c38e4521
|
||||
dd2971b0681141d57b221687791ad1bd
|
||||
86a0d598cde251321e21a0da4ab94065
|
||||
74616804a7dc29147dfb0afe122a9fd2
|
||||
|
||||
BIN
.safedk/dex/SafeDKAndroid-6.2.6.dex
Normal file
BIN
.safedk/dex/SafeDKAndroid-6.2.6.dex
Normal file
Binary file not shown.
BIN
.safedk/dex/android-support-multidex.dex
Normal file
BIN
.safedk/dex/android-support-multidex.dex
Normal file
Binary file not shown.
2
.safedk/hashes.safedk
Normal file
2
.safedk/hashes.safedk
Normal file
@ -0,0 +1,2 @@
|
||||
#Wed Feb 19 17:43:26 CST 2025
|
||||
json=1501372632
|
||||
1
.safedk/list.enc
Normal file
1
.safedk/list.enc
Normal file
File diff suppressed because one or more lines are too long
6
.safedk/plugin.properties
Normal file
6
.safedk/plugin.properties
Normal file
@ -0,0 +1,6 @@
|
||||
#
|
||||
#Wed Feb 19 17:43:26 CST 2025
|
||||
4CFHxOfvQvy95EqDxa_eNPe4pmq_KfoZPJeVscTMt2uT3VL2fO3iyZyBFMTOOTRbKw6WelbaDEhNzxOxVrlQTE=tAh5Z8CtFiG05NfRWh9UuOHCp3h3SaFvlh6Phw5ucaxFMCRs2d97F7lywfBKOEKSipdaGq8vZOaDLZkrL1fDDc
|
||||
sRf_am6eNsMAZxrSLe3K1GPOtbti7op1q9yz1VfCOdhEFHW1xM34XE_W2knxFET_OtazbIlk2aWU6vmtTJPxkg=qNJuTfHqsau8CXZyxyv2w4XapOhr48XdPZvBWB6wVzgv5pvEz__XieITRDapHWhsllKNSSy_H7yf6GgkkK1ziI
|
||||
sdk_analysis_plugin_version=5.2.7
|
||||
set_multidex=true
|
||||
34
.safedk/proguard-safedk.pro
Normal file
34
.safedk/proguard-safedk.pro
Normal file
@ -0,0 +1,34 @@
|
||||
-keep class androidx.multidex.** { *; }
|
||||
-keep class androidx.browser.customtabs.CustomTabsIntent { *; }
|
||||
-keep class androidx.** {
|
||||
*** startActivityForResult(***);
|
||||
*** startActivity(***);
|
||||
}
|
||||
-keep class android.support.multidex.** { *; }
|
||||
-keep class android.support.v4.app.** { *; }
|
||||
-keep class com.google.android.gms.location.FusedLocationProviderApi { *; }
|
||||
-keep class com.google.android.gms.location.LocationListener { *; }
|
||||
-keep class io.fabric.sdk.android.** { *; }
|
||||
-keep class okio.** { *; }
|
||||
-keep class retrofit2.** { *; }
|
||||
-keep class okhttp3.** { *; }
|
||||
-keep class com.squareup.okhttp.** { *; }
|
||||
-keep class com.android.volley.** { *; }
|
||||
-keep class com.flurry.** { *; }
|
||||
-keep class org.apache.** { *; }
|
||||
-keep class com.applovin.** { *; }
|
||||
-keep class com.google.android.gms.ads.** { *; }
|
||||
-keep class com.ironsource.** { *; }
|
||||
-keep class com.fyber.inneractive.** { *; }
|
||||
-keep class com.vungle.** { *; }
|
||||
-keep class com.unity3d.ads.** { *; }
|
||||
-keep class com.unity3d.services.** { *; }
|
||||
-keep class com.mintegral.msdk.** { *; }
|
||||
-keep class com.mbridge.msdk.** { *; }
|
||||
-keep class com.adcolony.sdk.** { *; }
|
||||
-keep class com.inmobi.** { *; }
|
||||
-keep class com.five_corp.** { *; }
|
||||
-keep class com.bytedance.** { *; }
|
||||
-keep class com.smaato.** { *; }
|
||||
-keep class com.safedk.** { *; }
|
||||
-keep class com.applovin.quality.** { *; }
|
||||
1
app/.gitignore
vendored
Normal file
1
app/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/build
|
||||
BIN
app/PrankMaster.jks
Normal file
BIN
app/PrankMaster.jks
Normal file
Binary file not shown.
95
app/build.gradle.kts
Normal file
95
app/build.gradle.kts
Normal file
@ -0,0 +1,95 @@
|
||||
import java.util.Date
|
||||
import java.text.SimpleDateFormat
|
||||
|
||||
plugins {
|
||||
id("com.android.application")
|
||||
id("org.jetbrains.kotlin.android")
|
||||
id("io.objectbox")
|
||||
id("com.google.firebase.crashlytics")
|
||||
id("com.google.gms.google-services")
|
||||
id("applovin-quality-service")
|
||||
}
|
||||
applovin {
|
||||
apiKey = "sRf_am6eNsMAZxrSLe3K1GPOtbti7op1q9yz1VfCOdhEFHW1xM34XE_W2knxFET_OtazbIlk2aWU6vmtTJPxkg"
|
||||
}
|
||||
|
||||
val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date())
|
||||
android {
|
||||
namespace = "com.prankster.fx"
|
||||
compileSdk = 34
|
||||
|
||||
defaultConfig {
|
||||
//com.prankster.fx
|
||||
applicationId = "com.prankster.fx"
|
||||
minSdk = 23
|
||||
targetSdk = 34
|
||||
versionCode = 3
|
||||
versionName = "1.0.2"
|
||||
setProperty(
|
||||
"archivesBaseName",
|
||||
"Prankster FX_V" + versionName + "(${versionCode})_$timestamp"
|
||||
)
|
||||
testInstrumentationRunner = "androidx.sounds.runner.AndroidJUnitRunner"
|
||||
vectorDrawables {
|
||||
useSupportLibrary = true
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
isMinifyEnabled = true
|
||||
proguardFiles(
|
||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||
"proguard-rules.pro"
|
||||
)
|
||||
}
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_17
|
||||
targetCompatibility = JavaVersion.VERSION_17
|
||||
}
|
||||
kotlinOptions {
|
||||
jvmTarget = "17"
|
||||
}
|
||||
buildFeatures {
|
||||
compose = true
|
||||
viewBinding = true
|
||||
}
|
||||
composeOptions {
|
||||
kotlinCompilerExtensionVersion = "1.4.3"
|
||||
}
|
||||
packaging {
|
||||
resources {
|
||||
excludes += "/META-INF/{AL2.0,LGPL2.1}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
|
||||
implementation("androidx.appcompat:appcompat:1.6.1")
|
||||
implementation("com.google.android.material:material:1.12.0")
|
||||
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
|
||||
implementation("androidx.legacy:legacy-support-v4:1.0.0")
|
||||
implementation("androidx.recyclerview:recyclerview:1.3.2")
|
||||
implementation("com.github.bumptech.glide:glide:4.16.0")
|
||||
|
||||
implementation("com.geyifeng.immersionbar:immersionbar:3.2.2")
|
||||
|
||||
implementation(platform("com.google.firebase:firebase-bom:33.7.0"))
|
||||
// When using the BoM, you don't specify versions in Firebase library dependencies
|
||||
// Add the dependency for the Firebase SDK for Google Analytics
|
||||
implementation("com.google.firebase:firebase-analytics")
|
||||
implementation("com.google.firebase:firebase-crashlytics")
|
||||
implementation("com.google.firebase:firebase-config")
|
||||
|
||||
implementation("com.applovin:applovin-sdk:12.6.1")
|
||||
implementation ("com.applovin.mediation:vungle-adapter:7.4.1.2")
|
||||
implementation ("com.applovin.mediation:mintegral-adapter:16.8.61.0")
|
||||
implementation ("com.applovin.mediation:inmobi-adapter:10.7.8.0")
|
||||
implementation ("com.squareup.picasso:picasso:2.71828")
|
||||
implementation ("androidx.recyclerview:recyclerview:1.1.0")
|
||||
implementation ("com.applovin.mediation:bytedance-adapter:6.3.0.2.0")
|
||||
implementation ("com.applovin.mediation:unityads-adapter:4.12.3.1")
|
||||
}
|
||||
29
app/google-services.json
Normal file
29
app/google-services.json
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"project_info": {
|
||||
"project_number": "273137931282",
|
||||
"project_id": "prankster-fx",
|
||||
"storage_bucket": "prankster-fx.firebasestorage.app"
|
||||
},
|
||||
"client": [
|
||||
{
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:273137931282:android:d30a14f5300ca7740334cb",
|
||||
"android_client_info": {
|
||||
"package_name": "com.prankster.fx"
|
||||
}
|
||||
},
|
||||
"oauth_client": [],
|
||||
"api_key": [
|
||||
{
|
||||
"current_key": "AIzaSyBYlfnAYEdRnkAHQydInFeuA5gl3wfBfjE"
|
||||
}
|
||||
],
|
||||
"services": {
|
||||
"appinvite_service": {
|
||||
"other_platform_oauth_client": []
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"configuration_version": "1"
|
||||
}
|
||||
112
app/objectbox-models/default.json
Normal file
112
app/objectbox-models/default.json
Normal file
@ -0,0 +1,112 @@
|
||||
{
|
||||
"_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.",
|
||||
"_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.",
|
||||
"_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.",
|
||||
"entities": [
|
||||
{
|
||||
"id": "3:6372494608185382462",
|
||||
"lastPropertyId": "3:6190783800393335475",
|
||||
"name": "Category",
|
||||
"properties": [
|
||||
{
|
||||
"id": "1:9088572167887595053",
|
||||
"name": "id",
|
||||
"type": 6,
|
||||
"flags": 1
|
||||
},
|
||||
{
|
||||
"id": "2:2294045821758826971",
|
||||
"name": "name",
|
||||
"type": 9
|
||||
},
|
||||
{
|
||||
"id": "3:6190783800393335475",
|
||||
"name": "covert",
|
||||
"type": 9
|
||||
}
|
||||
],
|
||||
"relations": [
|
||||
{
|
||||
"id": "4:6781268415547019296",
|
||||
"name": "beanList",
|
||||
"targetId": "6:8810616757821398748"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "6:8810616757821398748",
|
||||
"lastPropertyId": "6:3371160825837869454",
|
||||
"name": "Bean",
|
||||
"properties": [
|
||||
{
|
||||
"id": "1:881748992619560888",
|
||||
"name": "id",
|
||||
"type": 6,
|
||||
"flags": 1
|
||||
},
|
||||
{
|
||||
"id": "2:95077662452914291",
|
||||
"name": "name",
|
||||
"type": 9
|
||||
},
|
||||
{
|
||||
"id": "3:7000351314398811626",
|
||||
"name": "covert",
|
||||
"type": 9
|
||||
},
|
||||
{
|
||||
"id": "4:3982750000194227585",
|
||||
"name": "audioUrl",
|
||||
"type": 9
|
||||
},
|
||||
{
|
||||
"id": "5:5235585844249440522",
|
||||
"name": "isLike",
|
||||
"type": 1
|
||||
},
|
||||
{
|
||||
"id": "6:3371160825837869454",
|
||||
"name": "isCustomization",
|
||||
"type": 1
|
||||
}
|
||||
],
|
||||
"relations": []
|
||||
}
|
||||
],
|
||||
"lastEntityId": "6:8810616757821398748",
|
||||
"lastIndexId": "0:0",
|
||||
"lastRelationId": "4:6781268415547019296",
|
||||
"lastSequenceId": "0:0",
|
||||
"modelVersion": 5,
|
||||
"modelVersionParserMinimum": 5,
|
||||
"retiredEntityUids": [
|
||||
6644187494744704837,
|
||||
5451755925324613900,
|
||||
5341528467384834198,
|
||||
8669262289368091330
|
||||
],
|
||||
"retiredIndexUids": [],
|
||||
"retiredPropertyUids": [
|
||||
3737650329028529369,
|
||||
4763378658873693443,
|
||||
125364974873863130,
|
||||
2528835553105827913,
|
||||
4125097520975656265,
|
||||
1927156637783361412,
|
||||
6438478261519714898,
|
||||
2535158628950494443,
|
||||
4963029281587776266,
|
||||
8017263761729239946,
|
||||
3918234626049153042,
|
||||
4840800811073356695,
|
||||
930394402218217369,
|
||||
1357489842440803099,
|
||||
783114452691941347
|
||||
],
|
||||
"retiredRelationUids": [
|
||||
4497042841980461487,
|
||||
5723529287069432111,
|
||||
8439944504818566677
|
||||
],
|
||||
"version": 1
|
||||
}
|
||||
181
app/proguard-rules.pro
vendored
Normal file
181
app/proguard-rules.pro
vendored
Normal file
@ -0,0 +1,181 @@
|
||||
# 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
|
||||
-useuniqueclassmembernames
|
||||
-keepattributes SourceFile,LineNumberTable
|
||||
|
||||
-keepclassmembers class * implements java.io.Serializable {
|
||||
|
||||
static final long serialVersionUID;
|
||||
|
||||
private static final java.io.ObjectStreamField[] serialPersistentFields;
|
||||
|
||||
private void writeObject(java.io.ObjectOutputStream);
|
||||
|
||||
private void readObject(java.io.ObjectInputStream);
|
||||
|
||||
java.lang.Object writeReplace();
|
||||
|
||||
java.lang.Object readResolve();
|
||||
|
||||
}
|
||||
|
||||
|
||||
# 保留Processor类,这些类用于在编译时生成ObjectBox需要的代码
|
||||
-keep @io.objectbox.annotation.processor.Processor class * {
|
||||
*;
|
||||
}
|
||||
|
||||
# 保留ObjectBox的关键方法和构造函数
|
||||
-keepclassmembers class * extends io.objectbox.Box {
|
||||
<init>(...);
|
||||
<methods>;
|
||||
}
|
||||
|
||||
|
||||
#---------------------------------------------Topon
|
||||
-keep class com.startapp.** {
|
||||
*;
|
||||
}
|
||||
|
||||
-keep class com.truenet.** {
|
||||
*;
|
||||
}
|
||||
|
||||
-keepattributes Exceptions, InnerClasses, Signature, Deprecated, SourceFile,
|
||||
LineNumberTable, *Annotation*, EnclosingMethod
|
||||
-dontwarn android.webkit.JavascriptInterface
|
||||
-dontwarn com.startapp.**
|
||||
|
||||
-dontwarn org.jetbrains.annotations.**
|
||||
-keep class com.appnext.** { *; }
|
||||
-dontwarn com.appnext.**
|
||||
# Vungle
|
||||
-dontwarn com.vungle.ads.**
|
||||
-keepclassmembers class com.vungle.ads.** {
|
||||
*;
|
||||
}
|
||||
-keep class com.vungle.ads.**
|
||||
|
||||
|
||||
|
||||
# Google
|
||||
-keep class com.google.android.gms.** { *; }
|
||||
-dontwarn com.google.android.gms.**
|
||||
|
||||
|
||||
|
||||
|
||||
# START OkHttp + Okio
|
||||
# JSR 305 annotations are for embedding nullability information.
|
||||
-dontwarn javax.annotation.**
|
||||
|
||||
|
||||
# A resource is loaded with a relative path so the package of this class must be preserved.
|
||||
-adaptresourcefilenames okhttp3/internal/publicsuffix/PublicSuffixDatabase.gz
|
||||
|
||||
|
||||
# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
|
||||
-dontwarn org.codehaus.mojo.animal_sniffer.*
|
||||
|
||||
|
||||
# OkHttp platform used only on JVM and when Conscrypt and other security providers are available.
|
||||
-dontwarn okhttp3.internal.platform.**
|
||||
-dontwarn org.conscrypt.**
|
||||
-dontwarn org.bouncycastle.**
|
||||
-dontwarn org.openjsse.**
|
||||
|
||||
|
||||
# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
|
||||
-dontwarn org.codehaus.mojo.animal_sniffer.*
|
||||
|
||||
|
||||
# END OkHttp + Okio
|
||||
|
||||
|
||||
# START Protobuf
|
||||
-dontwarn com.google.protobuf.**
|
||||
-keepclassmembers class com.google.protobuf.** {
|
||||
*;
|
||||
}
|
||||
-keep class * extends com.google.protobuf.GeneratedMessageLite { *; }
|
||||
|
||||
|
||||
# END Protobuf
|
||||
-keepclassmembers class com.ironsource.sdk.controller.IronSourceWebView$JSInterface {
|
||||
public *;
|
||||
}
|
||||
-keepclassmembers class * implements android.os.Parcelable {
|
||||
public static final android.os.Parcelable$Creator *;
|
||||
}
|
||||
-keep public class com.google.android.gms.ads.** {
|
||||
public *;
|
||||
}
|
||||
-keep class com.ironsource.adapters.** { *;
|
||||
}
|
||||
-dontwarn com.ironsource.mediationsdk.**
|
||||
-dontwarn com.ironsource.adapters.**
|
||||
-keepattributes JavascriptInterface
|
||||
-keepclassmembers class * {
|
||||
@android.webkit.JavascriptInterface <methods>;
|
||||
}
|
||||
-keep class com.bytedance.sdk.** { *; }
|
||||
-keep class com.inmobi.** { *; }
|
||||
-keep public class com.google.android.gms.**
|
||||
-dontwarn com.google.android.gms.**
|
||||
-dontwarn com.squareup.picasso.**
|
||||
-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient{
|
||||
public *;
|
||||
}
|
||||
-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info{
|
||||
public *;
|
||||
}
|
||||
# skip the Picasso library classes
|
||||
-keep class com.squareup.picasso.** {*;}
|
||||
-dontwarn com.squareup.okhttp.**
|
||||
# skip Moat classes
|
||||
-keep class com.moat.** {*;}
|
||||
-dontwarn com.moat.**
|
||||
# skip IAB classes
|
||||
-keep class com.iab.** {*;}
|
||||
-dontwarn com.iab.**
|
||||
-keepattributes Signature
|
||||
-keepattributes *Annotation*
|
||||
-keep class com.mbridge.** {*; }
|
||||
-keep interface com.mbridge.** {*; }
|
||||
-keep class android.support.v4.** { *; }
|
||||
-dontwarn com.mbridge.**
|
||||
-keep class **.R$* { public static final int mbridge*; }
|
||||
-keep public class com.mbridge.* extends androidx.** { *; }
|
||||
-keep public class androidx.viewpager.widget.PagerAdapter{ *; }
|
||||
-keep public class androidx.viewpager.widget.ViewPager.OnPageChangeListener{ *; }
|
||||
-keep interface androidx.annotation.IntDef{ *; }
|
||||
-keep interface androidx.annotation.Nullable{ *; }
|
||||
-keep interface androidx.annotation.CheckResult{ *; }
|
||||
-keep interface androidx.annotation.NonNull{ *; }
|
||||
-keep public class androidx.fragment.app.Fragment{ *; }
|
||||
-keep public class androidx.core.content.FileProvider{ *; }
|
||||
-keep public class androidx.core.app.NotificationCompat{ *; }
|
||||
-keep public class androidx.appcompat.widget.AppCompatImageView { *; }
|
||||
-keep public class androidx.recyclerview.*{ *; }
|
||||
-keep class com.chartboost.** { *; }
|
||||
|
||||
#---------------------------------------------Topon
|
||||
BIN
app/release/Prankster FX_V1.0.1(2)_02_19_17_35-release.apk
Normal file
BIN
app/release/Prankster FX_V1.0.1(2)_02_19_17_35-release.apk
Normal file
Binary file not shown.
BIN
app/release/Prankster FX_V1.0.2(3)_02_19_17_42-release.aab
Normal file
BIN
app/release/Prankster FX_V1.0.2(3)_02_19_17_42-release.aab
Normal file
Binary file not shown.
20
app/release/output-metadata.json
Normal file
20
app/release/output-metadata.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"version": 3,
|
||||
"artifactType": {
|
||||
"type": "APK",
|
||||
"kind": "Directory"
|
||||
},
|
||||
"applicationId": "com.prankster.fx",
|
||||
"variantName": "release",
|
||||
"elements": [
|
||||
{
|
||||
"type": "SINGLE",
|
||||
"filters": [],
|
||||
"attributes": [],
|
||||
"versionCode": 2,
|
||||
"versionName": "1.0.1",
|
||||
"outputFile": "Prankster FX_V1.0.1(2)_02_19_17_35-release.apk"
|
||||
}
|
||||
],
|
||||
"elementType": "File"
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
package com.prankster.funny.audio.sounds
|
||||
|
||||
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 sounds, 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 sounds.
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("com.play.funny.audio.sounds", appContext.packageName)
|
||||
}
|
||||
}
|
||||
59
app/src/main/AndroidManifest.xml
Normal file
59
app/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission
|
||||
android:name="android.permission.READ_EXTERNAL_STORAGE"
|
||||
android:maxSdkVersion="32" />
|
||||
<uses-permission
|
||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||
android:maxSdkVersion="32" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
|
||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||
|
||||
<application
|
||||
android:name=".FXApp"
|
||||
android:allowBackup="true"
|
||||
android:dataExtractionRules="@xml/data_extraction_rules"
|
||||
android:fullBackupContent="@xml/backup_rules"
|
||||
android:icon="@mipmap/fx_logo"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/fx_logo_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/Theme.FunnyAudio"
|
||||
tools:targetApi="31">
|
||||
|
||||
<activity
|
||||
android:name=".ui.activity.FXPlayAct"
|
||||
android:screenOrientation="portrait"
|
||||
android:exported="false" />
|
||||
<activity
|
||||
android:name=".ui.activity.FXAllActivity"
|
||||
android:screenOrientation="portrait"
|
||||
android:exported="false" />
|
||||
<activity
|
||||
android:name=".ui.activity.FXMainAct"
|
||||
android:screenOrientation="portrait"
|
||||
android:exported="false" />
|
||||
<activity
|
||||
android:name=".ui.activity.FXSaveAudioAct"
|
||||
android:screenOrientation="portrait"
|
||||
android:exported="false" />
|
||||
<activity
|
||||
android:name=".ui.activity.FXRecordAudioAct"
|
||||
android:screenOrientation="portrait"
|
||||
android:exported="false" />
|
||||
<activity
|
||||
android:name=".ui.activity.FXSplashActivity"
|
||||
android:screenOrientation="portrait"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
3788
app/src/main/assets/FxAudio.json
Normal file
3788
app/src/main/assets/FxAudio.json
Normal file
File diff suppressed because it is too large
Load Diff
BIN
app/src/main/assets/black.ttf
Normal file
BIN
app/src/main/assets/black.ttf
Normal file
Binary file not shown.
BIN
app/src/main/assets/fxfont.ttf
Normal file
BIN
app/src/main/assets/fxfont.ttf
Normal file
Binary file not shown.
81
app/src/main/java/com/prankster/fx/FXApp.java
Normal file
81
app/src/main/java/com/prankster/fx/FXApp.java
Normal file
@ -0,0 +1,81 @@
|
||||
package com.prankster.fx;
|
||||
|
||||
import android.app.Application;
|
||||
import android.content.res.AssetManager;
|
||||
import android.graphics.Typeface;
|
||||
|
||||
import com.applovin.sdk.AppLovinMediationProvider;
|
||||
import com.applovin.sdk.AppLovinSdk;
|
||||
import com.applovin.sdk.AppLovinSdkConfiguration;
|
||||
import com.applovin.sdk.AppLovinSdkInitializationConfiguration;
|
||||
import com.prankster.fx.db.Bean;
|
||||
import com.prankster.fx.db.Category;
|
||||
import com.prankster.fx.db.ObManager;
|
||||
import com.prankster.fx.topon.AdManager;
|
||||
import com.prankster.fx.utils.CommonUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
|
||||
public class FXApp extends Application {
|
||||
|
||||
public static FXApp app;
|
||||
public static Typeface defaultFont;
|
||||
public static List<Category> bean;
|
||||
|
||||
public static String TAG = "---------FX-----";
|
||||
|
||||
private String APPId ="";
|
||||
|
||||
private String AppKey ="";
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
app = this;
|
||||
initSDk();
|
||||
AssetManager assets = getAssets();
|
||||
defaultFont = Typeface.createFromAsset(assets, "black.ttf");
|
||||
ObManager.init(this);
|
||||
if (bean != null)
|
||||
return;
|
||||
try {
|
||||
InputStream open = getAssets().open("FxAudio.json");
|
||||
String string = CommonUtils.getString(open);
|
||||
if (!string.isEmpty()) {
|
||||
bean = CommonUtils.getBean(string);
|
||||
for (Category category:bean){
|
||||
for (Bean bean1 : category.getBeanList()) {
|
||||
bean1.setLike(false);
|
||||
ObManager.getBoxBean().put(bean1);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void initSDk(){
|
||||
String maxSdkKey = "qNJuTfHqsau8CXZyxyv2w4XapOhr48XdPZvBWB6wVzgv5pvEz__XieITRDapHWhsllKNSSy_H7yf6GgkkK1ziI";
|
||||
// Create the initialization configuration
|
||||
AppLovinSdkInitializationConfiguration initConfig = AppLovinSdkInitializationConfiguration.builder( maxSdkKey, this )
|
||||
.setMediationProvider( AppLovinMediationProvider.MAX )
|
||||
// Perform any additional configuration/setting changes
|
||||
.build();
|
||||
|
||||
// Initialize the SDK with the configuration
|
||||
AppLovinSdk.getInstance( this ).initialize( initConfig, new AppLovinSdk.SdkInitializationListener()
|
||||
{
|
||||
@Override
|
||||
public void onSdkInitialized(final AppLovinSdkConfiguration sdkConfig)
|
||||
{
|
||||
// Start loading ads
|
||||
}
|
||||
} );
|
||||
|
||||
AdManager.loadAllAd();
|
||||
}
|
||||
}
|
||||
69
app/src/main/java/com/prankster/fx/db/Bean.java
Normal file
69
app/src/main/java/com/prankster/fx/db/Bean.java
Normal file
@ -0,0 +1,69 @@
|
||||
package com.prankster.fx.db;
|
||||
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import io.objectbox.annotation.Entity;
|
||||
import io.objectbox.annotation.Id;
|
||||
|
||||
@Entity
|
||||
public class Bean implements Serializable {
|
||||
@Id
|
||||
private long id;
|
||||
|
||||
private String name;
|
||||
private String covert;
|
||||
|
||||
private String audioUrl;
|
||||
private boolean isLike;
|
||||
|
||||
private boolean isCustomization;
|
||||
|
||||
public boolean isCustomization() {
|
||||
return isCustomization;
|
||||
}
|
||||
|
||||
public void setCustomization(boolean customization) {
|
||||
isCustomization = customization;
|
||||
}
|
||||
|
||||
public boolean isLike() {
|
||||
return isLike;
|
||||
}
|
||||
|
||||
public void setLike(boolean like) {
|
||||
isLike = like;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getCovert() {
|
||||
return covert;
|
||||
}
|
||||
|
||||
public void setCovert(String covert) {
|
||||
this.covert = covert;
|
||||
}
|
||||
|
||||
public String getAudioUrl() {
|
||||
return audioUrl;
|
||||
}
|
||||
|
||||
public void setAudioUrl(String audioUrl) {
|
||||
this.audioUrl = audioUrl;
|
||||
}
|
||||
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(long id) {
|
||||
this.id = id;
|
||||
}
|
||||
}
|
||||
50
app/src/main/java/com/prankster/fx/db/Category.java
Normal file
50
app/src/main/java/com/prankster/fx/db/Category.java
Normal file
@ -0,0 +1,50 @@
|
||||
package com.prankster.fx.db;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
import io.objectbox.annotation.Entity;
|
||||
import io.objectbox.annotation.Id;
|
||||
|
||||
|
||||
@Entity
|
||||
public class Category implements Serializable {
|
||||
@Id
|
||||
private long id;
|
||||
private String name;
|
||||
private String covert;
|
||||
|
||||
private List<Bean> beanList;
|
||||
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getCovert() {
|
||||
return covert;
|
||||
}
|
||||
|
||||
public void setCovert(String covert) {
|
||||
this.covert = covert;
|
||||
}
|
||||
|
||||
public List<Bean> getBeanList() {
|
||||
return beanList;
|
||||
}
|
||||
|
||||
public void setBeanList(List<Bean> beanList) {
|
||||
this.beanList = beanList;
|
||||
}
|
||||
}
|
||||
75
app/src/main/java/com/prankster/fx/db/ObManager.java
Normal file
75
app/src/main/java/com/prankster/fx/db/ObManager.java
Normal file
@ -0,0 +1,75 @@
|
||||
package com.prankster.fx.db;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import io.objectbox.Box;
|
||||
import io.objectbox.BoxStore;
|
||||
import io.objectbox.query.Query;
|
||||
|
||||
public class ObManager {
|
||||
|
||||
private static BoxStore store;
|
||||
|
||||
public static void init(Context context) {
|
||||
store = MyObjectBox.builder()
|
||||
.androidContext(context)
|
||||
.build();
|
||||
}
|
||||
|
||||
public static Box<Bean> getBoxBean() {
|
||||
return store.boxFor(Bean.class);
|
||||
}
|
||||
|
||||
|
||||
public static List<Bean> getAllLike() {
|
||||
Query<Bean> query = ObManager.getBoxBean().query(Bean_.isLike.equal(true)).build();
|
||||
List<Bean> data = query.find();
|
||||
query.close();
|
||||
return data;
|
||||
}
|
||||
|
||||
public static List<Bean> getAllCustomization() {
|
||||
Query<Bean> query = ObManager.getBoxBean().query(Bean_.isCustomization.equal(true)).build();
|
||||
List<Bean> data = query.find();
|
||||
query.close();
|
||||
return data;
|
||||
}
|
||||
|
||||
public static boolean checkLike(Bean bean) {
|
||||
Query<Bean> query = ObManager.getBoxBean().query(Bean_.name.equal(bean.getName())).build();
|
||||
Bean data = query.findFirst();
|
||||
query.close();
|
||||
if (data != null) {
|
||||
return data.isLike();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static boolean checkName(String name) {
|
||||
Query<Bean> query = ObManager.getBoxBean().query(Bean_.name.equal(name)).build();
|
||||
Bean data = query.findFirst();
|
||||
query.close();
|
||||
if (data != null) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void addLike(Bean bean) {
|
||||
bean.setLike(true);
|
||||
ObManager.getBoxBean().put(bean);
|
||||
}
|
||||
|
||||
public static void removeLike(Bean bean) {
|
||||
bean.setLike(false);
|
||||
ObManager.getBoxBean().put(bean);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
10
app/src/main/java/com/prankster/fx/topon/AdListener.java
Normal file
10
app/src/main/java/com/prankster/fx/topon/AdListener.java
Normal file
@ -0,0 +1,10 @@
|
||||
package com.prankster.fx.topon;
|
||||
|
||||
public interface AdListener {
|
||||
void loadFail(String placeId);
|
||||
void showSuccess();
|
||||
|
||||
void showFail();
|
||||
|
||||
void showClose();
|
||||
}
|
||||
228
app/src/main/java/com/prankster/fx/topon/AdManager.java
Normal file
228
app/src/main/java/com/prankster/fx/topon/AdManager.java
Normal file
@ -0,0 +1,228 @@
|
||||
package com.prankster.fx.topon;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.CountDownTimer;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.applovin.mediation.MaxAd;
|
||||
import com.applovin.mediation.MaxAdListener;
|
||||
import com.applovin.mediation.MaxError;
|
||||
import com.applovin.mediation.ads.MaxInterstitialAd;
|
||||
import com.prankster.fx.FXApp;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class AdManager {
|
||||
|
||||
private static final int type_no_cache = 0;
|
||||
private static final int type_has_cache = 1;
|
||||
private static final int type_show_success = 2;
|
||||
private static final int type_show_close = 3;
|
||||
private static final int type_show_fail = 4;
|
||||
|
||||
private static final String place1Id = "63cb5af8a1d7975e";
|
||||
private static final String place2Id = "c666cb8a3c03bd9c";
|
||||
private static final String place3Id = "8b2dfd2a5f6df1e7";
|
||||
|
||||
|
||||
private static boolean place1LoadFail = false;
|
||||
private static boolean place2LoadFail = false;
|
||||
private static boolean place3LoadFail = false;
|
||||
|
||||
private static boolean alreadyShow = false;
|
||||
|
||||
private static List<MaxInterstitialAd> list = new ArrayList<>();
|
||||
|
||||
|
||||
public static void loadAllAd() {
|
||||
if (list.size() == 0) {
|
||||
MaxInterstitialAd mInterstitialAd1 = new MaxInterstitialAd(place1Id, FXApp.app);
|
||||
MaxInterstitialAd mInterstitialAd2 = new MaxInterstitialAd(place2Id, FXApp.app);
|
||||
MaxInterstitialAd mInterstitialAd3 = new MaxInterstitialAd(place2Id, FXApp.app);
|
||||
list.add(mInterstitialAd1);
|
||||
list.add(mInterstitialAd2);
|
||||
list.add(mInterstitialAd3);
|
||||
}
|
||||
for (MaxInterstitialAd ad : list) {
|
||||
if (!ad.isReady()) {
|
||||
setCallBack(ad, new AdListener() {
|
||||
@Override
|
||||
public void loadFail(@NonNull String placeId) {
|
||||
if (placeId.equals(place1Id)) {
|
||||
place1LoadFail = true;
|
||||
}
|
||||
if (placeId.equals(place2Id)) {
|
||||
place2LoadFail = true;
|
||||
}
|
||||
if (placeId.equals(place3Id)) {
|
||||
place3LoadFail = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showSuccess() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showFail() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showClose() {
|
||||
|
||||
}
|
||||
});
|
||||
ad.loadAd();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private static MaxInterstitialAd getReadyAd() {
|
||||
Collections.shuffle(list);
|
||||
for (MaxInterstitialAd ad : list) {
|
||||
if (ad.isReady()) {
|
||||
Log.d(FXApp.TAG, "-has Cache------------");
|
||||
return ad;
|
||||
}
|
||||
}
|
||||
Log.d(FXApp.TAG, "-No Cache------------");
|
||||
return null;
|
||||
}
|
||||
|
||||
private static void setCallBack(MaxInterstitialAd ad, AdListener listener) {
|
||||
ad.setListener(new MaxAdListener() {
|
||||
@Override
|
||||
public void onAdLoaded(@NonNull MaxAd maxAd) {
|
||||
Log.d(FXApp.TAG, "LoadLoaded " + ad.getAdUnitId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdDisplayed(@NonNull MaxAd maxAd) {
|
||||
Log.d(FXApp.TAG, "AdShow " + maxAd.getAdUnitId());
|
||||
listener.showSuccess();
|
||||
ad.loadAd();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdHidden(@NonNull MaxAd maxAd) {
|
||||
listener.showClose();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdClicked(@NonNull MaxAd maxAd) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdLoadFailed(@NonNull String s, @NonNull MaxError maxError) {
|
||||
listener.loadFail(ad.getAdUnitId());
|
||||
Log.d(FXApp.TAG, "LoadFail:--" + ad.getAdUnitId() + "--" + maxError.getCode() + "---" + maxError.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdDisplayFailed(@NonNull MaxAd maxAd, @NonNull MaxError maxError) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public static CountDownTimer showWelcomeAd(
|
||||
Activity activity,
|
||||
Long totalTim,
|
||||
CountAction countAction,
|
||||
GoMainAction goMain
|
||||
) {
|
||||
Log.d(FXApp.TAG, "----------alreadyShow=" + alreadyShow);
|
||||
alreadyShow = false;
|
||||
CountDownTimer timer = new CountDownTimer(totalTim, 100) {
|
||||
@Override
|
||||
public void onTick(long millisUntilFinished) {
|
||||
countAction.onCount(millisUntilFinished);
|
||||
if (!alreadyShow) {
|
||||
showAD(activity, new AdStatusAction() {
|
||||
@Override
|
||||
public void onStatus(int adType) {
|
||||
if (adType == type_has_cache) {
|
||||
alreadyShow = true;
|
||||
}
|
||||
if (adType == type_show_close || adType == type_show_fail) {
|
||||
goMain.onGo();
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinish() {
|
||||
if (!alreadyShow) {
|
||||
showTopOn(activity, new onActionListener() {
|
||||
@Override
|
||||
public void onAction() {
|
||||
goMain.onGo();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
return timer;
|
||||
}
|
||||
|
||||
|
||||
private static void showAD(Activity activity, AdStatusAction action) {
|
||||
MaxInterstitialAd readyAd = getReadyAd();
|
||||
if (readyAd != null) {
|
||||
action.onStatus(type_has_cache);
|
||||
setCallBack(readyAd, new AdListener() {
|
||||
@Override
|
||||
public void loadFail(@NonNull String placeId) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showSuccess() {
|
||||
action.onStatus(type_show_success);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showFail() {
|
||||
action.onStatus(type_show_fail);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showClose() {
|
||||
action.onStatus(type_show_close);
|
||||
}
|
||||
});
|
||||
readyAd.showAd(activity);
|
||||
} else {
|
||||
action.onStatus(type_no_cache);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void showTopOn(Activity activity, onActionListener listener) {
|
||||
showAD(activity, new AdStatusAction() {
|
||||
@Override
|
||||
public void onStatus(int adType) {
|
||||
if (adType == type_no_cache || adType == type_show_close || adType == type_show_fail) {
|
||||
listener.onAction();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
package com.prankster.fx.topon;
|
||||
|
||||
public interface AdStatusAction {
|
||||
void onStatus(int adType);
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
package com.prankster.fx.topon;
|
||||
|
||||
public interface CountAction {
|
||||
void onCount(long millisUntilFinished);
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
package com.prankster.fx.topon;
|
||||
|
||||
public interface GoMainAction {
|
||||
void onGo();
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
package com.prankster.fx.topon;
|
||||
|
||||
public interface onActionListener {
|
||||
|
||||
void onAction();
|
||||
}
|
||||
@ -0,0 +1,55 @@
|
||||
package com.prankster.fx.ui.activity;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
import com.prankster.fx.R;
|
||||
import com.prankster.fx.ui.adapter.AllAdapter;
|
||||
import com.prankster.fx.databinding.ActivityAllBinding;
|
||||
import com.prankster.fx.db.Category;
|
||||
import com.prankster.fx.topon.AdManager;
|
||||
import com.prankster.fx.utils.ConstValues;
|
||||
import com.prankster.fx.utils.MyDecoration;
|
||||
|
||||
public class FXAllActivity extends AppCompatActivity implements View.OnClickListener {
|
||||
|
||||
private ActivityAllBinding activityListBinding;
|
||||
private Category data;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
AdManager.loadAllAd();
|
||||
activityListBinding = ActivityAllBinding.inflate(getLayoutInflater());
|
||||
setContentView(activityListBinding.getRoot());
|
||||
ImmersionBar.with(this)
|
||||
.statusBarColor(R.color.white)
|
||||
.statusBarDarkFont(true)
|
||||
.statusBarView(activityListBinding.view)
|
||||
.init();
|
||||
data = (Category) getIntent().getSerializableExtra(ConstValues.KEY_LIST_DATA);
|
||||
activityListBinding.categoryName.setText(data.getName());
|
||||
onList();
|
||||
activityListBinding.back.setOnClickListener(this);
|
||||
}
|
||||
|
||||
private void onList() {
|
||||
MyDecoration myDecoration = new MyDecoration(10, 10, 5);
|
||||
activityListBinding.listRecycler.addItemDecoration(myDecoration);
|
||||
activityListBinding.listRecycler.setLayoutManager(new GridLayoutManager(this, 3));
|
||||
AllAdapter allAdapter = new AllAdapter(this, data.getBeanList());
|
||||
activityListBinding.listRecycler.setAdapter(allAdapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if(v.equals(activityListBinding.back)){
|
||||
finish();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
297
app/src/main/java/com/prankster/fx/ui/activity/FXMainAct.java
Normal file
297
app/src/main/java/com/prankster/fx/ui/activity/FXMainAct.java
Normal file
@ -0,0 +1,297 @@
|
||||
package com.prankster.fx.ui.activity;
|
||||
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.viewpager2.adapter.FragmentStateAdapter;
|
||||
import androidx.viewpager2.widget.ViewPager2;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
import com.prankster.fx.FXApp;
|
||||
import com.prankster.fx.R;
|
||||
import com.prankster.fx.databinding.ActivityMainBinding;
|
||||
import com.prankster.fx.db.Bean;
|
||||
import com.prankster.fx.db.Category;
|
||||
import com.prankster.fx.topon.AdManager;
|
||||
import com.prankster.fx.ui.fragment.FXHomeFg;
|
||||
import com.prankster.fx.ui.fragment.FXLikeFg;
|
||||
import com.prankster.fx.ui.fragment.FXRecordFg;
|
||||
import com.prankster.fx.utils.CommonUtils;
|
||||
import com.prankster.fx.utils.ConstValues;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class FXMainAct extends AppCompatActivity implements View.OnClickListener {
|
||||
|
||||
private ActivityMainBinding activityMainBinding;
|
||||
|
||||
private List<Fragment> fragmentList = new ArrayList<>();
|
||||
private FXLikeFg fxLikeFg;
|
||||
private FXRecordFg fxRecordFg;
|
||||
private ActivityResultLauncher<String> audioPickerLauncher;
|
||||
|
||||
private MediaPlayer mediaPlayer;
|
||||
private Bean bean;
|
||||
private List<Bean> list;
|
||||
private boolean first = true;
|
||||
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
activityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());
|
||||
setContentView(activityMainBinding.getRoot());
|
||||
ImmersionBar.with(this)
|
||||
.statusBarColor(R.color.white)
|
||||
.statusBarDarkFont(true)
|
||||
.statusBarView(activityMainBinding.view)
|
||||
.init();
|
||||
AdManager.loadAllAd();
|
||||
initAudioData();
|
||||
initVp2();
|
||||
activityMainBinding.frameHome.setOnClickListener(this);
|
||||
activityMainBinding.frameAdd.setOnClickListener(this);
|
||||
activityMainBinding.frameCollect.setOnClickListener(this);
|
||||
activityMainBinding.imImport.setOnClickListener(this);
|
||||
|
||||
audioPickerLauncher = registerForActivityResult(new ActivityResultContracts.GetContent(),
|
||||
uri -> {
|
||||
// Handle the returned Uri
|
||||
if (uri != null) {
|
||||
long duration = CommonUtils.getAudioDuration(FXMainAct.this, uri);
|
||||
Intent intent = new Intent(FXMainAct.this, FXSaveAudioAct.class);
|
||||
intent.putExtra(FXSaveAudioAct.KEY_Path, uri.toString());
|
||||
intent.putExtra(FXSaveAudioAct.KEY_Time, duration);
|
||||
startActivity(intent);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
activityMainBinding.linearPlay.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
|
||||
mediaPlayer.pause();
|
||||
activityMainBinding.btnPlay.setSelected(false);
|
||||
return;
|
||||
}
|
||||
if (first) {
|
||||
activityMainBinding.btnPlay.setSelected(true);
|
||||
first = false;
|
||||
mediaPlayer.start();
|
||||
} else {
|
||||
playAudio(true);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void initVp2() {
|
||||
fxLikeFg = FXLikeFg.newInstance();
|
||||
fxRecordFg = FXRecordFg.newInstance();
|
||||
fragmentList.add(FXHomeFg.newInstance());
|
||||
fragmentList.add(fxRecordFg);
|
||||
fragmentList.add(fxLikeFg);
|
||||
activityMainBinding.vp2.setAdapter(new FragmentStateAdapter(this) {
|
||||
@NonNull
|
||||
@Override
|
||||
public Fragment createFragment(int position) {
|
||||
return fragmentList.get(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return fragmentList.size();
|
||||
}
|
||||
});
|
||||
|
||||
// 获取每个Tab下方的指示线
|
||||
View indicatorHome = findViewById(R.id.indicator_home);
|
||||
View indicatorAdd = findViewById(R.id.indicator_add);
|
||||
View indicatorCollect = findViewById(R.id.indicator_collect);
|
||||
|
||||
|
||||
activityMainBinding.vp2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
|
||||
activityMainBinding.vp2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
|
||||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
super.onPageSelected(position);
|
||||
setCurSelectTab(position);
|
||||
|
||||
// 隐藏所有指示线
|
||||
indicatorHome.setVisibility(View.GONE);
|
||||
indicatorAdd.setVisibility(View.GONE);
|
||||
indicatorCollect.setVisibility(View.GONE);
|
||||
|
||||
// 根据选中的Tab显示对应的指示线
|
||||
if (position == 0) {
|
||||
indicatorHome.setVisibility(View.VISIBLE);
|
||||
} else if (position == 1) {
|
||||
indicatorAdd.setVisibility(View.VISIBLE);
|
||||
} else if (position == 2) {
|
||||
indicatorCollect.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
int currentItem = activityMainBinding.vp2.getCurrentItem();
|
||||
Log.d("----------", "---------currentItem=" + currentItem);
|
||||
if (currentItem == 1) {
|
||||
fxRecordFg.refresh();
|
||||
} else if (currentItem == 2) {
|
||||
fxLikeFg.refresh();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void setCurSelectTab(int position) {
|
||||
if (position == 0) {
|
||||
activityMainBinding.imHome.setSelected(true);
|
||||
activityMainBinding.imAdd.setSelected(false);
|
||||
activityMainBinding.imCollect.setSelected(false);
|
||||
activityMainBinding.imImport.setVisibility(View.GONE);
|
||||
activityMainBinding.randomPlayLayout.setVisibility(View.VISIBLE);
|
||||
} else if (position == 1) {
|
||||
activityMainBinding.imHome.setSelected(false);
|
||||
activityMainBinding.imAdd.setSelected(true);
|
||||
activityMainBinding.imCollect.setSelected(false);
|
||||
activityMainBinding.imImport.setVisibility(View.VISIBLE);
|
||||
activityMainBinding.randomPlayLayout.setVisibility(View.GONE);
|
||||
fxRecordFg.refresh();
|
||||
} else {
|
||||
activityMainBinding.imHome.setSelected(false);
|
||||
activityMainBinding.imAdd.setSelected(false);
|
||||
activityMainBinding.imCollect.setSelected(true);
|
||||
activityMainBinding.imImport.setVisibility(View.GONE);
|
||||
activityMainBinding.randomPlayLayout.setVisibility(View.GONE);
|
||||
fxLikeFg.refresh();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (v.equals(activityMainBinding.frameHome)) {
|
||||
activityMainBinding.vp2.setCurrentItem(0);
|
||||
} else if (v.equals(activityMainBinding.frameAdd)) {
|
||||
activityMainBinding.vp2.setCurrentItem(1);
|
||||
} else if (v.equals(activityMainBinding.frameCollect)) {
|
||||
activityMainBinding.vp2.setCurrentItem(2);
|
||||
} else if (v.equals(activityMainBinding.imImport)) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
if (ContextCompat.checkSelfPermission(this, ConstValues.permission_read_audio[0])
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
ActivityCompat.requestPermissions(this, ConstValues.permission_read_audio,
|
||||
ConstValues.REQUEST_READ_STORAGE_PERMISSION);
|
||||
} else {
|
||||
importAudio();
|
||||
}
|
||||
} else {
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
|
||||
!= PackageManager.PERMISSION_GRANTED ||
|
||||
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
|
||||
ActivityCompat.requestPermissions(this, ConstValues.permission_store, ConstValues.REQUEST_READ_STORAGE_PERMISSION);
|
||||
} else {
|
||||
importAudio();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
if (requestCode == ConstValues.REQUEST_READ_STORAGE_PERMISSION) {
|
||||
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||
importAudio();
|
||||
} else {
|
||||
Toast.makeText(this, getString(R.string.permission_fail), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void importAudio() {
|
||||
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
intent.setType("audio/*");
|
||||
audioPickerLauncher.launch("audio/*");
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void initAudioData() {
|
||||
list = new ArrayList<>();
|
||||
for (Category category : FXApp.bean) {
|
||||
list.addAll(category.getBeanList());
|
||||
}
|
||||
initAudio();
|
||||
}
|
||||
|
||||
private void initAudio() {
|
||||
mediaPlayer = new MediaPlayer();
|
||||
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
|
||||
@Override
|
||||
public void onCompletion(MediaPlayer mp) {
|
||||
activityMainBinding.btnPlay.setSelected(false);
|
||||
}
|
||||
});
|
||||
playAudio(false);
|
||||
}
|
||||
|
||||
|
||||
private void playAudio(boolean play) {
|
||||
Collections.shuffle(list);
|
||||
bean = list.get(0);
|
||||
Glide.with(this)
|
||||
.load(bean.getCovert())
|
||||
.placeholder(R.drawable.tab_home_no)
|
||||
.into(activityMainBinding.audioIm);
|
||||
try {
|
||||
mediaPlayer.reset();
|
||||
mediaPlayer.setDataSource(bean.getAudioUrl());
|
||||
mediaPlayer.prepareAsync();
|
||||
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
|
||||
@Override
|
||||
public void onPrepared(MediaPlayer mp) {
|
||||
if (play) {
|
||||
activityMainBinding.btnPlay.setSelected(true);
|
||||
mediaPlayer.start();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
} catch (IOException ioException) {
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
249
app/src/main/java/com/prankster/fx/ui/activity/FXPlayAct.java
Normal file
249
app/src/main/java/com/prankster/fx/ui/activity/FXPlayAct.java
Normal file
@ -0,0 +1,249 @@
|
||||
package com.prankster.fx.ui.activity;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.os.Bundle;
|
||||
import android.os.CountDownTimer;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
import com.prankster.fx.R;
|
||||
import com.prankster.fx.databinding.ActivityPlayBinding;
|
||||
import com.prankster.fx.db.Bean;
|
||||
import com.prankster.fx.db.ObManager;
|
||||
import com.prankster.fx.topon.AdManager;
|
||||
import com.prankster.fx.topon.onActionListener;
|
||||
import com.prankster.fx.utils.CommonUtils;
|
||||
import com.prankster.fx.utils.ConstValues;
|
||||
import com.prankster.fx.utils.OnClickTimer;
|
||||
import com.prankster.fx.ui.view.TimerDialog;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class FXPlayAct extends AppCompatActivity implements View.OnClickListener, OnClickTimer {
|
||||
|
||||
private ActivityPlayBinding playBinding;
|
||||
|
||||
private Bean bean;
|
||||
private TimerDialog timerDialog;
|
||||
|
||||
private MediaPlayer mediaPlayer;
|
||||
private BroadcastReceiver volumeReceiver;
|
||||
private CountDownTimer countDownTimer;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
playBinding = ActivityPlayBinding.inflate(getLayoutInflater());
|
||||
setContentView(playBinding.getRoot());
|
||||
ImmersionBar.with(this)
|
||||
.statusBarColor(R.color.white)
|
||||
.statusBarDarkFont(true)
|
||||
.statusBarView(playBinding.view)
|
||||
.init();
|
||||
bean = (Bean) getIntent().getSerializableExtra(ConstValues.KEY_PLAY_DATA);
|
||||
AdManager.loadAllAd();
|
||||
AdManager.showTopOn(this, new onActionListener() {
|
||||
@Override
|
||||
public void onAction() {
|
||||
|
||||
}
|
||||
});
|
||||
initAudio();
|
||||
String covert = bean.getCovert();
|
||||
if (covert != null && !covert.isEmpty()) {
|
||||
Glide.with(this).load(covert)
|
||||
.placeholder(R.drawable.tab_home_no)
|
||||
.into(playBinding.image);
|
||||
} else {
|
||||
Glide.with(this).load(R.drawable.import_audio)
|
||||
.placeholder(R.drawable.tab_home_no)
|
||||
.into(playBinding.image);
|
||||
}
|
||||
playBinding.name.setText(bean.getName());
|
||||
playBinding.back.setOnClickListener(this);
|
||||
playBinding.linearPlay.setOnClickListener(this);
|
||||
playBinding.imLike.setOnClickListener(this);
|
||||
playBinding.imLoop.setOnClickListener(this);
|
||||
playBinding.imTimer.setOnClickListener(this);
|
||||
|
||||
CommonUtils.setVolume(this, playBinding.seekbar);
|
||||
|
||||
initLike();
|
||||
volumeReceiver();
|
||||
|
||||
}
|
||||
|
||||
private void stopCountDown() {
|
||||
Log.d("------", "------stopCountDown");
|
||||
if (countDownTimer != null) {
|
||||
countDownTimer.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
private void startCountDown(long time) {
|
||||
stopCountDown();
|
||||
countDownTimer = new CountDownTimer(time, 1000) {
|
||||
@Override
|
||||
public void onTick(long millisUntilFinished) {
|
||||
Log.d("------", "------millisUntilFinished=" + millisUntilFinished);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinish() {
|
||||
Log.d("------", "------onFinish");
|
||||
timerDialog.setOffSelected();
|
||||
if (!mediaPlayer.isPlaying()) {
|
||||
playBinding.btnPlay.setSelected(true);
|
||||
mediaPlayer.start();
|
||||
}
|
||||
}
|
||||
};
|
||||
countDownTimer.start();
|
||||
}
|
||||
|
||||
private void volumeReceiver() {
|
||||
volumeReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (intent.getAction().equals("android.media.VOLUME_CHANGED_ACTION")) {
|
||||
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
|
||||
if (playBinding.seekbar.getProgress() != currentVolume) {
|
||||
playBinding.seekbar.setProgress(currentVolume);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
IntentFilter filter = new IntentFilter("android.media.VOLUME_CHANGED_ACTION");
|
||||
registerReceiver(volumeReceiver, filter);
|
||||
}
|
||||
|
||||
private void initLike() {
|
||||
boolean b = ObManager.checkLike(bean);
|
||||
playBinding.imLike.setSelected(b);
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void initAudio() {
|
||||
showPlayBtn(false);
|
||||
mediaPlayer = new MediaPlayer();
|
||||
try {
|
||||
mediaPlayer.reset();
|
||||
mediaPlayer.setDataSource(bean.getAudioUrl());
|
||||
mediaPlayer.prepareAsync();
|
||||
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
|
||||
@Override
|
||||
public void onPrepared(MediaPlayer mp) {
|
||||
showPlayBtn(true);
|
||||
}
|
||||
});
|
||||
|
||||
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
|
||||
@Override
|
||||
public void onCompletion(MediaPlayer mp) {
|
||||
playBinding.btnPlay.setSelected(false);
|
||||
}
|
||||
});
|
||||
} catch (IOException ioException) {
|
||||
showPlayBtn(true);
|
||||
Toast.makeText(this, "----------prepare fail", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
private void showPlayBtn(boolean showBtn) {
|
||||
if (showBtn) {
|
||||
playBinding.linearPlay.setVisibility(View.VISIBLE);
|
||||
playBinding.playLoading.setVisibility(View.GONE);
|
||||
} else {
|
||||
playBinding.linearPlay.setVisibility(View.GONE);
|
||||
playBinding.playLoading.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (v.equals(playBinding.back)) {
|
||||
finish();
|
||||
} else if (v.equals(playBinding.linearPlay)) {
|
||||
|
||||
AdManager.showTopOn(FXPlayAct.this, new onActionListener() {
|
||||
@Override
|
||||
public void onAction() {
|
||||
boolean selected = playBinding.btnPlay.isSelected();
|
||||
if (selected) {
|
||||
if (mediaPlayer.isPlaying()) {
|
||||
mediaPlayer.pause();
|
||||
}
|
||||
} else {
|
||||
if (!mediaPlayer.isPlaying()) {
|
||||
mediaPlayer.start();
|
||||
}
|
||||
}
|
||||
playBinding.btnPlay.setSelected(!selected);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
} else if (v.equals(playBinding.imLike)) {
|
||||
AdManager.showTopOn(FXPlayAct.this, new onActionListener() {
|
||||
@Override
|
||||
public void onAction() {
|
||||
playBinding.imLike.setSelected(!playBinding.imLike.isSelected());
|
||||
boolean selected = playBinding.imLike.isSelected();
|
||||
if (selected) {
|
||||
ObManager.addLike(bean);
|
||||
} else {
|
||||
ObManager.removeLike(bean);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
} else if (v.equals(playBinding.imLoop)) {
|
||||
playBinding.imLoop.setSelected(!playBinding.imLoop.isSelected());
|
||||
mediaPlayer.setLooping(playBinding.imLoop.isSelected());
|
||||
} else if (v.equals(playBinding.imTimer)) {
|
||||
if (timerDialog == null) {
|
||||
timerDialog = new TimerDialog(FXPlayAct.this, this);
|
||||
}
|
||||
timerDialog.showTop(playBinding.imTimer);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (mediaPlayer.isPlaying()) {
|
||||
mediaPlayer.stop();
|
||||
}
|
||||
mediaPlayer.release();
|
||||
mediaPlayer = null;
|
||||
stopCountDown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClickTimerListener(long time) {
|
||||
timerDialog.hide();
|
||||
if (time == -1) {
|
||||
stopCountDown();
|
||||
} else {
|
||||
startCountDown(time);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,95 @@
|
||||
package com.prankster.fx.ui.activity;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.SystemClock;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
import com.prankster.fx.R;
|
||||
import com.prankster.fx.databinding.ActivityRecordAudioBinding;
|
||||
import com.prankster.fx.topon.AdManager;
|
||||
import com.prankster.fx.utils.AudioRecorder;
|
||||
|
||||
public class FXRecordAudioAct extends AppCompatActivity {
|
||||
ActivityRecordAudioBinding binding;
|
||||
private long startTime;
|
||||
private long elapsedTime;
|
||||
private Handler handler = new Handler();
|
||||
private Runnable runnable;
|
||||
private boolean isCreate = false;
|
||||
|
||||
private AudioRecorder audioRecorder;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
binding = ActivityRecordAudioBinding.inflate(getLayoutInflater());
|
||||
setContentView(binding.getRoot());
|
||||
|
||||
ImmersionBar.with(this)
|
||||
.statusBarColor(R.color.white)
|
||||
.statusBarDarkFont(true)
|
||||
.statusBarView(binding.view)
|
||||
.init();
|
||||
|
||||
audioRecorder = new AudioRecorder(this);
|
||||
AdManager.loadAllAd();
|
||||
binding.audioTime.setText(R.string.time_init);
|
||||
|
||||
initEvent();
|
||||
}
|
||||
|
||||
private void initEvent() {
|
||||
binding.back.setOnClickListener(v -> finish());
|
||||
binding.imMic.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
binding.imMic.setSelected(!binding.imMic.isSelected());
|
||||
createSound();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void createSound() {
|
||||
if (!isCreate) {
|
||||
audioRecorder.startRecording();
|
||||
isCreate = true;
|
||||
runnable = new Runnable() {
|
||||
@SuppressLint("DefaultLocale")
|
||||
@Override
|
||||
public void run() {
|
||||
long currentTime = SystemClock.elapsedRealtime();
|
||||
elapsedTime = currentTime - startTime;
|
||||
int milliseconds = (int) (elapsedTime % 1000) / 10;
|
||||
int seconds = (int) (elapsedTime / 1000) % 60;
|
||||
int minutes = (int) (elapsedTime / (1000 * 60)) % 60;
|
||||
binding.audioTime.setText(String.format("%02d : %02d : %02d", minutes, seconds, milliseconds));
|
||||
handler.postDelayed(this, 10);
|
||||
}
|
||||
};
|
||||
startTime = SystemClock.elapsedRealtime();
|
||||
handler.post(runnable);
|
||||
} else {
|
||||
audioRecorder.stopRecording();
|
||||
|
||||
handler.removeCallbacks(runnable);
|
||||
Intent intent = new Intent(FXRecordAudioAct.this, FXSaveAudioAct.class);
|
||||
intent.putExtra(FXSaveAudioAct.KEY_Time, elapsedTime);
|
||||
intent.putExtra(FXSaveAudioAct.KEY_Path, audioRecorder.getTempFileName());
|
||||
intent.putExtra(FXSaveAudioAct.KEY_import, 1);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
handler.removeCallbacks(runnable);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,238 @@
|
||||
package com.prankster.fx.ui.activity;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.media.AudioAttributes;
|
||||
import android.media.MediaPlayer;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.SystemClock;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
import com.prankster.fx.R;
|
||||
import com.prankster.fx.databinding.ActivitySaveBinding;
|
||||
import com.prankster.fx.db.Bean;
|
||||
import com.prankster.fx.db.ObManager;
|
||||
import com.prankster.fx.topon.AdManager;
|
||||
import com.prankster.fx.topon.onActionListener;
|
||||
import com.prankster.fx.utils.CommonUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
public class FXSaveAudioAct extends AppCompatActivity {
|
||||
private ActivitySaveBinding binding;
|
||||
private String path;
|
||||
|
||||
private MediaPlayer mediaPlayer;
|
||||
private Handler handler = new Handler();
|
||||
private Runnable timeUpdater;
|
||||
private long startTime;
|
||||
private long elapsedTime;
|
||||
private long audioDuration;
|
||||
|
||||
public static String KEY_Time = "KEY_time";
|
||||
public static String KEY_Path = "KEY_path";
|
||||
public static String KEY_import = "flag";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
binding = ActivitySaveBinding.inflate(getLayoutInflater());
|
||||
setContentView(binding.getRoot());
|
||||
|
||||
ImmersionBar.with(this)
|
||||
.statusBarColor(R.color.white)
|
||||
.statusBarDarkFont(true)
|
||||
.statusBarView(binding.view)
|
||||
.init();
|
||||
|
||||
AdManager.loadAllAd();
|
||||
CommonUtils.setStatusBarTextColor(this, true);
|
||||
binding.audioTime.setText(R.string.time_init);
|
||||
initData();
|
||||
initEvent();
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void togglePrank() throws IOException {
|
||||
if (binding.imPlayBtn.isSelected()) {
|
||||
initMediaPlayer();
|
||||
} else {
|
||||
stopPrank();
|
||||
}
|
||||
}
|
||||
|
||||
private void stopPrank() {
|
||||
handler.removeCallbacks(timeUpdater);
|
||||
if (mediaPlayer != null) {
|
||||
mediaPlayer.release();
|
||||
mediaPlayer = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void initMediaPlayer() {
|
||||
if (mediaPlayer == null) {
|
||||
mediaPlayer = new MediaPlayer();
|
||||
mediaPlayer.setAudioAttributes(
|
||||
new AudioAttributes.Builder()
|
||||
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
|
||||
.setUsage(AudioAttributes.USAGE_MEDIA)
|
||||
.build());
|
||||
try {
|
||||
mediaPlayer.setDataSource(path);
|
||||
} catch (Exception ex) {
|
||||
|
||||
}
|
||||
mediaPlayer.setOnPreparedListener(mp -> {
|
||||
mediaPlayer.start();
|
||||
startTimer();
|
||||
});
|
||||
mediaPlayer.setOnCompletionListener(mp -> {
|
||||
binding.imPlayBtn.setSelected(false);
|
||||
handler.removeCallbacks(timeUpdater);
|
||||
});
|
||||
mediaPlayer.prepareAsync();
|
||||
} else {
|
||||
mediaPlayer.start();
|
||||
startTimer();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void startTimer() {
|
||||
if (timeUpdater == null) {
|
||||
timeUpdater = new Runnable() {
|
||||
@SuppressLint("DefaultLocale")
|
||||
@Override
|
||||
public void run() {
|
||||
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
|
||||
long currentTime = SystemClock.elapsedRealtime();
|
||||
elapsedTime = currentTime - startTime;
|
||||
int milliseconds = (int) (elapsedTime % 1000) / 10;
|
||||
int seconds = (int) (elapsedTime / 1000) % 60;
|
||||
int minutes = (int) (elapsedTime / (1000 * 60)) % 60;
|
||||
binding.audioTime.setText(String.format("%02d : %02d : %02d", minutes, seconds, milliseconds));
|
||||
handler.postDelayed(this, 10);
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
startTime = SystemClock.elapsedRealtime();
|
||||
handler.post(timeUpdater);
|
||||
}
|
||||
|
||||
private void initEvent() {
|
||||
binding.back.setOnClickListener(v -> finish());
|
||||
binding.imPlayBtn.setOnClickListener(v -> {
|
||||
binding.imPlayBtn.setSelected(!binding.imPlayBtn.isSelected());
|
||||
try {
|
||||
togglePrank();
|
||||
} catch (IOException e) {
|
||||
Log.e("SaveActivity", "Error toggling prank", e);
|
||||
}
|
||||
});
|
||||
binding.save.setOnClickListener(v -> {
|
||||
|
||||
AdManager.showTopOn(FXSaveAudioAct.this, new onActionListener() {
|
||||
@Override
|
||||
public void onAction() {
|
||||
String name = binding.saveEdit.getText().toString().trim();
|
||||
boolean b = ObManager.checkName(name);
|
||||
if (!TextUtils.isEmpty(name)) {
|
||||
if(!b){
|
||||
binding.saveEdit.setText("");
|
||||
Toast.makeText(FXSaveAudioAct.this, getString(R.string.name_hint), Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
saveData(name);
|
||||
Toast.makeText(FXSaveAudioAct.this, getString(R.string.save_tips), Toast.LENGTH_SHORT).show();
|
||||
finish();
|
||||
} else {
|
||||
Toast.makeText(FXSaveAudioAct.this, getString(R.string.save_tip), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
private void saveData(String name) {
|
||||
File cacheDir = getCacheDir();
|
||||
File sourceFile = new File(path);
|
||||
File destinationFile = new File(cacheDir, name + ".mp3");
|
||||
|
||||
if (sourceFile.renameTo(destinationFile)) {
|
||||
Bean mydata = new Bean();
|
||||
mydata.setLike(false);
|
||||
mydata.setName(name);
|
||||
mydata.setCustomization(true);
|
||||
mydata.setAudioUrl(destinationFile.getAbsolutePath());
|
||||
ObManager.getBoxBean().put(mydata);
|
||||
} else {
|
||||
Log.e("SaveActivity", "Failed to rename file");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private String readFileFromUri(Context context, Uri uri) {
|
||||
ContentResolver contentResolver = context.getContentResolver();
|
||||
try (InputStream inputStream = contentResolver.openInputStream(uri);
|
||||
FileOutputStream outputStream = new FileOutputStream(new File(getCacheDir(), "temp_audio_file.mp3"))) {
|
||||
|
||||
if (inputStream == null) {
|
||||
Log.e("SaveActivity", "Input stream is null");
|
||||
return null;
|
||||
}
|
||||
|
||||
byte[] buffer = new byte[1024];
|
||||
int bytesRead;
|
||||
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
||||
outputStream.write(buffer, 0, bytesRead);
|
||||
}
|
||||
|
||||
return new File(getCacheDir(), "temp_audio_file.mp3").getAbsolutePath();
|
||||
} catch (IOException e) {
|
||||
Log.e("SaveActivity", "Error reading file from URI", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void initData() {
|
||||
Intent intent = getIntent();
|
||||
audioDuration = intent.getLongExtra(KEY_Time, 0);
|
||||
int importFlag = intent.getIntExtra(KEY_import, 0);
|
||||
|
||||
if (importFlag == 1) {
|
||||
path = intent.getStringExtra(KEY_Path);
|
||||
Log.e("zzj", "save path is" + path);
|
||||
} else {
|
||||
String uriPath = intent.getStringExtra(KEY_Path);
|
||||
Uri uri = Uri.parse(uriPath);
|
||||
path = readFileFromUri(this, uri);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
stopPrank();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,65 @@
|
||||
package com.prankster.fx.ui.activity;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.CountDownTimer;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
import com.prankster.fx.R;
|
||||
import com.prankster.fx.databinding.ActivitySplashBinding;
|
||||
import com.prankster.fx.topon.AdManager;
|
||||
import com.prankster.fx.topon.CountAction;
|
||||
import com.prankster.fx.topon.GoMainAction;
|
||||
|
||||
public class FXSplashActivity extends AppCompatActivity {
|
||||
|
||||
private long time = 11000;
|
||||
private ActivitySplashBinding binding;
|
||||
private CountDownTimer countDownTimer;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
binding = ActivitySplashBinding.inflate(getLayoutInflater());
|
||||
setContentView(binding.getRoot());
|
||||
|
||||
ImmersionBar.with(this)
|
||||
.statusBarColor(R.color.white)
|
||||
.statusBarDarkFont(true)
|
||||
.statusBarView(binding.view)
|
||||
.init();
|
||||
|
||||
|
||||
countDownTimer = AdManager.showWelcomeAd(FXSplashActivity.this, time, new CountAction() {
|
||||
@Override
|
||||
public void onCount(long millisUntilFinished) {
|
||||
int progressPercentage = (int) ((100 * millisUntilFinished) / time);
|
||||
int Percentage = 100 - progressPercentage;
|
||||
binding.loadingPb.setProgress(Percentage);
|
||||
}
|
||||
}, new GoMainAction() {
|
||||
@Override
|
||||
public void onGo() {
|
||||
welcomeMain();
|
||||
}
|
||||
});
|
||||
|
||||
countDownTimer.start();
|
||||
}
|
||||
|
||||
private void welcomeMain() {
|
||||
Intent intent = new Intent(this, FXMainAct.class);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (countDownTimer != null) {
|
||||
countDownTimer.cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,71 @@
|
||||
package com.prankster.fx.ui.adapter;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.prankster.fx.databinding.ItemAllBinding;
|
||||
import com.prankster.fx.db.Bean;
|
||||
import com.prankster.fx.ui.activity.FXPlayAct;
|
||||
import com.prankster.fx.utils.ConstValues;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class AllAdapter extends RecyclerView.Adapter<AllAdapter.ViewHolder> {
|
||||
|
||||
private final List<Bean> mValues;
|
||||
|
||||
private Context mCon;
|
||||
|
||||
public AllAdapter(Context context, List<Bean> items) {
|
||||
mValues = items;
|
||||
this.mCon = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
|
||||
return new ViewHolder(ItemAllBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||
Bean bean = mValues.get(position);
|
||||
String covert = bean.getCovert();
|
||||
Glide.with(mCon).load(covert).into(holder.vb.image);
|
||||
holder.vb.name.setText(bean.getName());
|
||||
holder.vb.getRoot().setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Intent intent = new Intent(mCon, FXPlayAct.class);
|
||||
intent.putExtra(ConstValues.KEY_PLAY_DATA, bean);
|
||||
mCon.startActivity(intent);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mValues.size();
|
||||
}
|
||||
|
||||
public class ViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
private ItemAllBinding vb;
|
||||
|
||||
public ViewHolder(ItemAllBinding binding) {
|
||||
super(binding.getRoot());
|
||||
vb = binding;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,85 @@
|
||||
package com.prankster.fx.ui.adapter;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.prankster.fx.databinding.ItemHomeBinding;
|
||||
import com.prankster.fx.db.Category;
|
||||
import com.prankster.fx.topon.AdManager;
|
||||
import com.prankster.fx.topon.onActionListener;
|
||||
import com.prankster.fx.ui.activity.FXAllActivity;
|
||||
import com.prankster.fx.utils.ConstValues;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.ViewHolder> {
|
||||
|
||||
private final List<Category> mValues;
|
||||
|
||||
|
||||
private WeakReference<Activity> mCon;
|
||||
|
||||
public HomeAdapter(Activity context, List<Category> items) {
|
||||
mValues = items;
|
||||
this.mCon = new WeakReference<>(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
|
||||
return new ViewHolder(ItemHomeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||
Category category = mValues.get(position);
|
||||
String covert = category.getCovert();
|
||||
Glide.with(mCon.get()).load(covert).into(holder.vb.image);
|
||||
holder.vb.name.setText(category.getName());
|
||||
holder.vb.relative.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Activity activity = mCon.get();
|
||||
if(activity!= null){
|
||||
AdManager.showTopOn(activity, new onActionListener() {
|
||||
@Override
|
||||
public void onAction() {
|
||||
Intent intent = new Intent(activity, FXAllActivity.class);
|
||||
intent.putExtra(ConstValues.KEY_LIST_DATA, category);
|
||||
activity.startActivity(intent);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mValues.size();
|
||||
}
|
||||
|
||||
public class ViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
private ItemHomeBinding vb;
|
||||
|
||||
public ViewHolder(ItemHomeBinding binding) {
|
||||
super(binding.getRoot());
|
||||
vb = binding;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
package com.prankster.fx.ui.adapter;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.prankster.fx.R;
|
||||
import com.prankster.fx.databinding.ItemLikeBinding;
|
||||
import com.prankster.fx.db.Bean;
|
||||
import com.prankster.fx.ui.activity.FXPlayAct;
|
||||
import com.prankster.fx.utils.ConstValues;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class likeAdapter extends RecyclerView.Adapter<likeAdapter.ViewHolder> {
|
||||
|
||||
private List<Bean> mValues;
|
||||
private Context mCOn;
|
||||
|
||||
public likeAdapter(Context context, List<Bean> items) {
|
||||
mValues = items;
|
||||
mCOn = context;
|
||||
}
|
||||
|
||||
public void updateData(List<Bean> items){
|
||||
mValues = items;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
|
||||
return new ViewHolder(ItemLikeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||
Bean bean = mValues.get(position);
|
||||
holder.vb.ttvName.setText(bean.getName());
|
||||
|
||||
if(bean.isCustomization()){
|
||||
Glide.with(mCOn).load(R.drawable.import_audio).into(holder.vb.image);
|
||||
}else {
|
||||
Glide.with(mCOn).load(bean.getCovert()).into(holder.vb.image);
|
||||
}
|
||||
|
||||
|
||||
holder.vb.frameIm.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Intent intent = new Intent(mCOn, FXPlayAct.class);
|
||||
intent.putExtra(ConstValues.KEY_PLAY_DATA, bean);
|
||||
mCOn.startActivity(intent);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mValues.size();
|
||||
}
|
||||
|
||||
public class ViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
public ItemLikeBinding vb;
|
||||
|
||||
public ViewHolder(ItemLikeBinding binding) {
|
||||
super(binding.getRoot());
|
||||
vb = binding;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
48
app/src/main/java/com/prankster/fx/ui/fragment/FXHomeFg.java
Normal file
48
app/src/main/java/com/prankster/fx/ui/fragment/FXHomeFg.java
Normal file
@ -0,0 +1,48 @@
|
||||
package com.prankster.fx.ui.fragment;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
|
||||
import com.prankster.fx.FXApp;
|
||||
import com.prankster.fx.ui.adapter.HomeAdapter;
|
||||
import com.prankster.fx.databinding.FgHomeBinding;
|
||||
|
||||
|
||||
public class FXHomeFg extends Fragment {
|
||||
|
||||
|
||||
private FgHomeBinding binding;
|
||||
|
||||
public FXHomeFg() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public static FXHomeFg newInstance() {
|
||||
FXHomeFg fragment = new FXHomeFg();
|
||||
Bundle args = new Bundle();
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
binding = FgHomeBinding.inflate(inflater);
|
||||
binding.recyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2));
|
||||
binding.recyclerView.setAdapter(new HomeAdapter(requireActivity(), FXApp.bean));
|
||||
|
||||
return binding.getRoot();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
77
app/src/main/java/com/prankster/fx/ui/fragment/FXLikeFg.java
Normal file
77
app/src/main/java/com/prankster/fx/ui/fragment/FXLikeFg.java
Normal file
@ -0,0 +1,77 @@
|
||||
package com.prankster.fx.ui.fragment;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.prankster.fx.ui.adapter.likeAdapter;
|
||||
import com.prankster.fx.databinding.FgLikeBinding;
|
||||
import com.prankster.fx.db.Bean;
|
||||
import com.prankster.fx.db.ObManager;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class FXLikeFg extends Fragment {
|
||||
|
||||
private likeAdapter adapter;
|
||||
|
||||
public FXLikeFg() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public static FXLikeFg newInstance() {
|
||||
FXLikeFg fragment = new FXLikeFg();
|
||||
Bundle args = new Bundle();
|
||||
// args.putInt(ARG_COLUMN_COUNT, columnCount);
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
private FgLikeBinding collectBinding;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
collectBinding = FgLikeBinding.inflate(getLayoutInflater());
|
||||
RecyclerView recyclerView = collectBinding.list;
|
||||
recyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2));
|
||||
List<Bean> all = ObManager.getAllLike();
|
||||
if(all.size()==0){
|
||||
collectBinding.layoutEmpty.setVisibility(View.VISIBLE);
|
||||
collectBinding.list.setVisibility(View.GONE);
|
||||
}else {
|
||||
collectBinding.layoutEmpty.setVisibility(View.GONE);
|
||||
collectBinding.list.setVisibility(View.VISIBLE);
|
||||
}
|
||||
adapter = new likeAdapter(requireContext(), all);
|
||||
recyclerView.setAdapter(adapter);
|
||||
|
||||
return collectBinding.getRoot();
|
||||
}
|
||||
|
||||
public void refresh() {
|
||||
if (adapter != null) {
|
||||
List<Bean> all = ObManager.getAllLike();
|
||||
if(all.size()==0){
|
||||
collectBinding.layoutEmpty.setVisibility(View.VISIBLE);
|
||||
collectBinding.list.setVisibility(View.GONE);
|
||||
}else {
|
||||
collectBinding.layoutEmpty.setVisibility(View.GONE);
|
||||
collectBinding.list.setVisibility(View.VISIBLE);
|
||||
}
|
||||
adapter.updateData(all);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
135
app/src/main/java/com/prankster/fx/ui/fragment/FXRecordFg.java
Normal file
135
app/src/main/java/com/prankster/fx/ui/fragment/FXRecordFg.java
Normal file
@ -0,0 +1,135 @@
|
||||
package com.prankster.fx.ui.fragment;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.prankster.fx.databinding.FgRecordBinding;
|
||||
import com.prankster.fx.ui.adapter.likeAdapter;
|
||||
import com.prankster.fx.databinding.FgRecordBinding;
|
||||
import com.prankster.fx.db.Bean;
|
||||
import com.prankster.fx.db.ObManager;
|
||||
import com.prankster.fx.topon.AdManager;
|
||||
import com.prankster.fx.topon.onActionListener;
|
||||
import com.prankster.fx.ui.activity.FXRecordAudioAct;
|
||||
import com.prankster.fx.utils.ConstValues;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class FXRecordFg extends Fragment {
|
||||
|
||||
|
||||
private static final String ARG_PARAM1 = "param1";
|
||||
private static final String ARG_PARAM2 = "param2";
|
||||
|
||||
private String mParam1;
|
||||
private String mParam2;
|
||||
private FgRecordBinding binding;
|
||||
private likeAdapter adapter;
|
||||
private ActivityResultLauncher<String> requestRecordAudioLauncher;
|
||||
|
||||
public FXRecordFg() {
|
||||
// Required empty public constructor
|
||||
}
|
||||
|
||||
public static FXRecordFg newInstance() {
|
||||
FXRecordFg fragment = new FXRecordFg();
|
||||
Bundle args = new Bundle();
|
||||
// args.putString(ARG_PARAM1, param1);
|
||||
// args.putString(ARG_PARAM2, param2);
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
if (getArguments() != null) {
|
||||
mParam1 = getArguments().getString(ARG_PARAM1);
|
||||
mParam2 = getArguments().getString(ARG_PARAM2);
|
||||
}
|
||||
requestRecordAudioLauncher = registerForActivityResult(
|
||||
new ActivityResultContracts.RequestPermission(),
|
||||
isGranted -> {
|
||||
if (isGranted) {
|
||||
intentRecordAudio();
|
||||
} else {
|
||||
Toast.makeText(requireContext(), "Recording permission denied", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
binding = FgRecordBinding.inflate(getLayoutInflater());
|
||||
|
||||
|
||||
binding.recyclerImport.setLayoutManager(new GridLayoutManager(requireContext(), 2));
|
||||
List<Bean> all = ObManager.getAllCustomization();
|
||||
updateUi(all);
|
||||
adapter = new likeAdapter(requireContext(), all);
|
||||
binding.recyclerImport.setAdapter(adapter);
|
||||
binding.recordBtn.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
AdManager.showTopOn(requireActivity(), new onActionListener() {
|
||||
@Override
|
||||
public void onAction() {
|
||||
checkAndRequestAudioPermission();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
return binding.getRoot();
|
||||
}
|
||||
|
||||
|
||||
public void refresh() {
|
||||
if (adapter != null) {
|
||||
List<Bean> all = ObManager.getAllCustomization();
|
||||
updateUi(all);
|
||||
adapter.updateData(all);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void updateUi(List<Bean> all) {
|
||||
if (all.size() == 0) {
|
||||
binding.noImportHint.setVisibility(View.VISIBLE);
|
||||
binding.recyclerImport.setVisibility(View.GONE);
|
||||
} else {
|
||||
binding.noImportHint.setVisibility(View.GONE);
|
||||
binding.recyclerImport.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
private void checkAndRequestAudioPermission() {
|
||||
if (ContextCompat.checkSelfPermission(requireContext(), ConstValues.permission_record_audio)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
requestRecordAudioLauncher.launch(ConstValues.permission_record_audio);
|
||||
} else {
|
||||
intentRecordAudio();
|
||||
}
|
||||
}
|
||||
|
||||
private void intentRecordAudio(){
|
||||
Intent intent = new Intent(requireContext(), FXRecordAudioAct.class);
|
||||
startActivity(intent);
|
||||
}
|
||||
}
|
||||
36
app/src/main/java/com/prankster/fx/ui/view/MyTv.java
Normal file
36
app/src/main/java/com/prankster/fx/ui/view/MyTv.java
Normal file
@ -0,0 +1,36 @@
|
||||
package com.prankster.fx.ui.view;
|
||||
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.prankster.fx.R;
|
||||
import com.prankster.fx.utils.CommonUtils;
|
||||
|
||||
|
||||
public class MyTv extends androidx.appcompat.widget.AppCompatTextView {
|
||||
|
||||
|
||||
public MyTv(Context context, @Nullable AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
initAttrs(context,attrs);
|
||||
}
|
||||
|
||||
|
||||
private void initAttrs(Context context, AttributeSet attrs){
|
||||
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyTV);
|
||||
boolean aBoolean = typedArray.getBoolean(R.styleable.MyTV_apply_font,false);
|
||||
if(aBoolean){
|
||||
CommonUtils.initFont(this);
|
||||
}
|
||||
|
||||
typedArray.recycle();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
103
app/src/main/java/com/prankster/fx/ui/view/TimerDialog.java
Normal file
103
app/src/main/java/com/prankster/fx/ui/view/TimerDialog.java
Normal file
@ -0,0 +1,103 @@
|
||||
package com.prankster.fx.ui.view;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.PopupWindow;
|
||||
|
||||
import com.prankster.fx.databinding.PopupTimerBinding;
|
||||
import com.prankster.fx.utils.OnClickTimer;
|
||||
|
||||
public class TimerDialog implements View.OnClickListener {
|
||||
private PopupTimerBinding binding;
|
||||
private PopupWindow popupWindow;
|
||||
private OnClickTimer mListener;
|
||||
|
||||
public TimerDialog(Activity context,OnClickTimer listener) {
|
||||
mListener = listener;
|
||||
binding = PopupTimerBinding.inflate(context.getLayoutInflater());
|
||||
popupWindow = new PopupWindow(binding.getRoot(), ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
popupWindow.setBackgroundDrawable(new BitmapDrawable());
|
||||
popupWindow.setOutsideTouchable(true);
|
||||
popupWindow.setFocusable(true);
|
||||
binding.tvOff.setSelected(true);
|
||||
binding.tvOff.setOnClickListener(this);
|
||||
binding.tv15s.setOnClickListener(this);
|
||||
binding.tv30s.setOnClickListener(this);
|
||||
binding.tv1m.setOnClickListener(this);
|
||||
binding.tv5m.setOnClickListener(this);
|
||||
}
|
||||
|
||||
public void showTop(View view) {
|
||||
|
||||
int[] location = new int[2];
|
||||
view.getLocationOnScreen(location);
|
||||
|
||||
int x = location[0];
|
||||
int y = location[1];
|
||||
|
||||
|
||||
int popupHeight = popupWindow.getHeight();
|
||||
int height = view.getHeight();
|
||||
int width = view.getWidth();
|
||||
Log.d("-------------", "--------x=" + x + "---y=" + y + "----popupHeight=" + popupHeight);
|
||||
// popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, x-30, y - popupHeight+height);
|
||||
popupWindow.showAsDropDown(view, -50,
|
||||
0,
|
||||
Gravity.NO_GRAVITY);
|
||||
}
|
||||
|
||||
private void setSelected(MyTv tv) {
|
||||
int childCount = binding.layoutTime.getChildCount();
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
View child = binding.layoutTime.getChildAt(i);
|
||||
if (child instanceof MyTv) {
|
||||
MyTv tvTimer = (MyTv) child;
|
||||
if (tvTimer.equals(tv)) {
|
||||
tvTimer.setSelected(true);
|
||||
} else {
|
||||
tvTimer.setSelected(false);
|
||||
}
|
||||
System.out.println("TextView: " + tvTimer.getText());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public void hide() {
|
||||
popupWindow.dismiss();
|
||||
|
||||
}
|
||||
public void setOffSelected() {
|
||||
setSelected(binding.tvOff);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (v instanceof MyTv) {
|
||||
MyTv v1 = (MyTv) v;
|
||||
String string = v1.getText().toString();
|
||||
switch (string){
|
||||
case "off":
|
||||
mListener.onClickTimerListener(-1);
|
||||
break;
|
||||
case "15 sec":
|
||||
mListener.onClickTimerListener(15*1000L);
|
||||
break;
|
||||
case "30 sec":
|
||||
mListener.onClickTimerListener(30*1000L);
|
||||
break;
|
||||
case "1 min":
|
||||
mListener.onClickTimerListener(60*1000L);
|
||||
break;
|
||||
case "5 min":
|
||||
mListener.onClickTimerListener(5*60*1000L);
|
||||
break;
|
||||
}
|
||||
setSelected(v1);
|
||||
}
|
||||
}
|
||||
}
|
||||
58
app/src/main/java/com/prankster/fx/utils/AudioRecorder.java
Normal file
58
app/src/main/java/com/prankster/fx/utils/AudioRecorder.java
Normal file
@ -0,0 +1,58 @@
|
||||
package com.prankster.fx.utils;
|
||||
|
||||
import android.content.Context;
|
||||
import android.media.MediaRecorder;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
public class AudioRecorder {
|
||||
private MediaRecorder mediaRecorder;
|
||||
private String tempFileName;
|
||||
private String fileName;
|
||||
private boolean isRecording = false;
|
||||
|
||||
public AudioRecorder(Context context) {
|
||||
|
||||
File dir = context.getCacheDir();
|
||||
File file = new File(dir, "temp_audio.mp3");
|
||||
tempFileName = file.getAbsolutePath();
|
||||
}
|
||||
|
||||
|
||||
public void startRecording() {
|
||||
if (isRecording) return;
|
||||
|
||||
mediaRecorder = new MediaRecorder();
|
||||
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
|
||||
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
|
||||
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
|
||||
mediaRecorder.setOutputFile(tempFileName);
|
||||
|
||||
try {
|
||||
mediaRecorder.prepare();
|
||||
mediaRecorder.start();
|
||||
isRecording = true;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void stopRecording() {
|
||||
if (!isRecording) return;
|
||||
|
||||
try {
|
||||
mediaRecorder.stop();
|
||||
} catch (IllegalStateException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
mediaRecorder.release();
|
||||
mediaRecorder = null;
|
||||
isRecording = false;
|
||||
}
|
||||
}
|
||||
|
||||
public String getTempFileName() {
|
||||
return tempFileName;
|
||||
}
|
||||
}
|
||||
162
app/src/main/java/com/prankster/fx/utils/CommonUtils.java
Normal file
162
app/src/main/java/com/prankster/fx/utils/CommonUtils.java
Normal file
@ -0,0 +1,162 @@
|
||||
package com.prankster.fx.utils;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaMetadataRetriever;
|
||||
import android.net.Uri;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import com.prankster.fx.FXApp;
|
||||
import com.prankster.fx.db.Bean;
|
||||
import com.prankster.fx.db.Category;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.StringWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class CommonUtils {
|
||||
|
||||
public static void initStatusBar(Window window) {
|
||||
View decorView = window.getDecorView();
|
||||
int flags = decorView.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
|
||||
decorView.setSystemUiVisibility(flags ^ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
|
||||
}
|
||||
public static void initFont(TextView tv) {
|
||||
tv.setTypeface(FXApp.defaultFont);
|
||||
}
|
||||
public static void setStatusBarTextColor(Activity activity, boolean dark) {
|
||||
Window window = activity.getWindow();
|
||||
View decor = window.getDecorView();
|
||||
if (dark) {
|
||||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
||||
} else {
|
||||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
||||
}
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
|
||||
}
|
||||
|
||||
public static String getString(InputStream input) {
|
||||
try {
|
||||
char[] charArray = new char[input.available()];
|
||||
int count = 0;
|
||||
StringWriter stringWriter = new StringWriter();
|
||||
InputStreamReader inputStreamReader = new InputStreamReader(input);
|
||||
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
|
||||
while ((count = bufferedReader.read(charArray)) != -1) {
|
||||
stringWriter.write(charArray, 0, count);
|
||||
}
|
||||
return stringWriter.toString();
|
||||
} catch (IOException exception) {
|
||||
return "";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void setVolume(Context context, SeekBar seekBar) {
|
||||
AudioManager audioManager = (AudioManager)context.getSystemService(AppCompatActivity.AUDIO_SERVICE);
|
||||
int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
|
||||
seekBar.setMax(maxVolume);
|
||||
seekBar.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
|
||||
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
||||
@Override
|
||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
||||
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
|
||||
// Log.d("----------","--------maxVolume="+maxVolume+"-------progress="+progress);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStartTrackingTouch(SeekBar seekBar) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
public static List<Category> getBean(String str) {
|
||||
|
||||
try {
|
||||
List<Category> data = new ArrayList<Category>();
|
||||
JSONArray jsonArray = new JSONArray(str);
|
||||
|
||||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
JSONObject it = jsonArray.getJSONObject(i);
|
||||
JSONArray listArray = it.getJSONArray("list");
|
||||
List<Bean> list = new ArrayList<>();
|
||||
for (int k = 0; k < listArray.length(); k++) {
|
||||
JSONObject listBean = listArray.getJSONObject(k);
|
||||
Bean bean = new Bean();
|
||||
bean.setAudioUrl(listBean.getString("mp3Url"));
|
||||
bean.setCovert(listBean.getString("preUrl"));
|
||||
bean.setName(listBean.getString("title"));
|
||||
list.add(bean);
|
||||
}
|
||||
|
||||
Category newBean = new Category();
|
||||
newBean.setCovert(it.getString("categoryUrl"));
|
||||
newBean.setBeanList(list);
|
||||
newBean.setName(it.getString("categoryName"));
|
||||
data.add(newBean);
|
||||
|
||||
}
|
||||
|
||||
return data;
|
||||
} catch (JSONException jo) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static long getAudioDuration(Context context, Uri uri) {
|
||||
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
|
||||
long duration = 0;
|
||||
|
||||
try {
|
||||
ContentResolver contentResolver = context.getContentResolver();
|
||||
retriever.setDataSource(context, uri);
|
||||
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
|
||||
duration = Long.parseLong(time);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try {
|
||||
retriever.release();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
return duration;
|
||||
}
|
||||
|
||||
public static String formatTime(int milliseconds) {
|
||||
|
||||
int seconds = (milliseconds / 1000) % 60;
|
||||
int minutes = (milliseconds / (1000 * 60)) % 60;
|
||||
int hours = milliseconds / (1000 * 60 * 60);
|
||||
|
||||
|
||||
return String.format("%02d:%02d:%02d", minutes, seconds, milliseconds);
|
||||
}
|
||||
}
|
||||
19
app/src/main/java/com/prankster/fx/utils/ConstValues.java
Normal file
19
app/src/main/java/com/prankster/fx/utils/ConstValues.java
Normal file
@ -0,0 +1,19 @@
|
||||
package com.prankster.fx.utils;
|
||||
|
||||
import android.Manifest;
|
||||
|
||||
|
||||
public class ConstValues {
|
||||
|
||||
public static final String KEY_LIST_DATA = "list_page_data";
|
||||
public static final String KEY_PLAY_DATA = "play_page_data";
|
||||
|
||||
|
||||
public static final int REQUEST_READ_STORAGE_PERMISSION = 5;
|
||||
public static final int REQUEST_PICK_AUDIO = -3;
|
||||
|
||||
public static String[] permission_read_audio = {Manifest.permission.READ_MEDIA_AUDIO};
|
||||
|
||||
public static String permission_record_audio = Manifest.permission.RECORD_AUDIO;
|
||||
public static String[] permission_store = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
|
||||
}
|
||||
76
app/src/main/java/com/prankster/fx/utils/MyDecoration.java
Normal file
76
app/src/main/java/com/prankster/fx/utils/MyDecoration.java
Normal file
@ -0,0 +1,76 @@
|
||||
package com.prankster.fx.utils;
|
||||
|
||||
import android.graphics.Rect;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
|
||||
|
||||
import com.prankster.fx.FXApp;
|
||||
|
||||
|
||||
public class MyDecoration extends RecyclerView.ItemDecoration {
|
||||
|
||||
private int v, h, ex;
|
||||
|
||||
public MyDecoration(int v, int h, int ex) {
|
||||
this.v = Math.round(dpToPx(v));
|
||||
this.h = Math.round(dpToPx(h));
|
||||
this.ex = Math.round(dpToPx(ex));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
|
||||
super.getItemOffsets(outRect, view, parent, state);
|
||||
int spanCount = 1;
|
||||
int spanSize = 1;
|
||||
int spanIndex = 0;
|
||||
|
||||
int childAdapterPosition = parent.getChildAdapterPosition(view);
|
||||
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
|
||||
if (layoutManager instanceof StaggeredGridLayoutManager) {
|
||||
StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
|
||||
StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
|
||||
spanCount = staggeredGridLayoutManager.getSpanCount();
|
||||
if (layoutParams.isFullSpan()) {
|
||||
spanSize = spanCount;
|
||||
}
|
||||
spanIndex = layoutParams.getSpanIndex();
|
||||
} else if (layoutManager instanceof GridLayoutManager) {
|
||||
GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
|
||||
GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams();
|
||||
spanCount = gridLayoutManager.getSpanCount();
|
||||
spanSize = gridLayoutManager.getSpanSizeLookup().getSpanSize(childAdapterPosition);
|
||||
spanIndex = layoutParams.getSpanIndex();
|
||||
} else if (layoutManager instanceof LinearLayoutManager) {
|
||||
outRect.left = v;
|
||||
outRect.right = v;
|
||||
outRect.bottom = h;
|
||||
}
|
||||
|
||||
if (spanSize == spanCount) {
|
||||
outRect.left = v + ex;
|
||||
outRect.right = v + ex;
|
||||
outRect.bottom = h;
|
||||
|
||||
} else {
|
||||
int itemAllSpacing = (v * (spanCount + 1) + ex * 2) / spanCount;
|
||||
int left = v * (spanIndex + 1) - itemAllSpacing * spanIndex + ex;
|
||||
int right = itemAllSpacing - left;
|
||||
outRect.left = left;
|
||||
outRect.right = right;
|
||||
outRect.bottom = h;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static float dpToPx(float dpValue) {
|
||||
float density = FXApp.app.getResources().getDisplayMetrics().density;
|
||||
return density * dpValue + 0.5f;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
package com.prankster.fx.utils;
|
||||
|
||||
public interface OnClickTimer {
|
||||
|
||||
void onClickTimerListener(long time);
|
||||
}
|
||||
5
app/src/main/res/color/color_timer.xml
Normal file
5
app/src/main/res/color/color_timer.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:color="@color/text_color1" android:state_selected="false"/>
|
||||
<item android:color="@color/main_color1" android:state_selected="true"/>
|
||||
</selector>
|
||||
30
app/src/main/res/drawable-v24/ic_launcher_foreground.xml
Normal file
30
app/src/main/res/drawable-v24/ic_launcher_foreground.xml
Normal file
@ -0,0 +1,30 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="85.84757"
|
||||
android:endY="92.4963"
|
||||
android:startX="42.9492"
|
||||
android:startY="49.59793"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#44000000"
|
||||
android:offset="0.0" />
|
||||
<item
|
||||
android:color="#00000000"
|
||||
android:offset="1.0" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeColor="#00000000" />
|
||||
</vector>
|
||||
9
app/src/main/res/drawable/back.xml
Normal file
9
app/src/main/res/drawable/back.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="64dp"
|
||||
android:height="64dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:pathData="M395.2,513.6l323.1,-312.4c19.1,-18.4 19.1,-48.3 0,-66.7 -19.1,-18.4 -49.9,-18.4 -69,0L291.8,480.3c-19.1,18.4 -19.1,48.3 0,66.7l357.6,345.7c9.5,9.2 22,13.8 34.5,13.8 12.5,0 25,-4.6 34.5,-13.8 19.1,-18.4 19.1,-48.2 0,-66.7L395.2,513.6z"
|
||||
android:fillColor="@color/black"/>
|
||||
</vector>
|
||||
9
app/src/main/res/drawable/bg_home_play.xml
Normal file
9
app/src/main/res/drawable/bg_home_play.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<corners android:radius="45dp" />
|
||||
<stroke
|
||||
android:width="3dp"
|
||||
android:color="@color/main_color1" />
|
||||
|
||||
</shape>
|
||||
7
app/src/main/res/drawable/bg_icon_stoke.xml
Normal file
7
app/src/main/res/drawable/bg_icon_stoke.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<stroke android:color="@color/indicator_color" android:width="1dp" />
|
||||
|
||||
|
||||
</shape>
|
||||
7
app/src/main/res/drawable/bg_icon_stoke_bg_press.xml
Normal file
7
app/src/main/res/drawable/bg_icon_stoke_bg_press.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<solid android:color="@color/indicator_color_2" android:width="1dp" />
|
||||
|
||||
|
||||
</shape>
|
||||
11
app/src/main/res/drawable/bg_main_sound.xml
Normal file
11
app/src/main/res/drawable/bg_main_sound.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape>
|
||||
<corners android:radius="16dp" />
|
||||
<stroke
|
||||
android:color="@color/main_color2"
|
||||
android:width="3dp" />
|
||||
</shape>
|
||||
</item>
|
||||
</layer-list>
|
||||
7
app/src/main/res/drawable/bg_play_stoke.xml
Normal file
7
app/src/main/res/drawable/bg_play_stoke.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<stroke android:color="@color/main_bg_color" android:width="0.5dp" />
|
||||
<corners android:radius="12dp" />
|
||||
|
||||
</shape>
|
||||
7
app/src/main/res/drawable/bg_record_btn.xml
Normal file
7
app/src/main/res/drawable/bg_record_btn.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<corners android:radius="8dp"/>
|
||||
<solid android:color="@color/main_color1" />
|
||||
|
||||
</shape>
|
||||
7
app/src/main/res/drawable/bg_save_edit.xml
Normal file
7
app/src/main/res/drawable/bg_save_edit.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<corners android:radius="10dp"/>
|
||||
<stroke android:color="@color/main_color1" android:width="2dp"/>
|
||||
|
||||
</shape>
|
||||
14
app/src/main/res/drawable/card_stoke.xml
Normal file
14
app/src/main/res/drawable/card_stoke.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<!-- 背景颜色 -->
|
||||
<solid android:color="@color/transparent" /> <!-- 卡片背景颜色 -->
|
||||
|
||||
<!-- 圆角 -->
|
||||
<!-- <corners android:radius="12dp" /> <!– 设置圆角大小 –>-->
|
||||
|
||||
<!-- 边框 -->
|
||||
<stroke
|
||||
android:width="3dp"
|
||||
android:color="@color/main_color1" />
|
||||
</shape>
|
||||
57
app/src/main/res/drawable/empty_like.xml
Normal file
57
app/src/main/res/drawable/empty_like.xml
Normal file
@ -0,0 +1,57 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="256dp"
|
||||
android:height="256dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:pathData="M64,826.6c0,70.6 203.2,128 454.2,128s454.1,-57.2 454.1,-128 -203.1,-128 -454.1,-128S64,756.1 64,826.6zM64,826.6"
|
||||
android:fillColor="#DEDEDE"/>
|
||||
<path
|
||||
android:pathData="M795.6,740.3L600,912l-7,-332.3 208,-123.4zM795.6,740.3"
|
||||
android:fillColor="#EEEEEE"/>
|
||||
<path
|
||||
android:pathData="M593.8,908.6L228.8,802L228.8,678.6l307.7,90.6c20.2,-142 37,-197.4 49.4,-167.5s15,132.3 8,306.9zM588.5,574.4l-97.9,-21.3 -6.3,-69.5L484.2,365.4l306.9,85.6h10.5zM588.5,574.4"
|
||||
android:fillColor="#DEDEDE"/>
|
||||
<path
|
||||
android:pathData="M490.6,557.6l-254.9,-70.6 254.9,-123.4zM490.6,557.6"
|
||||
android:fillColor="#EEEEEE"/>
|
||||
<path
|
||||
android:pathData="M878.6,618.5l-74.8,-152.5v132.3zM878.6,618.5"
|
||||
android:fillColor="#DEDEDE"/>
|
||||
<path
|
||||
android:pathData="M489.8,562.1a4.3,4.3 0,0 1,-4.5 -4.5L485.3,372.6a4.5,4.5 0,1 1,9 0L494.2,557.6a4.4,4.4 0,0 1,-4.5 4.5zM489.8,562.1"
|
||||
android:fillColor="#AAAAAA"/>
|
||||
<path
|
||||
android:pathData="M588.5,584.9h-0.8L229.6,493.3c-1.8,-0.8 -3.4,-1.8 -3.4,-3.4a4.7,4.7 0,0 1,2.6 -4.4l260.2,-124.5a1.8,1.8 0,0 1,2.6 0l311.4,86.4a4.3,4.3 0,0 1,1.6 8L591.1,584c-0.8,0 -1.8,1 -2.6,1zM243.8,487.3l344,88 202.5,-122.4 -299.8,-83.8zM243.8,487.3"
|
||||
android:fillColor="#AAAAAA"/>
|
||||
<path
|
||||
android:pathData="M600,918.3h-1.8a3.5,3.5 0,0 1,-2.6 -3.4L584,580.7c0,-1.8 0.8,-3.4 1.8,-3.4l213.4,-128.6a4.5,4.5 0,0 1,4.5 0,4.4 4.4,0 0,1 2.6,3.4v290.1a5.3,5.3 0,0 1,-1.8 3.4l-201.9,172.8zM593,582.3L603.4,904l193.2,-164.8v-280zM593,582.3"
|
||||
android:fillColor="#AAAAAA"/>
|
||||
<path
|
||||
android:pathData="M600,918.3h-0.8l-369.3,-107.7a5.4,5.4 0,0 1,-3.4 -4.5L226.5,677.6a4.3,4.3 0,0 1,4.5 -4.5,4.2 4.2,0 0,1 4.4,4.5v126l360.7,105.8v-0.8a4.5,4.5 0,1 1,9 0v6.3a3.8,3.8 0,0 1,-1.8 3.4zM600,918.3"
|
||||
android:fillColor="#AAAAAA"/>
|
||||
<path
|
||||
android:pathData="M530.2,768.4L161.6,655.5l68.8,-166.7 358.1,91.6zM530.2,768.4"
|
||||
android:fillColor="#FFFFFF"/>
|
||||
<path
|
||||
android:pathData="M530.2,772.9h-0.8L160,660c-0.8,0 -1.8,-0.8 -2.6,-2.6a2.8,2.8 0,0 1,0 -3.4l68.8,-166.6a4.1,4.1 0,0 1,5.2 -2.6L589.5,576a4.2,4.2 0,0 1,2.6 1.8,2.8 2.8,0 0,1 0,3.4l-58.3,189c0,1.6 -1.8,2.6 -3.6,2.6zM166.9,652.9L528,763.1l56,-179.8 -351,-89zM876.7,627.4h-0.8l-74.8,-21.3a5.4,5.4 0,0 1,-3.4 -4.5L797.7,451c0,-1.8 1.8,-3.4 3.4,-4.5a4.6,4.6 0,0 1,5.3 2.6l74.8,155.9v17.6a3.6,3.6 0,0 1,-1.8 3.4,2.6 2.6,0 0,1 -2.6,1.4zM806.1,598.3l65.9,19.4L872,608.8l-66.2,-137.6z"
|
||||
android:fillColor="#AAAAAA"/>
|
||||
<path
|
||||
android:pathData="M880,86.6c-6.3,-8.9 -49.4,0.8 -68.7,30 -5.3,8.9 -11.6,36.2 -7.1,29.9 11.5,-16.8 32.6,-7.1 48.6,-20.2 13.1,-11.3 32.6,-32.6 27.3,-40zM880,86.6"
|
||||
android:fillColor="#F0F1F4"/>
|
||||
<path
|
||||
android:pathData="M804.3,149.4h-1.8c-4.5,-2.6 4.5,-28.1 7.1,-33.6a85.4,85.4 0,0 1,59.8 -34.4,12.9 12.9,0 0,1 11.5,4.5c8,11.5 -26.5,42.2 -27.3,42.2a42.2,42.2 0,0 1,-25.5 9c-8.9,1.8 -17.5,2.6 -22.8,10.5a1.2,1.2 0,0 1,-1 1.8zM870.5,84.9a76.6,76.6 0,0 0,-56.5 32,104 104,0 0,0 -8,24 35,35 0,0 1,22.8 -8.9,44.3 44.3,0 0,0 22.9,-8c15,-13.1 29.9,-32 26.5,-36.2 -0.8,-1.5 -3.7,-2.6 -8,-2.6zM870.5,84.9"
|
||||
android:fillColor="#AAAAAA"/>
|
||||
<path
|
||||
android:pathData="M826.4,127.4l-3.4,-2.6c16,-20.2 34.4,-36.2 73.2,-46.7 3.4,-0.8 5.3,-1.8 6.3,-1.8s1.8,-0.8 7.1,-0.8l0.8,4.5a26.4,26.4 0,0 1,-6.3 0.8,65.7 65.7,0 0,0 -6.3,1.8c-38.1,9.4 -56,24 -71.4,44.9zM826.4,127.4M856,149.4c30.6,49.2 31.4,107.1 2.1,139a112.6,112.6 0,0 1,-37 24c4.3,-22.8 -1.3,-51 -11.8,-65.3a20.9,20.9 0,0 0,-14.3 -9.5,29 29,0 0,0 -24,10.6 44.9,44.9 0,0 0,-16 36.2,42.4 42.4,0 0,0 21.8,32l0.6,0.6a53.4,53.4 0,0 0,39.4 1.8c-13.8,52.3 -76.9,79 -84.3,81.7l1.8,4.4a182.5,182.5 0,0 0,59.8 -38.6,86.4 86.4,0 0,0 26.5,-48.8 101.4,101.4 0,0 0,41 -26.2c30.5,-33 30.5,-92.8 -1.3,-144.6zM817.8,314.6a50.3,50.3 0,0 1,-38 -0.6l-1,-1.7c-15.4,-9.7 -18.8,-20.8 -18.8,-28.2a43.7,43.7 0,0 1,14.5 -33,28.6 28.6,0 0,1 20.6,-9.4 18.5,18.5 0,0 1,11.9 8,88.6 88.6,0 0,1 11.4,64z"
|
||||
android:fillColor="#AAAAAA"/>
|
||||
<path
|
||||
android:pathData="M137.4,831.1c-0.8,9 -37.8,19.4 -64,7.1 -9,-3.4 -24,-20.2 -18.6,-17.6 16,6.3 27.3,-8 44.9,-6.3 14.4,2.6 38.1,9.8 38.1,16.8zM137.4,831.1"
|
||||
android:fillColor="#F0F1F4"/>
|
||||
<path
|
||||
android:pathData="M100.3,846.1a78.2,78.2 0,0 1,-28.3 -5.2c-6.3,-2.6 -22.9,-16 -20.2,-20.2 0,0 0.8,-2.6 4.5,-0.8a28.2,28.2 0,0 0,22.1 -1.8,38.8 38.8,0 0,1 22.8,-3.4c8,0.8 40,8 40,18.6 0,2.6 -1.8,5.3 -6.3,7.1a130.1,130.1 0,0 1,-34.4 5.8zM58.1,824a60.9,60.9 0,0 0,15 12.3,69.4 69.4,0 0,0 57.2,-1.8c2.6,-1.8 3.4,-2.6 3.4,-3.4 0,-4.5 -18.6,-11.5 -36.2,-14.2a52.9,52.9 0,0 0,-20.2 3.4,28.5 28.5,0 0,1 -19.1,3.7zM58.1,824"
|
||||
android:fillColor="#AAAAAA"/>
|
||||
<path
|
||||
android:pathData="M150.7,832.7a123.2,123.2 0,0 0,-43.3 -1.8,78.2 78.2,0 0,1 -32.6,-1.8l1.8,-4.5a73.5,73.5 0,0 0,31 1.8,127.1 127.1,0 0,1 44.1,1.8zM150.7,832.7"
|
||||
android:fillColor="#AAAAAA"/>
|
||||
</vector>
|
||||
12
app/src/main/res/drawable/home_item_parent.xml
Normal file
12
app/src/main/res/drawable/home_item_parent.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="@color/main_bg_color" />
|
||||
<gradient
|
||||
android:angle="135"
|
||||
android:endColor="@color/main_color2"
|
||||
android:startColor="@color/main_color1"
|
||||
android:type="linear" />
|
||||
<corners android:radius="12dp" />
|
||||
|
||||
</shape>
|
||||
7
app/src/main/res/drawable/home_recommend_bg.xml
Normal file
7
app/src/main/res/drawable/home_recommend_bg.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<corners android:radius="8dp"/>
|
||||
<solid android:color="@color/main_color2" />
|
||||
|
||||
</shape>
|
||||
7
app/src/main/res/drawable/home_recommend_round_bg.xml
Normal file
7
app/src/main/res/drawable/home_recommend_round_bg.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<corners android:radius="8dp"/>
|
||||
<solid android:color="@color/main_color2" />
|
||||
|
||||
</shape>
|
||||
170
app/src/main/res/drawable/ic_launcher_background.xml
Normal file
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>
|
||||
18
app/src/main/res/drawable/icon_import.xml
Normal file
18
app/src/main/res/drawable/icon_import.xml
Normal file
@ -0,0 +1,18 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="64dp"
|
||||
android:height="64dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:pathData="M926.4,637.7H299c-17.7,0 -32,-14.3 -32,-32s14.3,-32 32,-32h627.4c17.7,0 32,14.3 32,32s-14.3,32 -32,32z"
|
||||
android:fillColor="@color/white"/>
|
||||
<path
|
||||
android:pathData="M529.6,872.2c-8.2,0 -16.4,-3.1 -22.6,-9.4L281.2,637c-12.5,-12.5 -12.5,-32.8 0,-45.3s32.8,-12.5 45.3,0l225.8,225.8c12.5,12.5 12.5,32.8 0,45.3 -6.3,6.3 -14.5,9.4 -22.7,9.4z"
|
||||
android:fillColor="@color/white"/>
|
||||
<path
|
||||
android:pathData="M304.1,628.8c-8.2,0 -16.4,-3.1 -22.6,-9.4 -12.5,-12.5 -12.5,-32.8 0,-45.3l225.8,-225.8c12.5,-12.5 32.8,-12.5 45.3,0s12.5,32.8 0,45.3L326.7,619.4c-6.2,6.3 -14.4,9.4 -22.6,9.4z"
|
||||
android:fillColor="@color/white"/>
|
||||
<path
|
||||
android:pathData="M447.6,958.3H229.1c-89.3,0 -162,-72.7 -162,-162V228.2c0,-89.3 72.7,-162 162,-162h568.1c89.3,0 162,72.7 162,162v208.1c0,17.7 -14.3,32 -32,32s-32,-14.3 -32,-32V228.2c0,-54 -44,-98 -98,-98H229.1c-54,0 -98,44 -98,98v568.1c0,54 44,98 98,98h218.5c17.7,0 32,14.3 32,32s-14.3,32 -32,32z"
|
||||
android:fillColor="@color/white"/>
|
||||
</vector>
|
||||
9
app/src/main/res/drawable/icon_loop_no.xml
Normal file
9
app/src/main/res/drawable/icon_loop_no.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="64dp"
|
||||
android:height="64dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:fillColor="@color/main_gray"
|
||||
android:pathData="M199.7,583.7c15.4,-5.1 25.6,-20.5 20.5,-35.8 -5.1,-15.4 -5.1,-35.8 -5.1,-51.2 0,-102.4 87,-189.4 189.4,-189.4L665.6,307.2v51.2c0,15.4 10.2,20.5 25.6,15.4l117.8,-71.7c15.4,-10.2 15.4,-20.5 0,-30.7l-117.8,-76.8c-15.4,-15.4 -25.6,-10.2 -25.6,5.1v51.2L404.5,250.9c-66.6,0 -128,25.6 -174.1,71.7 -46.1,46.1 -71.7,107.5 -71.7,174.1 0,20.5 5.1,46.1 10.2,66.6 5.1,10.2 15.4,20.5 25.6,20.5h5.1zM199.7,583.7M844.8,409.6c-5.1,-10.2 -15.4,-20.5 -25.6,-20.5h-5.1c-15.4,5.1 -25.6,20.5 -20.5,35.8 5.1,15.4 5.1,35.8 5.1,51.2 0,107.5 -87,194.6 -194.6,194.6h-256v-51.2c0,-15.4 -10.2,-20.5 -25.6,-15.4L204.8,681c-15.4,10.2 -15.4,20.5 0,30.7l117.8,76.8c15.4,10.2 25.6,5.1 25.6,-15.4v-51.2h261.1c66.6,0 128,-25.6 174.1,-71.7 46.1,-46.1 71.7,-107.5 71.7,-174.1 0,-20.5 -5.1,-46.1 -10.2,-66.6zM844.8,409.6"/>
|
||||
</vector>
|
||||
9
app/src/main/res/drawable/icon_loop_selected.xml
Normal file
9
app/src/main/res/drawable/icon_loop_selected.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="64dp"
|
||||
android:height="64dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:fillColor="@color/main_color1"
|
||||
android:pathData="M199.7,583.7c15.4,-5.1 25.6,-20.5 20.5,-35.8 -5.1,-15.4 -5.1,-35.8 -5.1,-51.2 0,-102.4 87,-189.4 189.4,-189.4L665.6,307.2v51.2c0,15.4 10.2,20.5 25.6,15.4l117.8,-71.7c15.4,-10.2 15.4,-20.5 0,-30.7l-117.8,-76.8c-15.4,-15.4 -25.6,-10.2 -25.6,5.1v51.2L404.5,250.9c-66.6,0 -128,25.6 -174.1,71.7 -46.1,46.1 -71.7,107.5 -71.7,174.1 0,20.5 5.1,46.1 10.2,66.6 5.1,10.2 15.4,20.5 25.6,20.5h5.1zM199.7,583.7M844.8,409.6c-5.1,-10.2 -15.4,-20.5 -25.6,-20.5h-5.1c-15.4,5.1 -25.6,20.5 -20.5,35.8 5.1,15.4 5.1,35.8 5.1,51.2 0,107.5 -87,194.6 -194.6,194.6h-256v-51.2c0,-15.4 -10.2,-20.5 -25.6,-15.4L204.8,681c-15.4,10.2 -15.4,20.5 0,30.7l117.8,76.8c15.4,10.2 25.6,5.1 25.6,-15.4v-51.2h261.1c66.6,0 128,-25.6 174.1,-71.7 46.1,-46.1 71.7,-107.5 71.7,-174.1 0,-20.5 -5.1,-46.1 -10.2,-66.6zM844.8,409.6"/>
|
||||
</vector>
|
||||
21
app/src/main/res/drawable/icon_record.xml
Normal file
21
app/src/main/res/drawable/icon_record.xml
Normal file
@ -0,0 +1,21 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="25dp"
|
||||
android:height="25dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:pathData="M513.1,504.6m-450.8,0a450.8,450.8 0,1 0,901.6 0,450.8 450.8,0 1,0 -901.6,0Z"
|
||||
android:fillColor="@color/main_color1"/>
|
||||
<path
|
||||
android:pathData="M513.1,182c-178.2,0 -322.7,144.4 -322.7,322.7 0,178.2 144.4,322.7 322.7,322.7 178.2,0 322.7,-144.4 322.7,-322.7 0,-178.2 -144.4,-322.7 -322.7,-322.7zM419.1,397.9c0,-51.9 42,-94 94,-94 51.9,0 94,42 94,94v96.3c0,51.9 -42,94 -94,94 -51.9,0 -94,-42 -94,-94v-96.3zM684.5,492.5c0,86.5 -63.3,158.4 -145.7,171.2v46.7c0,14.1 -11.5,25.6 -25.6,25.6s-25.6,-11.5 -25.6,-25.6v-46.5C404.5,651.7 340.4,579.5 340.4,492.5v-12.8c0,-14.1 11.5,-25.6 25.6,-25.6s25.6,11.5 25.6,25.6v12.8c0,67.3 54.2,122 120.8,122 66.7,0 120.8,-54.7 120.8,-122v-12.8c0,-14.1 11.5,-25.6 25.6,-25.6s25.6,11.5 25.6,25.6v12.8z"
|
||||
android:fillColor="@color/white"/>
|
||||
<path
|
||||
android:pathData="M799.6,356.4c-53.7,-103.6 -161.8,-174.4 -286.6,-174.4 -178.2,0 -322.7,144.4 -322.7,322.7 0,117.1 62.4,219.6 155.8,276.2 1.1,0 2.3,0.1 3.4,0.1 240.1,0 436.4,-187.8 450,-424.4zM419.1,397.9c0,-51.9 42,-94 94,-94 51.9,0 94,42 94,94v96.3c0,51.9 -42,94 -94,94 -51.9,0 -94,-42 -94,-94v-96.3zM538.8,663.7v46.7c0,14.1 -11.5,25.6 -25.6,25.6s-25.6,-11.5 -25.6,-25.6v-46.5C404.5,651.7 340.4,579.5 340.4,492.5v-12.8c0,-14.1 11.5,-25.6 25.6,-25.6s25.6,11.5 25.6,25.6v12.8c0,67.3 54.2,122 120.8,122 66.7,0 120.8,-54.7 120.8,-122v-12.8c0,-14.1 11.5,-25.6 25.6,-25.6s25.6,11.5 25.6,25.6v12.8c0.1,86.5 -63.2,158.4 -145.6,171.2z"
|
||||
android:fillColor="@color/white"/>
|
||||
<path
|
||||
android:pathData="M190.4,504.6c0,40.9 7.7,79.9 21.5,115.9 4.8,0.2 9.5,0.3 14.3,0.3 51.9,0 101.8,-8.8 148.2,-24.9a172.9,172.9 0,0 1,-34.1 -103.3v-12.8c0,-14.1 11.5,-25.6 25.6,-25.6s25.6,11.5 25.6,25.6v12.8c0,31.9 12.2,61 32.2,82.8 8.4,-4.1 16.6,-8.4 24.7,-13.1 -18.1,-17.1 -29.4,-41.3 -29.4,-68.1v-96.3c0,-51.9 42,-94 94,-94 51.9,0 94,42 94,94v13.6a448.5,448.5 0,0 0,66.8 -186.6,321 321,0 0,0 -160.7,-42.9c-178.1,0 -322.6,144.5 -322.6,322.7z"
|
||||
android:fillColor="@color/white"/>
|
||||
<path
|
||||
android:pathData="M194.5,453.8c152.2,-27.8 277.7,-132 335.3,-271.5 -5.5,-0.3 -11.1,-0.4 -16.6,-0.4 -160.9,0 -294.2,117.8 -318.6,271.9z"
|
||||
android:fillColor="@color/white"/>
|
||||
</vector>
|
||||
21
app/src/main/res/drawable/icon_record_iing.xml
Normal file
21
app/src/main/res/drawable/icon_record_iing.xml
Normal file
@ -0,0 +1,21 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="25dp"
|
||||
android:height="25dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:pathData="M513.1,504.6m-450.8,0a450.8,450.8 0,1 0,901.6 0,450.8 450.8,0 1,0 -901.6,0Z"
|
||||
android:fillColor="@color/main_bg_color"/>
|
||||
<path
|
||||
android:pathData="M513.1,182c-178.2,0 -322.7,144.4 -322.7,322.7 0,178.2 144.4,322.7 322.7,322.7 178.2,0 322.7,-144.4 322.7,-322.7 0,-178.2 -144.4,-322.7 -322.7,-322.7zM419.1,397.9c0,-51.9 42,-94 94,-94 51.9,0 94,42 94,94v96.3c0,51.9 -42,94 -94,94 -51.9,0 -94,-42 -94,-94v-96.3zM684.5,492.5c0,86.5 -63.3,158.4 -145.7,171.2v46.7c0,14.1 -11.5,25.6 -25.6,25.6s-25.6,-11.5 -25.6,-25.6v-46.5C404.5,651.7 340.4,579.5 340.4,492.5v-12.8c0,-14.1 11.5,-25.6 25.6,-25.6s25.6,11.5 25.6,25.6v12.8c0,67.3 54.2,122 120.8,122 66.7,0 120.8,-54.7 120.8,-122v-12.8c0,-14.1 11.5,-25.6 25.6,-25.6s25.6,11.5 25.6,25.6v12.8z"
|
||||
android:fillColor="@color/white"/>
|
||||
<path
|
||||
android:pathData="M799.6,356.4c-53.7,-103.6 -161.8,-174.4 -286.6,-174.4 -178.2,0 -322.7,144.4 -322.7,322.7 0,117.1 62.4,219.6 155.8,276.2 1.1,0 2.3,0.1 3.4,0.1 240.1,0 436.4,-187.8 450,-424.4zM419.1,397.9c0,-51.9 42,-94 94,-94 51.9,0 94,42 94,94v96.3c0,51.9 -42,94 -94,94 -51.9,0 -94,-42 -94,-94v-96.3zM538.8,663.7v46.7c0,14.1 -11.5,25.6 -25.6,25.6s-25.6,-11.5 -25.6,-25.6v-46.5C404.5,651.7 340.4,579.5 340.4,492.5v-12.8c0,-14.1 11.5,-25.6 25.6,-25.6s25.6,11.5 25.6,25.6v12.8c0,67.3 54.2,122 120.8,122 66.7,0 120.8,-54.7 120.8,-122v-12.8c0,-14.1 11.5,-25.6 25.6,-25.6s25.6,11.5 25.6,25.6v12.8c0.1,86.5 -63.2,158.4 -145.6,171.2z"
|
||||
android:fillColor="@color/white"/>
|
||||
<path
|
||||
android:pathData="M190.4,504.6c0,40.9 7.7,79.9 21.5,115.9 4.8,0.2 9.5,0.3 14.3,0.3 51.9,0 101.8,-8.8 148.2,-24.9a172.9,172.9 0,0 1,-34.1 -103.3v-12.8c0,-14.1 11.5,-25.6 25.6,-25.6s25.6,11.5 25.6,25.6v12.8c0,31.9 12.2,61 32.2,82.8 8.4,-4.1 16.6,-8.4 24.7,-13.1 -18.1,-17.1 -29.4,-41.3 -29.4,-68.1v-96.3c0,-51.9 42,-94 94,-94 51.9,0 94,42 94,94v13.6a448.5,448.5 0,0 0,66.8 -186.6,321 321,0 0,0 -160.7,-42.9c-178.1,0 -322.6,144.5 -322.6,322.7z"
|
||||
android:fillColor="@color/white"/>
|
||||
<path
|
||||
android:pathData="M194.5,453.8c152.2,-27.8 277.7,-132 335.3,-271.5 -5.5,-0.3 -11.1,-0.4 -16.6,-0.4 -160.9,0 -294.2,117.8 -318.6,271.9z"
|
||||
android:fillColor="@color/white"/>
|
||||
</vector>
|
||||
12
app/src/main/res/drawable/icon_timer.xml
Normal file
12
app/src/main/res/drawable/icon_timer.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="64dp"
|
||||
android:height="64dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:fillColor="@color/main_gray"
|
||||
android:pathData="M512,64C264.6,64 64,264.6 64,512s200.6,448 448,448 448,-200.6 448,-448S759.4,64 512,64zM512,884c-205.4,0 -372,-166.6 -372,-372s166.6,-372 372,-372 372,166.6 372,372 -166.6,372 -372,372z"/>
|
||||
<path
|
||||
android:fillColor="@color/main_gray"
|
||||
android:pathData="M686.7,638.6L544.1,535.5V288c0,-4.4 -3.6,-8 -8,-8H488c-4.4,0 -8,3.6 -8,8v275.4c0,2.6 1.2,5 3.3,6.5l165.4,120.6c3.6,2.6 8.6,1.8 11.2,-1.7l28.6,-39c2.6,-3.7 1.8,-8.7 -1.8,-11.2z"/>
|
||||
</vector>
|
||||
12
app/src/main/res/drawable/icon_timer_slected.xml
Normal file
12
app/src/main/res/drawable/icon_timer_slected.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="64dp"
|
||||
android:height="64dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:fillColor="@color/main_color1"
|
||||
android:pathData="M512,64C264.6,64 64,264.6 64,512s200.6,448 448,448 448,-200.6 448,-448S759.4,64 512,64zM512,884c-205.4,0 -372,-166.6 -372,-372s166.6,-372 372,-372 372,166.6 372,372 -166.6,372 -372,372z"/>
|
||||
<path
|
||||
android:fillColor="@color/main_color1"
|
||||
android:pathData="M686.7,638.6L544.1,535.5V288c0,-4.4 -3.6,-8 -8,-8H488c-4.4,0 -8,3.6 -8,8v275.4c0,2.6 1.2,5 3.3,6.5l165.4,120.6c3.6,2.6 8.6,1.8 11.2,-1.7l28.6,-39c2.6,-3.7 1.8,-8.7 -1.8,-11.2z"/>
|
||||
</vector>
|
||||
9
app/src/main/res/drawable/icon_volum.xml
Normal file
9
app/src/main/res/drawable/icon_volum.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="21dp"
|
||||
android:height="18dp"
|
||||
android:viewportWidth="21"
|
||||
android:viewportHeight="18">
|
||||
<path
|
||||
android:pathData="M1.5,3.996H3.27C3.742,3.997 4.199,3.83 4.56,3.526L8.25,0.396C8.493,0.19 8.789,0.058 9.105,0.015C9.42,-0.028 9.741,0.02 10.03,0.154C10.319,0.287 10.564,0.5 10.736,0.768C10.908,1.036 10.999,1.348 11,1.666V16.326C10.999,16.645 10.908,16.956 10.736,17.224C10.564,17.492 10.319,17.705 10.03,17.838C9.741,17.972 9.42,18.02 9.105,17.977C8.789,17.934 8.493,17.802 8.25,17.596L4.56,14.466C4.199,14.162 3.742,13.996 3.27,13.996H1.5C1.102,13.996 0.721,13.838 0.439,13.557C0.158,13.276 0,12.894 0,12.496V5.496C0,5.098 0.158,4.717 0.439,4.436C0.721,4.154 1.102,3.996 1.5,3.996ZM14.77,13.766C15.397,13.14 15.895,12.397 16.234,11.578C16.573,10.76 16.748,9.882 16.748,8.996C16.748,8.11 16.573,7.233 16.234,6.414C15.895,5.596 15.397,4.852 14.77,4.226C14.629,4.086 14.439,4.007 14.24,4.007C14.041,4.007 13.851,4.086 13.71,4.226C13.569,4.367 13.491,4.557 13.491,4.756C13.491,4.955 13.569,5.146 13.71,5.286C14.198,5.773 14.585,6.351 14.849,6.988C15.113,7.625 15.25,8.307 15.25,8.996C15.25,9.685 15.113,10.368 14.849,11.005C14.585,11.641 14.198,12.219 13.71,12.706C13.569,12.847 13.491,13.038 13.491,13.236C13.491,13.435 13.569,13.626 13.71,13.766C13.778,13.838 13.861,13.894 13.952,13.932C14.043,13.97 14.141,13.988 14.24,13.986C14.339,13.987 14.436,13.967 14.527,13.93C14.618,13.892 14.701,13.836 14.77,13.766ZM17.07,16.816C16.971,16.817 16.874,16.798 16.782,16.76C16.691,16.723 16.609,16.667 16.54,16.596C16.469,16.527 16.413,16.445 16.375,16.354C16.336,16.263 16.316,16.165 16.316,16.066C16.316,15.967 16.336,15.87 16.375,15.779C16.413,15.688 16.469,15.605 16.54,15.536C18.274,13.802 19.249,11.449 19.249,8.996C19.249,6.543 18.274,4.191 16.54,2.456C16.469,2.387 16.413,2.305 16.375,2.214C16.336,2.123 16.316,2.025 16.316,1.926C16.316,1.827 16.336,1.73 16.375,1.639C16.413,1.548 16.469,1.465 16.54,1.396C16.681,1.256 16.871,1.177 17.07,1.177C17.269,1.177 17.459,1.256 17.6,1.396C18.599,2.394 19.392,3.578 19.932,4.882C20.473,6.187 20.751,7.584 20.751,8.996C20.751,10.408 20.473,11.806 19.932,13.11C19.392,14.414 18.599,15.599 17.6,16.596C17.531,16.666 17.448,16.722 17.357,16.76C17.266,16.797 17.169,16.817 17.07,16.816Z"
|
||||
android:fillColor="#ffffff"/>
|
||||
</vector>
|
||||
24
app/src/main/res/drawable/import_audio.xml
Normal file
24
app/src/main/res/drawable/import_audio.xml
Normal file
@ -0,0 +1,24 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="256dp"
|
||||
android:height="256dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:pathData="M904,960H120c-30.9,0 -56,-25.1 -56,-56V120c0,-30.9 25.1,-56 56,-56h784c30.9,0 56,25.1 56,56v784c0,30.9 -25.1,56 -56,56z"
|
||||
android:fillColor="@color/main_color1"/>
|
||||
<path
|
||||
android:pathData="M512,512m-336,0a336,336 0,1 0,672 0,336 336,0 1,0 -672,0Z"
|
||||
android:fillColor="@color/black"/>
|
||||
<path
|
||||
android:pathData="M512,512m-112,0a112,112 0,1 0,224 0,112 112,0 1,0 -224,0Z"
|
||||
android:fillColor="@color/main_color2"/>
|
||||
<path
|
||||
android:pathData="M512,512m-42,0a42,42 0,1 0,84 0,42 42,0 1,0 -84,0Z"
|
||||
android:fillColor="#E1F5FF"/>
|
||||
<path
|
||||
android:pathData="M842.7,239c-34.7,0 -63,-28.3 -63,-63s28.3,-63 63,-63 63,28.3 63,63 -28.3,63 -63,63zM842.7,155c-11.6,0 -21,9.4 -21,21s9.4,21 21,21 21,-9.4 21,-21 -9.4,-21 -21,-21z"
|
||||
android:fillColor="#E1F5FF"/>
|
||||
<path
|
||||
android:pathData="M715.1,597.2c-6.7,0 -13.3,-3.2 -17.3,-9.1 -6.6,-9.6 -4.1,-22.6 5.4,-29.2l52.8,-36.2 67.6,-309.2c2.5,-11.3 13.7,-18.5 25,-16 11.3,2.5 18.5,13.7 16,25L795.3,539.8a21,21 0,0 1,-8.6 12.8l-59.7,40.9a20.9,20.9 0,0 1,-11.9 3.7z"
|
||||
android:fillColor="#E1F5FF"/>
|
||||
</vector>
|
||||
16
app/src/main/res/drawable/pause.xml
Normal file
16
app/src/main/res/drawable/pause.xml
Normal file
@ -0,0 +1,16 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="64dp"
|
||||
android:height="64dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:pathData="M512,42.7c258.8,0 469.3,210.5 469.3,469.3s-210.5,469.3 -469.3,469.3 -469.3,-210.5 -469.3,-469.3 210.5,-469.3 469.3,-469.3z"
|
||||
android:fillColor="@color/main_color1"/>
|
||||
<path
|
||||
android:pathData="M384,312.9c31.3,0 56.9,25.6 56.9,56.9v284.4c0,31.3 -25.6,56.9 -56.9,56.9s-56.9,-25.6 -56.9,-56.9v-284.4c0,-31.3 25.6,-56.9 56.9,-56.9z"
|
||||
android:strokeAlpha="0.6"
|
||||
android:fillColor="#BCC8DC" />
|
||||
<path
|
||||
android:pathData="M640,312.9c31.3,0 56.9,25.6 56.9,56.9v284.4c0,31.3 -25.6,56.9 -56.9,56.9s-56.9,-25.6 -56.9,-56.9v-284.4c0,-31.3 25.6,-56.9 56.9,-56.9z"
|
||||
android:fillColor="#BCC8DC"/>
|
||||
</vector>
|
||||
12
app/src/main/res/drawable/play.xml
Normal file
12
app/src/main/res/drawable/play.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="64dp"
|
||||
android:height="64dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:pathData="M512.5,512m-418.9,0a418.9,418.9 0,1 0,837.7 0,418.9 418.9,0 1,0 -837.7,0Z"
|
||||
android:fillColor="@color/main_color1"/>
|
||||
<path
|
||||
android:pathData="M683.6,470l-231.4,-133.6c-32.3,-18.6 -72.7,4.7 -72.7,42v267.2c0,37.3 40.4,60.6 72.7,42l231.4,-133.6c32.3,-18.7 32.3,-65.3 0,-84z"
|
||||
android:fillColor="#BCC8DC"/>
|
||||
</vector>
|
||||
8
app/src/main/res/drawable/seek_bar_thumb.xml
Normal file
8
app/src/main/res/drawable/seek_bar_thumb.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<solid android:color="@color/white" />
|
||||
<size
|
||||
android:width="12dp"
|
||||
android:height="12dp" />
|
||||
</shape>
|
||||
17
app/src/main/res/drawable/seekbar_style.xml
Normal file
17
app/src/main/res/drawable/seekbar_style.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@android:id/background">
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@color/gray" />
|
||||
<corners android:radius="10dp" />
|
||||
</shape>
|
||||
</item>
|
||||
<item android:id="@android:id/progress">
|
||||
<scale android:scaleWidth="100%">
|
||||
<shape>
|
||||
<solid android:color="@color/white" />
|
||||
<corners android:radius="10dp" />
|
||||
</shape>
|
||||
</scale>
|
||||
</item>
|
||||
</layer-list>
|
||||
7
app/src/main/res/drawable/selector_icon_mic.xml
Normal file
7
app/src/main/res/drawable/selector_icon_mic.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_selected="false" android:drawable="@drawable/icon_record"/>
|
||||
<item android:state_selected="true" android:drawable="@drawable/icon_record_iing"/>
|
||||
|
||||
|
||||
</selector>
|
||||
5
app/src/main/res/drawable/selector_icon_press.xml
Normal file
5
app/src/main/res/drawable/selector_icon_press.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_pressed="true" android:drawable="@drawable/bg_icon_stoke_bg_press"/>
|
||||
<item android:state_pressed="false" android:drawable="@drawable/bg_icon_stoke"/>
|
||||
</selector>
|
||||
6
app/src/main/res/drawable/selector_looper.xml
Normal file
6
app/src/main/res/drawable/selector_looper.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/icon_loop_no" android:state_selected="false" />
|
||||
<item android:drawable="@drawable/icon_loop_selected" android:state_selected="true" />
|
||||
|
||||
</selector>
|
||||
6
app/src/main/res/drawable/selector_play.xml
Normal file
6
app/src/main/res/drawable/selector_play.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_selected="true" android:drawable="@drawable/stop"/>
|
||||
<item android:drawable="@drawable/play"/>
|
||||
|
||||
</selector>
|
||||
6
app/src/main/res/drawable/selector_play_pause.xml
Normal file
6
app/src/main/res/drawable/selector_play_pause.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/play" android:state_selected="false" />
|
||||
<item android:drawable="@drawable/pause" android:state_selected="true" />
|
||||
|
||||
</selector>
|
||||
5
app/src/main/res/drawable/selector_star.xml
Normal file
5
app/src/main/res/drawable/selector_star.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/star" android:state_selected="true"/>
|
||||
<item android:drawable="@drawable/star_gray" android:state_selected="false"/>
|
||||
</selector>
|
||||
6
app/src/main/res/drawable/selector_tab_home.xml
Normal file
6
app/src/main/res/drawable/selector_tab_home.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/tab_home_no" android:state_selected="false" />
|
||||
<item android:drawable="@drawable/tab_home" android:state_selected="true" />
|
||||
|
||||
</selector>
|
||||
6
app/src/main/res/drawable/selector_tab_like.xml
Normal file
6
app/src/main/res/drawable/selector_tab_like.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/tab_like_no" android:state_selected="false" />
|
||||
<item android:drawable="@drawable/tab_like" android:state_selected="true" />
|
||||
|
||||
</selector>
|
||||
6
app/src/main/res/drawable/selector_tab_record.xml
Normal file
6
app/src/main/res/drawable/selector_tab_record.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/tab_record_no" android:state_selected="false" />
|
||||
<item android:drawable="@drawable/tab_record" android:state_selected="true" />
|
||||
|
||||
</selector>
|
||||
20
app/src/main/res/drawable/splash_progress.xml
Normal file
20
app/src/main/res/drawable/splash_progress.xml
Normal file
@ -0,0 +1,20 @@
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@android:id/background">
|
||||
<shape>
|
||||
<corners android:radius="5dp" />
|
||||
<solid android:color="@color/main_gray" /> <!-- 背景颜色 -->
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
<item android:id="@android:id/progress">
|
||||
<clip>
|
||||
<shape>
|
||||
<corners android:radius="20dp" />
|
||||
<gradient
|
||||
android:startColor="@color/indicator_color_2"
|
||||
android:endColor="@color/indicator_color"
|
||||
android:angle="0" />
|
||||
</shape>
|
||||
</clip>
|
||||
</item>
|
||||
</layer-list>
|
||||
11
app/src/main/res/drawable/star.xml
Normal file
11
app/src/main/res/drawable/star.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:strokeWidth="1"
|
||||
android:pathData="M10.307,7.22C10.949,5.619 11.27,4.819 11.792,4.708C11.929,4.679 12.071,4.679 12.208,4.708C12.73,4.819 13.051,5.619 13.693,7.22C14.058,8.13 14.24,8.585 14.582,8.895C14.678,8.982 14.782,9.059 14.893,9.126C15.288,9.364 15.78,9.408 16.766,9.496C18.435,9.646 19.269,9.72 19.524,10.196C19.577,10.295 19.613,10.401 19.63,10.512C19.715,11.045 19.101,11.603 17.875,12.719L17.534,13.029C16.96,13.551 16.674,13.812 16.508,14.137C16.408,14.333 16.341,14.543 16.31,14.76C16.258,15.122 16.342,15.5 16.51,16.257L16.57,16.528C16.871,17.885 17.022,18.564 16.834,18.897C16.665,19.197 16.354,19.389 16.01,19.405C15.628,19.424 15.089,18.984 14.011,18.106C13.301,17.527 12.946,17.238 12.551,17.125C12.191,17.022 11.809,17.022 11.449,17.125C11.054,17.238 10.699,17.527 9.989,18.106C8.911,18.984 8.372,19.424 7.99,19.405C7.646,19.389 7.335,19.197 7.166,18.897C6.978,18.564 7.129,17.885 7.43,16.528L7.49,16.257C7.658,15.5 7.742,15.122 7.69,14.76C7.659,14.543 7.592,14.333 7.492,14.137C7.327,13.812 7.04,13.551 6.466,13.029L6.126,12.719C4.899,11.603 4.285,11.045 4.37,10.512C4.387,10.401 4.423,10.295 4.476,10.196C4.731,9.72 5.565,9.646 7.234,9.496C8.22,9.408 8.713,9.364 9.107,9.126C9.218,9.059 9.322,8.982 9.418,8.895C9.76,8.585 9.942,8.13 10.307,7.22Z"
|
||||
android:fillColor="#FFE03A"
|
||||
android:strokeColor="#FFE03A"/>
|
||||
</vector>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user