diff --git a/app/WallpaperDream.jks b/app/WallpaperDream.jks new file mode 100644 index 0000000..f23a661 Binary files /dev/null and b/app/WallpaperDream.jks differ diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 44356dd..15275bd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,9 +1,12 @@ +import java.text.SimpleDateFormat +import java.util.Date + plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) id("kotlin-kapt") } - +val timestamp: String = SimpleDateFormat("MM_dd_HH_mm").format(Date()) android { namespace = "com.wallpaper.wallpaperdream" compileSdk = 34 @@ -14,7 +17,7 @@ android { targetSdk = 34 versionCode = 1 versionName = "1.0.0" - + setProperty("archivesBaseName", "Wallpaper Dream_" + versionName + "(${versionCode})_$timestamp") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -52,7 +55,7 @@ dependencies { androidTestImplementation(libs.androidx.espresso.core) implementation("com.github.bumptech.glide:glide:4.16.0") - kapt("com.github.bumptech.glide:compiler:4.15.1") + kapt("com.github.bumptech.glide:compiler:4.16.0") implementation("androidx.room:room-runtime:2.6.1") kapt("androidx.room:room-compiler:2.6.1") diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb43..e3a4573 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,17 @@ # 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 + +-keepclassmembers class com.wallpaper.wallpaperdream.MyApplication { + public static final java.lang.String DB_NAME; + public static final int DB_VERSION; +} + +-keepclassmembers class * { + @androidx.room.Query ; +} + +-keep class com.wallpaper.wallpaperdream.data.database.AppDatabase { *; } +-keep class com.wallpaper.wallpaperdream.data.database.dao.WallpaperDataDao { *; } +-keep class com.wallpaper.wallpaperdream.data.database.entity.WallpaperData { *; } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d5ea827..5bb622d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,9 @@ android:supportsRtl="true" android:theme="@style/Theme.WallpaperDream" tools:targetApi="31"> + @@ -26,7 +29,7 @@ android:name=".ui.activity.ImageActivity" android:exported="false" /> diff --git a/app/src/main/java/com/wallpaper/wallpaperdream/data/database/dao/WallpaperDataDao.kt b/app/src/main/java/com/wallpaper/wallpaperdream/data/database/dao/WallpaperDataDao.kt index 7ee33c8..10aa749 100644 --- a/app/src/main/java/com/wallpaper/wallpaperdream/data/database/dao/WallpaperDataDao.kt +++ b/app/src/main/java/com/wallpaper/wallpaperdream/data/database/dao/WallpaperDataDao.kt @@ -32,6 +32,7 @@ interface WallpaperDataDao { @Query("SELECT isLike FROM wallpapers WHERE source = :imagePath") fun getWallpaperLike(imagePath: String): LiveData - @Query("UPDATE wallpapers SET isLike = :isLike WHERE source = :imagePath") - suspend fun updateIsLike(imagePath: String, isLike: Boolean) + @Query("UPDATE wallpapers SET isLike = :isLike WHERE source = :imagePath AND name = :name") + suspend fun updateIsLike(imagePath: String, name: String, isLike: Boolean) + } diff --git a/app/src/main/java/com/wallpaper/wallpaperdream/data/repository/WallpaperRepository.kt b/app/src/main/java/com/wallpaper/wallpaperdream/data/repository/WallpaperRepository.kt index b450e67..34de41c 100644 --- a/app/src/main/java/com/wallpaper/wallpaperdream/data/repository/WallpaperRepository.kt +++ b/app/src/main/java/com/wallpaper/wallpaperdream/data/repository/WallpaperRepository.kt @@ -23,8 +23,8 @@ class WallpaperRepository(context: Context) { dao.update(wallpaper) } - suspend fun updateIsLike(imagePath: String, isLike: Boolean) { - dao.updateIsLike(imagePath, isLike) + suspend fun updateIsLike(imagePath: String, name: String, isLike: Boolean) { + dao.updateIsLike(imagePath, name, isLike) } fun getWallpapers(limit: Int, offset: Int): LiveData> { diff --git a/app/src/main/java/com/wallpaper/wallpaperdream/ui/activity/CategoryActivity.kt b/app/src/main/java/com/wallpaper/wallpaperdream/ui/activity/CategoryActivity.kt index 8972e6c..4e4c265 100644 --- a/app/src/main/java/com/wallpaper/wallpaperdream/ui/activity/CategoryActivity.kt +++ b/app/src/main/java/com/wallpaper/wallpaperdream/ui/activity/CategoryActivity.kt @@ -63,8 +63,8 @@ class CategoryActivity : AppCompatActivity() { private fun loadImage() { viewModel .getAllCategory(name) - .observe(this, Observer { wallpapers -> + .observe(this) { wallpapers -> adapter.updateData(wallpapers) - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/wallpaper/wallpaperdream/ui/activity/ImageActivity.kt b/app/src/main/java/com/wallpaper/wallpaperdream/ui/activity/ImageActivity.kt index 5c41d3b..75d2c07 100644 --- a/app/src/main/java/com/wallpaper/wallpaperdream/ui/activity/ImageActivity.kt +++ b/app/src/main/java/com/wallpaper/wallpaperdream/ui/activity/ImageActivity.kt @@ -3,6 +3,7 @@ package com.wallpaper.wallpaperdream.ui.activity import android.app.WallpaperManager import android.content.pm.PackageManager import android.graphics.Bitmap +import android.graphics.Color import android.graphics.drawable.Drawable import android.os.Build import android.os.Bundle @@ -12,6 +13,7 @@ import android.widget.Toast import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider @@ -32,6 +34,7 @@ import kotlinx.coroutines.withContext class ImageActivity : AppCompatActivity() { private lateinit var binding: ActivityImageBinding private lateinit var imagePath: String + private lateinit var name: String private lateinit var bitmap: Bitmap private var isFavorite = false private lateinit var gallerySaver: GallerySaver @@ -47,16 +50,20 @@ class ImageActivity : AppCompatActivity() { ViewCompat.setOnApplyWindowInsetsListener( findViewById(R.id.main) ) { v: View, insets: WindowInsetsCompat -> - val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + val navigationBars = insets.getInsets(WindowInsetsCompat.Type.navigationBars()) + + v.setPadding(0, 0, 0, navigationBars.bottom) + insets } initData() initEvent() } + private fun initData() { imagePath = intent.getStringExtra("imagePath").toString() + name = intent.getStringExtra("name").toString() viewModel = ViewModelProvider(this)[WallpaperViewModel::class.java] @@ -70,11 +77,14 @@ class ImageActivity : AppCompatActivity() { showProgress() binding.back.setOnClickListener { finish() } + binding.favorite.setOnClickListener { isFavorite = !isFavorite - viewModel.updateIsLike(imagePath, isFavorite) + viewModel.updateIsLike(imagePath, name, isFavorite) } - binding.setWallpaper.setOnClickListener { v -> showCustomBottomSheetDialog() } + + binding.setWallpaper.setOnClickListener { showCustomBottomSheetDialog() } + binding.download.setOnClickListener { v -> showProgress() val activity = v.context as ImageActivity @@ -148,14 +158,22 @@ class ImageActivity : AppCompatActivity() { withContext(Dispatchers.Main) { hideProgress() binding.setWallpaper.isEnabled = true - Toast.makeText(applicationContext, "Wallpaper setting is successful", Toast.LENGTH_SHORT).show() + Toast.makeText( + applicationContext, + "Wallpaper setting is successful", + Toast.LENGTH_SHORT + ).show() } } catch (e: Exception) { e.printStackTrace() withContext(Dispatchers.Main) { hideProgress() - Toast.makeText(applicationContext, "Failed to set wallpaper", Toast.LENGTH_SHORT).show() + Toast.makeText( + applicationContext, + "Failed to set wallpaper", + Toast.LENGTH_SHORT + ).show() } } } @@ -178,14 +196,22 @@ class ImageActivity : AppCompatActivity() { withContext(Dispatchers.Main) { hideProgress() binding.setWallpaper.isEnabled = true - Toast.makeText(applicationContext, "Wallpaper setting is successful", Toast.LENGTH_SHORT).show() + Toast.makeText( + applicationContext, + "Wallpaper setting is successful", + Toast.LENGTH_SHORT + ).show() } } catch (e: Exception) { e.printStackTrace() withContext(Dispatchers.Main) { hideProgress() - Toast.makeText(applicationContext, "Failed to set wallpaper", Toast.LENGTH_SHORT).show() + Toast.makeText( + applicationContext, + "Failed to set wallpaper", + Toast.LENGTH_SHORT + ).show() } } } @@ -208,14 +234,22 @@ class ImageActivity : AppCompatActivity() { withContext(Dispatchers.Main) { hideProgress() binding.setWallpaper.isEnabled = true - Toast.makeText(applicationContext, "Wallpaper setting is successful", Toast.LENGTH_SHORT).show() + Toast.makeText( + applicationContext, + "Wallpaper setting is successful", + Toast.LENGTH_SHORT + ).show() } } catch (e: Exception) { e.printStackTrace() withContext(Dispatchers.Main) { hideProgress() - Toast.makeText(applicationContext, "Failed to set wallpaper", Toast.LENGTH_SHORT).show() + Toast.makeText( + applicationContext, + "Failed to set wallpaper", + Toast.LENGTH_SHORT + ).show() } } } @@ -240,7 +274,9 @@ class ImageActivity : AppCompatActivity() { override fun onLoadFailed(errorDrawable: Drawable?) { super.onLoadFailed(errorDrawable) - binding.image.setImageDrawable(errorDrawable ?: resources.getDrawable(R.mipmap.placeholder,null)) + binding.image.setImageDrawable( + errorDrawable ?: resources.getDrawable(R.mipmap.placeholder, null) + ) hideProgress() } }) @@ -249,10 +285,10 @@ class ImageActivity : AppCompatActivity() { private fun loadFavorite() { viewModel .getWallpaperLike(imagePath) - .observe(this, Observer { isLike -> + .observe(this) { isLike -> isFavorite = isLike; setFavoriteButton() - }) + } } private fun setFavoriteButton() { diff --git a/app/src/main/java/com/wallpaper/wallpaperdream/ui/activity/SplashActivity.kt b/app/src/main/java/com/wallpaper/wallpaperdream/ui/activity/SplashActivity.kt new file mode 100644 index 0000000..bbb28e3 --- /dev/null +++ b/app/src/main/java/com/wallpaper/wallpaperdream/ui/activity/SplashActivity.kt @@ -0,0 +1,76 @@ +package com.wallpaper.wallpaperdream.ui.activity + +import android.content.Intent +import android.os.Bundle +import android.os.CountDownTimer +import android.view.View +import android.widget.ProgressBar +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.RoundedCorners +import com.wallpaper.wallpaperdream.R +import com.wallpaper.wallpaperdream.databinding.ActivitySplashBinding + +class SplashActivity : AppCompatActivity() { + private lateinit var binding: ActivitySplashBinding + private lateinit var countDownTimer: CountDownTimer + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.enableEdgeToEdge() + + binding = ActivitySplashBinding.inflate(layoutInflater) + setContentView(binding.getRoot()) + + ViewCompat.setOnApplyWindowInsetsListener( + findViewById(R.id.main) + ) { v: View, insets: WindowInsetsCompat -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + + val progressBar: ProgressBar = binding.progressBar + + Glide.with(this) + .load(R.mipmap.placeholder) + .transform(RoundedCorners(16)) + .into(binding.splashImage) + + countDownTimer = object : CountDownTimer(TOTAL_TIME, 100) { + override fun onTick(millisUntilFinished: Long) { + val percentage = (100 - millisUntilFinished.toFloat() / TOTAL_TIME * 100).toInt() + progressBar.progress = percentage + } + + override fun onFinish() { + startMain() + } + } + + countDownTimer.start() + } + + private fun startMain() { + binding.progressBar.progress = 100 + + val intent = Intent( + this@SplashActivity, + MainActivity::class.java + ) + startActivity(intent) + finish() + } + + override fun onDestroy() { + super.onDestroy() + countDownTimer.cancel() + } + + companion object { + private const val TOTAL_TIME: Long = 3000 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/wallpaper/wallpaperdream/ui/adapter/CategoryAdapter.kt b/app/src/main/java/com/wallpaper/wallpaperdream/ui/adapter/CategoryAdapter.kt index 3111284..6077796 100644 --- a/app/src/main/java/com/wallpaper/wallpaperdream/ui/adapter/CategoryAdapter.kt +++ b/app/src/main/java/com/wallpaper/wallpaperdream/ui/adapter/CategoryAdapter.kt @@ -53,16 +53,16 @@ class CategoryAdapter( private var textView: TextView = itemView.findViewById(R.id.category_title) fun bind(imageEntry: WallpaperData) { - val imageEntryOriginal: String = imageEntry.original + val imagePath: String = imageEntry.original textView.text = imageEntry.name - loadImage(imageEntryOriginal) + loadImage(imagePath) setClickListeners(imageEntry) } - private fun loadImage(imageEntryOriginal: String) { + private fun loadImage(imagePath: String) { Glide.with(context) - .load(imageEntryOriginal) + .load(imagePath) .transform(RoundedCorners(32)) .error(R.mipmap.placeholder) .placeholder(R.mipmap.placeholder) diff --git a/app/src/main/java/com/wallpaper/wallpaperdream/ui/adapter/ImageAdapter.kt b/app/src/main/java/com/wallpaper/wallpaperdream/ui/adapter/ImageAdapter.kt index 35ca9fa..2bd85e5 100644 --- a/app/src/main/java/com/wallpaper/wallpaperdream/ui/adapter/ImageAdapter.kt +++ b/app/src/main/java/com/wallpaper/wallpaperdream/ui/adapter/ImageAdapter.kt @@ -57,16 +57,16 @@ class ImageAdapter( private var favoriteButton: ImageView = itemView.findViewById(R.id.btn_favorite) fun bind(imageEntry: WallpaperData) { - val imageEntryOriginal: String = imageEntry.original + val imagePath: String = imageEntry.previewThumb - loadImage(imageEntryOriginal) + loadImage(imagePath) setFavoriteButton(imageEntry) setClickListeners(imageEntry) } - private fun loadImage(imageEntryOriginal: String) { + private fun loadImage(imagePath: String) { Glide.with(context) - .load(imageEntryOriginal) + .load(imagePath) .transform(RoundedCorners(16)) .error(R.mipmap.placeholder) .placeholder(R.mipmap.placeholder) @@ -89,6 +89,7 @@ class ImageAdapter( ImageActivity::class.java ) intent.putExtra("imagePath", imageEntry.source) + intent.putExtra("name", imageEntry.name) activity.startActivity(intent) } diff --git a/app/src/main/java/com/wallpaper/wallpaperdream/ui/fragment/FavoriteFragment.kt b/app/src/main/java/com/wallpaper/wallpaperdream/ui/fragment/FavoriteFragment.kt index 5f5b28f..f331384 100644 --- a/app/src/main/java/com/wallpaper/wallpaperdream/ui/fragment/FavoriteFragment.kt +++ b/app/src/main/java/com/wallpaper/wallpaperdream/ui/fragment/FavoriteFragment.kt @@ -50,13 +50,13 @@ class FavoriteFragment : Fragment() { private fun loadFavoriteImages() { viewModel .getLike() - .observe(viewLifecycleOwner, Observer { wallpapers -> + .observe(viewLifecycleOwner) { wallpapers -> if (wallpapers.isEmpty()) { binding.backgroundText.visibility = View.VISIBLE } else { binding.backgroundText.visibility = View.GONE } adapter.updateData(wallpapers) - }) + } } } diff --git a/app/src/main/java/com/wallpaper/wallpaperdream/ui/fragment/HomeCategoryFragment.kt b/app/src/main/java/com/wallpaper/wallpaperdream/ui/fragment/HomeCategoryFragment.kt index 7ddb3fb..a3c5c0f 100644 --- a/app/src/main/java/com/wallpaper/wallpaperdream/ui/fragment/HomeCategoryFragment.kt +++ b/app/src/main/java/com/wallpaper/wallpaperdream/ui/fragment/HomeCategoryFragment.kt @@ -59,9 +59,9 @@ class HomeCategoryFragment : Fragment() { val randomOffset = (0..2000).random() viewModel .getWallpapers(type,randomOffset) - .observe(viewLifecycleOwner, Observer { wallpapers -> + .observe(viewLifecycleOwner) { wallpapers -> adapter.updateData(wallpapers) - }) + } } diff --git a/app/src/main/java/com/wallpaper/wallpaperdream/viewmodel/WallpaperViewModel.kt b/app/src/main/java/com/wallpaper/wallpaperdream/viewmodel/WallpaperViewModel.kt index a6a5f4a..19a173c 100644 --- a/app/src/main/java/com/wallpaper/wallpaperdream/viewmodel/WallpaperViewModel.kt +++ b/app/src/main/java/com/wallpaper/wallpaperdream/viewmodel/WallpaperViewModel.kt @@ -20,13 +20,13 @@ class WallpaperViewModel(application: Application) : AndroidViewModel(applicatio } } - fun updateIsLike(imagePath: String, isLike: Boolean) { + fun updateIsLike(imagePath: String, name: String, isLike: Boolean) { viewModelScope.launch { - repository.updateIsLike(imagePath, isLike) + repository.updateIsLike(imagePath, name, isLike) } } - fun getWallpapers(i: Int,random: Int): LiveData> { + fun getWallpapers(i: Int, random: Int): LiveData> { return when (i) { 1 -> repository.getWallpapers(20, 20) 2 -> repository.getWallpapers(20, 50) diff --git a/app/src/main/res/drawable/back.xml b/app/src/main/res/drawable/back.xml index 18e2453..8da51a2 100644 --- a/app/src/main/res/drawable/back.xml +++ b/app/src/main/res/drawable/back.xml @@ -8,13 +8,13 @@ android:strokeLineJoin="round" android:strokeWidth="4" android:fillColor="#00000000" - android:strokeColor="#000000" + android:strokeColor="#2196F3" android:strokeLineCap="round"/> diff --git a/app/src/main/res/drawable/category.xml b/app/src/main/res/drawable/category.xml index 5dc9115..4fd8abe 100644 --- a/app/src/main/res/drawable/category.xml +++ b/app/src/main/res/drawable/category.xml @@ -8,23 +8,23 @@ android:strokeLineJoin="round" android:strokeWidth="4" android:fillColor="#00000000" - android:strokeColor="#FFEB3B"/> + android:strokeColor="#2196F3"/> + android:strokeColor="#2196F3"/> + android:strokeColor="#2196F3"/> + android:strokeColor="#2196F3"/> diff --git a/app/src/main/res/drawable/favorite.xml b/app/src/main/res/drawable/favorite.xml index 5ec3dd1..f30fb5e 100644 --- a/app/src/main/res/drawable/favorite.xml +++ b/app/src/main/res/drawable/favorite.xml @@ -8,13 +8,13 @@ android:strokeLineJoin="round" android:strokeWidth="4" android:fillColor="#00000000" - android:strokeColor="#FFEB3B" + android:strokeColor="#2196F3" android:strokeLineCap="round"/> diff --git a/app/src/main/res/drawable/home.xml b/app/src/main/res/drawable/home.xml index e546b67..42fc201 100644 --- a/app/src/main/res/drawable/home.xml +++ b/app/src/main/res/drawable/home.xml @@ -7,13 +7,13 @@ android:pathData="M44,44V20L24,4L4,20L4,44H16V26H32V44H44Z" android:strokeLineJoin="round" android:strokeWidth="4" - android:fillColor="#FFEB3B" - android:strokeColor="#FFEB3B"/> + android:fillColor="#2196F3" + android:strokeColor="#2196F3"/> diff --git a/app/src/main/res/drawable/seek_bar_color.xml b/app/src/main/res/drawable/seek_bar_color.xml new file mode 100644 index 0000000..dc730d9 --- /dev/null +++ b/app/src/main/res/drawable/seek_bar_color.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_category.xml b/app/src/main/res/layout/activity_category.xml index 61d3555..857b1f3 100644 --- a/app/src/main/res/layout/activity_category.xml +++ b/app/src/main/res/layout/activity_category.xml @@ -5,6 +5,7 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@mipmap/background" tools:context=".ui.activity.CategoryActivity"> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxxhdpi/background.png b/app/src/main/res/mipmap-xxxhdpi/background.png new file mode 100644 index 0000000..0c02234 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/background.png differ diff --git a/keystore.properties b/keystore.properties new file mode 100644 index 0000000..c437827 --- /dev/null +++ b/keystore.properties @@ -0,0 +1,6 @@ +app_name=Wallpaper Dream +package_name=com.wallpaper.wallpaperdream +keystoreFile=app/WallpaperDream.jks +key_alias=WallpaperDreamkey0 +key_store_password=WallpaperDream +key_password=WallpaperDream