diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml
index 150b34a..076d632 100644
--- a/.idea/deploymentTargetDropDown.xml
+++ b/.idea/deploymentTargetDropDown.xml
@@ -15,18 +15,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/app/build.gradle b/app/build.gradle
index 0732609..b64a423 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -5,11 +5,21 @@ plugins {
}
android {
+
+ signingConfigs {
+ debug {
+ storeFile file('D:\\Android_Files\\MyLiveWallpaper\\app\\info\\livewallpaper_key_test.jks')
+ storePassword 'key123456'
+ keyPassword 'key123456'
+ keyAlias 'key_wallpaper_test'
+ }
+ }
+
namespace 'com.timber.soft.mylivewallpaper'
compileSdk 34
defaultConfig {
- applicationId "com.timber.soft.mylivewallpaper"
+ applicationId "com.timber.soft.livebackgroundswallpaper.test"
minSdk 22
targetSdk 34
versionCode 1
@@ -20,7 +30,12 @@ android {
buildTypes {
release {
- minifyEnabled false
+ minifyEnabled true
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+
+ debug {
+ minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
diff --git a/app/info/livewallpaper_key_test.jks b/app/info/livewallpaper_key_test.jks
new file mode 100644
index 0000000..bce5581
Binary files /dev/null and b/app/info/livewallpaper_key_test.jks differ
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 481bb43..9daa029 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -18,4 +18,26 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
-#-renamesourcefileattribute SourceFile
\ No newline at end of file
+#-renamesourcefileattribute SourceFile
+
+-keepattributes Signature
+-keepattributes *Annotation*
+-keep class com.google.gson.stream.** { *; }
+-keep class com.google.gson.examples.android.model.** { *; }
+-keep class * implements com.google.gson.TypeAdapter { *; }
+-keep class com.google.gson.internal.LinkedTreeMap { *; }
+-keep class com.timber.soft.mylivewallpaper.tools.AppTools
+-keep class com.timber.soft.mylivewallpaper.data.** { *; }
+
+
+-keepclassmembers class *{
+ @androidx.room.Query ;
+}
+
+-keep class com.timber.soft.mylivewallpaper.tools.AppFinalString {
+ public static final java.lang.String DB_NAME;
+ public static final int DB_VERSION;
+}
+
+-keepattributes Signature
+-keepattributes *Annotation*
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e1a60d8..f3ea93f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -10,10 +10,10 @@
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
- android:icon="@mipmap/ic_launcher"
+ android:icon="@mipmap/icon"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
- android:roundIcon="@mipmap/ic_launcher_round"
+ android:roundIcon="@mipmap/icon"
android:supportsRtl="true"
android:theme="@style/Theme.MyLiveWallpaper"
tools:targetApi="31">
@@ -28,6 +28,20 @@
+
+
+
+
+
+
+
+
\ 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
index dec3b4d..855a188 100644
--- a/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperDao.kt
+++ b/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperDao.kt
@@ -13,6 +13,9 @@ interface WallpaperDao {
@Query("delete from t_wallpaper")
suspend fun deleteAllData()
+ @Query("update t_wallpaper set isCollect = 0")
+ suspend fun deleteAllCollect()
+
@Query("select * from t_wallpaper where isCollect = :collect ")
suspend fun getCollectData(collect: Boolean = true): List
diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/service/VideoWallpaperService.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/service/VideoWallpaperService.kt
new file mode 100644
index 0000000..3207ff3
--- /dev/null
+++ b/app/src/main/java/com/timber/soft/mylivewallpaper/service/VideoWallpaperService.kt
@@ -0,0 +1,101 @@
+package com.timber.soft.mylivewallpaper.service
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.media.MediaPlayer
+import android.net.Uri
+import android.os.Build
+import android.service.wallpaper.WallpaperService
+import android.util.Log
+import android.view.SurfaceHolder
+import androidx.annotation.RequiresApi
+import androidx.localbroadcastmanager.content.LocalBroadcastManager
+import com.timber.soft.mylivewallpaper.tools.AppFinalString
+import com.timber.soft.mylivewallpaper.tools.MyApplication
+
+class VideoWallpaperService : WallpaperService() {
+
+// companion object {
+// const val ACTION_SET_WALLPAPER = "VideoWallpaperService"
+// }
+
+ // private lateinit var mBroadcastManager: LocalBroadcastManager
+ override fun onCreate() {
+ super.onCreate()
+// mBroadcastManager = LocalBroadcastManager.getInstance(this)
+ }
+
+ override fun onCreateEngine(): Engine {
+ return VideoEngine()
+ }
+
+ inner class VideoEngine : Engine() {
+ private var mediaPlayer: MediaPlayer? = null
+
+
+// private var mReceiver = object : BroadcastReceiver() {
+// override fun onReceive(context: Context?, intent: Intent?) {
+// updateVideo()
+// }
+// }
+
+ override fun onCreate(surfaceHolder: SurfaceHolder?) {
+ super.onCreate(surfaceHolder)
+// val filter = IntentFilter(ACTION_SET_WALLPAPER)
+// mBroadcastManager.registerReceiver(mReceiver, filter)
+ }
+
+
+ override fun onSurfaceCreated(holder: SurfaceHolder?) {
+ super.onSurfaceCreated(holder)
+ val uri = getVideoUri()
+ mediaPlayer = MediaPlayer.create(MyApplication.appContext, uri)
+ mediaPlayer?.setSurface(holder!!.surface)
+ mediaPlayer?.isLooping = true
+ mediaPlayer?.setVolume(0f, 0f)
+ mediaPlayer?.start()
+
+ }
+
+ override fun onVisibilityChanged(visible: Boolean) {
+ super.onVisibilityChanged(visible)
+ if (visible) {
+ mediaPlayer?.start()
+ } else {
+ mediaPlayer?.pause()
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ mediaPlayer?.let {
+ if (it.isPlaying) {
+ it.stop()
+ }
+ }
+ mediaPlayer?.release()
+ mediaPlayer = null
+// mBroadcastManager.unregisterReceiver(mReceiver)
+ }
+
+// private fun updateVideo() {
+// val uri = getVideoUri()
+// mediaPlayer?.reset()
+// mediaPlayer?.setDataSource(this@VideoWallpaperService, uri)
+// mediaPlayer?.isLooping = true
+// mediaPlayer?.setVolume(0f, 0f)
+// mediaPlayer?.prepare()
+// }
+ }
+
+ private fun getVideoUri(): Uri {
+ val prefs = MyApplication.appContext.getSharedPreferences(
+ AppFinalString.PREFS_NAME, Context.MODE_PRIVATE
+ )
+ val string = prefs.getString(AppFinalString.KEY_SP, null)
+ return Uri.parse(string)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppFinalString.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppFinalString.kt
index 2683974..28449c0 100644
--- a/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppFinalString.kt
+++ b/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppFinalString.kt
@@ -1,11 +1,11 @@
package com.timber.soft.mylivewallpaper.tools
object AppFinalString {
-
const val DB_NAME = "wallpaper_db"
const val DB_VERSION = 1
const val TABLE_NAME_WALLPAPER = "t_wallpaper"
const val KEY_EXTRA = "KEY_EXTRA"
const val ACTION_DATABASE_UPDATED = "ACTION_DATABASE_UPDATED"
-
+ const val KEY_SP = "KEY_SP"
+ const val PREFS_NAME = "MyPrefs"
}
\ 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 8b327ee..e7f0426 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
@@ -1,10 +1,13 @@
package com.timber.soft.mylivewallpaper.ui.activity
+import android.app.WallpaperManager
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
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
@@ -16,22 +19,21 @@ 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.service.VideoWallpaperService
import com.timber.soft.mylivewallpaper.tools.AppFinalString
import com.timber.soft.mylivewallpaper.tools.AppTools.glideDownload
-import com.timber.soft.mylivewallpaper.ui.customerView.DownLoadDialog
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
+
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
@@ -103,7 +105,14 @@ class DetailActivity : BaseActivity(), View.OnClickListener {
}
binding.detailsSet -> {
- Log.e("onclick", "detailsSet has been click!")
+ if (isDownload) {
+ binding.detailsPlayButton.isVisible = false
+ setWallpaper(videoUrl)
+ } else {
+ binding.detailsPlayButton.isVisible = false
+ binding.detailsProgressbar.isVisible = true
+ downloadPaper()
+ }
}
binding.detailsCollect -> {
@@ -127,6 +136,56 @@ class DetailActivity : BaseActivity(), View.OnClickListener {
}
}
+ private fun downloadPaper() {
+ 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 ->
+ videoUrl = path
+ isDownload = true
+ CoroutineScope(Dispatchers.IO).launch {
+ AppDatabase.dataBase.getWallpaperDao().insertData(wallpaperData.apply {
+ downloadUrl = path
+ })
+ }
+ setWallpaper(videoUrl)
+ }
+ }
+ }
+ }
+ }
+
+ private fun setWallpaper(videoUrl: String) {
+// binding.detailsCoverView.isVisible = true
+
+
+ val instance = WallpaperManager.getInstance(this)
+ try {
+ instance.clear()
+ }catch (e:Exception){
+
+ }
+ val prefs =
+ applicationContext.getSharedPreferences(AppFinalString.PREFS_NAME, Context.MODE_PRIVATE)
+ val editor = prefs.edit()
+ editor.putString(AppFinalString.KEY_SP, videoUrl)
+ editor.apply()
+
+ val intent = Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER)
+ intent.putExtra(
+ WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
+ ComponentName(this, VideoWallpaperService::class.java)
+ )
+ startActivity(intent)
+ }
+
private fun stopVideo() {
try {
mediaPlayer?.stop()
@@ -155,7 +214,7 @@ class DetailActivity : BaseActivity(), View.OnClickListener {
this@DetailActivity, "You have unfavorite this sound.", Toast.LENGTH_SHORT
).show()
CoroutineScope(Dispatchers.IO).launch {
- AppDatabase.dataBase.getWallpaperDao().deleteData(wallpaperData.apply {
+ AppDatabase.dataBase.getWallpaperDao().updateData(wallpaperData.apply {
isCollect = binding.detailsCollect.isSelected
})
}
@@ -171,11 +230,10 @@ class DetailActivity : BaseActivity(), View.OnClickListener {
this@DetailActivity, "Sorry, the download failed.", Toast.LENGTH_SHORT
).show()
binding.detailsProgressbar.isVisible = false
+ binding.detailsPlayButton.isVisible = true
} else {
binding.detailsProgressbar.isVisible = false
file.absolutePath.let { path ->
-// mediaPlayer.setDataSource(path)
-// mediaPlayer.prepare()
videoUrl = path
isDownload = true
CoroutineScope(Dispatchers.IO).launch {
@@ -216,10 +274,7 @@ class DetailActivity : BaseActivity(), View.OnClickListener {
}
override fun surfaceChanged(
- holder: SurfaceHolder,
- format: Int,
- width: Int,
- height: Int
+ holder: SurfaceHolder, format: Int, width: Int, height: Int
) {
}
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 e632bc4..58aa7eb 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
@@ -63,7 +63,7 @@ class SettingFragment : BaseFragment() {
binding.setLayoutDelete.setOnClickListener() {
CoroutineScope(Dispatchers.IO).launch {
- AppDatabase.dataBase.getWallpaperDao().deleteAllData()
+ AppDatabase.dataBase.getWallpaperDao().deleteAllCollect()
}
sendDatabaseUpdatedBroadcast()
Toast.makeText(
diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml
index 7ec39a5..bc40935 100644
--- a/app/src/main/res/layout/activity_details.xml
+++ b/app/src/main/res/layout/activity_details.xml
@@ -97,13 +97,30 @@
android:id="@+id/details_video_back"
android:layout_width="54dp"
android:layout_height="54dp"
- android:layout_gravity="start"
- android:layout_marginStart="24dp"
+ android:layout_gravity="end"
android:layout_marginTop="46dp"
+ android:layout_marginEnd="24dp"
android:background="@drawable/shape_circular"
android:padding="12dp"
android:src="@drawable/svg_back" />
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_start.xml b/app/src/main/res/layout/activity_start.xml
index cf20d82..8db212d 100644
--- a/app/src/main/res/layout/activity_start.xml
+++ b/app/src/main/res/layout/activity_start.xml
@@ -22,7 +22,7 @@
+ android:src="@mipmap/icon" />
+ android:src="@mipmap/icon" />
diff --git a/app/src/main/res/mipmap-xxxhdpi/icon.png b/app/src/main/res/mipmap-xxxhdpi/icon.png
new file mode 100644
index 0000000..3a921af
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/icon.png differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 16e34e6..f9f4589 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -5,4 +5,5 @@
#3095DE
#80BFEFFF
#B4DEFE
+ #BF000000
\ 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 70bf683..02c18a4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,5 +1,5 @@
- MyLiveWallpaper
+ Live Backgrounds Wallpaper
Home
Collect
@@ -9,7 +9,7 @@
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!
+ Please share this app and give us 5 stars if this app was helpful to you, thank you!
CANCEL
RATE IT
Clear All My Favorites
@@ -18,6 +18,7 @@
Set Wallpaper
+ Setting wallpaper ...
Loading video...
diff --git a/app/src/main/res/xml/wallpaper.xml b/app/src/main/res/xml/wallpaper.xml
new file mode 100644
index 0000000..0fb22c3
--- /dev/null
+++ b/app/src/main/res/xml/wallpaper.xml
@@ -0,0 +1,6 @@
+
+
+
+