diff --git a/.idea/migrations.xml b/.idea/migrations.xml
new file mode 100644
index 00000000..f8051a6f
--- /dev/null
+++ b/.idea/migrations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/bnyro/wallpaper/enums/ResizeMethod.kt b/app/src/main/java/com/bnyro/wallpaper/enums/ResizeMethod.kt
new file mode 100644
index 00000000..664d873c
--- /dev/null
+++ b/app/src/main/java/com/bnyro/wallpaper/enums/ResizeMethod.kt
@@ -0,0 +1,9 @@
+package com.bnyro.wallpaper.enums
+
+enum class ResizeMethod {
+ NONE,
+ CROP,
+ ZOOM,
+ FIT_WIDTH,
+ FIT_HEIGHT,
+}
diff --git a/app/src/main/java/com/bnyro/wallpaper/ui/components/dialogs/ImageFilterDialog.kt b/app/src/main/java/com/bnyro/wallpaper/ui/components/dialogs/ImageFilterDialog.kt
index 67c0f6c8..0ddfd34e 100644
--- a/app/src/main/java/com/bnyro/wallpaper/ui/components/dialogs/ImageFilterDialog.kt
+++ b/app/src/main/java/com/bnyro/wallpaper/ui/components/dialogs/ImageFilterDialog.kt
@@ -7,9 +7,11 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import com.bnyro.wallpaper.R
+import com.bnyro.wallpaper.enums.ResizeMethod
import com.bnyro.wallpaper.ui.components.DialogButton
import com.bnyro.wallpaper.ui.components.ImageFilterSlider
import com.bnyro.wallpaper.ui.components.prefs.CheckboxPref
+import com.bnyro.wallpaper.ui.components.prefs.ListPreference
import com.bnyro.wallpaper.util.Preferences
@Composable
@@ -25,6 +27,7 @@ fun ImageFilterDialog(
) {
Preferences.edit { putFloat(Preferences.blurKey, 1f) }
Preferences.edit { putBoolean(Preferences.grayscaleKey, false) }
+ Preferences.edit { putString(Preferences.resizeMethodKey, ResizeMethod.NONE.name) }
onChange.invoke()
onDismissRequest.invoke()
}
@@ -56,6 +59,14 @@ fun ImageFilterDialog(
) {
onChange.invoke()
}
+ val resizeMethods = listOf(R.string.none, R.string.crop, R.string.zoom, R.string.fit_width, R.string.fit_height)
+ ListPreference(
+ prefKey = Preferences.resizeMethodKey,
+ title = stringResource(R.string.resize_method),
+ entries = resizeMethods.map { stringResource(it) },
+ values = ResizeMethod.values().map { it.name },
+ defaultValue = ResizeMethod.ZOOM.name
+ )
}
}
)
diff --git a/app/src/main/java/com/bnyro/wallpaper/ui/components/prefs/ListPreference.kt b/app/src/main/java/com/bnyro/wallpaper/ui/components/prefs/ListPreference.kt
index 063d7249..cbe28ff7 100644
--- a/app/src/main/java/com/bnyro/wallpaper/ui/components/prefs/ListPreference.kt
+++ b/app/src/main/java/com/bnyro/wallpaper/ui/components/prefs/ListPreference.kt
@@ -49,6 +49,7 @@ fun ListPreference(
if (showDialog) {
ListDialog(
+ title = title,
items = entries,
onDismissRequest = {
showDialog = false
diff --git a/app/src/main/java/com/bnyro/wallpaper/ui/pages/SettingsPage.kt b/app/src/main/java/com/bnyro/wallpaper/ui/pages/SettingsPage.kt
index f96399fd..744926b9 100644
--- a/app/src/main/java/com/bnyro/wallpaper/ui/pages/SettingsPage.kt
+++ b/app/src/main/java/com/bnyro/wallpaper/ui/pages/SettingsPage.kt
@@ -85,10 +85,6 @@ fun SettingsPage(
) {
viewModel.themeMode = ThemeMode.values()[it.toInt()]
}
- CheckboxPref(
- prefKey = Preferences.cropImagesKey,
- title = stringResource(R.string.crop_images)
- )
CheckboxPref(
prefKey = Preferences.autoAddToFavoritesKey,
title = stringResource(R.string.auto_add_to_favorites)
diff --git a/app/src/main/java/com/bnyro/wallpaper/util/Preferences.kt b/app/src/main/java/com/bnyro/wallpaper/util/Preferences.kt
index 4131cda4..34406db7 100644
--- a/app/src/main/java/com/bnyro/wallpaper/util/Preferences.kt
+++ b/app/src/main/java/com/bnyro/wallpaper/util/Preferences.kt
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.type.TypeReference
import com.fasterxml.jackson.databind.ObjectMapper
object Preferences {
- const val cropImagesKey = "cropImages"
+ const val resizeMethodKey = "resizeMethod"
const val diskCacheKey = "diskCache"
const val themeModeKey = "themeModeKey"
const val autoAddToFavoritesKey = "autoAddToFavorites"
diff --git a/app/src/main/java/com/bnyro/wallpaper/util/WallpaperHelper.kt b/app/src/main/java/com/bnyro/wallpaper/util/WallpaperHelper.kt
index 990fc4fd..ff324a08 100644
--- a/app/src/main/java/com/bnyro/wallpaper/util/WallpaperHelper.kt
+++ b/app/src/main/java/com/bnyro/wallpaper/util/WallpaperHelper.kt
@@ -4,9 +4,10 @@ import android.app.WallpaperManager
import android.content.Context
import android.graphics.Bitmap
import android.os.Build
-import android.util.DisplayMetrics
import androidx.annotation.RequiresApi
+import com.bnyro.wallpaper.enums.ResizeMethod
import com.bnyro.wallpaper.enums.WallpaperTarget
+import kotlin.math.absoluteValue
object WallpaperHelper {
@RequiresApi(Build.VERSION_CODES.N)
@@ -26,15 +27,12 @@ object WallpaperHelper {
fun setWallpaper(context: Context, bitmap: Bitmap, mode: WallpaperTarget) {
Thread {
- val cropImages = Preferences.getBoolean(
- Preferences.cropImagesKey,
- false
- )
- val resizedBitmap = if (cropImages) {
- getCroppedBitmap(bitmap, context.resources.displayMetrics)
- } else {
- getResizedBitmap(bitmap, context.resources.displayMetrics)
- }
+ val resizeMethod = Preferences.getString(
+ Preferences.resizeMethodKey,
+ ResizeMethod.ZOOM.name
+ ).let { ResizeMethod.valueOf(it) }
+ val resizedBitmap = processBitmapByResizeMethod(context, bitmap, resizeMethod)
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (mode in listOf(WallpaperTarget.BOTH, WallpaperTarget.HOME)) {
setWallpaperUp(context, resizedBitmap, WallpaperManager.FLAG_SYSTEM)
@@ -48,35 +46,34 @@ object WallpaperHelper {
}.start()
}
- private fun getCroppedBitmap(bitmap: Bitmap, displayMetrics: DisplayMetrics): Bitmap {
- return Bitmap.createScaledBitmap(
- bitmap,
- displayMetrics.widthPixels,
- displayMetrics.heightPixels,
- true
- )
+ private fun processBitmapByResizeMethod(context: Context, bitmap: Bitmap, resizeMethod: ResizeMethod): Bitmap {
+ val metrics = context.resources.displayMetrics
+
+ return when (resizeMethod) {
+ ResizeMethod.CROP -> getResizedBitmap(bitmap, metrics.widthPixels, metrics.heightPixels)
+ ResizeMethod.ZOOM -> getZoomedBitmap(bitmap, metrics.widthPixels, metrics.heightPixels)
+ ResizeMethod.FIT_WIDTH -> getBitmapFitWidth(bitmap, metrics.widthPixels)
+ ResizeMethod.FIT_HEIGHT -> getBitmapFitHeight(bitmap, metrics.heightPixels)
+ ResizeMethod.NONE -> bitmap
+ }
}
- private fun getResizedBitmap(bitmap: Bitmap, displayMetrics: DisplayMetrics): Bitmap {
- val screenWidth = displayMetrics.widthPixels
- val screenHeight = displayMetrics.heightPixels
- val bitmapWidth = bitmap.width.toFloat()
- val bitmapHeight = bitmap.height.toFloat()
+ private fun getResizedBitmap(bitmap: Bitmap, width: Int, height: Int, filter: Boolean = true): Bitmap {
+ return Bitmap.createScaledBitmap(bitmap, width, height, filter)
+ }
- val bitmapRatio = bitmapHeight / bitmapWidth
- val screenRatio = screenHeight / screenWidth
+ private fun getZoomedBitmap(bitmap: Bitmap, screenWidth: Int, screenHeight: Int): Bitmap {
+ val bitmapRatio = bitmap.height.toFloat() / bitmap.width.toFloat()
+ val screenRatio = screenHeight.toFloat() / screenWidth.toFloat()
val resizedBitmap = if (screenRatio > bitmapRatio) {
- getResizedBitmap(bitmap, screenWidth, (screenWidth * bitmapRatio).toInt())
+ getResizedBitmap(bitmap, screenWidth, (screenWidth * bitmapRatio).toInt(), false)
} else {
- getResizedBitmap(bitmap, (screenHeight / bitmapRatio).toInt(), screenHeight)
+ getResizedBitmap(bitmap, (screenHeight / bitmapRatio).toInt(), screenHeight, false)
}
- val bitmapGapX = ((bitmap.width - screenWidth) / 2f).toInt()
- val bitmapGapY = ((bitmap.height - screenHeight) / 2f).toInt()
-
- // prevent crashes due to wrong aspect ratio
- if (bitmapGapX <= 0 || bitmapGapY <= 0) return resizedBitmap
+ val bitmapGapX = ((resizedBitmap.width - screenWidth) / 2).absoluteValue
+ val bitmapGapY = ((resizedBitmap.height - screenHeight) / 2).absoluteValue
return runCatching {
Bitmap.createBitmap(
@@ -89,12 +86,15 @@ object WallpaperHelper {
}.getOrDefault(resizedBitmap)
}
- private fun getResizedBitmap(bitmap: Bitmap, newWidth: Int, newHeight: Int): Bitmap {
- return Bitmap.createScaledBitmap(
- bitmap,
- newWidth,
- newHeight,
- false
- )
+ private fun getBitmapFitWidth(bitmap: Bitmap, width: Int): Bitmap {
+ val heightRatio = width.toFloat() / bitmap.width.toFloat()
+
+ return getResizedBitmap(bitmap, width, (bitmap.height * heightRatio).toInt())
+ }
+
+ private fun getBitmapFitHeight(bitmap: Bitmap, height: Int): Bitmap {
+ val widthRatio = height.toFloat() / bitmap.height.toFloat()
+
+ return getResizedBitmap(bitmap, (bitmap.width * widthRatio).toInt(), height)
}
}
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 409f1d80..a18ab71c 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -33,7 +33,7 @@
الضبابيَّة
الخبيئة
مغيِّر الخلفيَّة
- قُصَّ الصور
+ قُصَّ الصور
مصدر مغيِّر الخلفية
عبر الشبكة
محليٌّ
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index 0d3232ce..b2ae2d47 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -19,7 +19,7 @@
Sıfırla
Ümumi
Keş
- Şəkilləri kəs
+ Şəkilləri kəs
Halqa şəkil keşi
Divar kağızı dəyişdirici
Dəyişiklik intervalı
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index a8850af8..98064d26 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -14,7 +14,7 @@
Скід
Асноўныя
Кэш
- Абрэзаць выявы
+ Абрэзаць выявы
Змена шпалер
Інтэрвал змены
Крыніца змены шпалер
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
index 4f12c73a..126dcec8 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -23,7 +23,7 @@
সাধারণ
ক্যাশ
- ক্রপ করুন
+ ক্রপ করুন
ক্যাশের সাইজ
ওয়ালপেপার চেঞ্জার
পরিবর্তনের সময়
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index a224711f..b7a554bf 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -20,7 +20,7 @@
Obnovit
Obecné
Mezipaměť
- Oříznout obrázky
+ Oříznout obrázky
Mezipaměť obrázků
Měnič tapet
Interval změn
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 202a462f..ce2d1a2b 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -1,6 +1,6 @@
- Bilder zuschneiden
+ Bilder zuschneiden
Kategorie
Quelle
Erstellungsdatum
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 90a130d8..cdb7c3df 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -27,7 +27,7 @@
General
Caché
- Recortar imágenes
+ Recortar imágenes
Caché de imagen de bobina
Cambiador de papel tapiz
Intervalo de cambio
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 4141ab58..69359cdc 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -6,7 +6,7 @@
Ei vielä suosikkeja
Toteutaan satunnainen taustakuva
Suodatin
- Rajaa kuvat
+ Rajaa kuvat
Nollaa
Lukitusnäyttö
Molemmat
diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml
index d7328d9f..618d598d 100644
--- a/app/src/main/res/values-fr-rFR/strings.xml
+++ b/app/src/main/res/values-fr-rFR/strings.xml
@@ -24,7 +24,7 @@
Général
Cache
- Recadrer les images
+ Recadrer les images
Cache d\'image du diaporama
Modification du fond d\'écran
Intervalle de changement
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 4d079bf9..90341c29 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -25,7 +25,7 @@
Umum
Cache
- Pangkas gambar
+ Pangkas gambar
Cache gambar koil
Pengubah wallpaper
Ubah interval
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index a6e89fe4..956dfd94 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -26,7 +26,7 @@
Applicando sfondo casuale
Sorgente cambio sfondo
Scala di grigi
- Ritaglia immagini
+ Ritaglia immagini
Cambia intervallo
Tema
Chiaro
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index 40f8c8e4..8b31b4b9 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -33,7 +33,7 @@
איפוס
רישיון
גרסה
- חיתוך תמונות
+ חיתוך תמונות
אתר
מקוון
כהה
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 1fe79940..b9629dc5 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -41,7 +41,7 @@
キャッシュ
壁紙のプレビュー
- 画像のトリミング
+ 画像のトリミング
コイル画像キャッシュ
壁紙チェンジャー
変更間隔
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index d9236278..0a1e0092 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -33,7 +33,7 @@
웹사이트
즐겨찾기
잠금화면
- 이미지 자르기
+ 이미지 자르기
파일 크기
생성 날짜
설정
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index b2b72246..29d42f89 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -13,7 +13,7 @@
Tilbakestill
Generelt
Hurtiglager
- Beskjær bilder
+ Beskjær bilder
Skjermbildeendrer
Endringsintervall
Tema
diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml
index a7d807e0..976286b8 100644
--- a/app/src/main/res/values-or/strings.xml
+++ b/app/src/main/res/values-or/strings.xml
@@ -15,7 +15,7 @@
ପୁନଃସେଟ୍ କରନ୍ତୁ
ସାଧାରଣ
କ୍ୟାଚ୍
- ପ୍ରତିଛବିଗୁଡିକ କ୍ରପ୍ କରନ୍ତୁ
+ ପ୍ରତିଛବିଗୁଡିକ କ୍ରପ୍ କରନ୍ତୁ
ୱାଲପେପର ଚେଞ୍ଜର
ଉଜ୍ଜଳ
ଅନ୍ଧାର
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index b868d0ec..5d3078c7 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -15,7 +15,7 @@
Resetowanie
Główne
Pamięć podręczna
- Przycinaj zdjęcia
+ Przycinaj zdjęcia
Czas pomiędzy zmianą
Motyw
Nie ma jeszcze ulubionych
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 388121bb..4bbc40e2 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -17,7 +17,7 @@
Escala de cinza
Redefinir
Cache
- Cortar imagens
+ Cortar imagens
Tamanho do cache de imagem
Mudança de papel de parede
Intervalo de mudança
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index a74e016d..6149c536 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -20,7 +20,7 @@
Repor
Geral
Cache
- Imagens de corte
+ Imagens de corte
Cache de imagem da bobina
Mudança de papel de parede
Intervalo de mudança
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index c6516e24..aae6bcc2 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -16,7 +16,7 @@
Resetați
General
Cache
- Decupare imagini
+ Decupare imagini
Cache de imagini
Schimbare fundal
Temă
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 01b08e10..27b696e3 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -25,7 +25,7 @@
Основные
Кэш
- Обрезать изображения
+ Обрезать изображения
Кэш изображений
Смена обоев
Интервал смены обоев
diff --git a/app/src/main/res/values-ryu/strings.xml b/app/src/main/res/values-ryu/strings.xml
index bf47d149..b7779a60 100644
--- a/app/src/main/res/values-ryu/strings.xml
+++ b/app/src/main/res/values-ryu/strings.xml
@@ -41,7 +41,7 @@
キャッシュ
かびがんーじぬプレビュー
- やしぬぞうぬトリミング
+ やしぬぞうぬトリミング
コイルぬぞうキャッシュ
かびがみチェンジャー
へんかんかんかく
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index db540292..afeae219 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -33,7 +33,7 @@
Опште
Кеш
- Исеци слике
+ Исеци слике
Кеш посебних слика
Мењање позадина
Интервал промене
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 0f72feee..bfe85003 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -20,7 +20,7 @@
Sıfırla
Genel
Önbellek
- Resimleri kırp
+ Resimleri kırp
Coil resim önbelleği
Duvar kağıdı değiştirici
Değişim aralığı
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 2b3d928d..d6ce08a6 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -25,7 +25,7 @@
Загальне
Кеш
- Обрізати зображення
+ Обрізати зображення
Кеш зображень
Зміна шпалер
Інтервал зміни
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index c2a10b94..cb1f4c83 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -25,7 +25,7 @@
常规
缓存
- 剪裁图片
+ 剪裁图片
Coil 图像缓存
壁纸更换器
更换间隔
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index bd691272..7e9e94d7 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -43,7 +43,11 @@
Cache
Wallpaper preview
- Crop images
+ Resize method
+ Crop
+ Zoom (keeps aspect ratio)
+ Fit height
+ Fit width
Coil image cache
Wallpaper changer
Change interval