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