From e21ee88828cbb59db58609fbd398ad3a1a9c517a Mon Sep 17 00:00:00 2001 From: LUX-Timber Date: Tue, 23 Apr 2024 18:27:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=BC=98=E5=8C=96=E4=BA=86UI=E5=92=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=96=B0=E7=9A=84=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=9A=E5=90=AF=E7=94=A8=E4=BA=86=E8=8A=82=E6=B5=81=E7=82=B9?= =?UTF-8?q?=E5=87=BB=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=BA=86=E8=AF=84=E5=88=86?= =?UTF-8?q?=E5=92=8C=E5=88=86=E4=BA=AB=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=BA=86=E5=9C=A8=E6=9F=90=E4=BA=9B=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=B8=8A=E6=97=A0=E6=B3=95=E6=92=AD=E6=94=BE=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 + .../soft/mylivewallpaper/data/WallpaperDao.kt | 23 +++ .../mylivewallpaper/data/WallpaperData.kt | 2 +- .../soft/mylivewallpaper/tools/AppTools.kt | 49 ++++++ .../ui/activity/DetailActivity.kt | 22 ++- .../ui/adapter/RateStartAdapter.kt | 4 + .../ui/customerView/DownLoadDialog.kt | 58 +++++++ .../ui/fragment/RateFragment.kt | 67 ++++++++ .../ui/fragment/SettingFragment.kt | 36 +++++ app/src/main/res/drawable/shape_dialog_bg.xml | 9 ++ app/src/main/res/drawable/svg_close.xml | 9 ++ app/src/main/res/drawable/svg_rate.xml | 9 ++ app/src/main/res/drawable/svg_share.xml | 9 ++ app/src/main/res/layout/activity_details.xml | 2 +- app/src/main/res/layout/fragment_rate.xml | 79 ++++++++++ app/src/main/res/layout/fragment_setting.xml | 148 +++++++++++++++++- .../main/res/layout/view_downloaddialog.xml | 57 +++++++ app/src/main/res/values/strings.xml | 12 ++ app/src/main/res/values/styles.xml | 13 ++ gradle/libs.versions.toml | 4 + 20 files changed, 612 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperDao.kt create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/RateStartAdapter.kt create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/ui/customerView/DownLoadDialog.kt create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/RateFragment.kt create mode 100644 app/src/main/res/drawable/shape_dialog_bg.xml create mode 100644 app/src/main/res/drawable/svg_close.xml create mode 100644 app/src/main/res/drawable/svg_rate.xml create mode 100644 app/src/main/res/drawable/svg_share.xml create mode 100644 app/src/main/res/layout/fragment_rate.xml create mode 100644 app/src/main/res/layout/view_downloaddialog.xml create mode 100644 app/src/main/res/values/styles.xml diff --git a/app/build.gradle b/app/build.gradle index ad15ccf..0732609 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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) + } \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperDao.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperDao.kt new file mode 100644 index 0000000..c3d9fb6 --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperDao.kt @@ -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 + + @Update + suspend fun updateData(wallpaperData: WallpaperData) + + @Insert + suspend fun insertData(wallpaperData: WallpaperData) + + @Delete + suspend fun deleteData(wallpaperData: WallpaperData) + +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperData.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperData.kt index 6b1b37a..c3ffa61 100644 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperData.kt +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperData.kt @@ -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 \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppTools.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppTools.kt index 2996f91..4606429 100644 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppTools.kt +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppTools.kt @@ -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 { val reader = InputStreamReader(jsonInputStream) val jsonString = reader.readText() return Gson().fromJson(jsonString, Array::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() + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/DetailActivity.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/DetailActivity.kt index 578648b..da5537c 100644 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/DetailActivity.kt +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/DetailActivity.kt @@ -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) + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/RateStartAdapter.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/RateStartAdapter.kt new file mode 100644 index 0000000..1b785c1 --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/RateStartAdapter.kt @@ -0,0 +1,4 @@ +package com.timber.soft.mylivewallpaper.ui.adapter + +class RateStartAdapter { +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/customerView/DownLoadDialog.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/customerView/DownLoadDialog.kt new file mode 100644 index 0000000..04cc598 --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/customerView/DownLoadDialog.kt @@ -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() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/RateFragment.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/RateFragment.kt new file mode 100644 index 0000000..b86a68d --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/RateFragment.kt @@ -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 { + + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/SettingFragment.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/SettingFragment.kt index 224b358..fa24116 100644 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/SettingFragment.kt +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/SettingFragment.kt @@ -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: " + "" + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_dialog_bg.xml b/app/src/main/res/drawable/shape_dialog_bg.xml new file mode 100644 index 0000000..be6268e --- /dev/null +++ b/app/src/main/res/drawable/shape_dialog_bg.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/svg_close.xml b/app/src/main/res/drawable/svg_close.xml new file mode 100644 index 0000000..81a70ec --- /dev/null +++ b/app/src/main/res/drawable/svg_close.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/svg_rate.xml b/app/src/main/res/drawable/svg_rate.xml new file mode 100644 index 0000000..166ad3b --- /dev/null +++ b/app/src/main/res/drawable/svg_rate.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/svg_share.xml b/app/src/main/res/drawable/svg_share.xml new file mode 100644 index 0000000..7cf508e --- /dev/null +++ b/app/src/main/res/drawable/svg_share.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml index f4b1890..9f876bc 100644 --- a/app/src/main/res/layout/activity_details.xml +++ b/app/src/main/res/layout/activity_details.xml @@ -78,7 +78,7 @@ android:padding="12dp" android:paddingStart="16dp" android:src="@drawable/svg_play" - android:visibility="visible" /> + android:visibility="invisible" /> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_setting.xml b/app/src/main/res/layout/fragment_setting.xml index 77d9ef6..f008213 100644 --- a/app/src/main/res/layout/fragment_setting.xml +++ b/app/src/main/res/layout/fragment_setting.xml @@ -1,6 +1,148 @@ - + android:layout_height="match_parent" + android:background="@color/theme_color_light" + android:orientation="vertical" + tools:context=".ui.fragment.SettingFragment"> - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_downloaddialog.xml b/app/src/main/res/layout/view_downloaddialog.xml new file mode 100644 index 0000000..d658f96 --- /dev/null +++ b/app/src/main/res/layout/view_downloaddialog.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8fba58e..f9b3c85 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,5 +5,17 @@ Collect Set + Application settings + Rate us + Share us + https://play.google.com/store/apps/details?id= + 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! + CANCEL + RATE IT + + Set Wallpaper + Loading video... + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..d8ed2ac --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 625763d..e5e36f3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -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" }