From 064f5d8b317a01c5193e3badbd7cc68047fc340b Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Sun, 2 Apr 2023 21:37:06 +0300 Subject: [PATCH] some wallpapers fixes --- .../lite/ui/fragments/MessagesFragment.java | 34 +++---- .../lite/ui/fragments/ThemesFragment.java | 19 +--- .../lite/ui/wallpapers/ImageEffect.java | 96 +++++++++---------- .../lite/ui/wallpapers/ImageFilters.java | 12 ++- .../lite/ui/wallpapers/NativeEffects.java | 9 ++ .../ui/wallpapers/WallpaperMenuFragment.java | 8 -- .../ui/wallpapers/WallpaperPreferences.java | 9 +- .../lite/ui/wallpapers/WallpapersHooks.java | 36 ++++--- smali/res/xml/preferences_messages.xml | 3 + smali/res/xml/preferences_themes.xml | 5 - 10 files changed, 114 insertions(+), 117 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/MessagesFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/MessagesFragment.java index f0d9c1c3d..8d7242c07 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/MessagesFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/MessagesFragment.java @@ -1,23 +1,19 @@ package ru.vtosters.lite.ui.fragments; -import static ru.vtosters.lite.utils.AndroidUtils.isTablet; -import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer; -import static ru.vtosters.lite.utils.Preferences.autoalltranslate; -import static ru.vtosters.lite.utils.Preferences.vkme; - import android.annotation.SuppressLint; import android.os.Bundle; - import androidx.preference.Preference; - import com.vk.core.dialogs.alert.VkAlertDialog; import com.vtosters.lite.R; +import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter; +import ru.vtosters.lite.ui.wallpapers.WallpaperMenuFragment; +import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.lite.utils.LifecycleUtils; +import ru.vtosters.lite.utils.NavigatorUtils; +import ru.vtosters.lite.utils.Preferences; import java.util.Arrays; -import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter; -import ru.vtosters.lite.utils.Preferences; - public class MessagesFragment extends TrackedMaterialPreferenceToolbarFragment { @Override public void onCreate(Bundle bundle) { @@ -39,7 +35,7 @@ public class MessagesFragment extends TrackedMaterialPreferenceToolbarFragment { return true; }); - findPreference("autotranslate").setEnabled(!autoalltranslate()); + findPreference("autotranslate").setEnabled(!Preferences.autoalltranslate()); findPreference("lang_service").setOnPreferenceClickListener(preference -> { var items = Arrays.asList( @@ -61,23 +57,29 @@ public class MessagesFragment extends TrackedMaterialPreferenceToolbarFragment { return true; }); - findPreference("vkme_notifs").setEnabled(vkme()); + findPreference("vkme_notifs").setEnabled(Preferences.vkme()); findPreference("vkme").setIcon(R.drawable.ic_vkme_28); - if (isTablet()) { + if (AndroidUtils.isTablet()) { findPreference("vkmesett").setVisible(false); } + + var wp = findPreference("wallpapers"); + wp.setOnPreferenceClickListener(preference -> { + NavigatorUtils.switchFragment(requireContext(), WallpaperMenuFragment.class); + return true; + }); } @Override public boolean onPreferenceTreeClick(Preference preference) { - findPreference("autotranslate").setEnabled(!autoalltranslate()); - findPreference("vkme_notifs").setEnabled(vkme()); + findPreference("autotranslate").setEnabled(!Preferences.autoalltranslate()); + findPreference("vkme_notifs").setEnabled(Preferences.vkme()); return super.onPreferenceTreeClick(preference); } public boolean restart() { - restartApplicationWithTimer(); + LifecycleUtils.restartApplicationWithTimer(); return true; } diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java index de7a54b15..d711e9018 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java @@ -6,13 +6,10 @@ import android.os.Build; import android.os.Bundle; import android.util.Log; import android.view.WindowManager; - import androidx.preference.PreferenceCategory; - +import b.h.g.k.VKProgressDialog; import com.vk.core.dialogs.alert.VkAlertDialog; import com.vtosters.lite.R; - -import b.h.g.k.VKProgressDialog; import ru.vtosters.lite.concurrent.VTExecutors; import ru.vtosters.lite.themes.ThemesCore; import ru.vtosters.lite.themes.ThemesManager; @@ -20,12 +17,7 @@ import ru.vtosters.lite.themes.palettes.PalettesManager; import ru.vtosters.lite.ui.components.DockBarEditorManager; import ru.vtosters.lite.ui.dialogs.PalettesBottomSheetDialog; import ru.vtosters.lite.ui.views.rarepebble.ColorPickerView; -import ru.vtosters.lite.ui.wallpapers.WallpaperMenuFragment; -import ru.vtosters.lite.utils.AndroidUtils; -import ru.vtosters.lite.utils.LifecycleUtils; -import ru.vtosters.lite.utils.NavigatorUtils; -import ru.vtosters.lite.utils.Preferences; -import ru.vtosters.lite.utils.ThemesUtils; +import ru.vtosters.lite.utils.*; public class ThemesFragment extends TrackedMaterialPreferenceToolbarFragment { @@ -114,13 +106,6 @@ public class ThemesFragment extends TrackedMaterialPreferenceToolbarFragment { findPreference("accentprefs").setVisible(!ThemesUtils.isMonetTheme()); - var wp = findPreference("wallpapers"); - wp.setIcon(ThemesUtils.recolorDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_media_outline_28))); - wp.setOnPreferenceClickListener(preference -> { - NavigatorUtils.switchFragment(requireContext(), WallpaperMenuFragment.class); - return true; - }); - findPreference("systememoji").setOnPreferenceClickListener(preference -> { restart(); return true; diff --git a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/ImageEffect.java b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/ImageEffect.java index 0ff8f2576..ceac13b09 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/ImageEffect.java +++ b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/ImageEffect.java @@ -20,33 +20,24 @@ enum ImageEffects { public void applyEffect(ByteBuffer bitmap, int height, int width) { int radius; switch (Preferences.getPreferences().getString(ImageEffects.Blur.toString(), "disabled")) { - case "low": - radius = 8; - break; - case "med": - radius = 14; - break; - case "high": - radius = 20; - break; - default: + case "low" -> radius = 8; + case "med" -> radius = 14; + case "high" -> radius = 20; + default -> { return; + } } NativeEffects.gaussian(bitmap, height, width, radius); } @Override public String getSummary() { - switch (Preferences.getPreferences().getString(ImageEffects.Blur.toString(), "disabled")) { - case "low": - return AndroidUtils.getString(R.string.wallpapers_low); - case "med": - return AndroidUtils.getString(R.string.wallpapers_med); - case "high": - return AndroidUtils.getString(R.string.wallpapers_high); - default: - return AndroidUtils.getString(R.string.wallpapers_disabled); - } + return switch (Preferences.getPreferences().getString(ImageEffects.Blur.toString(), "disabled")) { + case "low" -> AndroidUtils.getString(R.string.wallpapers_low); + case "med" -> AndroidUtils.getString(R.string.wallpapers_med); + case "high" -> AndroidUtils.getString(R.string.wallpapers_high); + default -> AndroidUtils.getString(R.string.wallpapers_disabled); + }; } }, Dim(true, @@ -57,26 +48,22 @@ enum ImageEffects { public void applyEffect(ByteBuffer bitmap, int height, int width) { var delta = 0; switch (Preferences.getPreferences().getString(ImageEffects.Dim.toString(), "disabled")) { - case "dim_black": - delta = -50; break; - case "dim_white": - delta = 50; break; - default: + case "dim_black" -> delta = -50; + case "dim_white" -> delta = 50; + default -> { return; + } } NativeEffects.dim(bitmap, height, width, delta); } @Override public String getSummary() { - switch (Preferences.getPreferences().getString(ImageEffects.Dim.toString(), "disabled")) { - case "dim_black": - return AndroidUtils.getString(R.string.wallpapers_dim_black); - case "dim_white": - return AndroidUtils.getString(R.string.wallpapers_dim_white); - default: - return AndroidUtils.getString(R.string.wallpapers_disabled); - } + return switch (Preferences.getPreferences().getString(ImageEffects.Dim.toString(), "disabled")) { + case "dim_black" -> AndroidUtils.getString(R.string.wallpapers_dim_black); + case "dim_white" -> AndroidUtils.getString(R.string.wallpapers_dim_white); + default -> AndroidUtils.getString(R.string.wallpapers_disabled); + }; } }, Mosaic(true, @@ -87,30 +74,24 @@ enum ImageEffects { public void applyEffect(ByteBuffer bitmap, int height, int width) { var scale = 0; switch (Preferences.getPreferences().getString(ImageEffects.Mosaic.toString(), "disabled")) { - case "high": - scale = 50; break; - case "med": - scale = 25; break; - case "low": - scale = 10; break; - default: + case "high" -> scale = 50; + case "med" -> scale = 25; + case "low" -> scale = 10; + default -> { return; + } } NativeEffects.mosaic(bitmap, height, width, scale); } @Override public String getSummary() { - switch (Preferences.getPreferences().getString(ImageEffects.Mosaic.toString(), "disabled")) { - case "low": - return AndroidUtils.getString(R.string.wallpapers_low); - case "med": - return AndroidUtils.getString(R.string.wallpapers_med); - case "high": - return AndroidUtils.getString(R.string.wallpapers_high); - default: - return AndroidUtils.getString(R.string.wallpapers_disabled); - } + return switch (Preferences.getPreferences().getString(ImageEffects.Mosaic.toString(), "disabled")) { + case "low" -> AndroidUtils.getString(R.string.wallpapers_low); + case "med" -> AndroidUtils.getString(R.string.wallpapers_med); + case "high" -> AndroidUtils.getString(R.string.wallpapers_high); + default -> AndroidUtils.getString(R.string.wallpapers_disabled); + }; } }, Monochrome(false, null, null, @@ -181,7 +162,7 @@ enum ImageEffects { getGlobalContext().getString(R.string.filter_snow)) { @Override public void applyEffect(ByteBuffer bitmap, int height, int width) { - if (isApplied()){ + if (isApplied()) { NativeEffects.snow(bitmap); } } @@ -237,6 +218,19 @@ enum ImageEffects { return Preferences.getPreferences().getBoolean(this.toString(), false); } + public static Boolean hasEffects() { + return !Preferences.getString("msg_Blur").contains("disabled") && !Preferences.getString("msg_Blur").isEmpty() || + !Preferences.getString("msg_Dim").contains("disabled") && !Preferences.getString("msg_Dim").isEmpty() || + !Preferences.getString("msg_Mosaic").contains("disabled") && !Preferences.getString("msg_Mosaic").isEmpty() || + Preferences.getBoolValue("msg_Emboss", false) || + Preferences.getBoolValue("msg_Sepia", false) || + Preferences.getBoolValue("msg_Invert", false) || + Preferences.getBoolValue("msg_Snow", false) || + Preferences.getBoolValue("msg_Flea", false) || + Preferences.getBoolValue("msg_Engrave", false) || + Preferences.getBoolValue("msg_Monochrome", false); + } + @NonNull @Override public String toString() { diff --git a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/ImageFilters.java b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/ImageFilters.java index 165560054..f109addbd 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/ImageFilters.java +++ b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/ImageFilters.java @@ -1,21 +1,26 @@ package ru.vtosters.lite.ui.wallpapers; -import static ru.vtosters.lite.utils.AndroidUtils.getResources; - import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.util.Log; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import static ru.vtosters.lite.utils.AndroidUtils.getResources; + public class ImageFilters { public static Drawable getFilteredDrawable(Drawable orig) { if (orig == null) return null; - if (!(orig instanceof BitmapDrawable)) return orig; + + if (!(orig instanceof BitmapDrawable) || !ImageEffects.hasEffects()) { + return orig; + } Bitmap bitmap = ((BitmapDrawable) orig).getBitmap(); + if (bitmap.getConfig() != Bitmap.Config.ARGB_8888) { bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); } @@ -30,6 +35,7 @@ public class ImageFilters { for (var type : ImageEffects.values()) { type.applyEffect(directBuff, bitmap.getHeight(), bitmap.getWidth()); } + directBuff.flip(); bitmap.copyPixelsFromBuffer(directBuff); return new BitmapDrawable(getResources(), bitmap); diff --git a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/NativeEffects.java b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/NativeEffects.java index 1ae99fdcd..f24f9ea6a 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/NativeEffects.java +++ b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/NativeEffects.java @@ -9,14 +9,23 @@ public class NativeEffects { } public static native String monochrome(ByteBuffer input); + public static native String invert(ByteBuffer input); + public static native String sepia(ByteBuffer input); + public static native String emboss(ByteBuffer input, int height, int width); + public static native String engrave(ByteBuffer input, int height, int width); + public static native String flea(ByteBuffer input); + public static native String snow(ByteBuffer input); + // FIXME: slow when comparing with MediaNative.blurBitmap public static native String gaussian(ByteBuffer input, int height, int width, float radius); + public static native String dim(ByteBuffer input, int height, int width, int delta); + public static native String mosaic(ByteBuffer input, int height, int width, int scale); } diff --git a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpaperMenuFragment.java b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpaperMenuFragment.java index 19119165b..9d3f789ed 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpaperMenuFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpaperMenuFragment.java @@ -69,7 +69,6 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment { ), 1488 ); - removeStickCache(); return true; }); @@ -83,7 +82,6 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment { removeWallpaper(); requestUpdateWallpaper(); mWPPreviewPref.redraw(); - removeStickCache(); return true; }); @@ -184,12 +182,6 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment { } } - private void removeStickCache() { - SharedPreferences prefs2 = getContext().getSharedPreferences("stickers_storage", Context.MODE_PRIVATE); - prefs2.edit().clear().apply(); - ImEngineProvider.b().a(); - } - @Override public int T4() { return R.string.wallpapers; diff --git a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpaperPreferences.java b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpaperPreferences.java index f098503e9..1d339ee68 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpaperPreferences.java +++ b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpaperPreferences.java @@ -1,24 +1,21 @@ package ru.vtosters.lite.ui.wallpapers; -import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.*; -import static ru.vtosters.lite.utils.AndroidUtils.dp2px; - import android.annotation.SuppressLint; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; - import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; - import com.vtosters.lite.R; - import ru.vtosters.lite.ui.adapters.MessagesPreviewAdapter; import ru.vtosters.lite.utils.AndroidUtils; +import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getWallpaper; +import static ru.vtosters.lite.utils.AndroidUtils.dp2px; + public class WallpaperPreferences extends Preference { RecyclerView mRecyclerView; diff --git a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpapersHooks.java b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpapersHooks.java index 423f47604..154eabcb9 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpapersHooks.java +++ b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpapersHooks.java @@ -4,6 +4,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.os.Build; import android.view.View; import android.widget.ImageView; import com.vtosters.lite.R; @@ -24,16 +25,14 @@ import static ru.vtosters.lite.utils.Preferences.getBoolValue; public class WallpapersHooks { // TODO: force compress by default not asking user about that? private static final Supplier compress = () -> getBoolValue("compresswp", true); - private static final File originalWp = new File(getGlobalContext().getFilesDir(), "wallpaper.jpeg"); - private static final File compressedWp = new File(getGlobalContext().getFilesDir(), "compressedwp.jpeg"); - // TODO: cache to file? - private static Drawable mWallpaper; - private static boolean mUpdateWallpaperRequested = true; - + private static final File originalWp = new File(getGlobalContext().getFilesDir(), "wallpaper_new.jpeg"); + private static final File compressedWp = new File(getGlobalContext().getFilesDir(), "compressedwp_new.jpeg"); // TODO: respect blur, when there is blur/mosaic effect applied these two can be even less, just HD (1280x720) for e.g. private static final int MAX_WP_WIDTH = 1080; private static final int MAX_WP_HEIGHT = 1920; - + // TODO: cache to file? + private static Drawable mWallpaper; + private static boolean mUpdateWallpaperRequested = true; public static void setBg(View view) { if (hasWallpapers()) { @@ -44,6 +43,14 @@ public class WallpapersHooks { } public static Drawable getWallpaper() { + var oldwp = new File(getGlobalContext().getFilesDir(), "wallpaper.jpeg"); + var oldwpcompressed = new File(getGlobalContext().getFilesDir(), "compressedwp.jpeg"); + + if (oldwp.exists() || oldwpcompressed.exists()) { + oldwp.delete(); + oldwpcompressed.delete(); + } + if (mWallpaper == null || mUpdateWallpaperRequested) { if (!originalWp.exists()) { return null; @@ -61,6 +68,7 @@ public class WallpapersHooks { if (drawable == null) { return null; } + mWallpaper = getFilteredDrawable(drawable); mUpdateWallpaperRequested = false; } @@ -70,9 +78,9 @@ public class WallpapersHooks { private static boolean prepareCompressed() { // TODO remove this check? with "compress" enabled it should be fine - if (!eligibleWallpaperFile(originalWp)) { - return false; - } +// if (!eligibleWallpaperFile(originalWp)) { +// return false; +// } try (var f = new FileOutputStream(compressedWp)) { var bitmap = BitmapFactory.decodeFile(originalWp.getAbsolutePath()); @@ -81,7 +89,13 @@ public class WallpapersHooks { } var drawable = new BitmapDrawable(null, bitmap); // TODO: remove duplication without changes when provided image already fits required params - drawable.getBitmap().compress(Bitmap.CompressFormat.WEBP, 90, f); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + drawable.getBitmap().compress(Bitmap.CompressFormat.WEBP_LOSSY, 85, f); + } else { + drawable.getBitmap().compress(Bitmap.CompressFormat.WEBP, 85, f); + } + } catch (Exception e) { Log.d("Wallpapers", e.getMessage()); return false; diff --git a/smali/res/xml/preferences_messages.xml b/smali/res/xml/preferences_messages.xml index 450f7052c..f06dc4d02 100644 --- a/smali/res/xml/preferences_messages.xml +++ b/smali/res/xml/preferences_messages.xml @@ -12,6 +12,9 @@ android:title="@string/vkme_notifs"/> + - - -