From b3edb7d64703347727301bfabdc65e1cc0a09f2a Mon Sep 17 00:00:00 2001 From: nuclearfog Date: Sun, 16 Apr 2023 19:52:26 +0200 Subject: [PATCH] bug fix, R8 rules update --- app/build.gradle | 2 +- app/proguard-rules.pro | 2 + .../twidda/backend/utils/VisibilityDelay.java | 38 +++++++++++++++++++ .../twidda/ui/views/TabSelector.java | 17 ++++++--- gradle.properties | 1 + 5 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/org/nuclearfog/twidda/backend/utils/VisibilityDelay.java diff --git a/app/build.gradle b/app/build.gradle index bcaf117d..bd595c27 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,7 +45,7 @@ proguardDictionaries { dictionaryNames = ['dict/class-dictionary', 'dict/package-dictionary', 'dict/obfuscation-dictionary'] minLineLength 4 maxLineLength 8 - linesCountInDictionary 12500 + linesCountInDictionary 50000 } dependencies { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 1132152b..0066204c 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -3,6 +3,8 @@ -classobfuscationdictionary dict/class-dictionary.txt -packageobfuscationdictionary dict/package-dictionary.txt +-optimizationpasses 5 + # keep these libraries but allow obfuscating -dontwarn org.conscrypt.Conscrypt -keep,allowobfuscation, allowoptimization class org.conscrypt.Conscrypt {*;} diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/utils/VisibilityDelay.java b/app/src/main/java/org/nuclearfog/twidda/backend/utils/VisibilityDelay.java new file mode 100644 index 00000000..1ea03f35 --- /dev/null +++ b/app/src/main/java/org/nuclearfog/twidda/backend/utils/VisibilityDelay.java @@ -0,0 +1,38 @@ +package org.nuclearfog.twidda.backend.utils; + +import android.view.View; + +import java.lang.ref.WeakReference; + +/** + * This class is used to set visibility of a view using it's post method memory leak safe + * + * @author nuclearfog + */ +public class VisibilityDelay implements Runnable { + + private WeakReference viewRef; + private boolean visibility; + + /** + * @param view view to set visibility + * @param visibility true to set view visible + */ + public VisibilityDelay(View view, boolean visibility) { + viewRef = new WeakReference<>(view); + this.visibility = visibility; + } + + + @Override + public void run() { + View view = viewRef.get(); + if (view != null) { + if (visibility) { + view.setVisibility(View.VISIBLE); + } else { + view.setVisibility(View.INVISIBLE); + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/views/TabSelector.java b/app/src/main/java/org/nuclearfog/twidda/ui/views/TabSelector.java index 6cb70f61..0b85c2c7 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/views/TabSelector.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/views/TabSelector.java @@ -17,6 +17,7 @@ import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback; import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.backend.utils.AppStyles; +import org.nuclearfog.twidda.backend.utils.VisibilityDelay; import org.nuclearfog.twidda.config.GlobalSettings; /** @@ -57,12 +58,14 @@ public class TabSelector extends LinearLayout implements OnClickListener, OnGlob tabContainer.setOrientation(LinearLayout.HORIZONTAL); indicator = new View(context); - indicator.setVisibility(INVISIBLE); indicator_height = (int) getResources().getDimension(R.dimen.tabs_indicator_height); + LayoutParams indicatorParam = new LayoutParams(getMeasuredWidth() / Math.max(tabCount, 1), 5); LayoutParams tabContainerParam = new LayoutParams(LayoutParams.MATCH_PARENT, 0); tabContainerParam.weight = 1; tabContainer.setLayoutParams(tabContainerParam); + indicator.setLayoutParams(indicatorParam); + setVisibility(INVISIBLE); addView(tabContainer); addView(indicator); } @@ -86,7 +89,8 @@ public class TabSelector extends LinearLayout implements OnClickListener, OnGlob @Override public void onGlobalLayout() { getViewTreeObserver().removeOnGlobalLayoutListener(this); - for (int i = 0 ; i < tabContainer.getChildCount(); i++) { + // set tab item size + for (int i = 0; i < tabContainer.getChildCount(); i++) { View tabItemView = tabContainer.getChildAt(i); ImageView icon = tabItemView.findViewById(R.id.tab_icon); TextView label = tabItemView.findViewById(R.id.tab_text); @@ -94,11 +98,15 @@ public class TabSelector extends LinearLayout implements OnClickListener, OnGlob tabItemView.getLayoutParams().height = getMeasuredHeight(); AppStyles.setDrawableColor(icon, settings.getIconColor()); label.setTextColor(settings.getTextColor()); + tabItemView.requestLayout(); } + // set indicator size LayoutParams params = new LayoutParams(getMeasuredWidth() / Math.max(tabCount, 1), 5); indicator.setLayoutParams(params); indicator.setBackgroundColor(settings.getHighlightColor()); - indicator.setVisibility(VISIBLE); + indicator.requestLayout(); + // make this view visible after setting sizes and distances correctly + post(new VisibilityDelay(this, true)); } /** @@ -124,7 +132,7 @@ public class TabSelector extends LinearLayout implements OnClickListener, OnGlob } else { tabCount = tArray.length(); } - for (int i = 0 ; i < tabCount ; i++) { + for (int i = 0; i < tabCount; i++) { View tabItemView = inflate(getContext(), R.layout.item_tab, null); ImageView icon = tabItemView.findViewById(R.id.tab_icon); int resId = tArray.getResourceId(i, 0); @@ -165,7 +173,6 @@ public class TabSelector extends LinearLayout implements OnClickListener, OnGlob LayoutParams params = new LayoutParams(getMeasuredWidth() / tabCount, indicator_height); params.setMarginStart((int) (getMeasuredWidth() * positionOffset / tabCount)); indicator.setLayoutParams(params); - indicator.setVisibility(VISIBLE); } } diff --git a/gradle.properties b/gradle.properties index cb887e48..e1f4fa70 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,3 +15,4 @@ org.gradle.configureondemand=false; org.gradle.jvmargs=-Xmx1536M -Dkotlin.daemon.jvm.options\="-Xmx1536M" android.enableJetifier=true android.useAndroidX=true +android.enableR8.fullMode=true