V1.0.0(1)完成版

This commit is contained in:
lihongwei 2025-01-02 16:49:26 +08:00
parent 51e835a92e
commit 743d4c6fc0
25 changed files with 273 additions and 52 deletions

BIN
app/WallpaperDream.jks Normal file

Binary file not shown.

View File

@ -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")

View File

@ -18,4 +18,17 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
#-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 <methods>;
}
-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 { *; }

View File

@ -19,6 +19,9 @@
android:supportsRtl="true"
android:theme="@style/Theme.WallpaperDream"
tools:targetApi="31">
<activity
android:name=".ui.activity.MainActivity"
android:exported="false" />
<activity
android:name=".ui.activity.CategoryActivity"
android:exported="false" />
@ -26,7 +29,7 @@
android:name=".ui.activity.ImageActivity"
android:exported="false" />
<activity
android:name=".ui.activity.MainActivity"
android:name=".ui.activity.SplashActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@ -32,6 +32,7 @@ interface WallpaperDataDao {
@Query("SELECT isLike FROM wallpapers WHERE source = :imagePath")
fun getWallpaperLike(imagePath: String): LiveData<Boolean>
@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)
}

View File

@ -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<List<WallpaperData>> {

View File

@ -63,8 +63,8 @@ class CategoryActivity : AppCompatActivity() {
private fun loadImage() {
viewModel
.getAllCategory(name)
.observe(this, Observer { wallpapers ->
.observe(this) { wallpapers ->
adapter.updateData(wallpapers)
})
}
}
}

View File

@ -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() {

View File

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

View File

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

View File

@ -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)
}

View File

@ -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)
})
}
}
}

View File

@ -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)
})
}
}

View File

@ -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<List<WallpaperData>> {
fun getWallpapers(i: Int, random: Int): LiveData<List<WallpaperData>> {
return when (i) {
1 -> repository.getWallpapers(20, 20)
2 -> repository.getWallpapers(20, 50)

View File

@ -8,13 +8,13 @@
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeColor="#2196F3"
android:strokeLineCap="round"/>
<path
android:pathData="M36,36L24,24L36,12"
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeColor="#2196F3"
android:strokeLineCap="round"/>
</vector>

View File

@ -8,23 +8,23 @@
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#FFEB3B"/>
android:strokeColor="#2196F3"/>
<path
android:pathData="M18,28H8C6.895,28 6,28.895 6,30V40C6,41.105 6.895,42 8,42H18C19.105,42 20,41.105 20,40V30C20,28.895 19.105,28 18,28Z"
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#FFEB3B"/>
android:strokeColor="#2196F3"/>
<path
android:pathData="M40,6H30C28.895,6 28,6.895 28,8V18C28,19.105 28.895,20 30,20H40C41.105,20 42,19.105 42,18V8C42,6.895 41.105,6 40,6Z"
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#FFEB3B"/>
android:strokeColor="#2196F3"/>
<path
android:pathData="M40,28H30C28.895,28 28,28.895 28,30V40C28,41.105 28.895,42 30,42H40C41.105,42 42,41.105 42,40V30C42,28.895 41.105,28 40,28Z"
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#FFEB3B"/>
android:strokeColor="#2196F3"/>
</vector>

View File

@ -8,13 +8,13 @@
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#FFEB3B"
android:strokeColor="#2196F3"
android:strokeLineCap="round"/>
<path
android:pathData="M35,27L37.243,31.913L42.609,32.528L38.629,36.179L39.702,41.472L35,38.816L30.298,41.472L31.371,36.179L27.392,32.528L32.757,31.913L35,27Z"
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#FFEB3B"
android:strokeColor="#FFEB3B"
android:fillColor="#2196F3"
android:strokeColor="#2196F3"
android:strokeLineCap="round"/>
</vector>

View File

@ -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"/>
<path
android:pathData="M24,44V34"
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#FFEB3B"
android:strokeColor="#2196F3"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,30 @@
<!-- res/drawable/seekbar_progress_drawable.xml -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dp" />
<solid android:color="#D3D3D3" />
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="5dp" />
<solid android:color="#FFD700" />
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dp" />
<gradient
android:startColor="#4891FF"
android:endColor="#6CE89E"
android:angle="0" />
</shape>
</clip>
</item>
</layer-list>

View File

@ -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">
<ImageView

View File

@ -5,7 +5,7 @@
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/gray"
android:background="@mipmap/background"
tools:context=".ui.activity.ImageActivity">
<ImageView

View File

@ -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.MainActivity">
<androidx.viewpager2.widget.ViewPager2

View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/background"
tools:activity=".ui.activity.SplashActivity">
<ImageView
android:id="@+id/splash_image"
android:layout_width="150dp"
android:layout_height="150dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.388" />
<TextView
android:id="@+id/splash_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="@string/app_name"
android:textSize="24sp"
android:textStyle="bold"
android:gravity="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/splash_image" />
<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="0dp"
android:layout_height="5dp"
android:layout_marginStart="53dp"
android:layout_marginEnd="53dp"
android:layout_marginBottom="80dp"
android:max="100"
android:progress="0"
android:progressDrawable="@drawable/seek_bar_color"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

6
keystore.properties Normal file
View File

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