diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index d4fc0b9..150b34a 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -4,6 +4,17 @@ + + + + + + + + + + + @@ -15,7 +26,7 @@ - + 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 93bae63..fa3832c 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,9 +1,15 @@ package com.timber.soft.mylivewallpaper.tools +import android.content.Context import android.os.Build import android.os.Handler import android.os.Looper import android.view.View +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.google.gson.Gson import com.jakewharton.rxbinding4.view.clicks import com.timber.soft.mylivewallpaper.data.WallpaperData @@ -14,13 +20,11 @@ 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) @@ -28,39 +32,28 @@ object AppTools { 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 + fun glideDownload(context: Context, url: String, downloadCall: (File?) -> Unit) { + Glide.with(context).downloadOnly().load(url).addListener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + downloadCall.invoke(null) + return false } - } else { - dirName = MyApplication.appContext.filesDir.absolutePath - } - return dirName + + override fun onResourceReady( + resource: File?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + downloadCall.invoke(resource) + return false + } + }).preload() } - - 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 a11a381..8b327ee 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 @@ -2,10 +2,13 @@ package com.timber.soft.mylivewallpaper.ui.activity import android.graphics.Color import android.graphics.drawable.Drawable +import android.media.MediaPlayer import android.os.Build import android.util.Log +import android.view.SurfaceHolder import android.view.View import android.widget.Toast +import androidx.core.view.isVisible import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.DiskCacheStrategy @@ -13,11 +16,12 @@ import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target +import com.timber.soft.mylivewallpaper.R import com.timber.soft.mylivewallpaper.data.AppDatabase 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.tools.AppTools.glideDownload import com.timber.soft.mylivewallpaper.ui.customerView.DownLoadDialog import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -28,6 +32,9 @@ class DetailActivity : BaseActivity(), View.OnClickListener { private lateinit var binding: ActivityDetailsBinding private lateinit var wallpaperData: WallpaperData private lateinit var downDialog: DownLoadDialog + private var mediaPlayer: MediaPlayer? = null + private lateinit var videoUrl: String + private var isDownload = false override fun getActivityContentView(): View { binding = ActivityDetailsBinding.inflate(layoutInflater) return binding.root @@ -85,6 +92,7 @@ class DetailActivity : BaseActivity(), View.OnClickListener { binding.detailsCollect.setOnClickListener(this) binding.detailsSet.setOnClickListener(this) binding.detailsPlayButton.setOnClickListener(this) + binding.detailsVideoBack.setOnClickListener(this) binding.detailsCollect.isSelected = wallpaperData.isCollect } @@ -103,15 +111,32 @@ class DetailActivity : BaseActivity(), View.OnClickListener { } binding.detailsPlayButton -> { - if (isExist()) { + if (isDownload) { + binding.detailsPlayButton.isVisible = false playVideo() } else { + binding.detailsPlayButton.isVisible = false + binding.detailsProgressbar.isVisible = true showDownloadDialog() } } + + binding.detailsVideoBack -> { + stopVideo() + } } } + private fun stopVideo() { + try { + mediaPlayer?.stop() + } catch (e: Exception) { + e.printStackTrace() + } + binding.detailsFlPlay.isVisible = false + binding.detailsPlayButton.isVisible = true + } + private fun setCollect() { if (!binding.detailsCollect.isSelected) { binding.detailsCollect.isSelected = !binding.detailsCollect.isSelected @@ -138,15 +163,119 @@ class DetailActivity : BaseActivity(), View.OnClickListener { } private fun showDownloadDialog() { - Log.e("file_play", "file is null!") + wallpaperData.preview.let { + glideDownload(this, it) { file -> + if (file == null) { + isDownload = false + Toast.makeText( + this@DetailActivity, "Sorry, the download failed.", Toast.LENGTH_SHORT + ).show() + binding.detailsProgressbar.isVisible = false + } else { + binding.detailsProgressbar.isVisible = false + file.absolutePath.let { path -> +// mediaPlayer.setDataSource(path) +// mediaPlayer.prepare() + videoUrl = path + isDownload = true + CoroutineScope(Dispatchers.IO).launch { + AppDatabase.dataBase.getWallpaperDao().insertData(wallpaperData.apply { + downloadUrl = path + }) + } + playVideo() + } + } + } + } } private fun playVideo() { - Log.e("file_play", "file is exist!") + try { + if (mediaPlayer == null) { + mediaPlayer = MediaPlayer() + binding.detailsSurfaceVideo.holder.addCallback(object : SurfaceHolder.Callback { + override fun surfaceCreated(holder: SurfaceHolder) { + try { + mediaPlayer?.reset() + mediaPlayer?.setDataSource(videoUrl) + mediaPlayer?.setDisplay(holder) + mediaPlayer?.isLooping = true + mediaPlayer?.setVolume(0f, 0f) + mediaPlayer?.setOnPreparedListener { + try { + it.start() + } catch (e: Exception) { + e.printStackTrace() + } + } + mediaPlayer?.prepareAsync() + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun surfaceChanged( + holder: SurfaceHolder, + format: Int, + width: Int, + height: Int + ) { + } + + override fun surfaceDestroyed(holder: SurfaceHolder) { + } + + }) + } else { + mediaPlayer?.reset() + mediaPlayer?.setDataSource(videoUrl) + mediaPlayer?.isLooping = true + mediaPlayer?.setVolume(0f, 0f) + mediaPlayer?.prepare() + } + binding.detailsFlPlay.isVisible = true + } catch (e: Exception) { + e.printStackTrace() + } } - private fun isExist(): Boolean { - return isExist(wallpaperData.preview) + override fun onDestroy() { + super.onDestroy() + mediaPlayer?.stop() + mediaPlayer?.release() + mediaPlayer = null + } + + override fun onBackPressed() { + super.onBackPressed() + if (binding.detailsFlPlay.isVisible) { + stopVideo() + return + } + finish() + } + + override fun onPause() { + super.onPause() + if (binding.detailsFlPlay.isVisible) { + try { + stopVideo() + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + override fun onResume() { + super.onResume() + if (binding.detailsFlPlay.isVisible) { + try { + mediaPlayer?.start() + } catch (e: Exception) { + e.printStackTrace() + } + } } } \ 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 index 04cc598..bb083a5 100644 --- 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 @@ -10,23 +10,11 @@ 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) @@ -43,13 +31,10 @@ class DownLoadDialog( } private fun startDownload() { - binding.dialogProgressbar.progress = 0f + } private fun initView() { - if (!TextUtils.isEmpty(title)) { - binding.dialogText.text = title - } binding.dialogIvClose.throttleClicks { dismiss() } diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml index 9f876bc..7ec39a5 100644 --- a/app/src/main/res/layout/activity_details.xml +++ b/app/src/main/res/layout/activity_details.xml @@ -94,14 +94,15 @@ android:visibility="visible" /> + android:background="@drawable/shape_circular" + android:padding="12dp" + android:src="@drawable/svg_back" />