From 6379ce5741a283110455bb60cd5d5c02b64eb023 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Tue, 4 Jul 2023 13:42:04 +0300 Subject: [PATCH] cleanup code --- .../ru/vtosters/lite/themes/ThemesCore.java | 34 ++--- .../vtosters/lite/themes/ThemesManager.java | 39 +++-- .../themes/loaders/AssetManagerHelper.java | 12 +- .../lite/themes/loaders/ResourcesLoader.java | 140 +++++++++--------- .../lite/themes/palettes/PalettesManager.java | 16 +- .../lite/themes/utils/ArscEditor.java | 8 +- .../lite/ui/PreferenceFragmentUtils.java | 2 +- .../lite/ui/adapters/CategorizedAdapter.java | 23 ++- .../ui/adapters/MessagesPreviewAdapter.java | 11 +- .../lite/ui/dialogs/DisableBattery.java | 4 +- .../vtosters/lite/ui/dialogs/OTADialog.java | 2 + .../lite/ui/views/rarepebble/AlphaView.java | 8 +- .../lite/ui/views/rarepebble/HexEdit.java | 15 +- .../lite/ui/views/rarepebble/HueSatView.java | 46 +++--- .../ui/views/rarepebble/SliderViewBase.java | 1 - .../lite/ui/views/rarepebble/SquareView.java | 8 +- .../lite/ui/views/rarepebble/SwatchView.java | 25 ++-- .../lite/ui/views/rarepebble/ValueView.java | 9 +- .../ru/vtosters/lite/utils/AndroidUtils.java | 7 +- .../ru/vtosters/lite/utils/CrashReporter.java | 5 +- .../java/ru/vtosters/lite/utils/IOUtils.java | 22 +-- 21 files changed, 214 insertions(+), 223 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java b/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java index 42c186ebd..eea7712c0 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java @@ -166,26 +166,25 @@ public class ThemesCore { } public static boolean hasThemedAttr(Context context, int attrID) { - if (ThemesUtils.isMonetTheme() || ThemesManager.canApplyCustomAccent()) { - if (Preferences.getBoolValue("logColors", false)) { - try { - Log.d(TAG, "Requesting color by attr " + context.getResources().getResourceName(attrID)); - } catch (Exception ignored) { - } + if (Preferences.getBoolValue("logColors", false)) { + try { + Log.d(TAG, "Requesting color by attr " + context.getResources().getResourceName(attrID)); + } catch (Exception ignored) { } + } + if (ThemesUtils.isMonetTheme() || ThemesManager.canApplyCustomAccent()) { if (isCachedAccents()) { - if (ThemesUtils.isDarkTheme()) { - return (themedColors.get(attrID) != 0 && ACCENT_THEME_ONLY_DARK.get(attrID, true) && ( - ThemesUtils.isMilkshake() ? - ACCENT_THEME_ONLY_MILK_DARK.get(attrID, true) : - ACCENT_THEME_ONLY_NOMILK_DARK.get(attrID, true))); - } else { - return (themedColors.get(attrID) != 0 && ACCENT_THEME_ONLY_LIGHT.get(attrID, true) && ( - ThemesUtils.isMilkshake() ? - ACCENT_THEME_ONLY_MILK_LIGHT.get(attrID, true) : - ACCENT_THEME_ONLY_NOMILK_LIGHT.get(attrID, true))); - } + boolean isDark = ThemesUtils.isDarkTheme(); + boolean isMilkshake = ThemesUtils.isMilkshake(); + SparseBooleanArray themeOnlyMap = isDark ? ACCENT_THEME_ONLY_DARK : ACCENT_THEME_ONLY_LIGHT; + SparseBooleanArray milkshakeMap = isDark ? ACCENT_THEME_ONLY_MILK_DARK : ACCENT_THEME_ONLY_MILK_LIGHT; + SparseBooleanArray noMilkshakeMap = isDark ? ACCENT_THEME_ONLY_NOMILK_DARK : ACCENT_THEME_ONLY_NOMILK_LIGHT; + + return (themedColors.get(attrID) != 0 && themeOnlyMap.get(attrID, true) && ( + isMilkshake ? + milkshakeMap.get(attrID, true) : + noMilkshakeMap.get(attrID, true))); } else { return themedColors.get(attrID) != 0; } @@ -194,7 +193,6 @@ public class ThemesCore { } } - public static void clear() { cachedAccents = false; themedColors.clear(); diff --git a/app/src/main/java/ru/vtosters/lite/themes/ThemesManager.java b/app/src/main/java/ru/vtosters/lite/themes/ThemesManager.java index 29339bab8..50f465e1e 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ThemesManager.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ThemesManager.java @@ -20,7 +20,7 @@ import java.util.zip.ZipOutputStream; public class ThemesManager { - private final static int[] ACCENT_COLORS = { + private static final int[] ACCENT_COLORS = { R.color.vk_sky_300, R.color.sky_300, R.color.viewer_retry_button_text_color, @@ -96,7 +96,7 @@ public class ThemesManager { R.color.header_blue_opacity40 }; // modify it if "doNotCompress" in apktool.yml has been edited - private final static String[] DO_NOT_COMPRESS = { + private static final String[] DO_NOT_COMPRESS = { ".png", ".jpg", ".mp3", @@ -129,9 +129,8 @@ public class ThemesManager { } // validate modded apk before loading - private static void validateModApk() - throws IOException { - final var apk = new ZipFile(modApk); + private static void validateModApk() throws IOException { + var apk = new ZipFile(modApk); apk.close(); validated = true; @@ -155,21 +154,17 @@ public class ThemesManager { public static void generateModApk(int accentColor) throws Throwable { - try ( - final var apk = new ZipFile(baseApkPath) - ) { - final var arscEntry = apk.getEntry("resources.arsc"); - final var arscBis = new BufferedInputStream(apk.getInputStream(arscEntry)); - final var arsc = BinaryResourceFile.fromInputStream(arscBis); + try (var apk = new ZipFile(baseApkPath)) { + var arscEntry = apk.getEntry("resources.arsc"); + var arscBis = new BufferedInputStream(apk.getInputStream(arscEntry)); + var arsc = BinaryResourceFile.fromInputStream(arscBis); ArscEditor.changeColors(arsc, ACCENT_COLORS, accentColor); - try ( - final var zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(modApk))) - ) { - final var arscBuff = arsc.toByteArray(); - final var newArscEntry = new ZipEntry("resources.arsc"); + try (var zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(modApk)))) { + var arscBuff = arsc.toByteArray(); + var newArscEntry = new ZipEntry("resources.arsc"); - final var crc = new CRC32(); + var crc = new CRC32(); crc.update(arscBuff); newArscEntry.setSize(arscBuff.length); @@ -180,10 +175,10 @@ public class ThemesManager { zos.write(arscBuff); zos.closeEntry(); - final var entries = apk.entries(); + var entries = apk.entries(); while (entries.hasMoreElements()) { - final var entry = entries.nextElement(); - final var name = entry.getName(); + var entry = entries.nextElement(); + var name = entry.getName(); if (!name.startsWith("res/") && !name.startsWith("assets/") || name.equals("resources.arsc")) continue; @@ -196,8 +191,8 @@ public class ThemesManager { } } - final var entryBis = new BufferedInputStream(apk.getInputStream(entry)); - final var newEntry = new ZipEntry(name); + var entryBis = new BufferedInputStream(apk.getInputStream(entry)); + var newEntry = new ZipEntry(name); if (doNotCompress) { newEntry.setMethod(ZipEntry.STORED); diff --git a/app/src/main/java/ru/vtosters/lite/themes/loaders/AssetManagerHelper.java b/app/src/main/java/ru/vtosters/lite/themes/loaders/AssetManagerHelper.java index 4fb57aada..deccc1cbf 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/loaders/AssetManagerHelper.java +++ b/app/src/main/java/ru/vtosters/lite/themes/loaders/AssetManagerHelper.java @@ -10,11 +10,11 @@ public class AssetManagerHelper { // methods - private final static Method getAssetPathMtd; - private final static Method getApkAssetsMtd; - private final static Method addAssetPathMtd; - private final static Method addAssetPathAsSharedLibraryMtd; - private final static Method addOverlayPathMtd; + private static final Method getAssetPathMtd; + private static final Method getApkAssetsMtd; + private static final Method addAssetPathMtd; + private static final Method addAssetPathAsSharedLibraryMtd; + private static final Method addOverlayPathMtd; static { try { @@ -33,7 +33,7 @@ public class AssetManagerHelper { Object[] apkAssetsArr = (Object[]) getAssetPathMtd.invoke(assetManager); // By default, base apk is the last element of array if is not, for execution speed, we should iterate array from the end to the beginning for (int i = apkAssetsArr.length - 1; i >= 0; i--) { - final String pathname = (String) getApkAssetsMtd.invoke(apkAssetsArr[i]); + String pathname = (String) getApkAssetsMtd.invoke(apkAssetsArr[i]); if (pathname.contains(packagename)) return pathname; } diff --git a/app/src/main/java/ru/vtosters/lite/themes/loaders/ResourcesLoader.java b/app/src/main/java/ru/vtosters/lite/themes/loaders/ResourcesLoader.java index 95d6d5e3e..99340f531 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/loaders/ResourcesLoader.java +++ b/app/src/main/java/ru/vtosters/lite/themes/loaders/ResourcesLoader.java @@ -1,5 +1,6 @@ package ru.vtosters.lite.themes.loaders; +import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.res.AssetManager; @@ -19,6 +20,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; +@SuppressLint("PrivateApi") public class ResourcesLoader { private static Collection> sResourceReferences = null; @@ -42,7 +44,7 @@ public class ResourcesLoader { static { try { // API version 8 has PackageInfo, 10 has LoadedApk. Needs to check 9 - final Class activityThreadClz = Class.forName("android.app.ActivityThread"); + Class activityThreadClz = Class.forName("android.app.ActivityThread"); Class loadedApkClz; try { loadedApkClz = Class.forName("android.app.LoadedApk"); @@ -93,37 +95,36 @@ public class ResourcesLoader { //pre-N // Find the singleton instance of ResourcesManager - final Class resourcesManagerClass = Class.forName("android.app.ResourcesManager"); - final Method mGetInstance = ReflectionUtils.findMethod(resourcesManagerClass, "getInstance"); - final Object resourcesManager = mGetInstance.invoke(null); + Class resourcesManagerClass = Class.forName("android.app.ResourcesManager"); + Method mGetInstance = ReflectionUtils.findMethod(resourcesManagerClass, "getInstance"); + Object resourcesManager = mGetInstance.invoke(null); try { Field fMActiveResources = ReflectionUtils.findField(resourcesManagerClass, "mActiveResources"); - final ArrayMap> activeResources19 = + ArrayMap> activeResources19 = (ArrayMap>) fMActiveResources.get(resourcesManager); sResourceReferences = activeResources19.values(); } catch (NoSuchFieldException ignore) { // N moved the resources to mResourceReferences - final Field mResourceReferences = ReflectionUtils.findField(resourcesManagerClass, "mResourceReferences"); + Field mResourceReferences = ReflectionUtils.findField(resourcesManagerClass, "mResourceReferences"); sResourceReferences = (Collection>) mResourceReferences.get(resourcesManager); } } public static void load(Context context, String resPath, boolean reinject) throws Exception { - final ApplicationInfo appInfo = context.getApplicationInfo(); + ApplicationInfo appInfo = context.getApplicationInfo(); - final Field[] packagesFlds = Build.VERSION.SDK_INT < Build.VERSION_CODES.O_MR1 + Field[] packagesFlds = Build.VERSION.SDK_INT < Build.VERSION_CODES.O_MR1 ? new Field[]{packagesFld, resourcePackagesFld} : new Field[]{packagesFld}; for (var fld : packagesFlds) { - final var value = fld.get(sCurrentActivityThread); + var value = fld.get(sCurrentActivityThread); - for (var entry - : ((Map>) value).entrySet()) { - final var loadedApk = entry.getValue().get(); + for (var entry : ((Map>) value).entrySet()) { + var loadedApk = entry.getValue().get(); if (loadedApk == null) continue; - final var resDirPath = (String) resDirFld.get(loadedApk); + var resDirPath = (String) resDirFld.get(loadedApk); if (appInfo.sourceDir.equals(resDirPath)) resDirFld.set(loadedApk, resPath); } @@ -157,7 +158,7 @@ public class ResourcesLoader { ensureStringBlocksMtd.invoke(sAssetManager); } for (var wr : sResourceReferences) { - final var resources = wr.get(); + var resources = wr.get(); if (resources == null) continue; // Set the AssetManager of the Resources instance to our brand new one @@ -166,9 +167,9 @@ public class ResourcesLoader { assetsFld.set(resources, sAssetManager); } catch (Throwable ignore) { // N - final var resourceImpl = resourcesImplFld.get(resources); + var resourceImpl = resourcesImplFld.get(resources); // for Huawei HwResourcesImpl - final Field implAssets = ReflectionUtils.findField(resourceImpl, "mAssets"); + Field implAssets = ReflectionUtils.findField(resourceImpl, "mAssets"); implAssets.set(resourceImpl, sAssetManager); } @@ -196,13 +197,13 @@ public class ResourcesLoader { private static void installResourceInsuranceHacks(Context context, String patchedResApkPath) { try { - final Object activityThread = ReflectionUtils.getActivityThread(context, null); - final Field mHField = ReflectionUtils.findField(activityThread, "mH"); - final Handler mH = (Handler) mHField.get(activityThread); - final Field mCallbackField = ReflectionUtils.findField(Handler.class, "mCallback"); - final Handler.Callback originCallback = (Handler.Callback) mCallbackField.get(mH); + Object activityThread = ReflectionUtils.getActivityThread(context, null); + Field mHField = ReflectionUtils.findField(activityThread, "mH"); + Handler mH = (Handler) mHField.get(activityThread); + Field mCallbackField = ReflectionUtils.findField(Handler.class, "mCallback"); + Handler.Callback originCallback = (Handler.Callback) mCallbackField.get(mH); if (!(originCallback instanceof ResourceInsuranceHandlerCallback)) { - final ResourceInsuranceHandlerCallback hackCallback = new ResourceInsuranceHandlerCallback( + ResourceInsuranceHandlerCallback hackCallback = new ResourceInsuranceHandlerCallback( context, patchedResApkPath, originCallback, mH.getClass()); mCallbackField.set(mH, hackCallback); } else { @@ -250,9 +251,9 @@ public class ResourcesLoader { Log.w("ResourcesLoader", "try to clear typedArray cache!"); // Clear typedArray cache. try { - final Field typedArrayPoolField = ReflectionUtils.findField(Resources.class, "mTypedArrayPool"); - final Object origTypedArrayPool = typedArrayPoolField.get(resources); - final Method acquireMethod = ReflectionUtils.findMethod(origTypedArrayPool, "acquire"); + Field typedArrayPoolField = ReflectionUtils.findField(Resources.class, "mTypedArrayPool"); + Object origTypedArrayPool = typedArrayPoolField.get(resources); + Method acquireMethod = ReflectionUtils.findMethod(origTypedArrayPool, "acquire"); while (true) { if (acquireMethod.invoke(origTypedArrayPool) == null) { break; @@ -268,9 +269,8 @@ public class ResourcesLoader { applicationInfo.sharedLibraryFiles != null; } - private static final class ResourceInsuranceHandlerCallback implements Handler.Callback { + private static class ResourceInsuranceHandlerCallback implements Handler.Callback { private static final String LAUNCH_ACTIVITY_LIFECYCLE_ITEM_CLASSNAME = "android.app.servertransaction.LaunchActivityItem"; - private final Context mContext; private final String mPatchResApkPath; private final Handler.Callback mOriginalCallback; @@ -319,48 +319,56 @@ public class ResourcesLoader { } @SuppressWarnings("unchecked") - private boolean hackMessage(Message msg) { - boolean shouldReInjectPatchedResources = false; + // A method to check if the message requires re-injecting patched resources + private boolean shouldReInjectPatchedResources(Message msg) { if (!isPatchedResModifiedAfterLastLoad(mPatchResApkPath)) { - shouldReInjectPatchedResources = false; - } else { - if (msg.what == LAUNCH_ACTIVITY || msg.what == RELAUNCH_ACTIVITY) { - shouldReInjectPatchedResources = true; - } else if (msg.what == EXECUTE_TRANSACTION) { - do { - if (mSkipInterceptExecuteTransaction) { - break; - } - final Object transaction = msg.obj; - if (transaction == null) { - Log.w("ResourcesLoader", "transaction is null, skip rest insurance logic."); - break; - } - if (mGetCallbacksMethod == null) { - try { - mGetCallbacksMethod = ReflectionUtils.findMethod(transaction, "getCallbacks"); - } catch (Throwable ignored) { - // Ignored. - } - } - if (mGetCallbacksMethod == null) { - Log.e("ResourcesLoader", "fail to find getLifecycleStateRequest method, skip rest insurance logic."); - mSkipInterceptExecuteTransaction = true; - break; - } - try { - final List req = (List) mGetCallbacksMethod.invoke(transaction); - if (req != null && req.size() > 0) { - final Object cb = req.get(0); - shouldReInjectPatchedResources = cb != null && cb.getClass().getName().equals(LAUNCH_ACTIVITY_LIFECYCLE_ITEM_CLASSNAME); - } - } catch (Throwable ignored) { - Log.e("ResourcesLoader", "fail to call getLifecycleStateRequest method, skip rest insurance logic."); - } - } while (false); + return false; + } + if (msg.what == LAUNCH_ACTIVITY || msg.what == RELAUNCH_ACTIVITY) { + return true; + } + // If the message is executing a transaction, check the callbacks + if (msg.what == EXECUTE_TRANSACTION) { + // Skip the logic if the method is not found or an error occurs + if (mSkipInterceptExecuteTransaction) { + return false; + } + // Get the transaction object from the message + Object transaction = msg.obj; + if (transaction == null) { + Log.w("ResourcesLoader", "transaction is null, skip rest insurance logic."); + return false; + } + // Get the getCallbacks method from the transaction class + if (mGetCallbacksMethod == null) { + try { + mGetCallbacksMethod = ReflectionUtils.findMethod(transaction, "getCallbacks"); + } catch (Throwable ignored) { + // Ignored. + } + } + if (mGetCallbacksMethod == null) { + Log.e("ResourcesLoader", "fail to find getCallbacks method, skip rest insurance logic."); + mSkipInterceptExecuteTransaction = true; + return false; + } + try { + List callbacks = (List) mGetCallbacksMethod.invoke(transaction); + if (callbacks != null && !callbacks.isEmpty()) { + Object cb = callbacks.get(0); + return cb != null && cb.getClass().getName().equals(LAUNCH_ACTIVITY_LIFECYCLE_ITEM_CLASSNAME); + } + } catch (Throwable ignored) { + Log.e("ResourcesLoader", "fail to call getCallbacks method, skip rest insurance logic."); } } - if (shouldReInjectPatchedResources) { + return false; + } + + // A method to hack the message and re-inject patched resources if needed + @SuppressWarnings("unchecked") + private boolean hackMessage(Message msg) { + if (shouldReInjectPatchedResources(msg)) { try { load(mContext, mPatchResApkPath, true); } catch (Throwable thr) { diff --git a/app/src/main/java/ru/vtosters/lite/themes/palettes/PalettesManager.java b/app/src/main/java/ru/vtosters/lite/themes/palettes/PalettesManager.java index 593e298ec..87db482e0 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/palettes/PalettesManager.java +++ b/app/src/main/java/ru/vtosters/lite/themes/palettes/PalettesManager.java @@ -23,8 +23,8 @@ import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; public class PalettesManager { - private final static File PALETTES_DIR = new File(Environment.getExternalStorageDirectory(), "VTL/palettes"); - private final static String ASSETS_DIR = "vtl_themes/palettes/"; + private static final File PALETTES_DIR = new File(Environment.getExternalStorageDirectory(), "VTL/palettes"); + private static final String ASSETS_DIR = "vtl_themes/palettes/"; private static PalettesManager sInstance; @@ -51,17 +51,17 @@ public class PalettesManager { return; } - final var palettes = PALETTES_DIR.listFiles((dir, name) -> name.endsWith(".json")); + var palettes = PALETTES_DIR.listFiles((dir, name) -> name.endsWith(".json")); if (palettes == null || palettes.length == 0) copyPaletteFromAssets(); parsePalettes(); } - private boolean copyPaletteFromAssets() { + private void copyPaletteFromAssets() { try { - final var manager = AndroidUtils.getGlobalContext().getAssets(); - final var assets = manager.list(ASSETS_DIR); - if (assets == null || assets.length == 0) return false; + var manager = AndroidUtils.getGlobalContext().getAssets(); + var assets = manager.list(ASSETS_DIR); + if (assets == null || assets.length == 0) return; for (var asset : assets) { try { IOUtils.copy(manager.open(ASSETS_DIR + asset), new File(PALETTES_DIR, asset)); @@ -69,11 +69,9 @@ public class PalettesManager { e.printStackTrace(); } } - return true; } catch (IOException e) { e.printStackTrace(); } - return false; } private void parsePalettes() { diff --git a/app/src/main/java/ru/vtosters/lite/themes/utils/ArscEditor.java b/app/src/main/java/ru/vtosters/lite/themes/utils/ArscEditor.java index 2b3b65236..4541c0dee 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/utils/ArscEditor.java +++ b/app/src/main/java/ru/vtosters/lite/themes/utils/ArscEditor.java @@ -8,15 +8,15 @@ public class ArscEditor { public static void changeColors(BinaryResourceFile arsc, int[] colorIds, int color) { for (var chunk : arsc.getChunks()) { - final var resTableChunk = (ResourceTableChunk) chunk; + var resTableChunk = (ResourceTableChunk) chunk; for (var packageChunk : resTableChunk.getPackages()) { for (var typeChunk : packageChunk.getTypeChunks("color")) { for (var entry : typeChunk.getEntries().entrySet()) { - final var value = entry.getValue(); + var value = entry.getValue(); if (value.isComplex()) continue; - final var binValue = value.value(); + var binValue = value.value(); if (!isColorResourceValue(binValue)) continue; - final var resId = packageChunk.getId() << 24 | typeChunk.getId() << 16 | entry.getKey(); + var resId = packageChunk.getId() << 24 | typeChunk.getId() << 16 | entry.getKey(); for (var colodId : colorIds) { if (resId == colodId) { binValue.data = color; diff --git a/app/src/main/java/ru/vtosters/lite/ui/PreferenceFragmentUtils.java b/app/src/main/java/ru/vtosters/lite/ui/PreferenceFragmentUtils.java index 9b87c9b12..e95eba936 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/PreferenceFragmentUtils.java +++ b/app/src/main/java/ru/vtosters/lite/ui/PreferenceFragmentUtils.java @@ -301,7 +301,7 @@ public class PreferenceFragmentUtils { return addPreference(screen, key, title, null, null, preference -> { LinearLayout linearLayout = new LinearLayout(screen.getContext()); - final EditText editText = new EditText(screen.getContext()); + EditText editText = new EditText(screen.getContext()); editText.setText(PreferenceManager.getDefaultSharedPreferences(screen.getContext()).getString(key, "")); editText.setHint(title); editText.setTextColor(ThemesUtils.getTextAttr()); diff --git a/app/src/main/java/ru/vtosters/lite/ui/adapters/CategorizedAdapter.java b/app/src/main/java/ru/vtosters/lite/ui/adapters/CategorizedAdapter.java index 20dbcd766..2a7f10589 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/adapters/CategorizedAdapter.java +++ b/app/src/main/java/ru/vtosters/lite/ui/adapters/CategorizedAdapter.java @@ -36,7 +36,7 @@ public class CategorizedAdapter extends RecyclerView.Adapter mSelectedItems; private final List mDisabledItems; private final List mUnmovedItems; - final private List mExceptions = new ArrayList<>(); + private final List mExceptions = new ArrayList<>(); private final IViewHolderBinder mBinder; // Min and max counts @@ -50,7 +50,8 @@ public class CategorizedAdapter extends RecyclerView.Adapter extends RecyclerView.Adapter 0) { - boolean except=false; - int q=0; - for(var ex:mExceptions) - { - var i=mSelectedItems.indexOf(ex); - if(i==-1)continue; - if(i+1==fromPosition)except=true; + if (!mExceptions.isEmpty()) { + boolean except = false; + int q = 0; + for (var ex : mExceptions) { + var i = mSelectedItems.indexOf(ex); + if (i == -1) continue; + if (i + 1 == fromPosition) except = true; ++q; } - if(except&&q==1)return false; + if (except && q == 1) return false; } mDisabledItems.add(0, mSelectedItems.remove(fromPosition - 1)); } else Collections.swap(mSelectedItems, fromPosition - 1, toPosition - 1); @@ -224,7 +224,6 @@ public class CategorizedAdapter extends RecyclerView.Adapter { - private final String[] mMessages; public MessagesPreviewAdapter(String... messages) { @@ -35,9 +34,9 @@ public class MessagesPreviewAdapter extends RecyclerView.Adapter= 23 && Preferences.getBoolValue("showDoze", true))) return; - final String packName = activity.getPackageName(); - final PowerManager manager = (PowerManager) activity.getSystemService(Context.POWER_SERVICE); + String packName = activity.getPackageName(); + PowerManager manager = (PowerManager) activity.getSystemService(Context.POWER_SERVICE); if (manager.isIgnoringBatteryOptimizations(packName)) return; new VkAlertDialog.Builder(activity) .setTitle(R.string.batteryissuetitle) diff --git a/app/src/main/java/ru/vtosters/lite/ui/dialogs/OTADialog.java b/app/src/main/java/ru/vtosters/lite/ui/dialogs/OTADialog.java index b2d8b6721..e59accc0d 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/dialogs/OTADialog.java +++ b/app/src/main/java/ru/vtosters/lite/ui/dialogs/OTADialog.java @@ -1,5 +1,6 @@ package ru.vtosters.lite.ui.dialogs; +import android.annotation.SuppressLint; import android.app.Activity; import android.view.View; import android.widget.LinearLayout; @@ -41,6 +42,7 @@ public class OTADialog extends ModalBottomSheetWrapper implements OTA }); } + @SuppressLint("SetTextI18n") private View makeUpdateInfoView(String changelog) { LinearLayout container = new LinearLayout(mActivity); TextView changelogView = new TextView(mActivity); diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/AlphaView.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/AlphaView.java index 4c92e33fc..1154fb48e 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/AlphaView.java +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/AlphaView.java @@ -37,16 +37,16 @@ public class AlphaView extends SliderViewBase implements ColorObserver { @Override protected Bitmap makeBitmap(int w, int h) { - final boolean isWide = w > h; - final int n = Math.max(w, h); + boolean isWide = w > h; + int n = Math.max(w, h); int color = observableColor.getColor(); int[] colors = new int[n]; for (int i = 0; i < n; ++i) { float alpha = isWide ? (float) i / n : 1 - (float) i / n; colors[i] = color & 0xffffff | (int) (alpha * 0xff) << 24; } - final int bmpWidth = isWide ? w : 1; - final int bmpHeight = isWide ? 1 : h; + int bmpWidth = isWide ? w : 1; + int bmpHeight = isWide ? 1 : h; return Bitmap.createBitmap(colors, bmpWidth, bmpHeight, Bitmap.Config.ARGB_8888); } diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HexEdit.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HexEdit.java index 827fe8055..6a0b897c5 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HexEdit.java +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HexEdit.java @@ -18,13 +18,12 @@ class HexEdit { new HexFilter() }; - public static void setUpListeners(final EditText hexEdit, final ObservableColor observableColor) { - + public static void setUpListeners(EditText hexEdit, ObservableColor observableColor) { class MultiObserver implements ColorObserver, TextWatcher { @Override public void updateColor(ObservableColor observableColor) { - final String colorString = formatColor(observableColor.getColor()); + String colorString = formatColor(observableColor.getColor()); // Prevent onTextChanged getting called when we update text programmatically hexEdit.removeTextChangedListener(this); hexEdit.setText(colorString); @@ -57,7 +56,7 @@ class HexEdit { } } - final MultiObserver multiObserver = new MultiObserver(); + MultiObserver multiObserver = new MultiObserver(); hexEdit.addTextChangedListener(multiObserver); observableColor.addObserver(multiObserver); setShowAlphaDigits(hexEdit, true); @@ -71,14 +70,13 @@ class HexEdit { } } - public static void setShowAlphaDigits(final EditText hexEdit, boolean showAlphaDigits) { + public static void setShowAlphaDigits(EditText hexEdit, boolean showAlphaDigits) { hexEdit.setFilters(showAlphaDigits ? withAlphaDigits : withoutAlphaDigits); hexEdit.setText(hexEdit.getText()); // trigger a reformat of text } private static class ColorPasteLengthFilter implements InputFilter { - private static final int MAX_LENGTH = 6; private static final int PASTED_LEN = 8; private final InputFilter sixDigitFilter = new InputFilter.LengthFilter(MAX_LENGTH); @@ -86,8 +84,8 @@ class HexEdit { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { // If 8 digits have been pasted, replacing all source, trim alpha digits. // Otherwise standard LengthFilter behavior. - final int srcLength = end - start; - final int dstSelLength = dend - dstart; + int srcLength = end - start; + int dstSelLength = dend - dstart; if (srcLength == PASTED_LEN && dstSelLength == dest.length()) { // Discard alpha digits: return source.subSequence(PASTED_LEN - MAX_LENGTH, PASTED_LEN); @@ -98,7 +96,6 @@ class HexEdit { } private static class HexFilter implements InputFilter { - @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { boolean state = true; diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HueSatView.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HueSatView.java index 0dca2bc52..e6e008da3 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HueSatView.java +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HueSatView.java @@ -57,9 +57,9 @@ public class HueSatView extends SquareView implements ColorObserver { float[] hsv = new float[]{0f, 0f, 1f}; for (int y = 0; y < radiusPx; ++y) { for (int x = 0; x < radiusPx; ++x) { - final int i = x + y * radiusPx; - final float sat = satForPos(x, y, radiusPx); - final float arcBleed = 2f / radiusPx; // extend curved edge pixels just outside clip area. + int i = x + y * radiusPx; + float sat = satForPos(x, y, radiusPx); + float arcBleed = 2f / radiusPx; // extend curved edge pixels just outside clip area. if (sat <= 1 + arcBleed) { hsv[0] = hueForPos(x, y, radiusPx); hsv[1] = sat; @@ -71,35 +71,35 @@ public class HueSatView extends SquareView implements ColorObserver { } private static float hueForPos(float x, float y, float radiusPx) { - final double r = radiusPx - 1; // gives values 0...1 inclusive - final double dx = (r - x) / r; - final double dy = (r - y) / r; - final double angle = Math.atan2(dy, dx); - final double hue = 360 * angle / (Math.PI / 2); + double r = radiusPx - 1; // gives values 0...1 inclusive + double dx = (r - x) / r; + double dy = (r - y) / r; + double angle = Math.atan2(dy, dx); + double hue = 360 * angle / (Math.PI / 2); return (float) hue; } private static float satForPos(float x, float y, float radiusPx) { - final double r = radiusPx - 1; // gives values 0...1 inclusive - final double dx = (r - x) / r; - final double dy = (r - y) / r; - final double sat = dx * dx + dy * dy; // leave it squared -- exaggerates pale colors + double r = radiusPx - 1; // gives values 0...1 inclusive + double dx = (r - x) / r; + double dy = (r - y) / r; + double sat = dx * dx + dy * dy; // leave it squared -- exaggerates pale colors return (float) sat; } private static void setPointer(PointF pointer, float hue, float sat, float radiusPx) { - final float r = radiusPx - 1; // for values 0...1 inclusive - final double distance = r * Math.sqrt(sat); - final double angle = hue / 360 * Math.PI / 2; - final double dx = distance * Math.cos(angle); - final double dy = distance * Math.sin(angle); + float r = radiusPx - 1; // for values 0...1 inclusive + double distance = r * Math.sqrt(sat); + double angle = hue / 360 * Math.PI / 2; + double dx = distance * Math.cos(angle); + double dy = distance * Math.sin(angle); pointer.set(r - (float) dx, r - (float) dy); } private int optimalBitmapSize() { - final int scale = 2; - final int maxBitmapSize = 128; - final DisplayMetrics dm = getResources().getDisplayMetrics(); + int scale = 2; + int maxBitmapSize = 128; + DisplayMetrics dm = getResources().getDisplayMetrics(); return Math.min(maxBitmapSize, Math.min(dm.widthPixels, dm.heightPixels) / scale); } @@ -159,9 +159,9 @@ public class HueSatView extends SquareView implements ColorObserver { private boolean clamp(PointF pointer, float x, float y, boolean rejectOutside) { x = Math.min(x, w); y = Math.min(y, h); - final float dx = w - x; - final float dy = h - y; - final float r = (float) Math.sqrt(dx * dx + dy * dy); + float dx = w - x; + float dy = h - y; + float r = (float) Math.sqrt(dx * dx + dy * dy); boolean outside = r > w; if (!outside || !rejectOutside) { if (outside) { diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SliderViewBase.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SliderViewBase.java index 53b5bfc91..75400a32d 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SliderViewBase.java +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SliderViewBase.java @@ -6,7 +6,6 @@ import android.view.MotionEvent; import android.view.View; public abstract class SliderViewBase extends View { - private final Paint borderPaint; private final Paint checkerPaint; private final Rect viewRect = new Rect(); diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SquareView.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SquareView.java index 355ae9e45..11429dbde 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SquareView.java +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SquareView.java @@ -18,10 +18,10 @@ class SquareView extends View { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Constrain to square - final int w = MeasureSpec.getSize(widthMeasureSpec); - final int h = MeasureSpec.getSize(heightMeasureSpec); - final int modeW = MeasureSpec.getMode(widthMeasureSpec); - final int modeH = MeasureSpec.getMode(heightMeasureSpec); + int w = MeasureSpec.getSize(widthMeasureSpec); + int h = MeasureSpec.getSize(heightMeasureSpec); + int modeW = MeasureSpec.getMode(widthMeasureSpec); + int modeH = MeasureSpec.getMode(heightMeasureSpec); int size = minSizePx; if (modeW == MeasureSpec.UNSPECIFIED) { size = h; diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SwatchView.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SwatchView.java index b09260488..9929436c9 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SwatchView.java +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SwatchView.java @@ -8,7 +8,6 @@ import android.graphics.RectF; import ru.vtosters.lite.utils.AndroidUtils; public class SwatchView extends SquareView implements ColorObserver { - private final Paint borderPaint; private final Path borderPath; private final Paint checkerPaint; @@ -46,14 +45,14 @@ public class SwatchView extends SquareView implements ColorObserver { } private static void cornerArc(Path path, float cx, float cy, float r, float startAngle, float sweepAngle) { - final RectF ovalRect = new RectF(-r, -r, r, r); + RectF ovalRect = new RectF(-r, -r, r, r); ovalRect.offset(cx, cy); path.arcTo(ovalRect, startAngle, sweepAngle); } private static void mainArc(Path path, float viewSize, float margin, float startAngle, float sweepAngle) { float r = viewSize + margin; - final RectF ovalRect = new RectF(-r, -r, r, r); + RectF ovalRect = new RectF(-r, -r, r, r); ovalRect.offset(viewSize, viewSize); path.arcTo(ovalRect, startAngle, sweepAngle); } @@ -77,23 +76,23 @@ public class SwatchView extends SquareView implements ColorObserver { protected void onSizeChanged(int w, int h, int oldw, int oldh) { // We expect to be stacked behind a square HueSatView and fill the top left corner. - final float inset = borderPaint.getStrokeWidth() / 2; - final float r = Math.min(w, h); + float inset = borderPaint.getStrokeWidth() / 2; + float r = Math.min(w, h); // Trim the corners of the swatch is where it is radialMarginPx thick. // find how long the outeredges are: - final float margin = radialMarginPx; - final float diagonal = r + 2 * margin; - final float opp = (float) Math.sqrt(diagonal * diagonal - r * r); - final float edgeLen = r - opp; + float margin = radialMarginPx; + float diagonal = r + 2 * margin; + float opp = (float) Math.sqrt(diagonal * diagonal - r * r); + float edgeLen = r - opp; // Arc angles for drawing CCW - final float outerAngle = (float) Math.toDegrees(Math.atan2(opp, r)); - final float startAngle = 270 - outerAngle; + float outerAngle = (float) Math.toDegrees(Math.atan2(opp, r)); + float startAngle = 270 - outerAngle; // Sweep angle for each half of the swatch: - final float sweepAngle = outerAngle - 45; + float sweepAngle = outerAngle - 45; // Sweep angle for the smooth corners: - final float cornerSweepAngle = 90 - outerAngle; + float cornerSweepAngle = 90 - outerAngle; // Outer border: beginBorder(borderPath, inset, edgeLen, margin, cornerSweepAngle); diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ValueView.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ValueView.java index c73f0449f..63118b702 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ValueView.java +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ValueView.java @@ -5,7 +5,6 @@ import android.graphics.Bitmap; import android.graphics.Color; public class ValueView extends SliderViewBase implements ColorObserver { - private ObservableColor observableColor = new ObservableColor(0); public ValueView(Context context) { @@ -37,8 +36,8 @@ public class ValueView extends SliderViewBase implements ColorObserver { } protected Bitmap makeBitmap(int w, int h) { - final boolean isWide = w > h; - final int n = Math.max(w, h); + boolean isWide = w > h; + int n = Math.max(w, h); int[] colors = new int[n]; float[] hsv = new float[]{0, 0, 0}; @@ -48,8 +47,8 @@ public class ValueView extends SliderViewBase implements ColorObserver { hsv[2] = isWide ? (float) i / n : 1 - (float) i / n; colors[i] = Color.HSVToColor(hsv); } - final int bmpWidth = isWide ? w : 1; - final int bmpHeight = isWide ? 1 : h; + int bmpWidth = isWide ? w : 1; + int bmpHeight = isWide ? 1 : h; return Bitmap.createBitmap(colors, bmpWidth, bmpHeight, Bitmap.Config.ARGB_8888); } diff --git a/app/src/main/java/ru/vtosters/lite/utils/AndroidUtils.java b/app/src/main/java/ru/vtosters/lite/utils/AndroidUtils.java index c79090c1a..2a8fb0b0c 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/AndroidUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/AndroidUtils.java @@ -46,7 +46,7 @@ public class AndroidUtils { @NonNull public static Context getGlobalContext() { try { - final Method getInitialApplicationMtd = ReflectionUtils.findMethod(Class.forName("android.app.AppGlobals"), "getInitialApplication"); + Method getInitialApplicationMtd = ReflectionUtils.findMethod(Class.forName("android.app.AppGlobals"), "getInitialApplication"); return (Context) getInitialApplicationMtd.invoke(null); } catch (Exception e) { Log.d("GlobalContext", "Error while fetching context via refl"); @@ -186,8 +186,8 @@ public class AndroidUtils { } private static String getRandomString(int sizeOfRandomString) { - final Random random = new Random(); - final StringBuilder sb = new StringBuilder(sizeOfRandomString); + Random random = new Random(); + StringBuilder sb = new StringBuilder(sizeOfRandomString); for (int i = 0; i < sizeOfRandomString; ++i) sb.append(ALLOWED_CHARACTERS.charAt(random.nextInt(ALLOWED_CHARACTERS.length()))); return sb.toString(); @@ -221,7 +221,6 @@ public class AndroidUtils { long lastUpdateTime = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).lastUpdateTime; return firstInstallTime == lastUpdateTime; } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); return true; } } diff --git a/app/src/main/java/ru/vtosters/lite/utils/CrashReporter.java b/app/src/main/java/ru/vtosters/lite/utils/CrashReporter.java index bbfeb6f29..8bde5a8f8 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/CrashReporter.java +++ b/app/src/main/java/ru/vtosters/lite/utils/CrashReporter.java @@ -26,7 +26,7 @@ public class CrashReporter { } public static void init(Activity activity) { - final var defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); + var defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler((thread, th) -> CrashReporter.start(defaultUncaughtExceptionHandler, thread, th, activity)); } @@ -76,9 +76,8 @@ public class CrashReporter { } private static boolean isFoxbinInstalled() { - var pm = getGlobalContext().getPackageManager(); try { - pm.getPackageInfo("com.f0x1d.dogbin", 0); + getGlobalContext().getPackageManager().getPackageInfo("com.f0x1d.dogbin", 0); return true; } catch (Exception e) { return false; diff --git a/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java b/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java index 0f60256a5..c8dcd5075 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java @@ -16,7 +16,7 @@ import java.security.NoSuchAlgorithmException; import java.util.Arrays; public class IOUtils { - public static final int BUFFER_SIZE = 8192; + public static int BUFFER_SIZE = 8192; public static byte[] decodeStream(InputStream encIs, byte[] aesKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IOException { @@ -51,11 +51,11 @@ public class IOUtils { return new String(readFully(is), StandardCharsets.UTF_8); } - public static byte[] readFully(final InputStream is) + public static byte[] readFully(InputStream is) throws IOException { - final var bos = new ByteArrayOutputStream(); + var bos = new ByteArrayOutputStream(); try (bos) { - final byte[] buff = new byte[BUFFER_SIZE]; + byte[] buff = new byte[BUFFER_SIZE]; int len; while ((len = is.read(buff)) > 0) bos.write(buff, 0, len); @@ -63,7 +63,7 @@ public class IOUtils { } } - public static byte[] readFully(final File in) + public static byte[] readFully(File in) throws IOException { return readFully(new FileInputStream(in)); } @@ -80,25 +80,25 @@ public class IOUtils { fos.close(); } - public static void copy(final InputStream is, final OutputStream os) + public static void copy(InputStream is, OutputStream os) throws IOException { - final byte[] buff = new byte[BUFFER_SIZE]; + byte[] buff = new byte[BUFFER_SIZE]; int len; while ((len = is.read(buff)) > 0) os.write(buff, 0, len); } - public static void copy(final byte[] buffer, final File out) + public static void copy(byte[] buffer, File out) throws IOException { copy(new ByteArrayInputStream(buffer), new FileOutputStream(out)); } - public static void copy(final InputStream is, final File out) + public static void copy(InputStream is, File out) throws IOException { copy(is, new FileOutputStream(out)); } - public static void copy(final File in, final File out) + public static void copy(File in, File out) throws IOException { copy(new FileInputStream(in), new FileOutputStream(out)); } @@ -119,7 +119,7 @@ public class IOUtils { } public static long getDirSize(File dir) { - final var arr = dir.listFiles(); + var arr = dir.listFiles(); if (arr == null || arr.length == 0) return 0;