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 @@ + + + +