feat:优化了UI和添加了新的功能:启用了节流点击,添加了评分和分享功能,修复了在某些设备上无法播放的问题。

This commit is contained in:
LUX-Timber 2024-04-23 18:27:50 +08:00
parent b5deee2b9f
commit e21ee88828
20 changed files with 612 additions and 6 deletions

View File

@ -73,5 +73,11 @@ dependencies {
//viewModel初始化用
implementation(libs.activity.ktx)
implementation(libs.fragment.ktx)
// progress bar
implementation(libs.com.akexorcist.progress.bar)
// RxBinding
implementation(libs.jakewharton.rxbinding4)
}

View File

@ -0,0 +1,23 @@
package com.timber.soft.mylivewallpaper.data
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
@Dao
interface WallpaperDao {
@Query("select * from wallpaper where isCollect = :collect ")
suspend fun getCollectData(collect: Boolean = true): List<WallpaperData>
@Update
suspend fun updateData(wallpaperData: WallpaperData)
@Insert
suspend fun insertData(wallpaperData: WallpaperData)
@Delete
suspend fun deleteData(wallpaperData: WallpaperData)
}

View File

@ -15,5 +15,5 @@ data class WallpaperData(
val id: Int = 0,
val classId: String? = null,
var isCollect: Boolean = false,
var downloadUrl: String? = null,
var downloadUrl: String? = null
) : Serializable

View File

@ -1,17 +1,66 @@
package com.timber.soft.mylivewallpaper.tools
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.view.View
import com.google.gson.Gson
import com.jakewharton.rxbinding4.view.clicks
import com.timber.soft.mylivewallpaper.data.WallpaperData
import java.io.File
import java.io.InputStream
import java.io.InputStreamReader
import java.util.concurrent.TimeUnit
object AppTools {
private const val DIR_FILE_NAME = "tep"
private const val DIR_DOWNLOAD = "download"
fun View.throttleClicks(time: Long = 1000, block: (View) -> Unit) {
this.clicks().throttleFirst(time, TimeUnit.MILLISECONDS).subscribe { block(this) }
}
fun onMain(operation: () -> Unit) = Handler(Looper.getMainLooper()).post(operation)
fun parseJsonFile(jsonInputStream: InputStream): List<WallpaperData> {
val reader = InputStreamReader(jsonInputStream)
val jsonString = reader.readText()
return Gson().fromJson(jsonString, Array<WallpaperData>::class.java).toMutableList()
}
private fun getDownloadDirectory(): String {
return getDefaultDirectory() + File.separator + DIR_DOWNLOAD
}
private fun getDefaultDirectory(): String {
var dirName = ""
if (MyApplication.appContext.getExternalFilesDir(DIR_FILE_NAME) != null) {//外部存储可用
if (Build.VERSION.SDK_INT >= 29) {
dirName = MyApplication.appContext.getExternalFilesDir(DIR_FILE_NAME)!!.path
} else if (Build.VERSION.SDK_INT < 29) {
dirName = MyApplication.appContext.getExternalFilesDir(DIR_FILE_NAME)!!.absolutePath
}
} else {//外部存储不可用
dirName = MyApplication.appContext.filesDir.absolutePath
}
return dirName
}
fun getFileName(url: String): String {
return url.substring(url.lastIndexOf("/") + 1)
}
fun getFilePath(url: String): String {
return getDownloadDirectory() + File.separator + getFileName(url)
}
fun getFile(url: String): File {
return File(getFilePath(url))
}
fun isExist(url: String): Boolean {
return File(getFilePath(url)).exists()
}
}

View File

@ -14,11 +14,14 @@ import com.bumptech.glide.request.target.Target
import com.timber.soft.mylivewallpaper.data.WallpaperData
import com.timber.soft.mylivewallpaper.databinding.ActivityDetailsBinding
import com.timber.soft.mylivewallpaper.tools.AppFinalString
import com.timber.soft.mylivewallpaper.tools.AppTools.isExist
import com.timber.soft.mylivewallpaper.ui.customerView.DownLoadDialog
class DetailActivity : BaseActivity(), View.OnClickListener {
private lateinit var binding: ActivityDetailsBinding
private lateinit var wallpaperData: WallpaperData
private lateinit var downDialog: DownLoadDialog
override fun getActivityContentView(): View {
binding = ActivityDetailsBinding.inflate(layoutInflater)
return binding.root
@ -89,9 +92,26 @@ class DetailActivity : BaseActivity(), View.OnClickListener {
}
binding.detailsPlayButton -> {
Log.e("onclick", "detailsPlayButton has been click!")
if (isExist()) {
playVideo()
} else {
showDownloadDialog()
}
}
}
}
private fun showDownloadDialog() {
}
private fun playVideo() {
}
private fun isExist(): Boolean {
return isExist(wallpaperData.preview)
}
}

View File

@ -0,0 +1,4 @@
package com.timber.soft.mylivewallpaper.ui.adapter
class RateStartAdapter {
}

View File

@ -0,0 +1,58 @@
package com.timber.soft.mylivewallpaper.ui.customerView
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.text.TextUtils
import android.view.LayoutInflater
import com.timber.soft.mylivewallpaper.R
import com.timber.soft.mylivewallpaper.databinding.ViewDownloaddialogBinding
import com.timber.soft.mylivewallpaper.tools.AppTools.throttleClicks
import java.util.concurrent.atomic.AtomicInteger
/**
* TODO : no implement
*/
class DownLoadDialog(
private val context: Context,
private val url: String,
private val title: String = "",
init: DownLoadDialog.() -> Unit
) : Dialog(context, R.style.DownLoadDialog) {
private lateinit var binding: ViewDownloaddialogBinding
var onDownloadSuccess: (() -> Unit)? = null
var onDownloadFailed: (() -> Unit)? = null
private var mCount: AtomicInteger = AtomicInteger(0)
init {
init()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ViewDownloaddialogBinding.inflate(LayoutInflater.from(context))
setContentView(binding.root)
initViews()
}
private fun initViews() {
setCancelable(false)
setCanceledOnTouchOutside(false)
initView()
startDownload()
}
private fun startDownload() {
binding.dialogProgressbar.progress = 0f
}
private fun initView() {
if (!TextUtils.isEmpty(title)) {
binding.dialogText.text = title
}
binding.dialogIvClose.throttleClicks {
dismiss()
}
}
}

View File

@ -0,0 +1,67 @@
package com.timber.soft.mylivewallpaper.ui.fragment
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.fragment.app.DialogFragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.timber.soft.mylivewallpaper.databinding.FragmentRateBinding
import com.timber.soft.mylivewallpaper.ui.adapter.RateStartAdapter
class RateFragment : DialogFragment() {
private lateinit var binding: FragmentRateBinding
private lateinit var rateStartAdapter: RateStartAdapter
companion object {
val EXTRA_KEY = "task"
val ADD_TASK_TYPE_KEY = "add_task_type_key"
@JvmStatic
fun newInstance(param1: Int, param2: Int) = RateFragment().apply {
arguments = Bundle().apply {
putInt(EXTRA_KEY, param1)
putInt(ADD_TASK_TYPE_KEY, param2)
}
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentRateBinding.inflate(layoutInflater)
return binding.root
}
override fun onStart() {
super.onStart()
dialog?.run {
setCanceledOnTouchOutside(false)
setCancelable(false)
window?.run {
attributes = attributes.apply {
gravity = Gravity.CENTER
width = WindowManager.LayoutParams.WRAP_CONTENT
height = WindowManager.LayoutParams.WRAP_CONTENT
}
}
val decorView = window!!.decorView
decorView.setPadding(0, 0, 0, 0)
decorView.background = ColorDrawable(Color.TRANSPARENT)
}
initDialog()
}
private fun initDialog() {
binding.run {
}
}
}

View File

@ -1,6 +1,13 @@
package com.timber.soft.mylivewallpaper.ui.fragment
import android.content.Intent
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.util.Log
import android.view.View
import com.timber.soft.mylivewallpaper.R
import com.timber.soft.mylivewallpaper.databinding.FragmentSettingBinding
class SettingFragment : BaseFragment() {
@ -9,4 +16,33 @@ class SettingFragment : BaseFragment() {
binding = FragmentSettingBinding.inflate(layoutInflater)
return binding.root
}
override fun initViews() {
super.initViews()
binding.setLayoutRating.setOnClickListener {
//TODO:no implement
}
binding.setLayoutShare.setOnClickListener {
val url = getString(R.string.set_shop_link) + (activity?.packageName ?: "")
val intent = Intent(Intent.ACTION_SEND)
intent.setType("text/plain")
intent.putExtra(Intent.EXTRA_TEXT, url)
startActivity(intent)
}
val pInfo: PackageInfo
try {
pInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requireActivity().packageManager.getPackageInfo(
requireActivity().packageName, PackageManager.PackageInfoFlags.of(0)
)
} else {
requireActivity().packageManager.getPackageInfo(requireActivity().packageName, 0)
}
binding.setAppVersion.text = "Version: " + pInfo.versionName
} catch (e: PackageManager.NameNotFoundException) {
Log.e("Activity is null", e.toString())
binding.setAppVersion.text = "Version: " + ""
}
}
}

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/white" />
<corners android:radius="12dp" />
</shape>
</item>
</selector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M512,960C265,960 64,759 64,512S265,64 512,64s448,201 448,448 -201,448 -448,448zM512,128.3c-211.6,0 -383.7,172.1 -383.7,383.7 0,211.6 172.1,383.7 383.7,383.7 211.6,0 383.7,-172.2 383.7,-383.7 0,-211.6 -172.2,-383.7 -383.7,-383.7zM557.1,513.4l138.4,-136.9c12.6,-12.4 12.7,-32.7 0.3,-45.2s-32.7,-12.7 -45.2,-0.3l-138.6,137 -136.4,-136.9c-12.5,-12.5 -32.7,-12.6 -45.2,-0.1 -12.5,12.5 -12.5,32.7 -0.1,45.2l136.3,136.7L329,648.9c-12.6,12.4 -12.7,32.7 -0.3,45.2a31.9,31.9 0,0 0,22.8 9.5c8.1,0 16.3,-3.1 22.5,-9.2l137.6,-136.1 138.7,139.1c6.2,6.3 14.4,9.4 22.7,9.4a31.9,31.9 0,0 0,22.6 -9.3c12.5,-12.5 12.5,-32.7 0.1,-45.2L557.1,513.4z"
android:fillColor="#2c2c2c"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M1020.9,386.3a64.6,64.6 0,0 0,-51.6 -45.4l-276.4,-42L569.4,37.2A63.7,63.7 0,0 0,512.1 0a63.7,63.7 0,0 0,-57.3 37.2L331.2,298.9l-276.5,42a64.6,64.6 0,0 0,-51.5 45.4c-7.6,24.2 -1.3,50.7 16.2,68.5l199.9,203.6 -47.2,287.6c-4.2,25 5.8,50.3 25.4,65.3a62,62 0,0 0,67.3 5.1L512.1,880.5l247.2,135.7a62.1,62.1 0,0 0,67.3 -5.1c19.6,-14.9 29.5,-40.2 25.4,-65.3l-47.2,-287.6L1004.9,454.7c17.4,-17.7 23.7,-44.2 16.1,-68.4"
android:fillColor="#2c2c2c"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M554.7,150.9c0,-24.4 20.5,-44.2 45.7,-44.2 11.3,0 22.2,4.1 30.6,11.3l292.5,254.5c18.8,16.3 20.3,44.3 3.4,62.4l-1.7,1.7 -294.3,256a46.8,46.8 0,0 1,-64.6 -3.3,43.4 43.4,0 0,1 -11.7,-29.6V554.7c-211.9,17.5 -387.3,164.1 -447.2,360.9a511.6,511.6 0,0 1,-22.1 -149.3C85.3,497.9 291.8,277.7 554.7,256V150.9z"
android:fillColor="#2c2c2c"/>
</vector>

View File

@ -78,7 +78,7 @@
android:padding="12dp"
android:paddingStart="16dp"
android:src="@drawable/svg_play"
android:visibility="visible" />
android:visibility="invisible" />
<FrameLayout
android:id="@+id/details_flPlay"

View File

@ -0,0 +1,79 @@
<?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="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginEnd="24dp"
android:background="@drawable/shape_dialog_bg"
tools:context=".ui.fragment.RateFragment">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginTop="24dp"
android:text="@string/set_score"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:gravity="center"
android:paddingStart="24dp"
android:paddingEnd="24dp"
android:text="@string/set_rate_us_content"
android:textColor="@color/black"
android:textSize="12sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvTitle" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_content" />
<TextView
android:id="@+id/tv_cancel"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_marginTop="24dp"
android:gravity="center"
android:text="@string/set_cancel"
android:textColor="@color/theme_color_dark"
android:textSize="12sp"
android:textStyle="bold"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/tv_rate_it"
app:layout_constraintTop_toBottomOf="@id/recycler_start" />
<TextView
android:id="@+id/tv_rate_it"
android:layout_width="0dp"
android:layout_height="40dp"
android:gravity="center"
android:text="@string/set_rate_it"
android:textColor="@color/theme_color_dark"
android:textSize="12sp"
android:textStyle="bold"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintLeft_toRightOf="@id/tv_cancel"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_cancel" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,6 +1,148 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<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:layout_height="match_parent"
android:background="@color/theme_color_light"
android:orientation="vertical"
tools:context=".ui.fragment.SettingFragment">
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/white" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:gravity="center_horizontal"
android:paddingBottom="8dp"
android:text="@string/set_title"
android:textColor="@color/black"
android:textSize="18sp" />
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginStart="28dp"
android:layout_marginTop="28dp"
android:layout_marginEnd="28dp"
app:cardCornerRadius="12dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--appLog-->
<androidx.cardview.widget.CardView
android:id="@+id/set_image_logo"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
app:cardCornerRadius="12dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher" />
</androidx.cardview.widget.CardView>
<!--AppName-->
<TextView
android:id="@+id/set_app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="@string/app_name"
android:textColor="@color/black"
android:textSize="18sp" />
<!--Version-->
<TextView
android:id="@+id/set_app_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="4dp"
android:text="@string/app_name"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginStart="28dp"
android:layout_marginTop="18dp"
android:layout_marginEnd="28dp"
app:cardCornerRadius="12dp">
<LinearLayout
android:id="@+id/set_layout_rating"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/set_img_google"
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_marginStart="25dp"
android:padding="2dp"
android:src="@drawable/svg_rate" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:gravity="center"
android:text="@string/set_score"
android:textColor="@color/black"
android:textSize="14sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginStart="28dp"
android:layout_marginTop="18dp"
android:layout_marginEnd="28dp"
app:cardCornerRadius="12dp">
<LinearLayout
android:id="@+id/set_layout_share"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/set_img_link"
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_marginStart="25dp"
android:src="@drawable/svg_share" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:gravity="center"
android:text="@string/set_share"
android:textColor="@color/black"
android:textSize="14sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>

View 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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_dialog_bg"
android:orientation="vertical"
android:paddingStart="22dp"
android:paddingEnd="22dp"
android:paddingBottom="22dp">
<TextView
android:id="@+id/dialog_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:gravity="center"
android:text="@string/video_loading"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold" />
<com.akexorcist.roundcornerprogressbar.RoundCornerProgressBar
android:id="@+id/dialog_progressbar"
android:layout_width="match_parent"
android:layout_height="8dp"
android:layout_below="@id/dialog_tvPercent"
android:layout_gravity="center"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="16dp"
app:rcBackgroundColor="@color/white"
app:rcProgressColor="@color/theme_color_dark" />
<TextView
android:id="@+id/dialog_tvPercent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/dialog_text"
android:layout_marginTop="16dp"
android:alpha="0.54"
android:gravity="center"
android:textColor="@color/black"
android:textSize="16sp"
tools:text="54%" />
<ImageView
android:id="@+id/dialog_ivClose"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_marginEnd="6dp"
android:padding="6dp"
android:src="@drawable/svg_close" />
</RelativeLayout>

View File

@ -5,5 +5,17 @@
<string name="main_collect">Collect</string>
<string name="main_setting">Set</string>
<string name="set_title">Application settings</string>
<string name="set_score">Rate us</string>
<string name="set_share">Share us</string>
<string name="set_shop_link">https://play.google.com/store/apps/details?id=</string>
<string name="set_rate_us_content">We hope this app is useful for you, if it does, would youplease give us a 5 sar and a mice revtew on Google Play, it really helps!</string>
<string name="set_cancel">CANCEL</string>
<string name="set_rate_it">RATE IT</string>
<string name="details_set_wallpaper">Set Wallpaper</string>
<string name="video_loading">Loading video...</string>
</resources>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="DownLoadDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:backgroundDimEnabled">true</item>
</style>
</resources>

View File

@ -10,8 +10,10 @@ material = "1.11.0"
activity = "1.8.0"
activity-ktx = "1.9.0"
fragment-ktx = "1.6.2"
rxbinding = "4.0.0"
constraintlayout = "2.1.4"
lifecycle = "2.7.0"
progress-bar = "2.1.2"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
@ -25,6 +27,8 @@ lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx
activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activity-ktx" }
fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragment-ktx" }
androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
jakewharton-rxbinding4 = { module = "com.jakewharton.rxbinding4:rxbinding", version.ref = "rxbinding" }
com-akexorcist-progress-bar = { group = "com.akexorcist", name = "round-corner-progress-bar", version.ref = "progress-bar" }
[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }