From a1e4ef9e8e8b0efdc494774a4e26f8de30ea7c1c Mon Sep 17 00:00:00 2001 From: Avently <7953703+avently@users.noreply.github.com> Date: Wed, 16 Sep 2020 04:49:26 +0300 Subject: [PATCH] Fix for multiple listeners of insets --- .../newpipe/views/FocusAwareCoordinator.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/views/FocusAwareCoordinator.java b/app/src/main/java/org/schabi/newpipe/views/FocusAwareCoordinator.java index 1ffb7d069..f400b62b1 100644 --- a/app/src/main/java/org/schabi/newpipe/views/FocusAwareCoordinator.java +++ b/app/src/main/java/org/schabi/newpipe/views/FocusAwareCoordinator.java @@ -17,15 +17,19 @@ */ package org.schabi.newpipe.views; +import android.annotation.TargetApi; import android.content.Context; import android.graphics.Rect; +import android.os.Build; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; +import android.view.WindowInsets; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.coordinatorlayout.widget.CoordinatorLayout; +import org.schabi.newpipe.R; public final class FocusAwareCoordinator extends CoordinatorLayout { private final Rect childFocus = new Rect(); @@ -63,4 +67,41 @@ public final class FocusAwareCoordinator extends CoordinatorLayout { requestChildRectangleOnScreen(child, childFocus, false); } } + + /** + * Applies window insets to all children, not just for the first who consume the insets. + * Makes possible for multiple fragments to co-exist. Without this code + * the first ViewGroup who consumes will be the last who receive the insets + */ + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + @Override + public WindowInsets dispatchApplyWindowInsets(final WindowInsets insets) { + boolean consumed = false; + for (int i = 0; i < getChildCount(); i++) { + final View child = getChildAt(i); + final WindowInsets res = child.dispatchApplyWindowInsets(insets); + if (res.isConsumed()) { + consumed = true; + } + } + + if (consumed) { + insets.consumeSystemWindowInsets(); + } + return insets; + } + + /** + * Adjusts player's controls manually because fitsSystemWindows doesn't work when multiple + * receivers adjust its bounds. So when two listeners are present (like in profile page) + * the player's controls will not receive insets. This method fixes it + */ + @Override + protected boolean fitSystemWindows(final Rect insets) { + final ViewGroup controls = findViewById(R.id.playbackControlRoot); + if (controls != null) { + controls.setPadding(insets.left, insets.top, insets.right, insets.bottom); + } + return super.fitSystemWindows(insets); + } }