init
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
|
||||||
1
app/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/build
|
||||||
93
app/build.gradle.kts
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
import java.io.FileInputStream
|
||||||
|
import java.util.Date
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Properties
|
||||||
|
import kotlin.apply
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id("com.android.application")
|
||||||
|
id("org.jetbrains.kotlin.android")
|
||||||
|
id("io.objectbox")
|
||||||
|
id("plugin.resTools")
|
||||||
|
}
|
||||||
|
val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date())
|
||||||
|
val keystorePropertiesFile = file("keystore.properties")
|
||||||
|
val keystoreProperties = Properties().apply {
|
||||||
|
load(FileInputStream(keystorePropertiesFile))
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace = "com.fun.wave.pranksounds"
|
||||||
|
compileSdk = 36
|
||||||
|
defaultConfig {
|
||||||
|
applicationId = "com.fun.wave.pranksounds"
|
||||||
|
minSdk = 24
|
||||||
|
targetSdk = 36
|
||||||
|
versionCode = 1
|
||||||
|
versionName = "1.0"
|
||||||
|
setProperty("archivesBaseName", "Fun Prank Sounds_V" + versionName + "(${versionCode})_$timestamp")
|
||||||
|
testInstrumentationRunner = "androidx.sounds.runner.AndroidJUnitRunner"
|
||||||
|
vectorDrawables {
|
||||||
|
useSupportLibrary = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
create("release") {
|
||||||
|
storeFile = file(keystoreProperties["keystoreFile"] as String)
|
||||||
|
storePassword = keystoreProperties["key_store_password"] as String
|
||||||
|
keyAlias = keystoreProperties["key_alias"] as String
|
||||||
|
keyPassword = keystoreProperties["key_password"] as String
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
isMinifyEnabled = true
|
||||||
|
signingConfig = signingConfigs.getByName("release")
|
||||||
|
proguardFiles(
|
||||||
|
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||||
|
"proguard-rules.pro"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
|
}
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = "17"
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
viewBinding = true
|
||||||
|
}
|
||||||
|
composeOptions {
|
||||||
|
kotlinCompilerExtensionVersion = "1.4.3"
|
||||||
|
}
|
||||||
|
packaging {
|
||||||
|
resources {
|
||||||
|
excludes += "/META-INF/{AL2.0,LGPL2.1}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resConfig {
|
||||||
|
new_prefix = "better_" // 资源前缀
|
||||||
|
old_prefix = "" // 老前缀,可为''空字符串
|
||||||
|
// === below use default
|
||||||
|
// resFolderPath 资源目录
|
||||||
|
// srcFolderPath 源代码目录
|
||||||
|
// manifestFilePath 清单文件目录
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
implementation("androidx.appcompat:appcompat:1.7.1")
|
||||||
|
implementation("com.google.android.material:material:1.13.0")
|
||||||
|
implementation("androidx.constraintlayout:constraintlayout:2.2.1")
|
||||||
|
implementation("androidx.legacy:legacy-support-v4:1.0.0")
|
||||||
|
implementation("androidx.recyclerview:recyclerview:1.4.0")
|
||||||
|
implementation ("com.github.bumptech.glide:glide:5.0.5")
|
||||||
|
implementation ("com.airbnb.android:lottie:6.7.1")
|
||||||
|
implementation("androidx.activity:activity:1.12.1")
|
||||||
|
implementation("com.airbnb.android:lottie:6.7.1")
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
6
app/keystore.properties
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
app_name=Prank Sound App
|
||||||
|
package_name=com.light.prank.sound.app
|
||||||
|
keystoreFile=PrankSoundApp
|
||||||
|
key_alias=PrankSoundAppkey0
|
||||||
|
key_store_password=PrankSoundApp
|
||||||
|
key_password=PrankSoundApp
|
||||||
169
app/objectbox-models/default.json
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
{
|
||||||
|
"_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": "13:7824910208781978737",
|
||||||
|
"lastPropertyId": "7:8857830758367360123",
|
||||||
|
"name": "PrankBean",
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"id": "1:6047917390232111500",
|
||||||
|
"name": "id",
|
||||||
|
"type": 6,
|
||||||
|
"flags": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2:4623783959485819277",
|
||||||
|
"name": "name",
|
||||||
|
"type": 9
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3:7692086498868210194",
|
||||||
|
"name": "covert",
|
||||||
|
"type": 9
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4:2825018824026239987",
|
||||||
|
"name": "audioUrl",
|
||||||
|
"type": 9
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "5:8932557144992099091",
|
||||||
|
"name": "isLike",
|
||||||
|
"type": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "6:5962978559603145119",
|
||||||
|
"name": "isCustomization",
|
||||||
|
"type": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "7:8857830758367360123",
|
||||||
|
"name": "colorIndex",
|
||||||
|
"type": 5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"relations": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "14:87710518712999501",
|
||||||
|
"lastPropertyId": "3:1835392782982996208",
|
||||||
|
"name": "SoundsWrapper",
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"id": "1:6200994814248403217",
|
||||||
|
"name": "id",
|
||||||
|
"type": 6,
|
||||||
|
"flags": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2:6932511964128134026",
|
||||||
|
"name": "name",
|
||||||
|
"type": 9
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3:1835392782982996208",
|
||||||
|
"name": "covert",
|
||||||
|
"type": 9
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
{
|
||||||
|
"id": "9:8982482320798399131",
|
||||||
|
"name": "prankBeanList",
|
||||||
|
"targetId": "13:7824910208781978737"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lastEntityId": "14:87710518712999501",
|
||||||
|
"lastIndexId": "0:0",
|
||||||
|
"lastRelationId": "9:8982482320798399131",
|
||||||
|
"lastSequenceId": "0:0",
|
||||||
|
"modelVersion": 5,
|
||||||
|
"modelVersionParserMinimum": 5,
|
||||||
|
"retiredEntityUids": [
|
||||||
|
6644187494744704837,
|
||||||
|
5451755925324613900,
|
||||||
|
5341528467384834198,
|
||||||
|
8669262289368091330,
|
||||||
|
8810616757821398748,
|
||||||
|
6372494608185382462,
|
||||||
|
260548638537148495,
|
||||||
|
6171058126503557976,
|
||||||
|
8085616393527895261,
|
||||||
|
8739827070759887179,
|
||||||
|
6925743302808159345,
|
||||||
|
4787339686156620592
|
||||||
|
],
|
||||||
|
"retiredIndexUids": [],
|
||||||
|
"retiredPropertyUids": [
|
||||||
|
3737650329028529369,
|
||||||
|
4763378658873693443,
|
||||||
|
125364974873863130,
|
||||||
|
2528835553105827913,
|
||||||
|
4125097520975656265,
|
||||||
|
1927156637783361412,
|
||||||
|
6438478261519714898,
|
||||||
|
2535158628950494443,
|
||||||
|
4963029281587776266,
|
||||||
|
8017263761729239946,
|
||||||
|
3918234626049153042,
|
||||||
|
4840800811073356695,
|
||||||
|
930394402218217369,
|
||||||
|
1357489842440803099,
|
||||||
|
783114452691941347,
|
||||||
|
881748992619560888,
|
||||||
|
95077662452914291,
|
||||||
|
7000351314398811626,
|
||||||
|
3982750000194227585,
|
||||||
|
5235585844249440522,
|
||||||
|
3371160825837869454,
|
||||||
|
9088572167887595053,
|
||||||
|
2294045821758826971,
|
||||||
|
6190783800393335475,
|
||||||
|
6856939928119969590,
|
||||||
|
9041548896743223717,
|
||||||
|
4243540562679615259,
|
||||||
|
3106056562243875264,
|
||||||
|
7411940719916723671,
|
||||||
|
8627564250033438412,
|
||||||
|
2362105308234412259,
|
||||||
|
6967435104198349134,
|
||||||
|
9068611668884650878,
|
||||||
|
1871289416013564443,
|
||||||
|
146773896596794310,
|
||||||
|
5478293265216175724,
|
||||||
|
5188652570119820578,
|
||||||
|
6461488128394318327,
|
||||||
|
1026277688866110674,
|
||||||
|
2521498030617118564,
|
||||||
|
2583438008647218971,
|
||||||
|
731259648768476447,
|
||||||
|
5851268731306509989,
|
||||||
|
7559103671740386544,
|
||||||
|
5195394224802633518,
|
||||||
|
7729663788422230782,
|
||||||
|
7713392402430065102,
|
||||||
|
161854929172988279,
|
||||||
|
4329094194233611546,
|
||||||
|
469180437797582293,
|
||||||
|
2566506951489034336,
|
||||||
|
9129679095050664868,
|
||||||
|
8225212046296577339,
|
||||||
|
2106199083066446849
|
||||||
|
],
|
||||||
|
"retiredRelationUids": [
|
||||||
|
4497042841980461487,
|
||||||
|
5723529287069432111,
|
||||||
|
8439944504818566677,
|
||||||
|
6781268415547019296,
|
||||||
|
2600628166471439351,
|
||||||
|
6610744321567014290,
|
||||||
|
3875887204039397939,
|
||||||
|
3485786768338944717
|
||||||
|
],
|
||||||
|
"version": 1
|
||||||
|
}
|
||||||
51
app/proguard-rules.pro
vendored
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
# 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>;
|
||||||
|
}
|
||||||
58
app/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
<?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="com.fun.pranksounds.com.fun.wave.pranksounds.utils.App"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.FunnyAudio"
|
||||||
|
tools:targetApi="31">
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="com.fun.pranksounds.com.fun.wave.pranksounds.activity.AcPlayPranks"
|
||||||
|
android:exported="false"
|
||||||
|
android:screenOrientation="portrait" />
|
||||||
|
<activity
|
||||||
|
android:name="com.fun.pranksounds.com.fun.wave.pranksounds.activity.AcCategoryList"
|
||||||
|
android:exported="false"
|
||||||
|
android:screenOrientation="portrait" />
|
||||||
|
<activity
|
||||||
|
android:name="com.fun.pranksounds.com.fun.wave.pranksounds.activity.AcMain"
|
||||||
|
android:exported="false"
|
||||||
|
android:screenOrientation="portrait" />
|
||||||
|
<activity
|
||||||
|
android:name="com.fun.pranksounds.com.fun.wave.pranksounds.custom.AcSave"
|
||||||
|
android:exported="false"
|
||||||
|
android:screenOrientation="portrait" />
|
||||||
|
<activity
|
||||||
|
android:name="com.fun.pranksounds.com.fun.wave.pranksounds.custom.AcRecording"
|
||||||
|
android:exported="false"
|
||||||
|
android:screenOrientation="portrait" />
|
||||||
|
<activity
|
||||||
|
android:name="com.fun.pranksounds.com.fun.wave.pranksounds.activity.AcSplashUi"
|
||||||
|
android:exported="true"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
|
android:theme="@style/Theme.Welcome">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
3791
app/src/main/assets/prank.json
Normal file
BIN
app/src/main/assets/pranks.ttf
Normal file
BIN
app/src/main/ic_launcher-playstore.png
Normal file
|
After Width: | Height: | Size: 377 KiB |
@ -0,0 +1,62 @@
|
|||||||
|
package com.fun.wave.pranksounds.activity;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import androidx.recyclerview.widget.GridLayoutManager;
|
||||||
|
|
||||||
|
import com.fun.wave.pranksounds.base.BaseActivity;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.SoundsWrapper;
|
||||||
|
import com.fun.wave.pranksounds.utils.MyItemSpace;
|
||||||
|
import com.fun.wave.pranksounds.utils.MyUtils;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.OnClickItemListener;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.PrankBean;
|
||||||
|
import com.fun.pranksounds.databinding.AcCategoryListBinding;
|
||||||
|
|
||||||
|
public class AcCategoryList extends BaseActivity<AcCategoryListBinding> implements View.OnClickListener, OnClickItemListener {
|
||||||
|
|
||||||
|
|
||||||
|
private SoundsWrapper data;
|
||||||
|
private int colorIndex;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void init() {
|
||||||
|
data = (SoundsWrapper) getIntent().getSerializableExtra(MyUtils.KEY_LIST_DATA);
|
||||||
|
colorIndex = getIntent().getIntExtra(MyUtils.KEY_LIST_COLOR_POS,0);
|
||||||
|
viewBind.categoryName.setText(data.getName());
|
||||||
|
onList();
|
||||||
|
viewBind.back.setOnClickListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AcCategoryListBinding initViewBinding() {
|
||||||
|
return AcCategoryListBinding.inflate(getLayoutInflater());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onList() {
|
||||||
|
MyItemSpace itemHelper = new MyItemSpace(5, 5, 0);
|
||||||
|
viewBind.listRecycler.addItemDecoration(itemHelper);
|
||||||
|
viewBind.listRecycler.setLayoutManager(new GridLayoutManager(this, 2));
|
||||||
|
AdapterCategoryList adapterCategoryList = new AdapterCategoryList(this, data.getPrankBeanList(),0,this);
|
||||||
|
viewBind.listRecycler.setAdapter(adapterCategoryList);
|
||||||
|
adapterCategoryList.setColorIndex(colorIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if(v.equals(viewBind.back)){
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClickSoundsListener(PrankBean data) {
|
||||||
|
Intent intent = new Intent(this, AcPlayPranks.class);
|
||||||
|
intent.putExtra(MyUtils.KEY_PLAY_DATA, data);
|
||||||
|
intent.putExtra(MyUtils.KEY_LIST_COLOR_POS, colorIndex);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
}
|
||||||
255
app/src/main/java/com/fun/wave/pranksounds/activity/AcMain.java
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
package com.fun.wave.pranksounds.activity;
|
||||||
|
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.activity.result.ActivityResultCallback;
|
||||||
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.viewpager2.adapter.FragmentStateAdapter;
|
||||||
|
import androidx.viewpager2.widget.ViewPager2;
|
||||||
|
|
||||||
|
import com.fun.pranksounds.R;
|
||||||
|
import com.fun.wave.pranksounds.base.BaseActivity;
|
||||||
|
import com.fun.wave.pranksounds.custom.AcRecording;
|
||||||
|
import com.fun.wave.pranksounds.custom.AcSave;
|
||||||
|
import com.fun.wave.pranksounds.custom.FragmentCustom;
|
||||||
|
import com.fun.pranksounds.databinding.AcMainBinding;
|
||||||
|
import com.fun.pranksounds.databinding.TabItemLayoutBinding;
|
||||||
|
import com.fun.wave.pranksounds.like.FragmentLike;
|
||||||
|
import com.fun.wave.pranksounds.main.FragmentMain;
|
||||||
|
import com.fun.wave.pranksounds.utils.MyUtils;
|
||||||
|
import com.google.android.material.tabs.TabLayout;
|
||||||
|
import com.google.android.material.tabs.TabLayoutMediator;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class AcMain extends BaseActivity<AcMainBinding> {
|
||||||
|
|
||||||
|
|
||||||
|
private ActivityResultLauncher<String> audioPickerLauncher;
|
||||||
|
|
||||||
|
private ActivityResultLauncher<String> requestRecordAudioLauncher;
|
||||||
|
|
||||||
|
private ActivityResultLauncher<String[]> requestStorePermissionsLauncher;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void init() {
|
||||||
|
initVp2();
|
||||||
|
initImport();
|
||||||
|
viewBind.importLayout.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
onClickTimer(0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
viewBind.recordLayout.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
onClickTimer(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initImport() {
|
||||||
|
requestRecordAudioLauncher = registerForActivityResult(
|
||||||
|
new ActivityResultContracts.RequestPermission(),
|
||||||
|
isGranted -> {
|
||||||
|
if (isGranted) {
|
||||||
|
intentRecordAudio();
|
||||||
|
} else {
|
||||||
|
Toast.makeText(AcMain.this, "Recording permission denied", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
requestStorePermissionsLauncher = registerForActivityResult(
|
||||||
|
new ActivityResultContracts.RequestMultiplePermissions(),
|
||||||
|
new ActivityResultCallback<Map<String, Boolean>>() {
|
||||||
|
@Override
|
||||||
|
public void onActivityResult(Map<String, Boolean> result) {
|
||||||
|
Boolean isGranted = true;
|
||||||
|
for (Map.Entry<String, Boolean> entry : result.entrySet()) {
|
||||||
|
String permission = entry.getKey();
|
||||||
|
isGranted = entry.getValue();
|
||||||
|
if (!entry.getValue()) {
|
||||||
|
isGranted = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (isGranted) {
|
||||||
|
importAudio();
|
||||||
|
} else {
|
||||||
|
Toast.makeText(AcMain.this, getString(R.string.permission_denied), Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
audioPickerLauncher = registerForActivityResult(new ActivityResultContracts.GetContent(),
|
||||||
|
new ActivityResultCallback<Uri>() {
|
||||||
|
@Override
|
||||||
|
public void onActivityResult(Uri uri) {
|
||||||
|
// Handle the returned Uri
|
||||||
|
if (uri != null) {
|
||||||
|
long duration = MyUtils.getAudioDuration(AcMain.this, uri);
|
||||||
|
Intent intent = new Intent(AcMain.this, AcSave.class);
|
||||||
|
intent.putExtra(AcSave.KEY_Path, uri.toString());
|
||||||
|
// intent.putExtra(AcSave.KEY_Time, duration);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AcMainBinding initViewBinding() {
|
||||||
|
return AcMainBinding.inflate(getLayoutInflater());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void intentRecordAudio() {
|
||||||
|
Intent intent = new Intent(AcMain.this, AcRecording.class);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initVp2() {
|
||||||
|
List<Fragment> fragmentList = new ArrayList<>();
|
||||||
|
fragmentList.add(FragmentMain.newInstance());
|
||||||
|
fragmentList.add(FragmentLike.newInstance());
|
||||||
|
fragmentList.add(FragmentCustom.newInstance());
|
||||||
|
viewBind.vp2.setAdapter(new FragmentStateAdapter(this) {
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Fragment createFragment(int position) {
|
||||||
|
return fragmentList.get(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return fragmentList.size();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
viewBind.vp2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
|
||||||
|
new TabLayoutMediator(viewBind.bottomTab, viewBind.vp2, new TabLayoutMediator.TabConfigurationStrategy() {
|
||||||
|
@Override
|
||||||
|
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
|
||||||
|
TabItemLayoutBinding inflate = TabItemLayoutBinding.inflate(getLayoutInflater());
|
||||||
|
tab.setCustomView(inflate.getRoot());
|
||||||
|
switch (position) {
|
||||||
|
case 0 -> {
|
||||||
|
inflate.imageTab.setImageResource(R.drawable.tab_prank);
|
||||||
|
inflate.getRoot().animate()
|
||||||
|
.scaleX(1.7f)
|
||||||
|
.scaleY(1.7f)
|
||||||
|
.setDuration(200)
|
||||||
|
.start();
|
||||||
|
}
|
||||||
|
case 1 -> inflate.imageTab.setImageResource(R.drawable.tab_collection);
|
||||||
|
case 2 -> inflate.imageTab.setImageResource(R.drawable.tab_mine);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}).attach();
|
||||||
|
viewBind.bottomTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
|
||||||
|
@Override
|
||||||
|
public void onTabSelected(TabLayout.Tab tab) {
|
||||||
|
View customView = tab.getCustomView();
|
||||||
|
if (customView != null) {
|
||||||
|
customView.animate()
|
||||||
|
.scaleX(1.7f)
|
||||||
|
.scaleY(1.7f)
|
||||||
|
.setDuration(200)
|
||||||
|
.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTabUnselected(TabLayout.Tab tab) {
|
||||||
|
View customView = tab.getCustomView();
|
||||||
|
if (customView != null) {
|
||||||
|
View view = customView.findViewById(R.id.image_tab);
|
||||||
|
customView.animate()
|
||||||
|
.scaleX(1f)
|
||||||
|
.scaleY(1f)
|
||||||
|
.setDuration(200)
|
||||||
|
.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTabReselected(TabLayout.Tab tab) {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||||
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||||
|
if (requestCode == MyUtils.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/*");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onClickTimer(int type) {
|
||||||
|
switch (type) {
|
||||||
|
case 0:
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
|
if (ContextCompat.checkSelfPermission(AcMain.this, MyUtils.permission_read_audio[0])
|
||||||
|
!= PackageManager.PERMISSION_GRANTED) {
|
||||||
|
requestStorePermissionsLauncher.launch(MyUtils.permission_read_audio);
|
||||||
|
} else {
|
||||||
|
importAudio();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (ContextCompat.checkSelfPermission(AcMain.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
|
||||||
|
!= PackageManager.PERMISSION_GRANTED ||
|
||||||
|
ContextCompat.checkSelfPermission(AcMain.this, Manifest.permission.READ_EXTERNAL_STORAGE)
|
||||||
|
!= PackageManager.PERMISSION_GRANTED) {
|
||||||
|
requestStorePermissionsLauncher.launch(MyUtils.permission_store);
|
||||||
|
} else {
|
||||||
|
importAudio();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
checkAndRequestAudioPermission();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkAndRequestAudioPermission() {
|
||||||
|
if (ContextCompat.checkSelfPermission(AcMain.this, MyUtils.permission_record_audio)
|
||||||
|
!= PackageManager.PERMISSION_GRANTED) {
|
||||||
|
requestRecordAudioLauncher.launch(MyUtils.permission_record_audio);
|
||||||
|
} else {
|
||||||
|
intentRecordAudio();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,245 @@
|
|||||||
|
package com.fun.wave.pranksounds.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.CountDownTimer;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.fun.wave.pranksounds.utils.PopupClock;
|
||||||
|
import com.fun.wave.pranksounds.base.BaseActivity;
|
||||||
|
import com.fun.wave.pranksounds.utils.MyItemSpace;
|
||||||
|
import com.fun.wave.pranksounds.utils.MyUtils;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.ObjectBoxMan;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.OnClickItemListener;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.OnClickTimerListener;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.PrankBean;
|
||||||
|
import com.fun.pranksounds.R;
|
||||||
|
import com.fun.pranksounds.databinding.AcPlayPranksBinding;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AcPlayPranks extends BaseActivity<AcPlayPranksBinding> implements View.OnClickListener, OnClickTimerListener, OnClickItemListener {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private PrankBean PrankBean;
|
||||||
|
private PopupClock popupClock;
|
||||||
|
|
||||||
|
private MediaPlayer mediaPlayer;
|
||||||
|
private BroadcastReceiver volumeReceiver;
|
||||||
|
private CountDownTimer countDownTimer;
|
||||||
|
private int color;
|
||||||
|
private boolean isPause = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void init() {
|
||||||
|
PrankBean = (PrankBean) getIntent().getSerializableExtra(MyUtils.KEY_PLAY_DATA);
|
||||||
|
color = getIntent().getIntExtra(MyUtils.KEY_LIST_COLOR_POS,0);
|
||||||
|
initAudio();
|
||||||
|
String covert = PrankBean.getCovert();
|
||||||
|
if (covert != null && !covert.isEmpty()) {
|
||||||
|
Glide.with(this).load(covert)
|
||||||
|
.placeholder(R.drawable.image_sounds)
|
||||||
|
.into(viewBind.image);
|
||||||
|
} else {
|
||||||
|
Glide.with(this).load(R.drawable.image_sounds)
|
||||||
|
.into(viewBind.image);
|
||||||
|
}
|
||||||
|
viewBind.name.setText(PrankBean.getName());
|
||||||
|
viewBind.back.setOnClickListener(this);
|
||||||
|
viewBind.btnPlay.setOnClickListener(this);
|
||||||
|
viewBind.imLike.setOnClickListener(this);
|
||||||
|
viewBind.imLoop.setOnClickListener(this);
|
||||||
|
viewBind.imTimer.setOnClickListener(this);
|
||||||
|
MyUtils.setVolume(this, viewBind.seekbar);
|
||||||
|
|
||||||
|
initLike();
|
||||||
|
loadMore();
|
||||||
|
volumeReceiver();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AcPlayPranksBinding initViewBinding() {
|
||||||
|
return AcPlayPranksBinding.inflate(getLayoutInflater());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopCountDown() {
|
||||||
|
if (countDownTimer != null) {
|
||||||
|
countDownTimer.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void startCountDown(long time) {
|
||||||
|
stopCountDown();
|
||||||
|
countDownTimer = new CountDownTimer(time, 1000) {
|
||||||
|
@Override
|
||||||
|
public void onTick(long millisUntilFinished) {
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onFinish() {
|
||||||
|
popupClock.setOffSelected();
|
||||||
|
if (!mediaPlayer.isPlaying()) {
|
||||||
|
viewBind.btnPlay.setSelected(true);
|
||||||
|
mediaPlayer.start();
|
||||||
|
isPause = false;
|
||||||
|
viewBind.rippleView.startRipple();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
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 (viewBind.seekbar.getProgress() != currentVolume) {
|
||||||
|
viewBind.seekbar.setProgress(currentVolume);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
IntentFilter filter = new IntentFilter("android.media.VOLUME_CHANGED_ACTION");
|
||||||
|
registerReceiver(volumeReceiver, filter);
|
||||||
|
}
|
||||||
|
private void initLike() {
|
||||||
|
boolean b = ObjectBoxMan.checkLike(PrankBean);
|
||||||
|
viewBind.imLike.setSelected(b);
|
||||||
|
}
|
||||||
|
private void loadMore() {
|
||||||
|
List<PrankBean> more = ObjectBoxMan.getMore();
|
||||||
|
MyItemSpace itemHelper = new MyItemSpace(0, 0, (int) MyUtils.dpToPx(3));
|
||||||
|
AdapterCategoryList adapterCategoryList = new AdapterCategoryList(this, more, 1, this);
|
||||||
|
viewBind.moreRecycler.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
|
||||||
|
viewBind.moreRecycler.setAdapter(adapterCategoryList);
|
||||||
|
viewBind.moreRecycler.addItemDecoration(itemHelper);
|
||||||
|
adapterCategoryList.setColorIndex(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initAudio() {
|
||||||
|
showPlayBtn(false);
|
||||||
|
mediaPlayer = new MediaPlayer();
|
||||||
|
try {
|
||||||
|
mediaPlayer.reset();
|
||||||
|
mediaPlayer.setDataSource(PrankBean.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) {
|
||||||
|
viewBind.btnPlay.setSelected(false);
|
||||||
|
viewBind.rippleView.stopRipple();
|
||||||
|
isPause = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (IOException ioException) {
|
||||||
|
showPlayBtn(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showPlayBtn(boolean showBtn) {
|
||||||
|
if (showBtn) {
|
||||||
|
viewBind.btnPlay.setVisibility(View.VISIBLE);
|
||||||
|
viewBind.playLoading.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
viewBind.btnPlay.setVisibility(View.GONE);
|
||||||
|
viewBind.playLoading.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if (v.equals(viewBind.back)) {
|
||||||
|
finish();
|
||||||
|
} else if (v.equals(viewBind.btnPlay)) {
|
||||||
|
boolean selected = viewBind.btnPlay.isSelected();
|
||||||
|
if (selected) {
|
||||||
|
if (mediaPlayer.isPlaying()) {
|
||||||
|
mediaPlayer.pause();
|
||||||
|
viewBind.rippleView.pauseRipple();
|
||||||
|
isPause = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!mediaPlayer.isPlaying()) {
|
||||||
|
if(isPause){
|
||||||
|
viewBind.rippleView.resumeRipple();
|
||||||
|
}else {
|
||||||
|
viewBind.rippleView.startRipple();
|
||||||
|
}
|
||||||
|
mediaPlayer.start();
|
||||||
|
isPause = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
viewBind.btnPlay.setSelected(!selected);
|
||||||
|
|
||||||
|
} else if (v.equals(viewBind.imLike)) {
|
||||||
|
viewBind.imLike.setSelected(!viewBind.imLike.isSelected());
|
||||||
|
boolean selected = viewBind.imLike.isSelected();
|
||||||
|
if (selected) {
|
||||||
|
PrankBean.setColorIndex(color);
|
||||||
|
ObjectBoxMan.addLike(PrankBean);
|
||||||
|
} else {
|
||||||
|
ObjectBoxMan.removeLike(PrankBean);
|
||||||
|
}
|
||||||
|
} else if (v.equals(viewBind.imLoop)) {
|
||||||
|
viewBind.imLoop.setSelected(!viewBind.imLoop.isSelected());
|
||||||
|
mediaPlayer.setLooping(viewBind.imLoop.isSelected());
|
||||||
|
} else if (v.equals(viewBind.imTimer)) {
|
||||||
|
if (popupClock == null) {
|
||||||
|
popupClock = new PopupClock(AcPlayPranks.this, this);
|
||||||
|
}
|
||||||
|
popupClock.showTop(viewBind.imTimer);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
if (mediaPlayer.isPlaying()) {
|
||||||
|
mediaPlayer.stop();
|
||||||
|
}
|
||||||
|
isPause = false;
|
||||||
|
mediaPlayer.release();
|
||||||
|
mediaPlayer = null;
|
||||||
|
stopCountDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClickTimerListener(long time) {
|
||||||
|
popupClock.hide();
|
||||||
|
if (time == -1) {
|
||||||
|
stopCountDown();
|
||||||
|
} else {
|
||||||
|
startCountDown(time);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClickSoundsListener(PrankBean data) {
|
||||||
|
Intent intent = new Intent(this, AcPlayPranks.class);
|
||||||
|
intent.putExtra(MyUtils.KEY_PLAY_DATA, data);
|
||||||
|
startActivity(intent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
package com.fun.wave.pranksounds.activity;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.CountDownTimer;
|
||||||
|
|
||||||
|
|
||||||
|
import com.fun.wave.pranksounds.base.BaseActivity;
|
||||||
|
import com.fun.pranksounds.databinding.AcSplashUiBinding;
|
||||||
|
|
||||||
|
public class AcSplashUi extends BaseActivity<AcSplashUiBinding> {
|
||||||
|
|
||||||
|
private CountDownTimer countDownTimer;
|
||||||
|
@Override
|
||||||
|
protected void init() {
|
||||||
|
long time = 1200;
|
||||||
|
countDownTimer = new CountDownTimer(time, 50) {
|
||||||
|
@Override
|
||||||
|
public void onFinish() {
|
||||||
|
welcomeMain();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTick(long millisUntilFinished) {
|
||||||
|
int progress = (int) ((time - millisUntilFinished) * 100 / time);
|
||||||
|
viewBind.loadingPb.setProgress(progress);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
countDownTimer.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AcSplashUiBinding initViewBinding() {
|
||||||
|
return AcSplashUiBinding.inflate(getLayoutInflater());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void welcomeMain() {
|
||||||
|
viewBind.loadingPb.setProgress(100);
|
||||||
|
Intent intent = new Intent(this, AcMain.class);
|
||||||
|
startActivity(intent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
if (countDownTimer != null) {
|
||||||
|
countDownTimer.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,82 @@
|
|||||||
|
package com.fun.wave.pranksounds.activity;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.RelativeLayout;
|
||||||
|
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.OnClickItemListener;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.PrankBean;
|
||||||
|
import com.fun.wave.pranksounds.utils.MyUtils;
|
||||||
|
import com.fun.pranksounds.databinding.CategoryListAdapterBinding;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AdapterCategoryList extends RecyclerView.Adapter<AdapterCategoryList.ViewHolder> {
|
||||||
|
private final List<PrankBean> mValues;
|
||||||
|
private Context mCon;
|
||||||
|
private int type;
|
||||||
|
private OnClickItemListener mListener;
|
||||||
|
private int colorIndex;
|
||||||
|
|
||||||
|
public void setColorIndex(int colorIndex) {
|
||||||
|
this.colorIndex = colorIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdapterCategoryList(Context context, List<PrankBean> items, int mType, OnClickItemListener listener) {
|
||||||
|
mValues = items;
|
||||||
|
this.mCon = context;
|
||||||
|
type = mType;
|
||||||
|
mListener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||||
|
return new ViewHolder(CategoryListAdapterBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||||
|
holder.vb.relative.setBackground(ContextCompat.getDrawable(mCon, MyUtils.childBgs[colorIndex]));
|
||||||
|
PrankBean PrankBean = mValues.get(position);
|
||||||
|
String covert = PrankBean.getCovert();
|
||||||
|
Glide.with(mCon).load(covert).into(holder.vb.image);
|
||||||
|
holder.vb.name.setText(PrankBean.getName());
|
||||||
|
holder.vb.getRoot().setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
mListener.onClickSoundsListener(PrankBean);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return mValues.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
private CategoryListAdapterBinding vb;
|
||||||
|
|
||||||
|
public ViewHolder(CategoryListAdapterBinding binding) {
|
||||||
|
super(binding.getRoot());
|
||||||
|
vb = binding;
|
||||||
|
ViewGroup.LayoutParams layoutParams = vb.relative.getLayoutParams();
|
||||||
|
if (type == 0) {
|
||||||
|
layoutParams.width = RelativeLayout.LayoutParams.MATCH_PARENT;
|
||||||
|
vb.name.setMaxLines(2);
|
||||||
|
} else {
|
||||||
|
layoutParams.width = (int) MyUtils.dpToPx(130);
|
||||||
|
vb.name.setMaxLines(1);
|
||||||
|
}
|
||||||
|
vb.relative.setLayoutParams(layoutParams);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
package com.fun.wave.pranksounds.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import androidx.activity.EdgeToEdge;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.core.graphics.Insets;
|
||||||
|
import androidx.core.view.ViewCompat;
|
||||||
|
import androidx.core.view.WindowInsetsCompat;
|
||||||
|
import androidx.viewbinding.ViewBinding;
|
||||||
|
|
||||||
|
public abstract class BaseActivity<T extends ViewBinding> extends AppCompatActivity {
|
||||||
|
|
||||||
|
|
||||||
|
protected T viewBind;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
EdgeToEdge.enable(this);
|
||||||
|
viewBind = initViewBinding();
|
||||||
|
setContentView(viewBind.getRoot());
|
||||||
|
ViewCompat.setOnApplyWindowInsetsListener(getRootView(), (v, insets) -> {
|
||||||
|
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
|
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
|
||||||
|
return insets;
|
||||||
|
});
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void init();
|
||||||
|
|
||||||
|
protected View getRootView() {
|
||||||
|
return viewBind.getRoot();
|
||||||
|
}
|
||||||
|
protected abstract T initViewBinding();
|
||||||
|
}
|
||||||
@ -0,0 +1,98 @@
|
|||||||
|
package com.fun.wave.pranksounds.custom;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import com.fun.pranksounds.R;
|
||||||
|
import com.fun.wave.pranksounds.base.BaseActivity;
|
||||||
|
import com.fun.pranksounds.databinding.AcRecordingBinding;
|
||||||
|
import com.fun.wave.pranksounds.utils.MyRecorderUtils;
|
||||||
|
import com.fun.wave.pranksounds.utils.OnUpdateRecordingTime;
|
||||||
|
|
||||||
|
public class AcRecording extends BaseActivity<AcRecordingBinding> {
|
||||||
|
private Handler handler = new Handler(Looper.getMainLooper());
|
||||||
|
|
||||||
|
private boolean isCreate = false;
|
||||||
|
|
||||||
|
private MyRecorderUtils myRecorderUtils;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void init() {
|
||||||
|
myRecorderUtils = new MyRecorderUtils(this, handler, new OnUpdateRecordingTime() {
|
||||||
|
@Override
|
||||||
|
public void onUpdateTime(long time) {
|
||||||
|
|
||||||
|
int milliseconds = (int) (time % 1000) / 10;
|
||||||
|
int seconds = (int) (time / 1000) % 60;
|
||||||
|
int minutes = (int) (time / (1000 * 60)) % 60;
|
||||||
|
viewBind.audioTime.setText(String.format("%02d : %02d : %02d", minutes, seconds, milliseconds));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
viewBind.audioTime.setText(R.string.time_init);
|
||||||
|
initEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AcRecordingBinding initViewBinding() {
|
||||||
|
return AcRecordingBinding.inflate(getLayoutInflater());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initEvent() {
|
||||||
|
viewBind.back.setOnClickListener(v -> finish());
|
||||||
|
viewBind.viewBtnStart.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
createSound(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
viewBind.viewPause.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
createSound(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createSound(Boolean isStop) {
|
||||||
|
if (!isCreate) {
|
||||||
|
myRecorderUtils.startRecording();
|
||||||
|
viewBind.lottieView.playAnimation();
|
||||||
|
viewBind.viewPause.setSelected(true);
|
||||||
|
isCreate = true;
|
||||||
|
} else {
|
||||||
|
if (isStop) {
|
||||||
|
viewBind.lottieView.cancelAnimation();
|
||||||
|
viewBind.viewPause.setSelected(false);
|
||||||
|
myRecorderUtils.stopRecording();
|
||||||
|
Intent intent = new Intent(AcRecording.this, AcSave.class);
|
||||||
|
// intent.putExtra(AcSave.KEY_Time, elapsedTime);
|
||||||
|
intent.putExtra(AcSave.KEY_Path, myRecorderUtils.getTempFileName());
|
||||||
|
intent.putExtra(AcSave.KEY_import, 1);
|
||||||
|
startActivity(intent);
|
||||||
|
finish();
|
||||||
|
} else {
|
||||||
|
Log.d("================","--"+myRecorderUtils.isRecording());
|
||||||
|
if (myRecorderUtils.isRecording()) {
|
||||||
|
viewBind.viewPause.setSelected(false);
|
||||||
|
myRecorderUtils.pauseRecording();
|
||||||
|
viewBind.lottieView.pauseAnimation();
|
||||||
|
} else {
|
||||||
|
viewBind.viewPause.setSelected(true);
|
||||||
|
myRecorderUtils.resumeRecording();
|
||||||
|
viewBind.lottieView.resumeAnimation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
myRecorderUtils.stopRecording();
|
||||||
|
}
|
||||||
|
}
|
||||||
215
app/src/main/java/com/fun/wave/pranksounds/custom/AcSave.java
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
package com.fun.wave.pranksounds.custom;
|
||||||
|
|
||||||
|
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.Handler;
|
||||||
|
import android.os.SystemClock;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.fun.wave.pranksounds.base.BaseActivity;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.ObjectBoxMan;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.PrankBean;
|
||||||
|
import com.fun.pranksounds.R;
|
||||||
|
import com.fun.pranksounds.databinding.AcSaveBinding;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
public class AcSave extends BaseActivity<AcSaveBinding> {
|
||||||
|
|
||||||
|
private String path;
|
||||||
|
|
||||||
|
private MediaPlayer mediaPlayer;
|
||||||
|
private Handler handler = new Handler();
|
||||||
|
private Runnable timeUpdater;
|
||||||
|
private long startTime;
|
||||||
|
private long elapsedTime;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static String KEY_Path = "KEY_path";
|
||||||
|
public static String KEY_import = "flag";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void init() {
|
||||||
|
viewBind.audioTime.setText(R.string.time_init);
|
||||||
|
initData();
|
||||||
|
initEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AcSaveBinding initViewBinding() {
|
||||||
|
return AcSaveBinding.inflate(getLayoutInflater());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void togglePrank() throws IOException {
|
||||||
|
if (viewBind.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 -> {
|
||||||
|
viewBind.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;
|
||||||
|
viewBind.audioTime.setText(String.format("%02d : %02d : %02d", minutes, seconds, milliseconds));
|
||||||
|
handler.postDelayed(this, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
startTime = SystemClock.elapsedRealtime();
|
||||||
|
handler.post(timeUpdater);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initEvent() {
|
||||||
|
viewBind.back.setOnClickListener(v -> finish());
|
||||||
|
viewBind.imPlayBtn.setOnClickListener(v -> {
|
||||||
|
viewBind.imPlayBtn.setSelected(!viewBind.imPlayBtn.isSelected());
|
||||||
|
try {
|
||||||
|
togglePrank();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e("SaveActivity", "Error toggling prank", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
viewBind.save.setOnClickListener(v -> {
|
||||||
|
String name = viewBind.saveEdit.getText().toString().trim();
|
||||||
|
boolean b = ObjectBoxMan.checkName(name);
|
||||||
|
if (!TextUtils.isEmpty(name)) {
|
||||||
|
if(!b){
|
||||||
|
viewBind.saveEdit.setText("");
|
||||||
|
Toast.makeText(AcSave.this, getString(R.string.name_hint), Toast.LENGTH_SHORT).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
saveData(name);
|
||||||
|
Toast.makeText(AcSave.this, getString(R.string.save_tips), Toast.LENGTH_SHORT).show();
|
||||||
|
finish();
|
||||||
|
} else {
|
||||||
|
Toast.makeText(AcSave.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)) {
|
||||||
|
PrankBean mydata = new PrankBean();
|
||||||
|
mydata.setLike(false);
|
||||||
|
mydata.setName(name);
|
||||||
|
mydata.setCustomization(true);
|
||||||
|
mydata.setAudioUrl(destinationFile.getAbsolutePath());
|
||||||
|
ObjectBoxMan.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();
|
||||||
|
|
||||||
|
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,76 @@
|
|||||||
|
package com.fun.wave.pranksounds.custom;
|
||||||
|
|
||||||
|
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.fun.wave.pranksounds.dataListener.ObjectBoxMan;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.PrankBean;
|
||||||
|
import com.fun.pranksounds.databinding.FragmentCustomBinding;
|
||||||
|
import com.fun.wave.pranksounds.like.AdapterLike;
|
||||||
|
import com.fun.wave.pranksounds.utils.MyItemSpace;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
public class FragmentCustom extends Fragment {
|
||||||
|
|
||||||
|
private FragmentCustomBinding binding;
|
||||||
|
private AdapterLike adapter;
|
||||||
|
public FragmentCustom() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FragmentCustom newInstance() {
|
||||||
|
FragmentCustom fragment = new FragmentCustom();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
binding = FragmentCustomBinding.inflate(getLayoutInflater());
|
||||||
|
MyItemSpace itemHelper = new MyItemSpace(7, 7, 7);
|
||||||
|
binding.recyclerImport.addItemDecoration(itemHelper);
|
||||||
|
binding.recyclerImport.setLayoutManager(new GridLayoutManager(requireContext(), 2));
|
||||||
|
List<PrankBean> all = ObjectBoxMan.getAllCustomization();
|
||||||
|
adapter = new AdapterLike(requireContext(), all, true);
|
||||||
|
updateEmpty(all);
|
||||||
|
binding.recyclerImport.setAdapter(adapter);
|
||||||
|
return binding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void refresh() {
|
||||||
|
if (adapter != null) {
|
||||||
|
List<PrankBean> all = ObjectBoxMan.getAllCustomization();
|
||||||
|
adapter.updateData(all);
|
||||||
|
updateEmpty(all);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
private void updateEmpty(List<PrankBean> data) {
|
||||||
|
if (data.isEmpty()) {
|
||||||
|
binding.layoutEmpty.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
binding.layoutEmpty.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,83 @@
|
|||||||
|
package com.fun.wave.pranksounds.dataListener;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.objectbox.Box;
|
||||||
|
import io.objectbox.BoxStore;
|
||||||
|
import io.objectbox.query.Query;
|
||||||
|
|
||||||
|
public class ObjectBoxMan {
|
||||||
|
|
||||||
|
private static BoxStore store;
|
||||||
|
|
||||||
|
public static void init(Context context) {
|
||||||
|
store = MyObjectBox.builder()
|
||||||
|
.androidContext(context)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Box<PrankBean> getBoxBean() {
|
||||||
|
return store.boxFor(PrankBean.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<PrankBean> getAllLike() {
|
||||||
|
Query<PrankBean> query = ObjectBoxMan.getBoxBean().query(PrankBean_.isLike.equal(true)).build();
|
||||||
|
List<PrankBean> data = query.find();
|
||||||
|
query.close();
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<PrankBean> getAllCustomization() {
|
||||||
|
Query<PrankBean> query = ObjectBoxMan.getBoxBean().query(PrankBean_.isCustomization.equal(true)).build();
|
||||||
|
List<PrankBean> data = query.find();
|
||||||
|
query.close();
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static List<PrankBean> getMore() {
|
||||||
|
Query<PrankBean> query = ObjectBoxMan.getBoxBean().query(PrankBean_.isCustomization.equal(false)).build();
|
||||||
|
List<PrankBean> data = query.find();
|
||||||
|
query.close();
|
||||||
|
Collections.shuffle(data);
|
||||||
|
return data.subList(0, 11);
|
||||||
|
}
|
||||||
|
public static boolean checkLike(PrankBean PrankBean) {
|
||||||
|
Query<PrankBean> query = ObjectBoxMan.getBoxBean().query(PrankBean_.name.equal(PrankBean.getName()).and(PrankBean_.isLike.equal(true))).build();
|
||||||
|
PrankBean data = query.findFirst();
|
||||||
|
query.close();
|
||||||
|
if (data != null) {
|
||||||
|
return data.isLike();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean checkName(String name) {
|
||||||
|
Query<PrankBean> query = ObjectBoxMan.getBoxBean().query(PrankBean_.name.equal(name)).build();
|
||||||
|
PrankBean data = query.findFirst();
|
||||||
|
query.close();
|
||||||
|
if (data != null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void addLike(PrankBean PrankBean) {
|
||||||
|
PrankBean.setLike(true);
|
||||||
|
ObjectBoxMan.getBoxBean().put(PrankBean);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeLike(PrankBean PrankBean) {
|
||||||
|
PrankBean.setLike(false);
|
||||||
|
ObjectBoxMan.getBoxBean().put(PrankBean);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
package com.fun.wave.pranksounds.dataListener;
|
||||||
|
|
||||||
|
public interface OnClickItemListener {
|
||||||
|
|
||||||
|
void onClickSoundsListener(PrankBean data);
|
||||||
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
package com.fun.wave.pranksounds.dataListener;
|
||||||
|
|
||||||
|
public interface OnClickTimerListener {
|
||||||
|
|
||||||
|
void onClickTimerListener(long time);
|
||||||
|
}
|
||||||
@ -0,0 +1,78 @@
|
|||||||
|
package com.fun.wave.pranksounds.dataListener;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import io.objectbox.annotation.Entity;
|
||||||
|
import io.objectbox.annotation.Id;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class PrankBean implements Serializable {
|
||||||
|
@Id
|
||||||
|
private long id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private String covert;
|
||||||
|
|
||||||
|
private String audioUrl;
|
||||||
|
private boolean isLike;
|
||||||
|
|
||||||
|
private boolean isCustomization;
|
||||||
|
private int colorIndex;
|
||||||
|
|
||||||
|
public int getColorIndex() {
|
||||||
|
return colorIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setColorIndex(int colorIndex) {
|
||||||
|
this.colorIndex = colorIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
package com.fun.wave.pranksounds.dataListener;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.objectbox.annotation.Entity;
|
||||||
|
import io.objectbox.annotation.Id;
|
||||||
|
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class SoundsWrapper implements Serializable {
|
||||||
|
@Id
|
||||||
|
private long id;
|
||||||
|
private String name;
|
||||||
|
private String covert;
|
||||||
|
|
||||||
|
private List<PrankBean> prankBeanList;
|
||||||
|
|
||||||
|
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<PrankBean> getPrankBeanList() {
|
||||||
|
return prankBeanList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInfoList(List<PrankBean> prankBeanList) {
|
||||||
|
this.prankBeanList = prankBeanList;
|
||||||
|
}
|
||||||
|
}
|
||||||
126
app/src/main/java/com/fun/wave/pranksounds/like/AdapterLike.java
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
package com.fun.wave.pranksounds.like;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.fun.wave.pranksounds.activity.AcPlayPranks;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.PrankBean;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.ObjectBoxMan;
|
||||||
|
import com.fun.wave.pranksounds.utils.MyUtils;
|
||||||
|
import com.fun.pranksounds.R;
|
||||||
|
import com.fun.pranksounds.databinding.LikeAdapterBinding;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
public class AdapterLike extends RecyclerView.Adapter<AdapterLike.ViewHolder> {
|
||||||
|
|
||||||
|
private List<PrankBean> mValues;
|
||||||
|
private Context mCOn;
|
||||||
|
private boolean showDelete = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public AdapterLike(Context context, List<PrankBean> items, boolean showDelete) {
|
||||||
|
mValues = items;
|
||||||
|
mCOn = context;
|
||||||
|
this.showDelete = showDelete;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateData(List<PrankBean> items) {
|
||||||
|
mValues = items;
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||||
|
|
||||||
|
return new ViewHolder(LikeAdapterBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||||
|
PrankBean PrankBean = mValues.get(position);
|
||||||
|
holder.vb.ttvName.setText(PrankBean.getName());
|
||||||
|
int colorIndex = PrankBean.getColorIndex();
|
||||||
|
holder.vb.layout.setBackground(ContextCompat.getDrawable(mCOn, MyUtils.childBgs[colorIndex]));
|
||||||
|
if (PrankBean.isCustomization()) {
|
||||||
|
Glide.with(mCOn).load(R.drawable.image_sounds).into(holder.vb.image);
|
||||||
|
} else {
|
||||||
|
Glide.with(mCOn).load(PrankBean.getCovert()).into(holder.vb.image);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showDelete) {
|
||||||
|
holder.vb.view.setVisibility(View.GONE);
|
||||||
|
if(mValues.size()%2==0){
|
||||||
|
if(position == mValues.size()-1||position == mValues.size()-2){
|
||||||
|
holder.vb.view.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
if (position == mValues.size() - 1) {
|
||||||
|
holder.vb.view.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
holder.vb.imDelete.setVisibility(View.VISIBLE);
|
||||||
|
holder.vb.imDelete.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
ObjectBoxMan.getBoxBean().remove(PrankBean);
|
||||||
|
String audioUrl = PrankBean.getAudioUrl();
|
||||||
|
int pos = holder.getBindingAdapterPosition();
|
||||||
|
mValues.remove(pos);
|
||||||
|
notifyItemRemoved(pos);
|
||||||
|
File file = new File(audioUrl);
|
||||||
|
if (file.exists()) {
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
holder.vb.imDelete.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
holder.vb.layout.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
Intent intent = new Intent(mCOn, AcPlayPranks.class);
|
||||||
|
intent.putExtra(MyUtils.KEY_PLAY_DATA, PrankBean);
|
||||||
|
intent.putExtra(MyUtils.KEY_LIST_COLOR_POS, colorIndex);
|
||||||
|
mCOn.startActivity(intent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return mValues.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
public LikeAdapterBinding vb;
|
||||||
|
|
||||||
|
public ViewHolder(LikeAdapterBinding binding) {
|
||||||
|
super(binding.getRoot());
|
||||||
|
vb = binding;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,86 @@
|
|||||||
|
package com.fun.wave.pranksounds.like;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
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.fun.wave.pranksounds.utils.MyItemSpace;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.ObjectBoxMan;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.PrankBean;
|
||||||
|
import com.fun.pranksounds.databinding.FragmentLikeBinding;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
public class FragmentLike extends Fragment {
|
||||||
|
|
||||||
|
private AdapterLike adapter;
|
||||||
|
|
||||||
|
public FragmentLike() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public static FragmentLike newInstance() {
|
||||||
|
FragmentLike fragment = new FragmentLike();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
}
|
||||||
|
|
||||||
|
private FragmentLikeBinding collectBinding;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
collectBinding = FragmentLikeBinding.inflate(getLayoutInflater());
|
||||||
|
RecyclerView recyclerView = collectBinding.list;
|
||||||
|
recyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2));
|
||||||
|
List<PrankBean> all = ObjectBoxMan.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 AdapterLike(requireContext(), all,false);
|
||||||
|
MyItemSpace itemHelper = new MyItemSpace(7, 7, 7);
|
||||||
|
recyclerView.addItemDecoration(itemHelper);
|
||||||
|
recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
|
return collectBinding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
Log.d("------------------","-------like--onResume");
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void refresh() {
|
||||||
|
if (adapter != null) {
|
||||||
|
List<PrankBean> all = ObjectBoxMan.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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,81 @@
|
|||||||
|
package com.fun.wave.pranksounds.main;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.fun.wave.pranksounds.activity.AcCategoryList;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.SoundsWrapper;
|
||||||
|
import com.fun.wave.pranksounds.utils.MyUtils;
|
||||||
|
import com.fun.pranksounds.databinding.MainAdapterBinding;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
public class AdapterMain extends RecyclerView.Adapter<AdapterMain.ViewHolder> {
|
||||||
|
|
||||||
|
private final List<SoundsWrapper> mValues;
|
||||||
|
|
||||||
|
private Context mCon;
|
||||||
|
|
||||||
|
|
||||||
|
public AdapterMain(Context context, List<SoundsWrapper> items) {
|
||||||
|
mValues = items;
|
||||||
|
this.mCon = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||||
|
|
||||||
|
return new ViewHolder(MainAdapterBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||||
|
int absoluteAdapterPosition = holder.getAbsoluteAdapterPosition();
|
||||||
|
int i = absoluteAdapterPosition % 6;
|
||||||
|
holder.vb.relative.setBackground(ContextCompat.getDrawable(mCon, MyUtils.bgs[i]));
|
||||||
|
SoundsWrapper soundsWrapper = mValues.get(absoluteAdapterPosition);
|
||||||
|
String covert = soundsWrapper.getCovert();
|
||||||
|
Glide.with(mCon).load(covert).into(holder.vb.image);
|
||||||
|
holder.vb.name.setText(soundsWrapper.getName());
|
||||||
|
holder.vb.relative.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
Intent intent = new Intent(mCon, AcCategoryList.class);
|
||||||
|
intent.putExtra(MyUtils.KEY_LIST_DATA, soundsWrapper);
|
||||||
|
intent.putExtra(MyUtils.KEY_LIST_COLOR_POS, i);
|
||||||
|
mCon.startActivity(intent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if(absoluteAdapterPosition == mValues.size()-1||absoluteAdapterPosition == mValues.size()-2){
|
||||||
|
holder.vb.view.setVisibility(View.VISIBLE);
|
||||||
|
}else {
|
||||||
|
holder.vb.view.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return mValues.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
private MainAdapterBinding vb;
|
||||||
|
|
||||||
|
public ViewHolder(MainAdapterBinding binding) {
|
||||||
|
super(binding.getRoot());
|
||||||
|
vb = binding;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
package com.fun.wave.pranksounds.main;
|
||||||
|
|
||||||
|
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.fun.wave.pranksounds.utils.App;
|
||||||
|
import com.fun.wave.pranksounds.utils.MyItemSpace;
|
||||||
|
import com.fun.pranksounds.databinding.FragmentMainBinding;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
|
||||||
|
public class FragmentMain extends Fragment {
|
||||||
|
|
||||||
|
|
||||||
|
private FragmentMainBinding binding;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public FragmentMain() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public static FragmentMain newInstance() {
|
||||||
|
FragmentMain fragment = new FragmentMain();
|
||||||
|
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 = FragmentMainBinding.inflate(inflater);
|
||||||
|
|
||||||
|
MyItemSpace itemHelper = new MyItemSpace(15, 15, 7);
|
||||||
|
binding.recyclerView.addItemDecoration(itemHelper);
|
||||||
|
binding.recyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2));
|
||||||
|
Collections.shuffle(App.bean);
|
||||||
|
binding.recyclerView.setAdapter(new AdapterMain(requireContext(), App.bean ));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return binding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
54
app/src/main/java/com/fun/wave/pranksounds/utils/App.java
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
package com.fun.wave.pranksounds.utils;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.res.AssetManager;
|
||||||
|
import android.graphics.Typeface;
|
||||||
|
|
||||||
|
import com.fun.wave.pranksounds.dataListener.SoundsWrapper;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.PrankBean;
|
||||||
|
|
||||||
|
import com.fun.wave.pranksounds.dataListener.ObjectBoxMan;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class App extends Application {
|
||||||
|
|
||||||
|
public static App app;
|
||||||
|
public static Typeface defaultFont;
|
||||||
|
public static List<SoundsWrapper> bean;
|
||||||
|
private List<PrankBean> prankBeanList;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
app = this;
|
||||||
|
AssetManager assets = getAssets();
|
||||||
|
defaultFont = Typeface.createFromAsset(assets, "pranks.ttf");
|
||||||
|
ObjectBoxMan.init(this);
|
||||||
|
if (bean != null)
|
||||||
|
return;
|
||||||
|
try {
|
||||||
|
prankBeanList = new ArrayList<>();
|
||||||
|
InputStream open = getAssets().open("prank.json");
|
||||||
|
String string = MyUtils.getString(open);
|
||||||
|
if (!string.isEmpty()) {
|
||||||
|
bean = MyUtils.getBean(string);
|
||||||
|
for (SoundsWrapper category:bean){
|
||||||
|
for (PrankBean prankBean1 : category.getPrankBeanList()) {
|
||||||
|
prankBean1.setLike(false);
|
||||||
|
prankBeanList.add(prankBean1);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Collections.shuffle(prankBeanList);
|
||||||
|
ObjectBoxMan.getBoxBean().put(prankBeanList);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,122 @@
|
|||||||
|
package com.`fun`.wave.pranksounds.utils
|
||||||
|
|
||||||
|
import android.animation.ValueAnimator
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Canvas
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.graphics.Paint
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.View
|
||||||
|
import androidx.core.animation.doOnEnd
|
||||||
|
|
||||||
|
class CustomRippleView @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? = null
|
||||||
|
) : View(context, attrs) {
|
||||||
|
|
||||||
|
private val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||||
|
color = Color.parseColor("#FFFFFF")
|
||||||
|
style = Paint.Style.FILL
|
||||||
|
}
|
||||||
|
|
||||||
|
private val ripples = mutableListOf<Ripple>()
|
||||||
|
private val maxRadius = 200f
|
||||||
|
private val rippleDuration = 1000L
|
||||||
|
private val rippleDelay = 300L
|
||||||
|
|
||||||
|
private var curisRunning = false
|
||||||
|
private var isPaused = false
|
||||||
|
|
||||||
|
private val rippleRunnable = object : Runnable {
|
||||||
|
override fun run() {
|
||||||
|
if (!curisRunning || isPaused) return
|
||||||
|
val ripple = Ripple()
|
||||||
|
ripples.add(ripple)
|
||||||
|
ripple.start()
|
||||||
|
postDelayed(this, rippleDelay)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun startRipple() {
|
||||||
|
if (curisRunning) return
|
||||||
|
curisRunning = true
|
||||||
|
isPaused = false
|
||||||
|
post(rippleRunnable)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun stopRipple() {
|
||||||
|
curisRunning = false
|
||||||
|
isPaused = false
|
||||||
|
removeCallbacks(rippleRunnable)
|
||||||
|
ripples.forEach { it.cancel() }
|
||||||
|
ripples.clear()
|
||||||
|
invalidate()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun pauseRipple() {
|
||||||
|
isPaused = true
|
||||||
|
ripples.forEach { it.pause() }
|
||||||
|
removeCallbacks(rippleRunnable)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun resumeRipple() {
|
||||||
|
if (!curisRunning || !isPaused) return
|
||||||
|
isPaused = false
|
||||||
|
ripples.forEach { it.resume() }
|
||||||
|
post(rippleRunnable)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDraw(canvas: Canvas) {
|
||||||
|
super.onDraw(canvas)
|
||||||
|
val centerX = width / 2f
|
||||||
|
val centerY = height / 2f
|
||||||
|
val iterator = ripples.iterator()
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
val ripple = iterator.next()
|
||||||
|
if (!ripple.isRunning) {
|
||||||
|
iterator.remove()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
paint.alpha = (255 * (1 - ripple.progress)).toInt()
|
||||||
|
canvas.drawCircle(centerX, centerY, maxRadius * ripple.progress, paint)
|
||||||
|
}
|
||||||
|
if (ripples.isNotEmpty()) invalidate()
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class Ripple {
|
||||||
|
var progress = 0f
|
||||||
|
var isRunning = true
|
||||||
|
private var animator: ValueAnimator? = null
|
||||||
|
|
||||||
|
fun start() {
|
||||||
|
animator = ValueAnimator.ofFloat(0f, 1f).apply {
|
||||||
|
duration = rippleDuration
|
||||||
|
addUpdateListener {
|
||||||
|
progress = it.animatedValue as Float
|
||||||
|
invalidate()
|
||||||
|
}
|
||||||
|
doOnEnd {
|
||||||
|
this@Ripple.isRunning = false
|
||||||
|
}
|
||||||
|
start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun pause() {
|
||||||
|
if (animator?.isRunning == true) {
|
||||||
|
animator?.pause()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun resume() {
|
||||||
|
if (animator?.isPaused == true) {
|
||||||
|
animator?.resume()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun cancel() {
|
||||||
|
animator?.cancel()
|
||||||
|
isRunning = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,74 @@
|
|||||||
|
package com.fun.wave.pranksounds.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;
|
||||||
|
|
||||||
|
|
||||||
|
public class MyItemSpace extends RecyclerView.ItemDecoration {
|
||||||
|
|
||||||
|
private int v, h, ex;
|
||||||
|
|
||||||
|
public MyItemSpace(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 = App.app.getResources().getDisplayMetrics().density;
|
||||||
|
return density * dpValue + 0.5f;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,122 @@
|
|||||||
|
package com.fun.wave.pranksounds.utils;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.media.MediaRecorder;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
|
||||||
|
public class MyRecorderUtils {
|
||||||
|
private MediaRecorder mediaRecorder;
|
||||||
|
private String tempFileName;
|
||||||
|
private boolean isRecording = false;
|
||||||
|
private boolean isPaused = false;
|
||||||
|
|
||||||
|
private long startTime = 0L;
|
||||||
|
private long pauseTime = 0L;
|
||||||
|
private long totalPauseTime = 0L;
|
||||||
|
|
||||||
|
|
||||||
|
private Runnable updateRunnable;
|
||||||
|
private Handler mHandler;
|
||||||
|
public MyRecorderUtils(Context context, Handler handler,OnUpdateRecordingTime listener) {
|
||||||
|
mHandler = handler;
|
||||||
|
File dir = context.getCacheDir();
|
||||||
|
File file = new File(dir, "temp_audio.mp3");
|
||||||
|
tempFileName = file.getAbsolutePath();
|
||||||
|
updateRunnable = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (!isRecording || isPaused) return;
|
||||||
|
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
|
long recordTime = currentTime - startTime - totalPauseTime;
|
||||||
|
listener.onUpdateTime(recordTime);
|
||||||
|
handler.postDelayed(updateRunnable, 1000);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
public void startTimer() {
|
||||||
|
startTime = System.currentTimeMillis();
|
||||||
|
totalPauseTime = 0L;
|
||||||
|
isRecording = true;
|
||||||
|
isPaused = false;
|
||||||
|
mHandler.post(updateRunnable);
|
||||||
|
}
|
||||||
|
public void pauseTimer() {
|
||||||
|
pauseTime = System.currentTimeMillis();
|
||||||
|
isPaused = true;
|
||||||
|
isRecording = false;
|
||||||
|
}
|
||||||
|
public void resumeTimer() {
|
||||||
|
totalPauseTime += System.currentTimeMillis() - pauseTime;
|
||||||
|
isPaused = false;
|
||||||
|
isRecording = true;
|
||||||
|
mHandler.post(updateRunnable);
|
||||||
|
}
|
||||||
|
public void stopTimer() {
|
||||||
|
isRecording = false;
|
||||||
|
isPaused = false;
|
||||||
|
mHandler.removeCallbacks(updateRunnable);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean isRecording() {
|
||||||
|
return isRecording;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
Log.d("================","=========startRecording");
|
||||||
|
try {
|
||||||
|
mediaRecorder.prepare();
|
||||||
|
mediaRecorder.start();
|
||||||
|
startTimer();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void resumeRecording() {
|
||||||
|
if (!isRecording && isPaused) {
|
||||||
|
mediaRecorder.resume();
|
||||||
|
Log.d("================","=========resume");
|
||||||
|
resumeTimer();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public void pauseRecording() {
|
||||||
|
if (isRecording && !isPaused) {
|
||||||
|
Log.d("================","=========pauseRecording");
|
||||||
|
mediaRecorder.pause();
|
||||||
|
pauseTimer();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopRecording() {
|
||||||
|
if (!isRecording) return;
|
||||||
|
try {
|
||||||
|
Log.d("================","=========stopRecording");
|
||||||
|
mediaRecorder.stop();
|
||||||
|
} catch (IllegalStateException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
stopTimer();
|
||||||
|
mediaRecorder.release();
|
||||||
|
mediaRecorder = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTempFileName() {
|
||||||
|
return tempFileName;
|
||||||
|
}
|
||||||
|
}
|
||||||
35
app/src/main/java/com/fun/wave/pranksounds/utils/MyTv.java
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package com.fun.wave.pranksounds.utils;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.fun.pranksounds.R;
|
||||||
|
|
||||||
|
|
||||||
|
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){
|
||||||
|
MyUtils.initFont(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedArray.recycle();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
172
app/src/main/java/com/fun/wave/pranksounds/utils/MyUtils.java
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
package com.fun.wave.pranksounds.utils;
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
|
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.fun.wave.pranksounds.dataListener.PrankBean;
|
||||||
|
import com.fun.wave.pranksounds.dataListener.SoundsWrapper;
|
||||||
|
import com.fun.pranksounds.R;
|
||||||
|
|
||||||
|
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 MyUtils {
|
||||||
|
|
||||||
|
public static int[] bgs = new int[]{R.drawable.main_item_bg,R.drawable.main_item_bg,R.drawable.main_item_bg,R.drawable.main_item_bg,
|
||||||
|
R.drawable.main_item_bg,R.drawable.main_item_bg};
|
||||||
|
|
||||||
|
public static int[] childBgs = new int[]{R.drawable.main_item_bg,R.drawable.main_item_bg,R.drawable.main_item_bg,R.drawable.main_item_bg,
|
||||||
|
R.drawable.main_item_bg,R.drawable.main_item_bg};
|
||||||
|
|
||||||
|
|
||||||
|
public static final String KEY_LIST_COLOR_POS = "list_page_color_pos";
|
||||||
|
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 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};
|
||||||
|
|
||||||
|
|
||||||
|
public static void initFont(TextView tv) {
|
||||||
|
tv.setTypeface(App.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);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStartTrackingTouch(SeekBar seekBar) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
public static List<SoundsWrapper> getBean(String str) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
List<SoundsWrapper> data = new ArrayList<SoundsWrapper>();
|
||||||
|
JSONArray jsonArray = new JSONArray(str);
|
||||||
|
|
||||||
|
for (int i = 0; i < jsonArray.length(); i++) {
|
||||||
|
JSONObject it = jsonArray.getJSONObject(i);
|
||||||
|
JSONArray listArray = it.getJSONArray("list");
|
||||||
|
List<PrankBean> list = new ArrayList<>();
|
||||||
|
for (int k = 0; k < listArray.length(); k++) {
|
||||||
|
JSONObject listBean = listArray.getJSONObject(k);
|
||||||
|
PrankBean PrankBean = new PrankBean();
|
||||||
|
PrankBean.setAudioUrl(listBean.getString("mp3Url"));
|
||||||
|
PrankBean.setCovert(listBean.getString("preUrl"));
|
||||||
|
PrankBean.setName(listBean.getString("title"));
|
||||||
|
list.add(PrankBean);
|
||||||
|
}
|
||||||
|
|
||||||
|
SoundsWrapper newBean = new SoundsWrapper();
|
||||||
|
newBean.setCovert(it.getString("categoryUrl"));
|
||||||
|
newBean.setInfoList(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 float dpToPx(float dpValue) {
|
||||||
|
float density = App.app.getResources().getDisplayMetrics().density;
|
||||||
|
return density * dpValue + 0.5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
package com.fun.wave.pranksounds.utils;
|
||||||
|
|
||||||
|
public interface OnUpdateRecordingTime {
|
||||||
|
|
||||||
|
void onUpdateTime(long time);
|
||||||
|
}
|
||||||
103
app/src/main/java/com/fun/wave/pranksounds/utils/PopupClock.java
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
package com.fun.wave.pranksounds.utils;
|
||||||
|
|
||||||
|
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.fun.wave.pranksounds.dataListener.OnClickTimerListener;
|
||||||
|
import com.fun.pranksounds.databinding.PopupClockBinding;
|
||||||
|
|
||||||
|
public class PopupClock implements View.OnClickListener {
|
||||||
|
private PopupClockBinding binding;
|
||||||
|
private PopupWindow popupWindow;
|
||||||
|
private OnClickTimerListener mListener;
|
||||||
|
|
||||||
|
public PopupClock(Activity context, OnClickTimerListener listener) {
|
||||||
|
mListener = listener;
|
||||||
|
binding = PopupClockBinding.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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
5
app/src/main/res/color/seletor_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/color_CECECE" android:state_selected="false"/>
|
||||||
|
<item android:color="@color/color_FA6502" android:state_selected="true"/>
|
||||||
|
</selector>
|
||||||
BIN
app/src/main/res/drawable/background.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
27
app/src/main/res/drawable/btn_record.xml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item>
|
||||||
|
<shape android:shape="oval">
|
||||||
|
<size
|
||||||
|
android:width="48dp"
|
||||||
|
android:height="48dp" />
|
||||||
|
<solid android:color="#07377B" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<item
|
||||||
|
android:width="20dp"
|
||||||
|
android:height="20dp"
|
||||||
|
android:gravity="center">
|
||||||
|
|
||||||
|
<shape android:shape="oval">
|
||||||
|
<stroke
|
||||||
|
android:width="2dp"
|
||||||
|
android:color="#FFFFFF" />
|
||||||
|
<solid android:color="@android:color/transparent" />
|
||||||
|
</shape>
|
||||||
|
|
||||||
|
</item>
|
||||||
|
|
||||||
|
</layer-list>
|
||||||
|
|
||||||
|
|
||||||
9
app/src/main/res/drawable/drawable_back_00.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>
|
||||||
10
app/src/main/res/drawable/drawable_bg_btn.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<corners android:radius="10dp" />
|
||||||
|
<gradient
|
||||||
|
android:angle="135"
|
||||||
|
android:endColor="@color/color_EDB7C1"
|
||||||
|
android:startColor="@color/color_FDE38E" />
|
||||||
|
|
||||||
|
</shape>
|
||||||
9
app/src/main/res/drawable/drawable_bg_edittext.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="8dp" />
|
||||||
|
<stroke
|
||||||
|
android:width="2dp"
|
||||||
|
android:color="@color/color_07377B" />
|
||||||
|
|
||||||
|
</shape>
|
||||||
8
app/src/main/res/drawable/drawable_bg_timer.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="rectangle">
|
||||||
|
<corners android:radius="10dp" />
|
||||||
|
<solid android:color="@color/white" />
|
||||||
|
|
||||||
|
|
||||||
|
</shape>
|
||||||
12
app/src/main/res/drawable/drawable_delete.xml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<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="M1009.2,513.5C1009.2,236 788.5,15.4 511,15.4 233.5,15.4 13.3,236 13.3,513.5c0,277.5 220.7,498.2 498.2,498.2 277,0 497.7,-220.7 497.7,-498.2zM1009.2,513.5"
|
||||||
|
android:fillColor="@color/color_FA666B"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M719.9,627.7l-114.2,-114.2L719.9,399.4c29.2,-29.2 29.2,-58.9 0,-88.1l-6.7,-6.7c-29.2,-29.2 -58.9,-29.2 -88.1,0L511,418.8 397.3,304.6c-29.2,-29.2 -58.9,-29.2 -88.1,0L302.1,311.3c-29.2,29.2 -29.2,58.9 0,88.1l114.2,114.2L302.1,627.7c-29.2,29.2 -29.2,58.9 0,88.1l6.7,6.7c29.2,29.2 58.9,29.2 88.1,0l114.2,-114.2 114.2,114.2c29.2,29.2 58.9,29.2 88.1,0l6.7,-6.7c29.2,-29.7 29.2,-58.9 0,-88.1z"
|
||||||
|
android:fillColor="#FFFFFF"/>
|
||||||
|
</vector>
|
||||||
57
app/src/main/res/drawable/drawable_image_empty.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="@color/color_cccccc"/>
|
||||||
|
<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="@color/color_cccccc"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M490.6,557.6l-254.9,-70.6 254.9,-123.4zM490.6,557.6"
|
||||||
|
android:fillColor="@color/color_cccccc"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M878.6,618.5l-74.8,-152.5v132.3zM878.6,618.5"
|
||||||
|
android:fillColor="@color/color_cccccc"/>
|
||||||
|
<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="@color/color_cccccc"/>
|
||||||
|
<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="@color/color_cccccc"/>
|
||||||
|
<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="@color/color_cccccc"/>
|
||||||
|
<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>
|
||||||
17
app/src/main/res/drawable/drawable_layer_sounds.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/color_7B7B7C" />
|
||||||
|
<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>
|
||||||
9
app/src/main/res/drawable/drawable_loop_0.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/color_FA6502"
|
||||||
|
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/drawable_loop_1.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/color_7B7B7C"
|
||||||
|
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>
|
||||||
6
app/src/main/res/drawable/drawable_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/drawable_loop_1" android:state_selected="false" />
|
||||||
|
<item android:drawable="@drawable/drawable_loop_0" android:state_selected="true" />
|
||||||
|
|
||||||
|
</selector>
|
||||||
16
app/src/main/res/drawable/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/color_FA6502"/>
|
||||||
|
<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="@color/white" />
|
||||||
|
<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="@color/white"/>
|
||||||
|
</vector>
|
||||||
12
app/src/main/res/drawable/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/color_FA6502"/>
|
||||||
|
<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="@color/white"/>
|
||||||
|
</vector>
|
||||||
15
app/src/main/res/drawable/drawable_play_like_0.xml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<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="M510.4,298.9C394.7,30.2 65.6,92.9 63.4,404.8c-1.3,180.3 434.6,455.2 447.7,499.8 11.9,-46.3 448,-322.6 446.7,-501.7 -2.2,-312.7 -337,-362.1 -447.4,-104z"
|
||||||
|
android:fillColor="@color/color_7B7B7C"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M425.2,824.7c39.9,47.1 82.4,67.9 86,80 11.9,-46.3 448,-322.6 446.7,-501.7 -0.7,-101 -36.1,-174.5 -87.4,-219C762.9,90.4 275.6,538.5 425.2,824.7z"
|
||||||
|
android:fillColor="@color/color_7B7B7C"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M511.1,904.6c8.6,-47 448,-322.6 446.7,-501.7 -0.3,-50.5 -9.4,-94.1 -24.7,-130.7S355.8,729.6 511.1,904.6z"
|
||||||
|
android:fillColor="@color/color_7B7B7C"/>
|
||||||
|
</vector>
|
||||||
15
app/src/main/res/drawable/drawable_red_like.xml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<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="M510.4,298.9C394.7,30.2 65.6,92.9 63.4,404.8c-1.3,180.3 434.6,455.2 447.7,499.8 11.9,-46.3 448,-322.6 446.7,-501.7 -2.2,-312.7 -337,-362.1 -447.4,-104z"
|
||||||
|
android:fillColor="@color/color_D6242A"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M425.2,824.7c39.9,47.1 82.4,67.9 86,80 11.9,-46.3 448,-322.6 446.7,-501.7 -0.7,-101 -36.1,-174.5 -87.4,-219C762.9,90.4 275.6,538.5 425.2,824.7z"
|
||||||
|
android:fillColor="@color/color_D6242A"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M511.1,904.6c8.6,-47 448,-322.6 446.7,-501.7 -0.3,-50.5 -9.4,-94.1 -24.7,-130.7S355.8,729.6 511.1,904.6z"
|
||||||
|
android:fillColor="@color/color_D6242A"/>
|
||||||
|
</vector>
|
||||||
8
app/src/main/res/drawable/drawable_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>
|
||||||
12
app/src/main/res/drawable/drawable_timer_1.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/color_FA6502"
|
||||||
|
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/color_FA6502"
|
||||||
|
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/drawable_volume_white.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="@color/white"/>
|
||||||
|
</vector>
|
||||||
18
app/src/main/res/drawable/drawable_welcome_pb.xml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<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/color_7B7B7C" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<item android:id="@android:id/progress">
|
||||||
|
<clip>
|
||||||
|
<shape>
|
||||||
|
<corners android:radius="20dp" />
|
||||||
|
<solid android:color="@color/white"/>
|
||||||
|
|
||||||
|
</shape>
|
||||||
|
</clip>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
||||||
15
app/src/main/res/drawable/icon_import.xml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<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="M84.1,181.9c0,-15 12.2,-27.2 27.2,-27.2h235.9c7.4,0 14.5,3 19.6,8.4l50.2,52.3a156.2,156.2 0,0 0,112.7 48h410.3c15,0 27.2,12.2 27.2,27.2V840.8a27.2,27.2 0,0 1,-27.2 27.2H111.2a27.2,27.2 0,0 1,-27.2 -27.2V181.9z"
|
||||||
|
android:fillColor="#FFD7AA"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M56.9,209.1c0,-15 12.2,-27.1 27.2,-27.1h235.9c7.4,0 14.5,3 19.6,8.3l50.2,52.3a156.2,156.2 0,0 0,112.7 48H912.8c15,0 27.2,12.1 27.2,27.2v550.2a27.2,27.2 0,0 1,-27.2 27.2H84.1A27.2,27.2 0,0 1,56.9 868V209.1z"
|
||||||
|
android:fillColor="#FFA440"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M288.1,555l161.6,-154.7v96.6h105.6c64.4,0 261.4,86.1 110.7,308 36,-181.4 -105.6,-187.9 -105.6,-187.9h-110.8v101.8l-161.6,-163.8z"
|
||||||
|
android:fillColor="#FFFFFF"/>
|
||||||
|
</vector>
|
||||||
9
app/src/main/res/drawable/icon_pause.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="256dp"
|
||||||
|
android:height="256dp"
|
||||||
|
android:viewportWidth="1024"
|
||||||
|
android:viewportHeight="1024">
|
||||||
|
<path
|
||||||
|
android:fillColor="@color/white"
|
||||||
|
android:pathData="M269,114.3c73.2,0 132.6,59.3 132.6,132.6v530.2c0,73.2 -59.3,132.6 -132.6,132.6s-132.6,-59.3 -132.6,-132.6L136.4,246.9c0,-73.2 59.3,-132.6 132.6,-132.6zM755,114.3c73.2,0 132.6,59.3 132.6,132.6v530.2c0,73.2 -59.3,132.6 -132.6,132.6s-132.6,-59.3 -132.6,-132.6L622.5,246.9c0,-73.2 59.3,-132.6 132.6,-132.6z"/>
|
||||||
|
</vector>
|
||||||
9
app/src/main/res/drawable/icon_play.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="256dp"
|
||||||
|
android:height="256dp"
|
||||||
|
android:viewportWidth="1024"
|
||||||
|
android:viewportHeight="1024">
|
||||||
|
<path
|
||||||
|
android:fillColor="@color/white"
|
||||||
|
android:pathData="M897.1,597.1l-464.6,311.5c-47,31.5 -110.6,18.9 -142.1,-28A102.4,102.4 0,0 1,273.1 823.5V200.5c0,-56.6 45.8,-102.4 102.4,-102.4a102.4,102.4 0,0 1,57 17.3l464.6,311.5c47,31.5 59.5,95.1 28,142.1a102.4,102.4 0,0 1,-28 28z"/>
|
||||||
|
</vector>
|
||||||
18
app/src/main/res/drawable/icon_record.xml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="257.3dp"
|
||||||
|
android:height="256dp"
|
||||||
|
android:viewportWidth="1029"
|
||||||
|
android:viewportHeight="1024">
|
||||||
|
<path
|
||||||
|
android:pathData="M515.3,1024C232,1024 1.7,793.7 0,510.3h33.1c0,265.1 215.4,480.5 482.2,480.5 21.5,0 41.4,-1.7 63,-3.3 263.5,-34.8 447.4,-276.7 412.6,-540.2C961,230.3 792,61.3 575,33.1l5,-33.1c281.7,34.8 480.5,291.6 445.7,573.3 -29.8,232 -212.1,415.9 -444.1,445.7 -21.5,3.3 -44.7,5 -66.3,5z"
|
||||||
|
android:fillColor="#1B47A4"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M480.5,825.2v-119.3c0,-8.3 11.6,-14.9 24.9,-14.9s24.9,6.6 24.9,14.9v119.3c0,8.3 -11.6,14.9 -24.9,14.9s-24.9,-6.6 -24.9,-14.9z"
|
||||||
|
android:fillColor="#1B47A4"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M502.1,633c-72.9,0 -130.9,-54.7 -130.9,-121V299.9c0,-66.3 58,-121 130.9,-121h3.3c72.9,0 130.9,54.7 130.9,121V513.7c0,66.3 -58,121 -130.9,121h-3.3z"
|
||||||
|
android:fillColor="#1B47A4"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M502.1,722.4c-61.3,0 -117.6,-21.5 -160.7,-61.3 -43.1,-39.8 -66.3,-92.8 -66.3,-149.1 0,-11.6 11.6,-23.2 24.9,-23.2s24.9,9.9 24.9,23.2c0,44.7 18.2,86.2 53,116 33.1,31.5 79.5,48.1 125.9,48.1h3.3c48.1,0 92.8,-16.6 125.9,-48.1s53,-72.9 53,-116c0,-11.6 11.6,-23.2 24.9,-23.2s24.9,9.9 24.9,23.2c0,56.3 -23.2,109.4 -66.3,149.1 -43.1,39.8 -99.4,61.3 -160.7,61.3h-6.6z"
|
||||||
|
android:fillColor="#1B47A4"/>
|
||||||
|
</vector>
|
||||||
9
app/src/main/res/drawable/image_sounds.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<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="M885.3,256L138.7,256a53.4,53.4 0,0 0,-53.3 53.3v576a53.4,53.4 0,0 0,53.3 53.3h746.7a53.4,53.4 0,0 0,53.3 -53.3L938.7,309.3a53.4,53.4 0,0 0,-53.3 -53.3zM624.8,596.4a21.3,21.3 0,0 1,-26.6 -14.2C593.3,566 586.2,552 577.5,541.8a64.2,64.2 0,0 0,-13.3 -12,21.5 21.5,0 0,1 -3,-2.4q-3.4,-3.2 -6.6,-6.8L554.6,725.3c0,23.6 -12.2,46.3 -33.5,62.3C501.3,802.5 475.4,810.7 448,810.7s-53.3,-8.2 -73.1,-23c-21.3,-16 -33.5,-38.7 -33.5,-62.3s12.2,-46.3 33.5,-62.3C394.7,648.2 420.6,640 448,640c23.3,0 45.7,5.9 64,16.9L512,405.3a21.3,21.3 0,0 1,20.8 -21.3h0.6a21.3,21.3 0,0 1,21.3 20.2c0.7,14.1 3.5,35.5 12.6,56.8 5.8,13.8 13.5,25.6 22.4,34.4a107.5,107.5 0,0 1,20.5 18.8c12.6,14.9 22.4,33.6 29,55.6a21.3,21.3 0,0 1,-14.3 26.6zM512,725.3c0,23.1 -29.3,42.7 -64,42.7s-64,-19.5 -64,-42.7 29.3,-42.7 64,-42.7 64,19.5 64,42.7zM170.7,106.7a21.3,21.3 0,0 1,21.3 -21.3h640a21.3,21.3 0,0 1,0 42.7L192,128a21.3,21.3 0,0 1,-21.3 -21.3zM128,192a21.3,21.3 0,0 1,21.3 -21.3h725.3a21.3,21.3 0,0 1,0 42.7L149.3,213.3a21.3,21.3 0,0 1,-21.3 -21.3z"
|
||||||
|
android:fillColor="@color/color_tab_image"/>
|
||||||
|
</vector>
|
||||||
14
app/src/main/res/drawable/main_item_bg.xml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="900dp"
|
||||||
|
android:height="600dp"
|
||||||
|
android:viewportWidth="900"
|
||||||
|
android:viewportHeight="600">
|
||||||
|
<path
|
||||||
|
android:pathData="M0,0h900v600h-900z"
|
||||||
|
android:fillColor="#ffffff"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M0,491L25,471.3C50,451.7 100,412.3 150,420.5C200,428.7 250,484.3 300,500.7C350,517 400,494 450,460C500,426 550,381 600,353C650,325 700,314 750,348.7C800,383.3 850,463.7 875,503.8L900,544L900,601L875,601C850,601 800,601 750,601C700,601 650,601 600,601C550,601 500,601 450,601C400,601 350,601 300,601C250,601 200,601 150,601C100,601 50,601 25,601L0,601Z"
|
||||||
|
android:strokeLineJoin="miter"
|
||||||
|
android:fillColor="@color/color_07377B"
|
||||||
|
android:strokeLineCap="round"/>
|
||||||
|
</vector>
|
||||||
16
app/src/main/res/drawable/selector_home_button.xml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:state_pressed="true">
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<corners android:radius="10dp" />
|
||||||
|
<solid android:color="@color/color_07377B" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<item android:state_pressed="false">
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<corners android:radius="10dp" />
|
||||||
|
<stroke android:width="2dp" android:color="@color/color_07377B" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
</selector>
|
||||||
6
app/src/main/res/drawable/selector_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/drawable_play_like_0" android:state_selected="false" />
|
||||||
|
<item android:drawable="@drawable/drawable_red_like" android:state_selected="true" />
|
||||||
|
|
||||||
|
</selector>
|
||||||
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:drawable="@drawable/drawable_play" android:state_selected="false" />
|
||||||
|
<item android:drawable="@drawable/drawable_pause" android:state_selected="true" />
|
||||||
|
|
||||||
|
</selector>
|
||||||
6
app/src/main/res/drawable/selector_recording_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/icon_pause" android:state_selected="true" />
|
||||||
|
<item android:drawable="@drawable/icon_play" android:state_selected="false" />
|
||||||
|
</selector>
|
||||||
21
app/src/main/res/drawable/tab_collection.xml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<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="M512,512m-512,0a512,512 0,1 0,1024 0,512 512,0 1,0 -1024,0Z"
|
||||||
|
android:fillColor="@color/color_tab_image"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M140.5,242a46.6,101.7 29.8,1 0,80.8 46.2,46.6 101.7,29.8 1,0 -80.8,-46.2Z"
|
||||||
|
android:fillColor="#FFFFFF"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M93.5,431.9m-22.3,0a22.3,22.3 0,1 0,44.5 0,22.3 22.3,0 1,0 -44.5,0Z"
|
||||||
|
android:fillColor="#FFFFFF"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M832.6,857a24.5,24.5 0,1 0,0 -49,24.5 24.5,0 0,0 0,49zM832.6,881.5a49,49 0,1 0,0 -97.9,49 49,0 0,0 0,97.9z"
|
||||||
|
android:fillColor="#FFFFFF"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M213.7,430.9c0,-39.7 10.5,-78.4 30.1,-111.3 19.6,-32.9 47.4,-58.4 79.9,-73.4 32.5,-14.9 68.2,-18.6 102.6,-10.4 34.3,8.1 65.7,27.7 90.2,56.1 24.5,-28.4 55.9,-48 90.2,-56.1 34.3,-8.1 70,-4.5 102.6,10.4 32.5,14.9 60.3,40.5 79.9,73.4C808.7,352.4 819.2,391.2 819.2,430.9c0.1,31.1 -6.3,61.9 -18.7,89.7 -12.4,27.8 -30.4,51.9 -52.6,70.4l-199.5,185.9c-11.1,10.3 -25.1,15.9 -39.5,15.6 -14.4,-0.3 -28.2,-6.3 -39,-17L275.5,582.4c-19.4,-18.7 -35,-41.9 -45.7,-68.1A221,221 0,0 1,213.7 430.9z"
|
||||||
|
android:fillColor="#FFFFFF"/>
|
||||||
|
</vector>
|
||||||
9
app/src/main/res/drawable/tab_mine.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<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="M760.7,833.8h-58.5a14.6,14.6 0,1 0,0 29.3h58.5v58.5a14.6,14.6 0,1 0,29.3 0v-58.5h58.5a14.6,14.6 0,1 0,0 -29.3h-58.5v-58.5a14.6,14.6 0,1 0,-29.3 0v58.5ZM749,702.2L980.1,702.2a29.3,29.3 0,0 1,29.3 29.3v263.3a29.3,29.3 0,0 1,-29.3 29.3L570.5,1024a29.3,29.3 0,0 1,-29.3 -29.3L541.3,658.3a14.6,14.6 0,0 1,14.6 -14.6h132.2a29.3,29.3 0,0 1,22.8 11L749,702.2ZM766,672.9l-40.4,-48.1a29.3,29.3 0,0 0,-22.4 -10.4L541.3,614.4a29.3,29.3 0,0 0,-29.3 29.3v373.9c0,3.5 -2.9,6.4 -6.4,6.4L58.5,1024A43.9,43.9 0,0 1,14.6 980.1c0,-202.3 124.5,-375.6 301,-447.3A292.3,292.3 0,0 1,190.2 292.6C190.2,131 321.2,0 482.7,0s292.6,131 292.6,292.6a292.1,292.1 0,0 1,-115.4 232.9A483.7,483.7 0,0 1,869.8 672.9h-103.9Z"
|
||||||
|
android:fillColor="@color/color_tab_image"/>
|
||||||
|
</vector>
|
||||||
9
app/src/main/res/drawable/tab_prank.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<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="M854.7,410c-19.6,-298.5 -130.1,-262.5 -130.1,-262.5s-148.5,183.9 -494.4,200v258s147,7.5 242.6,34.5 159.8,42.2 247,117c0,0 156.8,-12.7 134.9,-347zM97.8,351.9h94.5v251.7L97.8,603.6zM429.5,767.8c-37,-44.7 -48.3,-102.3 -48.3,-102.3h-88.7c0,91.5 82.6,207 100.1,230.2 17.5,23.2 39.4,12.8 89.7,0 50.2,-12.8 9.4,-63.9 9.4,-63.9s-25.2,-19.3 -62.2,-64z"
|
||||||
|
android:fillColor="@color/color_tab_image"/>
|
||||||
|
</vector>
|
||||||
BIN
app/src/main/res/drawable/welcome_icon.png
Normal file
|
After Width: | Height: | Size: 348 KiB |
47
app/src/main/res/layout/ac_category_list.xml
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:background="@drawable/background"
|
||||||
|
tools:context="com.fun.pranksounds.com.fun.wave.pranksounds.activity.AcCategoryList">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/title_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingBottom="2dp"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/category_name"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:text="@string/app_name"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="18sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/back"
|
||||||
|
android:layout_width="45dp"
|
||||||
|
android:layout_height="45dp"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:src="@drawable/drawable_back_00" />
|
||||||
|
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/list_recycler"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
98
app/src/main/res/layout/ac_main.xml
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@drawable/background"
|
||||||
|
tools:context="com.fun.pranksounds.com.fun.wave.pranksounds.activity.AcMain">
|
||||||
|
|
||||||
|
<androidx.viewpager2.widget.ViewPager2
|
||||||
|
android:id="@+id/vp2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
app:layout_constraintBottom_toTopOf="@id/import_layout"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
app:layout_constraintVertical_bias="1.0"
|
||||||
|
tools:layout_editor_absoluteX="16dp" />
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/import_layout"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="80dp"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:background="@drawable/selector_home_button"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingVertical="8dp"
|
||||||
|
app:layout_constraintBottom_toTopOf="@id/bottom_tab"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toLeftOf="@id/record_layout">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="45dp"
|
||||||
|
android:layout_height="45dp"
|
||||||
|
android:src="@drawable/icon_import" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:shadowColor="@color/text_shadow"
|
||||||
|
android:shadowDx="0"
|
||||||
|
android:shadowDy="1"
|
||||||
|
android:shadowRadius="3"
|
||||||
|
android:text="@string/import_audio" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/record_layout"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="10dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:background="@drawable/selector_home_button"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingVertical="8dp"
|
||||||
|
app:layout_constraintLeft_toRightOf="@id/import_layout"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/import_layout">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="45dp"
|
||||||
|
android:layout_height="45dp"
|
||||||
|
android:src="@drawable/icon_record" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:shadowColor="@color/text_shadow"
|
||||||
|
android:shadowDx="0"
|
||||||
|
android:shadowDy="1"
|
||||||
|
android:shadowRadius="3"
|
||||||
|
android:text="@string/recording_audio" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="1dp"
|
||||||
|
android:background="@color/main_gray"
|
||||||
|
app:layout_constraintBottom_toTopOf="@id/bottom_tab" />
|
||||||
|
|
||||||
|
<com.google.android.material.tabs.TabLayout
|
||||||
|
android:id="@+id/bottom_tab"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
app:tabBackground="@color/white"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:tabIndicatorHeight="0dp"
|
||||||
|
app:elevation="0dp"
|
||||||
|
app:tabInlineLabel="false"
|
||||||
|
app:tabPadding="0dp" />
|
||||||
|
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
205
app/src/main/res/layout/ac_play_pranks.xml
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/constraint_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@drawable/background"
|
||||||
|
tools:context="com.fun.pranksounds.com.fun.wave.pranksounds.activity.AcPlayPranks">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/title_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/name"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:text="@string/app_name"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="18sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/back"
|
||||||
|
android:layout_width="45dp"
|
||||||
|
android:layout_height="45dp"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:src="@drawable/drawable_back_00" />
|
||||||
|
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/linear_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_marginTop="15dp"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:orientation="vertical"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/title_layout">
|
||||||
|
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/image"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="250dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:src="@mipmap/ic_launcher" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/play_parent"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/play_loading"
|
||||||
|
android:layout_width="34dp"
|
||||||
|
android:layout_height="34dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:indeterminateTint="@color/white" />
|
||||||
|
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/btn_play"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center">
|
||||||
|
|
||||||
|
<com.fun.pranksounds.utils.CustomRippleView
|
||||||
|
android:id="@+id/rippleView"
|
||||||
|
android:layout_width="150dp"
|
||||||
|
android:layout_height="150dp" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="62dp"
|
||||||
|
android:layout_height="62dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:src="@drawable/selector_play" />
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="30dp"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/play_parent">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/im_timer"
|
||||||
|
android:layout_width="40dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:layout_marginStart="66dp"
|
||||||
|
android:layout_marginEnd="15dp"
|
||||||
|
android:padding="4dp"
|
||||||
|
android:src="@drawable/drawable_timer_1"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/im_loop"
|
||||||
|
android:layout_width="40dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:layout_marginStart="15dp"
|
||||||
|
android:padding="2dp"
|
||||||
|
android:src="@drawable/drawable_looper"
|
||||||
|
app:layout_constraintLeft_toRightOf="@id/im_timer"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/im_timer" />
|
||||||
|
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/im_like"
|
||||||
|
android:layout_width="40dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:layout_marginStart="15dp"
|
||||||
|
android:padding="5dp"
|
||||||
|
android:src="@drawable/selector_like"
|
||||||
|
app:layout_constraintLeft_toRightOf="@id/im_loop"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/im_timer" />
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/layout_volume"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="52dp"
|
||||||
|
android:layout_marginStart="20dp"
|
||||||
|
android:layout_marginEnd="20dp"
|
||||||
|
android:paddingStart="10dp"
|
||||||
|
android:paddingEnd="10dp"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/im_timer">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/im"
|
||||||
|
android:layout_width="22dp"
|
||||||
|
android:layout_height="22dp"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:src="@drawable/drawable_volume_white" />
|
||||||
|
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/seekbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_toEndOf="@id/im"
|
||||||
|
android:maxHeight="5dp"
|
||||||
|
android:progress="10"
|
||||||
|
android:progressDrawable="@drawable/drawable_layer_sounds"
|
||||||
|
android:thumb="@drawable/drawable_thumb" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/more_title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:layout_marginStart="15dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:text="@string/recommendation"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="14sp"
|
||||||
|
app:apply_font="true"
|
||||||
|
app:layout_constraintBottom_toTopOf="@id/more_recycler"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent" />
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/more_recycler"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="20dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent" />
|
||||||
|
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
89
app/src/main/res/layout/ac_recording.xml
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@drawable/background"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/title_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/name"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:text="@string/recording_audio"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="18sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/back"
|
||||||
|
android:layout_width="45dp"
|
||||||
|
android:layout_height="45dp"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:src="@drawable/drawable_back_00" />
|
||||||
|
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/audio_time"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_above="@id/lottieView"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:layout_marginBottom="20dp"
|
||||||
|
android:text="00:00:00"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="21sp" />
|
||||||
|
|
||||||
|
<com.airbnb.lottie.LottieAnimationView
|
||||||
|
android:id="@+id/lottieView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
app:lottie_autoPlay="false"
|
||||||
|
app:lottie_loop="true"
|
||||||
|
app:lottie_rawRes="@raw/sounds_recoding" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/view_btn_start"
|
||||||
|
android:layout_width="55dp"
|
||||||
|
android:layout_height="55dp"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_marginBottom="90dp"
|
||||||
|
android:background="@drawable/btn_record" />
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignTop="@id/view_btn_start"
|
||||||
|
android:layout_alignBottom="@id/view_btn_start"
|
||||||
|
android:layout_marginStart="26dp"
|
||||||
|
android:layout_toEndOf="@id/view_btn_start">
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/view_pause"
|
||||||
|
android:layout_width="35dp"
|
||||||
|
android:layout_height="35dp"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:background="@drawable/selector_recording_pause" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
120
app/src/main/res/layout/ac_save.xml
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/activity_save"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:background="@drawable/background"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/title_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/name"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:text="@string/save_sound"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="18sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/back"
|
||||||
|
android:layout_width="45dp"
|
||||||
|
android:layout_height="45dp"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:src="@drawable/drawable_back_00" />
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/audio_im"
|
||||||
|
android:layout_width="260dp"
|
||||||
|
android:layout_height="220dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:src="@drawable/image_sounds"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/title_layout">
|
||||||
|
|
||||||
|
</ImageView>
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/im_play_btn"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="38dp"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/audio_im"
|
||||||
|
android:background="@drawable/drawable_bg_btn"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingStart="10dp"
|
||||||
|
android:paddingEnd="10dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/btn_play"
|
||||||
|
android:layout_width="22dp"
|
||||||
|
android:layout_height="22dp"
|
||||||
|
android:src="@drawable/selector_play" />
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
android:text="@string/play_audio"
|
||||||
|
app:apply_font="true" />
|
||||||
|
</LinearLayout>
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/audio_time"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="14dp"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="20sp"
|
||||||
|
android:text="00:00:00"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/im_play_btn" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/save_edit"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="36dp"
|
||||||
|
android:background="@drawable/drawable_bg_edittext"
|
||||||
|
android:gravity="center"
|
||||||
|
android:hint="@string/save_audio_name_hint"
|
||||||
|
android:maxLength="10"
|
||||||
|
android:padding="11dp"
|
||||||
|
android:textColorHint="@color/hint_text_color"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/audio_time" />
|
||||||
|
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/save"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="45dp"
|
||||||
|
android:paddingStart="35dp"
|
||||||
|
android:paddingEnd="35dp"
|
||||||
|
android:background="@drawable/drawable_bg_btn"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/save"
|
||||||
|
android:layout_marginTop="50dp"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
android:textSize="19sp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/save_edit" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
50
app/src/main/res/layout/ac_splash_ui.xml
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/main"
|
||||||
|
android:background="@color/color_07377B"
|
||||||
|
tools:context="com.fun.pranksounds.com.fun.wave.pranksounds.activity.AcSplashUi">
|
||||||
|
|
||||||
|
|
||||||
|
<androidx.constraintlayout.utils.widget.ImageFilterView
|
||||||
|
android:layout_width="250dp"
|
||||||
|
android:layout_height="250dp"
|
||||||
|
android:background="@color/color_trans"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:src="@drawable/welcome_icon" />
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_above="@id/loading_pb"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_marginStart="15dp"
|
||||||
|
android:layout_marginTop="200dp"
|
||||||
|
android:layout_marginEnd="15dp"
|
||||||
|
android:layout_marginBottom="32dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:lineSpacingExtra="4dp"
|
||||||
|
android:text="@string/welcome"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
android:textSize="18sp" />
|
||||||
|
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/loading_pb"
|
||||||
|
style="?android:attr/progressBarStyleHorizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="8dp"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_marginStart="25dp"
|
||||||
|
android:layout_marginEnd="25dp"
|
||||||
|
android:layout_marginBottom="35dp"
|
||||||
|
android:progress="90"
|
||||||
|
android:progressDrawable="@drawable/drawable_welcome_pb" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
|
||||||
47
app/src/main/res/layout/category_list_adapter.xml
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:cardCornerRadius="7dp"
|
||||||
|
app:cardElevation="0dp">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/relative"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="150dp"
|
||||||
|
android:paddingStart="5dp"
|
||||||
|
android:paddingTop="5dp"
|
||||||
|
android:paddingEnd="5dp"
|
||||||
|
android:paddingBottom="10dp">
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/name"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:gravity="center"
|
||||||
|
android:shadowColor="@color/text_shadow"
|
||||||
|
android:shadowDx="0"
|
||||||
|
android:shadowDy="1"
|
||||||
|
android:shadowRadius="3"
|
||||||
|
android:text="@string/app_name"
|
||||||
|
android:textColor="@color/text_color1"
|
||||||
|
android:textSize="12sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/image"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="80dp"
|
||||||
|
android:layout_below="@id/name"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:src="@mipmap/ic_launcher" />
|
||||||
|
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</androidx.cardview.widget.CardView>
|
||||||
|
|
||||||
|
|
||||||
53
app/src/main/res/layout/fragment_custom.xml
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context="com.fun.pranksounds.com.fun.wave.pranksounds.custom.FragmentCustom">
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/title_layout"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/tab2"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="18sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/recycler_import"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_below="@id/title_layout" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/layout_empty"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="200dp"
|
||||||
|
android:layout_height="200dp"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:src="@drawable/drawable_image_empty" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:text="@string/empty_customer"
|
||||||
|
android:textColor="@color/hint_text_color"
|
||||||
|
android:textSize="15sp" />
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
50
app/src/main/res/layout/fragment_like.xml
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/title_layout"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/tab3"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="18sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/list"
|
||||||
|
android:layout_below="@id/title_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/layout_empty"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="200dp"
|
||||||
|
android:layout_height="200dp"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:src="@drawable/drawable_image_empty" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:text="@string/empty_like"
|
||||||
|
android:textColor="@color/hint_text_color"
|
||||||
|
android:textSize="15sp" />
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</RelativeLayout>
|
||||||
25
app/src/main/res/layout/fragment_main.xml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/title_layout"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/app_name"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="18sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/recyclerView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/title_layout" />
|
||||||
|
</RelativeLayout>
|
||||||
66
app/src/main/res/layout/like_adapter.xml
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:cardCornerRadius="7dp"
|
||||||
|
app:cardElevation="0dp">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="150dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="5dp">
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/ttv_name"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:shadowColor="@color/text_shadow"
|
||||||
|
android:shadowDx="0"
|
||||||
|
android:shadowDy="1"
|
||||||
|
android:shadowRadius="3"
|
||||||
|
android:text="@string/app_name"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="12sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/image"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="96dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:src="@drawable/image_sounds" />
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/im_delete"
|
||||||
|
android:layout_width="34dp"
|
||||||
|
android:layout_height="34dp"
|
||||||
|
android:layout_alignEnd="@id/layout"
|
||||||
|
android:layout_gravity="end"
|
||||||
|
android:padding="5dp"
|
||||||
|
android:src="@drawable/drawable_delete" />
|
||||||
|
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/view"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
android:layout_below="@id/layout" />
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</androidx.cardview.widget.CardView>
|
||||||
57
app/src/main/res/layout/main_adapter.xml
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center">
|
||||||
|
|
||||||
|
<androidx.cardview.widget.CardView
|
||||||
|
android:id="@+id/card"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:cardCornerRadius="7dp"
|
||||||
|
app:cardElevation="0dp">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/relative"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="150dp">
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/name"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:shadowColor="@color/text_shadow"
|
||||||
|
android:shadowDx="0"
|
||||||
|
android:shadowDy="1"
|
||||||
|
android:shadowRadius="3"
|
||||||
|
android:text="@string/app_name"
|
||||||
|
android:textColor="@color/text_color1"
|
||||||
|
android:textSize="12sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/image"
|
||||||
|
android:layout_width="96dp"
|
||||||
|
android:layout_height="96dp"
|
||||||
|
android:layout_below="@id/name"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:src="@mipmap/ic_launcher" />
|
||||||
|
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
</androidx.cardview.widget.CardView>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/view"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="70dp"
|
||||||
|
android:layout_below="@id/card" />
|
||||||
|
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
119
app/src/main/res/layout/popup_clock.xml
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/drawable_bg_timer"
|
||||||
|
android:padding="10dp">
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/title_timer"
|
||||||
|
android:textColor="@color/text_color1"
|
||||||
|
android:textSize="14sp"
|
||||||
|
app:apply_font="false" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/layout_time"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/title"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/tv_off"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:padding="7dp"
|
||||||
|
android:text="@string/timer1"
|
||||||
|
android:textColor="@color/seletor_color_timer"
|
||||||
|
android:textSize="13sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="1dp"
|
||||||
|
android:layout_height="20dp"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
android:layout_marginEnd="5dp"
|
||||||
|
android:background="@color/main_gray" />
|
||||||
|
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/tv_15s"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:padding="7dp"
|
||||||
|
android:text="@string/timer2"
|
||||||
|
android:textColor="@color/seletor_color_timer"
|
||||||
|
android:textSize="13sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="1dp"
|
||||||
|
android:layout_height="20dp"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
android:layout_marginEnd="5dp"
|
||||||
|
android:background="@color/main_gray" />
|
||||||
|
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/tv_30s"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:padding="7dp"
|
||||||
|
android:text="@string/timer3"
|
||||||
|
android:textColor="@color/seletor_color_timer"
|
||||||
|
android:textSize="13sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="1dp"
|
||||||
|
android:layout_height="20dp"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
android:layout_marginEnd="5dp"
|
||||||
|
android:background="@color/main_gray" />
|
||||||
|
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/tv_1m"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:padding="7dp"
|
||||||
|
android:text="@string/timer4"
|
||||||
|
android:textColor="@color/seletor_color_timer"
|
||||||
|
android:textSize="13sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="1dp"
|
||||||
|
android:layout_height="20dp"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
android:layout_marginEnd="5dp"
|
||||||
|
android:background="@color/main_gray" />
|
||||||
|
|
||||||
|
|
||||||
|
<com.fun.wave.pranksounds.utils.MyTv
|
||||||
|
android:id="@+id/tv_5m"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:padding="7dp"
|
||||||
|
android:text="@string/timer5"
|
||||||
|
android:textColor="@color/seletor_color_timer"
|
||||||
|
android:textSize="13sp"
|
||||||
|
app:apply_font="true" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
13
app/src/main/res/layout/tab_item_layout.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="23dp"
|
||||||
|
android:layout_height="23dp"
|
||||||
|
android:id="@+id/image_tab"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:contentDescription="@string/image_tab" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
5
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@mipmap/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
</adaptive-icon>
|
||||||
5
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@mipmap/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
</adaptive-icon>
|
||||||
BIN
app/src/main/res/mipmap-hdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
app/src/main/res/mipmap-hdpi/ic_launcher_background.webp
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher_background.webp
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 8.6 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_background.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 16 KiB |