V1.0.0(1) 无Ad版本

This commit is contained in:
litingting 2024-04-17 10:33:05 +08:00
commit 354b2298db
102 changed files with 10140 additions and 0 deletions

17
.gitignore vendored Normal file
View File

@ -0,0 +1,17 @@
*.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
.idea/
app/release/

1
app/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

3
app/SignatureInfo Normal file
View File

@ -0,0 +1,3 @@
签名文件:VariousFunnySounds.jks
别名:VariousFunnySoundskey0
密码:VariousFunnySounds

BIN
app/VariousFunnySounds.jks Normal file

Binary file not shown.

64
app/build.gradle.kts Normal file
View File

@ -0,0 +1,64 @@
import java.util.Date
import java.text.SimpleDateFormat
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id ("kotlin-kapt")
}
val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date())
android {
compileSdk = 34
namespace = "com.various.funny.sounds.audio"
defaultConfig {
applicationId = "com.various.funny.sounds.audio"
minSdk = 23
targetSdk = 34
versionCode = 1
versionName = "1.0.0"
setProperty("archivesBaseName", "Various Funny Sounds_V" + versionName + "(${versionCode})_$timestamp")
testInstrumentationRunner = "androidx.audio.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
buildFeatures{
viewBinding = true
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.11.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.legacy:legacy-support-v4:1.0.0")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.audio.ext:junit:1.1.5")
androidTestImplementation("androidx.audio.espresso:espresso-core:3.5.1")
implementation ("com.github.bumptech.glide:glide:4.16.0")
implementation ("androidx.room:room-ktx:2.6.1")
implementation ("androidx.room:room-runtime:2.6.1")
kapt ("androidx.room:room-compiler:2.6.1")
}

34
app/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,34 @@
# 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
#room
-keepclassmembers class com.various.funny.sounds.audio.helper.ComUtils{
public static final java.lang.String DB_Name;
public static final int DB_Version;
}
-keepclassmembers class *{
@androidx.room.Query <methods>;
}
-keep class com.various.funny.sounds.audio.db.MyRoomBase { *; }
-keep class com.various.funny.sounds.audio.db.NewBeanDao { *; }
-keep class com.various.funny.sounds.audio.db.NewBeanChildDao { *; }
-keep class com.various.funny.sounds.audio.data.** {*;}

View File

@ -0,0 +1,24 @@
package com.various.funny.sounds.audio
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented audio, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under audio.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.various.funny.sounds.audio", appContext.packageName)
}
}

View File

@ -0,0 +1,38 @@
<?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" />
<application
android:name=".VariousFunnySounds"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/launcher_logo"
android:label="@string/app_name"
android:roundIcon="@mipmap/launcher_logo"
android:supportsRtl="true"
android:theme="@style/Theme.VariousFunnySounds"
tools:targetApi="31">
<activity
android:name=".ui.activity.PlayActivity"
android:exported="false" />
<activity
android:name=".ui.activity.SourceActivity"
android:exported="false" />
<activity
android:name=".ui.activity.OpenActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.activity.HomeActivity"
android:exported="false" />
</application>
</manifest>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,36 @@
package com.various.funny.sounds.audio
import android.app.Application
import com.various.funny.sounds.audio.db.MyRoomBase
import com.various.funny.sounds.audio.helper.ComUtils
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class VariousFunnySounds : Application() {
companion object {
lateinit var appContext: VariousFunnySounds
}
override fun onCreate() {
super.onCreate()
appContext = this
getData()
}
private fun getData() {
val open = assets.open("resource_target.json")
CoroutineScope(Dispatchers.IO).launch {
if (MyRoomBase.dataBase.getNewBeanDao().getData().isEmpty()) {
val fileString = ComUtils.getFileString(open)
ComUtils.parseJsonStr(fileString)
}
}
}
}

View File

@ -0,0 +1,17 @@
package com.various.funny.sounds.audio.data
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.various.funny.sounds.audio.helper.ComUtils
@Entity(tableName = ComUtils.TABLE_Name_Category)
class NewBean(
@PrimaryKey(autoGenerate = false)
val categoryId: String,
val categoryName: String,
val categoryUrl: String
// var list: List<NewBeanChild>
) {
}

View File

@ -0,0 +1,25 @@
package com.various.funny.sounds.audio.data
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.various.funny.sounds.audio.helper.ComUtils
import java.io.Serializable
@Entity(tableName = ComUtils.TABLE_Name_Sounds)
data class NewBeanChild(
@PrimaryKey(autoGenerate = true)
var id: Int = 0,
var classId: String,
var mp3Url: String?, var preUrl: String?, var title: String?,
var isCollect: Boolean = false,
var downloadUrl: String? = null
) : Serializable {
// foreignKeys = [ForeignKey(
// entity = NewBean::class,
// parentColumns = ["categoryId"],
// childColumns = ["classId"],
// onDelete = ForeignKey.NO_ACTION
// )]
}

View File

@ -0,0 +1,34 @@
package com.various.funny.sounds.audio.db
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import com.various.funny.sounds.audio.VariousFunnySounds
import com.various.funny.sounds.audio.data.NewBean
import com.various.funny.sounds.audio.data.NewBeanChild
import com.various.funny.sounds.audio.helper.ComUtils
@Database(
entities = [NewBean::class, NewBeanChild::class],
version = ComUtils.DB_Version,
exportSchema = false
)
abstract class MyRoomBase : RoomDatabase() {
companion object {
val dataBase: MyRoomBase by lazy { getInstance() }
private fun getInstance(): MyRoomBase {
return Room.databaseBuilder(
VariousFunnySounds.appContext,
MyRoomBase::class.java,
ComUtils.DB_Name
).build()
}
}
abstract fun getNewBeanDao(): NewBeanDao
abstract fun getNewBeanChildDao(): NewBeanChildDao
}

View File

@ -0,0 +1,31 @@
package com.various.funny.sounds.audio.db
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import com.various.funny.sounds.audio.data.NewBeanChild
@Dao
interface NewBeanChildDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertData(child: NewBeanChild)
@Query("select * from sounds where classId = :id ")
suspend fun getData(id: String): List<NewBeanChild>
@Query("select * from sounds where isCollect = :collect ")
suspend fun getCollectData(collect:Boolean = true): List<NewBeanChild>
@Update
suspend fun updateData(newBeanChild: NewBeanChild)
}

View File

@ -0,0 +1,29 @@
package com.various.funny.sounds.audio.db
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import com.various.funny.sounds.audio.data.NewBean
@Dao
interface NewBeanDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertData(bean: NewBean)
@Query("select * from category ")
suspend fun getData():List<NewBean>
}

View File

@ -0,0 +1,137 @@
package com.various.funny.sounds.audio.helper
import android.content.Context
import android.media.AudioManager
import android.widget.SeekBar
import androidx.appcompat.app.AppCompatActivity
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import com.various.funny.sounds.audio.VariousFunnySounds
import com.various.funny.sounds.audio.data.NewBean
import com.various.funny.sounds.audio.data.NewBeanChild
import com.various.funny.sounds.audio.db.MyRoomBase
import org.json.JSONArray
import org.json.JSONObject
import java.io.BufferedReader
import java.io.File
import java.io.InputStream
import java.io.InputStreamReader
import java.io.StringWriter
object ComUtils {
const val DB_Name = "funny sounds"
const val DB_Version = 1
const val TABLE_Name_Category = "category"
const val TABLE_Name_Sounds = "sounds"
fun getScreenWidthPx(): Int {
return VariousFunnySounds.appContext.resources.displayMetrics.widthPixels
}
fun dpToPx(dpV: Float): Int {
VariousFunnySounds.appContext.resources.displayMetrics.density.let {
val value = dpV * it + 0.5f
return value.toInt()
}
}
fun getFileString(input: InputStream): String {
val charArray = CharArray(input.available())
var count = 0
val stringWriter = StringWriter()
val inputStreamReader = InputStreamReader(input)
val bufferedReader = BufferedReader(inputStreamReader)
while (bufferedReader.read(charArray).also { count = it } != -1) {
stringWriter.write(charArray, 0, count)
}
return stringWriter.toString()
}
fun setPlayVolume(context: Context, seekBar: SeekBar) {
val audioManager = context.getSystemService(AppCompatActivity.AUDIO_SERVICE) as AudioManager
val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
seekBar.max = maxVolume
seekBar.progress = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0)
}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
override fun onStopTrackingTouch(seekBar: SeekBar) {}
})
}
fun glideDownload(context: Context, url: String,downloadCall:(File?)->Unit) {
Glide.with(context).downloadOnly().load(url).addListener(object : RequestListener<File> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<File>,
isFirstResource: Boolean
): Boolean {
downloadCall.invoke(null)
return false
}
override fun onResourceReady(
resource: File,
model: Any,
target: Target<File>?,
dataSource: DataSource,
isFirstResource: Boolean
): Boolean {
downloadCall.invoke(resource)
return false
}
}).preload()
}
suspend fun parseJsonStr(string: String): MutableList<NewBean> {
var data: MutableList<NewBean> = mutableListOf()
val jsonArray = JSONArray(string)
for (h in 0 until jsonArray.length()) {
val jsonObject = jsonArray[h] as JSONObject
jsonObject.run {
val id = getString("categoryId")
val listArray = getJSONArray("list")
var listData: MutableList<NewBeanChild> = mutableListOf()
for (d in 0 until listArray.length()) {
val listBean = listArray.get(d) as JSONObject
listBean.run {
val newBeanChild = NewBeanChild(
classId = id, mp3Url = getString("mp3Url"),
preUrl = getString("preUrl"),
title = getString("title")
)
listData.add(
newBeanChild
)
MyRoomBase.dataBase.getNewBeanChildDao().insertData(newBeanChild)
}
}
val newBean = NewBean(
categoryUrl = getString("categoryUrl"),
categoryId = id, categoryName = getString("categoryName")
)
data.add(
newBean
)
MyRoomBase.dataBase.getNewBeanDao().insertData(newBean)
}
}
return data
}
}

View File

@ -0,0 +1,16 @@
package com.various.funny.sounds.audio.helper
import android.content.res.Resources
object ExtendUtils {
val Int.dp: Int
get() = android.util.TypedValue.applyDimension(
android.util.TypedValue.COMPLEX_UNIT_DIP,
this.toFloat(),
Resources.getSystem().displayMetrics
).toInt()
}

View File

@ -0,0 +1,22 @@
package com.various.funny.sounds.audio.helper
import android.graphics.Rect
import android.view.View
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
class ItemSpace(val space: Int) : RecyclerView.ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
if (parent.layoutManager is GridLayoutManager) {
outRect.right = space
}
}
}

View File

@ -0,0 +1,75 @@
package com.various.funny.sounds.audio.ui.activity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager.OnPageChangeListener
import com.various.funny.sounds.audio.databinding.ActivityHomeBinding
import com.various.funny.sounds.audio.ui.adapter.ViewPagerAdapter
import com.various.funny.sounds.audio.ui.fragment.CollectFragment
import com.various.funny.sounds.audio.ui.fragment.HomeFragment
class HomeActivity : AppCompatActivity(), OnPageChangeListener {
private lateinit var homeBinding: ActivityHomeBinding
private var data_fragment = mutableListOf<Fragment>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initStatusBar()
homeBinding = ActivityHomeBinding.inflate(layoutInflater)
setContentView(homeBinding.root)
data_fragment.add(HomeFragment.newInstance())
data_fragment.add(CollectFragment.newInstance())
onInitView()
}
private fun onInitView() {
homeBinding.viewPager.run {
adapter = ViewPagerAdapter(data_fragment, supportFragmentManager)
addOnPageChangeListener(this@HomeActivity)
}
onInitTab()
setTabSelect(0)
}
private fun initStatusBar(){
val flags = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.decorView.systemUiVisibility = flags xor View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
}
override fun onPageSelected(position: Int) {
setTabSelect(position)
}
override fun onPageScrollStateChanged(state: Int) {
}
private fun onInitTab() {
homeBinding.tabHome.setOnClickListener {
setTabSelect(0)
}
homeBinding.tabCollect.setOnClickListener {
setTabSelect(1)
}
}
private fun setTabSelect(position: Int) {
if (position == 0) {
homeBinding.tabHomeIm.isSelected = true
homeBinding.tabCollectIm.isSelected = false
homeBinding.viewPager.currentItem = 0
} else {
homeBinding.tabCollectIm.isSelected = true
homeBinding.tabHomeIm.isSelected = false
homeBinding.viewPager.currentItem = 1
}
}
}

View File

@ -0,0 +1,34 @@
package com.various.funny.sounds.audio.ui.activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.CountDownTimer
import android.view.View
import android.view.WindowManager
import com.various.funny.sounds.audio.R
class OpenActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_open)
initStatusBar()
val countDownTimer = object : CountDownTimer(2000, 1000) {
override fun onTick(millisUntilFinished: Long) {
}
override fun onFinish() {
startActivity(Intent(this@OpenActivity, HomeActivity::class.java))
}
}
countDownTimer.start()
}
private fun initStatusBar() {
val flags = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.decorView.systemUiVisibility = flags xor View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
}
}

View File

@ -0,0 +1,148 @@
package com.various.funny.sounds.audio.ui.activity
import android.media.MediaPlayer
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import com.bumptech.glide.Glide
import com.various.funny.sounds.audio.R
import com.various.funny.sounds.audio.data.NewBeanChild
import com.various.funny.sounds.audio.databinding.ActivityPlayBinding
import com.various.funny.sounds.audio.db.MyRoomBase
import com.various.funny.sounds.audio.helper.ComUtils
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class PlayActivity : AppCompatActivity(), View.OnClickListener {
companion object {
val INTENT_KEY_SOUND = "key_sound"
}
private lateinit var playBinding: ActivityPlayBinding
private var mediaPlayer: MediaPlayer? = null
private var isDownload = false
private lateinit var newBeanChild: NewBeanChild
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
playBinding = ActivityPlayBinding.inflate(layoutInflater)
setContentView(playBinding.root)
initStatusBar()
newBeanChild = intent.getSerializableExtra(INTENT_KEY_SOUND) as NewBeanChild
onInitView()
}
private fun initStatusBar() {
val flags = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.decorView.systemUiVisibility = flags xor View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
}
private fun onInitView() {
playBinding.textviewSoundTitle.text = newBeanChild.title
Glide.with(this).load(newBeanChild.preUrl).placeholder(R.mipmap.placeholder)
.into(playBinding.imPreview)
ComUtils.setPlayVolume(this, playBinding.volumeSeekbar)
playBinding.imCollect.isSelected = newBeanChild.isCollect
playBinding.iconBack.setOnClickListener(this)
playBinding.imPlay.setOnClickListener(this)
playBinding.imCollect.setOnClickListener(this)
initMediaPlayer()
}
override fun onClick(v: View?) {
when (v) {
playBinding.imPlay -> {
if(isDownload) {
playBinding.imPlay.isSelected = !playBinding.imPlay.isSelected
play()
}else{
playBinding.progressbar.isVisible = true
startDownload()
}
}
playBinding.iconBack -> {
finish()
}
playBinding.imCollect -> {
playBinding.imCollect.isSelected = !playBinding.imCollect.isSelected
CoroutineScope(Dispatchers.IO).launch {
MyRoomBase.dataBase.getNewBeanChildDao().updateData(newBeanChild.apply {
isCollect = playBinding.imCollect.isSelected
})
}
}
}
}
private fun initMediaPlayer() {
mediaPlayer = MediaPlayer()
mediaPlayer?.isLooping = true
newBeanChild.downloadUrl?.let {
mediaPlayer?.setDataSource(it)
mediaPlayer?.prepare()
isDownload = true
}
}
private fun startDownload() {
newBeanChild.mp3Url?.let {
ComUtils.glideDownload(this, it) { file ->
if (file == null) {
isDownload = false
playBinding.imPlay.isSelected = false
Toast.makeText(this@PlayActivity, getString(R.string.sorry), Toast.LENGTH_SHORT).show()
playBinding.progressbar.isVisible = false
} else {
playBinding.progressbar.isVisible = false
file.absolutePath.let { path ->
mediaPlayer?.setDataSource(path)
mediaPlayer?.prepare()
isDownload = true
playBinding.imPlay.isSelected = true
play()
CoroutineScope(Dispatchers.IO).launch {
MyRoomBase.dataBase.getNewBeanChildDao().updateData(newBeanChild.apply {
downloadUrl = path
})
}
}
}
}
}
}
private fun play() {
if (playBinding.imPlay.isSelected) {
mediaPlayer?.start()
} else {
mediaPlayer?.pause()
}
}
override fun onDestroy() {
super.onDestroy()
mediaPlayer?.stop()
mediaPlayer?.release()
mediaPlayer = null
}
}

View File

@ -0,0 +1,57 @@
package com.various.funny.sounds.audio.ui.activity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.GridLayoutManager
import com.various.funny.sounds.audio.databinding.ActivitySourceBinding
import com.various.funny.sounds.audio.helper.ComUtils
import com.various.funny.sounds.audio.helper.ItemSpace
import com.various.funny.sounds.audio.ui.adapter.SourceAdapter
class SourceActivity : AppCompatActivity() {
private lateinit var sourceBinding: ActivitySourceBinding
private lateinit var mAdapter:SourceAdapter
private lateinit var viewModel: SourceViewModel
companion object{
val INTENT_KEY_ID = "key_class_id"
}
private lateinit var id:String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sourceBinding = ActivitySourceBinding.inflate(layoutInflater)
setContentView(sourceBinding.root)
id = intent.getStringExtra(INTENT_KEY_ID)!!
viewModel = ViewModelProvider(this)[SourceViewModel::class.java]
viewModel.query(id)
mAdapter = SourceAdapter(this@SourceActivity)
viewModel.getList().observe(this){
mAdapter.updateData(it)
}
initStatusBar()
onInitSource()
sourceBinding.iconBack.setOnClickListener {
finish()
}
}
private fun onInitSource(){
val i = ComUtils.getScreenWidthPx() - ComUtils.dpToPx(110f)*3
val spacePx = i / 4
sourceBinding.recyclerViewSource.run {
adapter = mAdapter
layoutManager = GridLayoutManager(this@SourceActivity,3)
addItemDecoration(ItemSpace(spacePx))
setPadding(spacePx,ComUtils.dpToPx(6f),0,0)
}
}
private fun initStatusBar(){
val flags = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.decorView.systemUiVisibility = flags xor View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
}
}

View File

@ -0,0 +1,28 @@
package com.various.funny.sounds.audio.ui.activity
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.various.funny.sounds.audio.data.NewBeanChild
import com.various.funny.sounds.audio.db.MyRoomBase
import kotlinx.coroutines.launch
class SourceViewModel : ViewModel() {
private var _mdata: MutableLiveData<List<NewBeanChild>> = MutableLiveData<List<NewBeanChild>>()
fun query(id: String) {
viewModelScope.launch {
_mdata.value = MyRoomBase.dataBase.getNewBeanChildDao().getData(id)
}
}
fun getList() = _mdata
override fun onCleared() {
super.onCleared()
}
}

View File

@ -0,0 +1,62 @@
package com.various.funny.sounds.audio.ui.adapter
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.various.funny.sounds.audio.R
import com.various.funny.sounds.audio.data.NewBean
import com.various.funny.sounds.audio.databinding.AdapterCategoryBinding
import com.various.funny.sounds.audio.ui.activity.SourceActivity
class CategoryAdapter(var mContext: Context) :
RecyclerView.Adapter<CategoryAdapter.CategoryViewHolder>() {
val categoryBg =
intArrayOf(R.mipmap.item_bg1, R.mipmap.item_bg2, R.mipmap.item_bg3, R.mipmap.item_bg4)
private var mData: List<NewBean> = emptyList()
fun updateData(data: List<NewBean>) {
mData = data
notifyDataSetChanged()
}
inner class CategoryViewHolder(var categoryItemViewBing: AdapterCategoryBinding) :
RecyclerView.ViewHolder(categoryItemViewBing.root) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CategoryViewHolder {
return CategoryViewHolder(
AdapterCategoryBinding.inflate(
LayoutInflater.from(mContext),
parent,
false
)
)
}
override fun getItemCount(): Int = mData.size
override fun onBindViewHolder(holder: CategoryViewHolder, position: Int) {
holder.categoryItemViewBing.rootView.background =
ContextCompat.getDrawable(mContext, categoryBg[position % 4])
mData[position].run {
holder.categoryItemViewBing.textViewCategoryName.text = categoryName
Glide.with(mContext).load(categoryUrl).placeholder(R.mipmap.placeholder).into(holder.categoryItemViewBing.categoryIm)
holder.categoryItemViewBing.rootView.setOnClickListener {
mContext.startActivity(Intent(mContext, SourceActivity::class.java).apply {
putExtra(SourceActivity.INTENT_KEY_ID,categoryId)
})
}
}
}
}

View File

@ -0,0 +1,60 @@
package com.various.funny.sounds.audio.ui.adapter
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.various.funny.sounds.audio.R
import com.various.funny.sounds.audio.data.NewBeanChild
import com.various.funny.sounds.audio.databinding.AdapterCollectBinding
import com.various.funny.sounds.audio.ui.activity.PlayActivity
class CollectAdapter(var mContext: Context) :
RecyclerView.Adapter<CollectAdapter.ResourceViewHolder>() {
val collectBg =
intArrayOf(R.mipmap.collect_bg1, R.mipmap.collect_bg2, R.mipmap.collect_bg3, R.mipmap.collect_bg4)
private var mData: List<NewBeanChild> = emptyList()
fun updateData(data: List<NewBeanChild>) {
mData = data
notifyDataSetChanged()
}
inner class ResourceViewHolder(var adapterCollectBinding: AdapterCollectBinding) :
RecyclerView.ViewHolder(adapterCollectBinding.root) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ResourceViewHolder {
return ResourceViewHolder(
AdapterCollectBinding.inflate(
LayoutInflater.from(mContext),
parent,
false
)
)
}
override fun getItemCount(): Int = mData.size
override fun onBindViewHolder(holder: ResourceViewHolder, position: Int) {
holder.adapterCollectBinding.rootView.background = ContextCompat.getDrawable(mContext,collectBg[position%4])
mData[position].run {
holder.adapterCollectBinding.textViewCollectName.text = title
Glide.with(mContext).load(preUrl).placeholder(R.mipmap.placeholder).into(holder.adapterCollectBinding.collectIm)
holder.adapterCollectBinding.rootView.setOnClickListener {
mContext.startActivity(Intent(mContext, PlayActivity::class.java).apply {
putExtra(PlayActivity.INTENT_KEY_SOUND,this@run)
})
}
}
}
}

View File

@ -0,0 +1,58 @@
package com.various.funny.sounds.audio.ui.adapter
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.various.funny.sounds.audio.R
import com.various.funny.sounds.audio.data.NewBeanChild
import com.various.funny.sounds.audio.databinding.AdapterSourceBinding
import com.various.funny.sounds.audio.ui.activity.PlayActivity
class SourceAdapter(var mContext: Context) :
RecyclerView.Adapter<SourceAdapter.SourceViewHolder>() {
val categoryBg =
intArrayOf(R.mipmap.item_bg1, R.mipmap.item_bg2, R.mipmap.item_bg3, R.mipmap.item_bg4)
private var mData: List<NewBeanChild> = emptyList()
fun updateData(data: List<NewBeanChild>) {
mData = data
notifyDataSetChanged()
}
inner class SourceViewHolder(var adapterSourceBinding: AdapterSourceBinding) :
RecyclerView.ViewHolder(adapterSourceBinding.root) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SourceViewHolder {
return SourceViewHolder(
AdapterSourceBinding.inflate(
LayoutInflater.from(mContext),
parent,
false
)
)
}
override fun getItemCount(): Int = mData.size
override fun onBindViewHolder(holder: SourceViewHolder, position: Int) {
holder.adapterSourceBinding.rootView.background = ContextCompat.getDrawable(mContext,categoryBg[position%4])
mData[position].run {
holder.adapterSourceBinding.textViewName.text = title
Glide.with(mContext).load(preUrl).placeholder(R.mipmap.placeholder).into(holder.adapterSourceBinding.sourceIm)
holder.adapterSourceBinding.rootView.setOnClickListener {
mContext.startActivity(Intent(mContext,PlayActivity::class.java).apply {
putExtra(PlayActivity.INTENT_KEY_SOUND,this@run)
})
}
}
}
}

View File

@ -0,0 +1,18 @@
package com.various.funny.sounds.audio.ui.adapter
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter
class ViewPagerAdapter(var data: List<Fragment>, fragmentManager: FragmentManager) :
FragmentStatePagerAdapter(fragmentManager) {
override fun getCount(): Int {
return data.size
}
override fun getItem(position: Int): Fragment {
return data[position]
}
}

View File

@ -0,0 +1,55 @@
package com.various.funny.sounds.audio.ui.fragment
import androidx.lifecycle.ViewModelProvider
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import com.various.funny.sounds.audio.databinding.FragmentCollectBinding
import com.various.funny.sounds.audio.ui.adapter.CollectAdapter
class CollectFragment : Fragment() {
companion object {
fun newInstance() = CollectFragment()
}
private lateinit var viewModel: CollectViewModel
private lateinit var collectBinding: FragmentCollectBinding
private lateinit var collectAdapter:CollectAdapter
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
collectBinding = FragmentCollectBinding.inflate(layoutInflater)
onInitCollect()
return collectBinding.root
}
override fun onResume() {
super.onResume()
viewModel.update()
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProvider(this).get(CollectViewModel::class.java)
viewModel.getList().observe(viewLifecycleOwner, Observer {
collectAdapter.updateData(it)
})
}
private fun onInitCollect(){
collectAdapter = CollectAdapter(requireContext())
collectBinding.collectRecycler.run {
adapter = collectAdapter
layoutManager = LinearLayoutManager(requireContext())
}
}
}

View File

@ -0,0 +1,31 @@
package com.various.funny.sounds.audio.ui.fragment
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.various.funny.sounds.audio.data.NewBeanChild
import com.various.funny.sounds.audio.db.MyRoomBase
import kotlinx.coroutines.launch
class CollectViewModel : ViewModel() {
private var _mdata: MutableLiveData<List<NewBeanChild>> = MutableLiveData<List<NewBeanChild>>()
init {
viewModelScope.launch {
_mdata.value = MyRoomBase.dataBase.getNewBeanChildDao().getCollectData()
}
}
fun update(){
viewModelScope.launch {
_mdata.value = MyRoomBase.dataBase.getNewBeanChildDao().getCollectData()
}
}
fun getList() = _mdata
override fun onCleared() {
super.onCleared()
}
}

View File

@ -0,0 +1,58 @@
package com.various.funny.sounds.audio.ui.fragment
import androidx.lifecycle.ViewModelProvider
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.GridLayoutManager
import com.various.funny.sounds.audio.databinding.FragmentHomeBinding
import com.various.funny.sounds.audio.helper.ComUtils
import com.various.funny.sounds.audio.helper.ItemSpace
import com.various.funny.sounds.audio.ui.adapter.CategoryAdapter
class HomeFragment : Fragment() {
companion object {
fun newInstance() = HomeFragment()
}
private lateinit var viewModel: HomeViewModel
private lateinit var homeBinding: FragmentHomeBinding
private lateinit var mAdapter: CategoryAdapter
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
homeBinding = FragmentHomeBinding.inflate(layoutInflater)
onInitCAtegory()
return homeBinding.root
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProvider(this)[HomeViewModel::class.java]
viewModel.getList().observe(viewLifecycleOwner, Observer {
mAdapter.updateData(it)
})
}
private fun onInitCAtegory() {
val i = ComUtils.getScreenWidthPx() - ComUtils.dpToPx(156f) * 2
val spacePx = i / 3
mAdapter = CategoryAdapter(requireContext())
homeBinding.recyclerView.run {
adapter = mAdapter
layoutManager = GridLayoutManager(requireContext(), 2)
addItemDecoration(ItemSpace(spacePx))
setPadding(spacePx, 0, 0, 0)
}
}
}

View File

@ -0,0 +1,28 @@
package com.various.funny.sounds.audio.ui.fragment
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.various.funny.sounds.audio.data.NewBean
import com.various.funny.sounds.audio.db.MyRoomBase
import kotlinx.coroutines.launch
class HomeViewModel : ViewModel() {
private var _mdata: MutableLiveData<List<NewBean>> = MutableLiveData<List<NewBean>>()
init {
viewModelScope.launch {
val data = MyRoomBase.dataBase.getNewBeanDao().getData()
_mdata.value = data.shuffled()
}
}
fun getList() = _mdata
override fun onCleared() {
super.onCleared()
}
}

View File

@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View File

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

@ -0,0 +1,30 @@
<?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_6A6E8C" />
<corners android:radius="10dp" />
<stroke
android:width="1dp"
android:color="@color/white" />
<size android:height="6dp" />
</shape>
</item>
<item android:id="@android:id/progress">
<scale android:scaleWidth="100%">
<shape>
<solid android:color="#ffbd74" />
<size android:height="6dp" />
<corners android:radius="10dp" />
<stroke
android:width="1dp"
android:color="@color/white" />
<gradient
android:angle="0"
android:centerColor="@color/color_C58D99"
android:endColor="@color/color_76B4AE"
android:startColor="@color/color_77C0DE" />
</shape>
</scale>
</item>
</layer-list>

View 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>

View 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="@mipmap/love_red" android:state_selected="true"/>
<item android:drawable="@mipmap/love_white" android:state_selected="false"/>
</selector>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/collect_selected" android:state_selected="true" />
<item android:drawable="@mipmap/collect_normal" android:state_selected="false" />
</selector>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/home_selected" android:state_selected="true" />
<item android:drawable="@mipmap/home_normal" android:state_selected="false" />
</selector>

View 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="@mipmap/pause_circle" android:state_selected="true"/>
<item android:drawable="@mipmap/play_circle" android:state_selected="false"/>
</selector>

View File

@ -0,0 +1,53 @@
<?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"
tools:context=".ui.activity.HomeActivity">
<androidx.viewpager.widget.ViewPager
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/viewPager"
app:layout_constraintBottom_toTopOf="@id/tab_home"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/tab_home"
android:layout_width="0dp"
android:layout_height="64dp"
android:orientation="vertical"
android:gravity="center"
android:background="@color/color_main"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/tab_collect">
<ImageView
android:layout_width="30dp"
android:id="@+id/tab_home_im"
android:layout_height="30dp"
android:src="@drawable/selector_draw_home" />
</LinearLayout>
<LinearLayout
android:id="@+id/tab_collect"
android:layout_width="0dp"
android:layout_height="64dp"
android:gravity="center"
android:background="@color/color_main"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/tab_home"
app:layout_constraintRight_toRightOf="parent">
<ImageView
android:id="@+id/tab_collect_im"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/selector_draw_collect" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,20 @@
<?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:paddingTop="25dp"
android:background="@mipmap/home_background"
tools:context=".ui.activity.OpenActivity">
<ImageView
android:layout_width="206dp"
android:layout_height="206dp"
android:layout_marginTop="220dp"
android:src="@mipmap/open_logo"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,112 @@
<?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="@color/color_main"
android:paddingTop="40dp"
tools:context=".ui.activity.PlayActivity">
<ImageView
android:id="@+id/icon_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingBottom="5dp"
android:src="@mipmap/icon_back"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textview_sound_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/app_name"
android:textColor="@color/white"
android:textSize="18sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/im_collect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="16dp"
android:src="@drawable/selector_collect"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/textview_sound_title" />
<ImageView
android:id="@+id/im_preview"
android:layout_width="144dp"
android:layout_height="144dp"
android:layout_marginTop="77dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/textview_sound_title" />
<ImageView
android:id="@+id/im_volume_small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="80dp"
android:src="@mipmap/volume_slash"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/im_preview" />
<SeekBar
android:id="@+id/volume_seekbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:maxHeight="5dp"
android:progress="50"
android:progressDrawable="@drawable/progressdrawable"
android:thumb="@drawable/seek_bar_circle"
app:layout_constraintBottom_toBottomOf="@id/im_volume_small"
app:layout_constraintLeft_toRightOf="@id/im_volume_small"
app:layout_constraintRight_toLeftOf="@id/im_volume_big"
app:layout_constraintTop_toTopOf="@id/im_volume_small" />
<ImageView
android:id="@+id/im_volume_big"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="80dp"
android:layout_marginEnd="20dp"
android:src="@mipmap/volume_high"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/im_preview" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="70dp"
android:id="@+id/im_play"
android:src="@drawable/selector_play"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/im_volume_small" />
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/progressbar"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/im_play"
app:layout_constraintBottom_toBottomOf="@id/im_play"
android:indeterminateTint="@color/color_C58D99"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,42 @@
<?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="@color/color_main"
android:paddingTop="40dp"
tools:context=".ui.activity.SourceActivity">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
android:paddingStart="16dp"
android:paddingBottom="5dp"
android:id="@+id/icon_back"
app:layout_constraintLeft_toLeftOf="parent"
android:src="@mipmap/icon_back"/>
<TextView
android:id="@+id/textview_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:text="@string/app_name"
android:textColor="@color/white"
android:textSize="18sp"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/recycler_view_source"
android:paddingBottom="15dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/icon_back" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,34 @@
<?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"
android:id="@+id/root_view"
android:layout_width="156dp"
android:layout_height="179dp"
android:layout_marginTop="16dp"
android:background="@mipmap/item_bg1">
<ImageView
android:id="@+id/category_im"
android:layout_width="87dp"
android:layout_height="87dp"
android:layout_marginTop="30dp"
android:src="@mipmap/ic_launcher"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:textColor="@color/white"
android:id="@+id/text_view_category_name"
android:textSize="16sp"
android:text="@string/app_name"
android:gravity="center"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/category_im" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,50 @@
<?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"
android:id="@+id/root_view"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginStart="16dp"
android:layout_marginTop="14dp"
android:layout_marginEnd="16dp"
android:background="@mipmap/collect_bg1">
<ImageView
android:id="@+id/collect_im"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginStart="16dp"
android:src="@mipmap/ic_launcher"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView_collect_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:ellipsize="end"
android:gravity="start"
android:maxLines="1"
android:paddingEnd="4dp"
android:text="@string/app_name"
android:textColor="@color/white"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/collect_im"
app:layout_constraintRight_toLeftOf="@id/im_love"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/im_love"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="16dp"
android:src="@mipmap/love_red"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,38 @@
<?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"
android:id="@+id/root_view"
android:layout_width="110dp"
android:layout_height="120dp"
android:layout_marginTop="14dp"
android:background="@mipmap/item_bg1">
<ImageView
android:id="@+id/source_im"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="18dp"
android:src="@mipmap/ic_launcher"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="8dp"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
android:text="wwwwwwwwwwwwwwwwwwwww"
android:textColor="@color/white"
android:textSize="12sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/source_im" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_main"
android:orientation="vertical"
android:paddingTop="40dp"
tools:context=".ui.fragment.CollectFragment">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/collect"
android:textColor="@color/white"
android:textSize="18sp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/collect_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="16dp"
android:paddingTop="6dp" />
</LinearLayout>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/home_background"
android:orientation="vertical"
android:paddingTop="40dp"
tools:context=".ui.fragment.HomeFragment">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/app_name"
android:textColor="@color/white"
android:textSize="18sp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:paddingTop="4dp"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 718 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,16 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.VariousFunnySounds" parent="Theme.MaterialComponents.DayNight.NoActionBar.Bridge">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="color_main">#474C72</color>
<color name="color_6A6E8C">#6A6E8C</color>
<color name="color_77C0DE">#77C0DE</color>
<color name="color_C58D99">#C58D99</color>
<color name="color_76B4AE">#76B4AE</color>
</resources>

View File

@ -0,0 +1,5 @@
<resources>
<string name="app_name">Various Funny Sounds</string>
<string name="collect">Collect</string>
<string name="sorry">Sorry, the download failed. Please try again.</string>
</resources>

View File

@ -0,0 +1,16 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.VariousFunnySounds" parent="Theme.MaterialComponents.DayNight.NoActionBar.Bridge">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older that API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
</device-transfer>
-->
</data-extraction-rules>

View File

@ -0,0 +1,17 @@
package com.various.funny.sounds.audio
import org.junit.Test
import org.junit.Assert.*
/**
* Example local unit audio, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}

Binary file not shown.

5
build.gradle.kts Normal file
View File

@ -0,0 +1,5 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id("com.android.application") version "8.1.3" apply false
id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}

23
gradle.properties Normal file
View File

@ -0,0 +1,23 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,6 @@
#Mon Mar 25 14:55:51 CST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

185
gradlew vendored Normal file
View File

@ -0,0 +1,185 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

Some files were not shown because too many files have changed in this diff Show More