diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java
index 7d37c3c4..cd2f8695 100644
--- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java
+++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java
@@ -69,6 +69,7 @@ import org.joinmastodon.android.ui.text.CustomEmojiSpan;
import org.joinmastodon.android.ui.text.HtmlParser;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.CoverImageView;
+import org.joinmastodon.android.ui.views.CustomDrawingOrderLinearLayout;
import org.joinmastodon.android.ui.views.NestedRecyclerScrollView;
import org.joinmastodon.android.ui.views.ProgressBarButton;
import org.joinmastodon.android.utils.ElevationOnScrollListener;
@@ -125,6 +126,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
private View nameEditWrap, bioEditWrap;
private View tabsDivider;
private View actionButtonWrap;
+ private CustomDrawingOrderLinearLayout scrollableContent;
private Account account;
private String accountID;
@@ -204,6 +206,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
countersLayout=content.findViewById(R.id.profile_counters);
tabsDivider=content.findViewById(R.id.tabs_divider);
actionButtonWrap=content.findViewById(R.id.profile_action_btn_wrap);
+ scrollableContent=content.findViewById(R.id.scrollable_content);
avatar.setOutlineProvider(OutlineProviders.roundedRect(24));
avatar.setClipToOutline(true);
@@ -288,6 +291,14 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
return true;
});
+ scrollableContent.setDrawingOrderCallback((count, pos)->{
+ // The header is the first child, draw it last to overlap everything for the photo viewer transition to look nice
+ if(pos==count-1)
+ return 0;
+ // Offset the order of other child views to compensate
+ return pos+1;
+ });
+
return sizeWrapper;
}
diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/tabs/TabLayout.java b/mastodon/src/main/java/org/joinmastodon/android/ui/tabs/TabLayout.java
index d3045705..1528f0ea 100644
--- a/mastodon/src/main/java/org/joinmastodon/android/ui/tabs/TabLayout.java
+++ b/mastodon/src/main/java/org/joinmastodon/android/ui/tabs/TabLayout.java
@@ -79,6 +79,7 @@ import androidx.recyclerview.widget.util.Pools;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import me.grishka.appkit.utils.CubicBezierInterpolator;
+import me.grishka.appkit.utils.CustomViewHelper;
import me.grishka.appkit.utils.V;
import java.lang.annotation.Retention;
@@ -157,7 +158,7 @@ import java.util.Iterator;
* @attr ref com.google.android.material.R.styleable#TabLayout_tabTextAppearance
*/
@ViewPager.DecorView
-public class TabLayout extends HorizontalScrollView {
+public class TabLayout extends HorizontalScrollView implements CustomViewHelper{
private static final CubicBezierInterpolator FAST_OUT_SLOW_IN_INTERPOLATOR=new CubicBezierInterpolator(.4f, 0f, .2f, 1f);
private static final int DEF_STYLE_RES = R.style.Widget_Design_TabLayout;
@@ -1657,7 +1658,7 @@ public class TabLayout extends HorizontalScrollView {
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// If we have a MeasureSpec which allows us to decide our height, try and use the default
// height
- final int idealHeight = Math.round(V.dp(getDefaultHeight()));
+ final int idealHeight = Math.round(dp(getDefaultHeight()));
switch (MeasureSpec.getMode(heightMeasureSpec)) {
case MeasureSpec.AT_MOST:
if (getChildCount() == 1 && MeasureSpec.getSize(heightMeasureSpec) >= idealHeight) {
@@ -1680,7 +1681,7 @@ public class TabLayout extends HorizontalScrollView {
tabMaxWidth =
requestedTabMaxWidth > 0
? requestedTabMaxWidth
- : (int) (specWidth - V.dp(TAB_MIN_WIDTH_MARGIN));
+ : (int) (specWidth - dp(TAB_MIN_WIDTH_MARGIN));
}
// Now super measure itself using the (possibly) modified height spec
@@ -2842,7 +2843,7 @@ public class TabLayout extends HorizontalScrollView {
int iconMargin = 0;
if (hasText && iconView.getVisibility() == VISIBLE) {
// If we're showing both text and icon, add some margin bottom to the icon
- iconMargin = (int) V.dp(DEFAULT_GAP_TEXT_ICON);
+ iconMargin = (int) dp(DEFAULT_GAP_TEXT_ICON);
}
if (inlineLabel) {
if (iconMargin != lp.getMarginEnd()) {
@@ -3043,7 +3044,7 @@ public class TabLayout extends HorizontalScrollView {
return;
}
- final int gutter = (int) V.dp(FIXED_WRAP_GUTTER_MIN);
+ final int gutter = (int) dp(FIXED_WRAP_GUTTER_MIN);
boolean remeasure = false;
if (largestTabWidth * count <= getMeasuredWidth() - gutter * 2) {
diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/views/ChildDrawingOrderCallback.java b/mastodon/src/main/java/org/joinmastodon/android/ui/views/ChildDrawingOrderCallback.java
new file mode 100644
index 00000000..b2e25fc2
--- /dev/null
+++ b/mastodon/src/main/java/org/joinmastodon/android/ui/views/ChildDrawingOrderCallback.java
@@ -0,0 +1,5 @@
+package org.joinmastodon.android.ui.views;
+
+public interface ChildDrawingOrderCallback{
+ int getChildDrawingOrder(int childCount, int drawingPosition);
+}
diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/views/CustomDrawingOrderLinearLayout.java b/mastodon/src/main/java/org/joinmastodon/android/ui/views/CustomDrawingOrderLinearLayout.java
new file mode 100644
index 00000000..d290abb9
--- /dev/null
+++ b/mastodon/src/main/java/org/joinmastodon/android/ui/views/CustomDrawingOrderLinearLayout.java
@@ -0,0 +1,33 @@
+package org.joinmastodon.android.ui.views;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+
+public class CustomDrawingOrderLinearLayout extends LinearLayout{
+ private ChildDrawingOrderCallback drawingOrderCallback;
+
+ public CustomDrawingOrderLinearLayout(Context context){
+ this(context, null);
+ }
+
+ public CustomDrawingOrderLinearLayout(Context context, AttributeSet attrs){
+ this(context, attrs, 0);
+ }
+
+ public CustomDrawingOrderLinearLayout(Context context, AttributeSet attrs, int defStyle){
+ super(context, attrs, defStyle);
+ setChildrenDrawingOrderEnabled(true);
+ }
+
+ @Override
+ protected int getChildDrawingOrder(int childCount, int drawingPosition){
+ if(drawingOrderCallback!=null)
+ return drawingOrderCallback.getChildDrawingOrder(childCount, drawingPosition);
+ return super.getChildDrawingOrder(childCount, drawingPosition);
+ }
+
+ public void setDrawingOrderCallback(ChildDrawingOrderCallback drawingOrderCallback){
+ this.drawingOrderCallback=drawingOrderCallback;
+ }
+}
diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/views/FloatingHintEditTextLayout.java b/mastodon/src/main/java/org/joinmastodon/android/ui/views/FloatingHintEditTextLayout.java
index e5fb7292..01a24ba5 100644
--- a/mastodon/src/main/java/org/joinmastodon/android/ui/views/FloatingHintEditTextLayout.java
+++ b/mastodon/src/main/java/org/joinmastodon/android/ui/views/FloatingHintEditTextLayout.java
@@ -35,9 +35,9 @@ import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import me.grishka.appkit.utils.CubicBezierInterpolator;
-import me.grishka.appkit.utils.V;
+import me.grishka.appkit.utils.CustomViewHelper;
-public class FloatingHintEditTextLayout extends FrameLayout{
+public class FloatingHintEditTextLayout extends FrameLayout implements CustomViewHelper{
private EditText edit;
private TextView label;
private int labelTextSize;
@@ -60,10 +60,8 @@ public class FloatingHintEditTextLayout extends FrameLayout{
public FloatingHintEditTextLayout(Context context, AttributeSet attrs, int defStyle){
super(context, attrs, defStyle);
- if(isInEditMode())
- V.setApplicationContext(context);
TypedArray ta=context.obtainStyledAttributes(attrs, R.styleable.FloatingHintEditTextLayout);
- labelTextSize=ta.getDimensionPixelSize(R.styleable.FloatingHintEditTextLayout_android_labelTextSize, V.dp(12));
+ labelTextSize=ta.getDimensionPixelSize(R.styleable.FloatingHintEditTextLayout_android_labelTextSize, dp(12));
offsetY=ta.getDimensionPixelOffset(R.styleable.FloatingHintEditTextLayout_editTextOffsetY, 0);
labelColors=ta.getColorStateList(R.styleable.FloatingHintEditTextLayout_labelTextColor);
ta.recycle();
@@ -103,7 +101,7 @@ public class FloatingHintEditTextLayout extends FrameLayout{
errorView.setTextColor(UiUtils.getThemeColor(getContext(), R.attr.colorM3OnSurfaceVariant));
errorView.setLinkTextColor(UiUtils.getThemeColor(getContext(), R.attr.colorM3Primary));
errorView.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
- errorView.setPadding(V.dp(16), V.dp(4), V.dp(16), 0);
+ errorView.setPadding(dp(16), dp(4), dp(16), 0);
errorView.setVisibility(View.GONE);
addView(errorView);
}
@@ -187,7 +185,7 @@ public class FloatingHintEditTextLayout extends FrameLayout{
public void onDrawForeground(Canvas canvas){
if(getForeground()!=null && animProgress>0){
canvas.save();
- float width=(label.getWidth()+V.dp(8))*animProgress;
+ float width=(label.getWidth()+dp(8))*animProgress;
float centerX=label.getLeft()+label.getWidth()/2f;
tmpRect.set(centerX-width/2f, label.getTop(), centerX+width/2f, label.getBottom());
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O)
@@ -347,7 +345,7 @@ public class FloatingHintEditTextLayout extends FrameLayout{
@Override
protected void onBoundsChange(@NonNull Rect bounds){
super.onBoundsChange(bounds);
- int offset=V.dp(12);
+ int offset=dp(12);
wrapped.setBounds(edit.getLeft()-offset, edit.getTop()-offset, edit.getRight()+offset, edit.getBottom()+offset);
}
}
diff --git a/mastodon/src/main/res/layout/fragment_profile.xml b/mastodon/src/main/res/layout/fragment_profile.xml
index ac315550..af139b19 100644
--- a/mastodon/src/main/res/layout/fragment_profile.xml
+++ b/mastodon/src/main/res/layout/fragment_profile.xml
@@ -16,7 +16,7 @@
android:layout_height="match_parent"
android:nestedScrollingEnabled="true">
-
-
+