1
0
mirror of https://github.com/TeamNewPipe/NewPipe synced 2024-06-18 03:10:00 +00:00
NewPipe/app/src/main/java/org/schabi/newpipe/views/FocusAwareCoordinator.java
TiA4f8R 79e98db3bd
Apply the requested changes and little improvements
Apply the requested changes, use ShareUtils.shareText to share an stream in the play queue and optimize imports for Java files, using Android Studio functionality.

Apply the requested changes and do little improvements
Apply the requested changes, use ShareUtils.shareText to share an stream in the play queue and optimize imports for Java files, using Android Studio functionality.
2021-01-16 13:23:42 +01:00

109 lines
3.8 KiB
Java

/*
* Copyright (C) Eltex ltd 2019 <eltex@eltex-co.ru>
* FocusAwareCoordinator.java is part of NewPipe.
*
* NewPipe is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* NewPipe is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
*/
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();
public FocusAwareCoordinator(@NonNull final Context context) {
super(context);
}
public FocusAwareCoordinator(@NonNull final Context context,
@Nullable final AttributeSet attrs) {
super(context, attrs);
}
public FocusAwareCoordinator(@NonNull final Context context,
@Nullable final AttributeSet attrs, final int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void requestChildFocus(final View child, final View focused) {
super.requestChildFocus(child, focused);
if (!isInTouchMode()) {
if (focused.getHeight() >= getHeight()) {
focused.getFocusedRect(childFocus);
((ViewGroup) child).offsetDescendantRectToMyCoords(focused, childFocus);
} else {
focused.getHitRect(childFocus);
((ViewGroup) child).offsetDescendantRectToMyCoords((View) focused.getParent(),
childFocus);
}
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);
}
}