mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2024-12-23 08:30:44 +00:00
Delete some unused code
This commit is contained in:
parent
102204e293
commit
979a320347
@ -1,44 +0,0 @@
|
|||||||
package org.schabi.newpipe.util;
|
|
||||||
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
public final class BitmapUtils {
|
|
||||||
private BitmapUtils() { }
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static Bitmap centerCrop(final Bitmap inputBitmap, final int newWidth,
|
|
||||||
final int newHeight) {
|
|
||||||
if (inputBitmap == null || inputBitmap.isRecycled()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final float sourceWidth = inputBitmap.getWidth();
|
|
||||||
final float sourceHeight = inputBitmap.getHeight();
|
|
||||||
|
|
||||||
final float xScale = newWidth / sourceWidth;
|
|
||||||
final float yScale = newHeight / sourceHeight;
|
|
||||||
|
|
||||||
final float newXScale;
|
|
||||||
final float newYScale;
|
|
||||||
|
|
||||||
if (yScale > xScale) {
|
|
||||||
newXScale = xScale / yScale;
|
|
||||||
newYScale = 1.0f;
|
|
||||||
} else {
|
|
||||||
newXScale = 1.0f;
|
|
||||||
newYScale = yScale / xScale;
|
|
||||||
}
|
|
||||||
|
|
||||||
final float scaledWidth = newXScale * sourceWidth;
|
|
||||||
final float scaledHeight = newYScale * sourceHeight;
|
|
||||||
|
|
||||||
final int left = (int) ((sourceWidth - scaledWidth) / 2);
|
|
||||||
final int top = (int) ((sourceHeight - scaledHeight) / 2);
|
|
||||||
final int width = (int) scaledWidth;
|
|
||||||
final int height = (int) scaledHeight;
|
|
||||||
|
|
||||||
return Bitmap.createBitmap(inputBitmap, left, top, width, height);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
package org.schabi.newpipe.util;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.PointF;
|
|
||||||
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
||||||
import androidx.recyclerview.widget.LinearSmoothScroller;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
|
|
||||||
public class LayoutManagerSmoothScroller extends LinearLayoutManager {
|
|
||||||
public LayoutManagerSmoothScroller(final Context context) {
|
|
||||||
super(context, VERTICAL, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public LayoutManagerSmoothScroller(final Context context, final int orientation,
|
|
||||||
final boolean reverseLayout) {
|
|
||||||
super(context, orientation, reverseLayout);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void smoothScrollToPosition(final RecyclerView recyclerView,
|
|
||||||
final RecyclerView.State state, final int position) {
|
|
||||||
final RecyclerView.SmoothScroller smoothScroller
|
|
||||||
= new TopSnappedSmoothScroller(recyclerView.getContext());
|
|
||||||
smoothScroller.setTargetPosition(position);
|
|
||||||
startSmoothScroll(smoothScroller);
|
|
||||||
}
|
|
||||||
|
|
||||||
private class TopSnappedSmoothScroller extends LinearSmoothScroller {
|
|
||||||
TopSnappedSmoothScroller(final Context context) {
|
|
||||||
super(context);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PointF computeScrollVectorForPosition(final int targetPosition) {
|
|
||||||
return LayoutManagerSmoothScroller.this
|
|
||||||
.computeScrollVectorForPosition(targetPosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getVerticalSnapPreference() {
|
|
||||||
return SNAP_TO_START;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,303 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2019 Alexander Rvachev <rvacheva@nxt.ru>
|
|
||||||
* FocusOverlayView.java is part of NewPipe
|
|
||||||
*
|
|
||||||
* License: GPL-3.0+
|
|
||||||
* This program 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.
|
|
||||||
*
|
|
||||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package org.schabi.newpipe.views;
|
|
||||||
|
|
||||||
import android.graphics.Rect;
|
|
||||||
import android.text.Layout;
|
|
||||||
import android.text.Selection;
|
|
||||||
import android.text.Spannable;
|
|
||||||
import android.text.method.LinkMovementMethod;
|
|
||||||
import android.text.style.ClickableSpan;
|
|
||||||
import android.view.KeyEvent;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.view.ViewParent;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
public class LargeTextMovementMethod extends LinkMovementMethod {
|
|
||||||
private final Rect visibleRect = new Rect();
|
|
||||||
|
|
||||||
private int direction;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTakeFocus(final TextView view, final Spannable text, final int dir) {
|
|
||||||
Selection.removeSelection(text);
|
|
||||||
|
|
||||||
super.onTakeFocus(view, text, dir);
|
|
||||||
|
|
||||||
this.direction = dirToRelative(dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean handleMovementKey(final TextView widget,
|
|
||||||
final Spannable buffer,
|
|
||||||
final int keyCode,
|
|
||||||
final int movementMetaState,
|
|
||||||
final KeyEvent event) {
|
|
||||||
if (!doHandleMovement(widget, buffer, keyCode, movementMetaState, event)) {
|
|
||||||
// clear selection to make sure, that it does not confuse focus handling code
|
|
||||||
Selection.removeSelection(buffer);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean doHandleMovement(final TextView widget,
|
|
||||||
final Spannable buffer,
|
|
||||||
final int keyCode,
|
|
||||||
final int movementMetaState,
|
|
||||||
final KeyEvent event) {
|
|
||||||
final int newDir = keyToDir(keyCode);
|
|
||||||
|
|
||||||
if (direction != 0 && newDir != direction) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.direction = 0;
|
|
||||||
|
|
||||||
final ViewGroup root = findScrollableParent(widget);
|
|
||||||
|
|
||||||
widget.getHitRect(visibleRect);
|
|
||||||
|
|
||||||
root.offsetDescendantRectToMyCoords((View) widget.getParent(), visibleRect);
|
|
||||||
|
|
||||||
return super.handleMovementKey(widget, buffer, keyCode, movementMetaState, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean up(final TextView widget, final Spannable buffer) {
|
|
||||||
if (gotoPrev(widget, buffer)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.up(widget, buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean left(final TextView widget, final Spannable buffer) {
|
|
||||||
if (gotoPrev(widget, buffer)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.left(widget, buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean right(final TextView widget, final Spannable buffer) {
|
|
||||||
if (gotoNext(widget, buffer)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.right(widget, buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean down(final TextView widget, final Spannable buffer) {
|
|
||||||
if (gotoNext(widget, buffer)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.down(widget, buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean gotoPrev(final TextView view, final Spannable buffer) {
|
|
||||||
final Layout layout = view.getLayout();
|
|
||||||
if (layout == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final View root = findScrollableParent(view);
|
|
||||||
|
|
||||||
final int rootHeight = root.getHeight();
|
|
||||||
|
|
||||||
if (visibleRect.top >= 0) {
|
|
||||||
// we fit entirely into the viewport, no need for fancy footwork
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int topExtra = -visibleRect.top;
|
|
||||||
|
|
||||||
final int firstVisibleLineNumber = layout.getLineForVertical(topExtra);
|
|
||||||
|
|
||||||
// when deciding whether to pass "focus" to span, account for one more line
|
|
||||||
// this ensures, that focus is never passed to spans partially outside scroll window
|
|
||||||
final int visibleStart = firstVisibleLineNumber == 0
|
|
||||||
? 0
|
|
||||||
: layout.getLineStart(firstVisibleLineNumber - 1);
|
|
||||||
|
|
||||||
final ClickableSpan[] candidates = buffer.getSpans(
|
|
||||||
visibleStart, buffer.length(), ClickableSpan.class);
|
|
||||||
|
|
||||||
if (candidates.length != 0) {
|
|
||||||
final int a = Selection.getSelectionStart(buffer);
|
|
||||||
final int b = Selection.getSelectionEnd(buffer);
|
|
||||||
|
|
||||||
final int selStart = Math.min(a, b);
|
|
||||||
final int selEnd = Math.max(a, b);
|
|
||||||
|
|
||||||
int bestStart = -1;
|
|
||||||
int bestEnd = -1;
|
|
||||||
|
|
||||||
for (final ClickableSpan candidate : candidates) {
|
|
||||||
final int start = buffer.getSpanStart(candidate);
|
|
||||||
final int end = buffer.getSpanEnd(candidate);
|
|
||||||
|
|
||||||
if ((end < selEnd || selStart == selEnd) && start >= visibleStart) {
|
|
||||||
if (end > bestEnd) {
|
|
||||||
bestStart = buffer.getSpanStart(candidate);
|
|
||||||
bestEnd = end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bestStart >= 0) {
|
|
||||||
Selection.setSelection(buffer, bestEnd, bestStart);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final float fourLines = view.getTextSize() * 4;
|
|
||||||
|
|
||||||
visibleRect.left = 0;
|
|
||||||
visibleRect.right = view.getWidth();
|
|
||||||
visibleRect.top = Math.max(0, (int) (topExtra - fourLines));
|
|
||||||
visibleRect.bottom = visibleRect.top + rootHeight;
|
|
||||||
|
|
||||||
return view.requestRectangleOnScreen(visibleRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean gotoNext(final TextView view, final Spannable buffer) {
|
|
||||||
final Layout layout = view.getLayout();
|
|
||||||
if (layout == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final View root = findScrollableParent(view);
|
|
||||||
|
|
||||||
final int rootHeight = root.getHeight();
|
|
||||||
|
|
||||||
if (visibleRect.bottom <= rootHeight) {
|
|
||||||
// we fit entirely into the viewport, no need for fancy footwork
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int bottomExtra = visibleRect.bottom - rootHeight;
|
|
||||||
|
|
||||||
final int visibleBottomBorder = view.getHeight() - bottomExtra;
|
|
||||||
|
|
||||||
final int lineCount = layout.getLineCount();
|
|
||||||
|
|
||||||
final int lastVisibleLineNumber = layout.getLineForVertical(visibleBottomBorder);
|
|
||||||
|
|
||||||
// when deciding whether to pass "focus" to span, account for one more line
|
|
||||||
// this ensures, that focus is never passed to spans partially outside scroll window
|
|
||||||
final int visibleEnd = lastVisibleLineNumber == lineCount - 1
|
|
||||||
? buffer.length()
|
|
||||||
: layout.getLineEnd(lastVisibleLineNumber - 1);
|
|
||||||
|
|
||||||
final ClickableSpan[] candidates = buffer.getSpans(0, visibleEnd, ClickableSpan.class);
|
|
||||||
|
|
||||||
if (candidates.length != 0) {
|
|
||||||
final int a = Selection.getSelectionStart(buffer);
|
|
||||||
final int b = Selection.getSelectionEnd(buffer);
|
|
||||||
|
|
||||||
final int selStart = Math.min(a, b);
|
|
||||||
final int selEnd = Math.max(a, b);
|
|
||||||
|
|
||||||
int bestStart = Integer.MAX_VALUE;
|
|
||||||
int bestEnd = Integer.MAX_VALUE;
|
|
||||||
|
|
||||||
for (final ClickableSpan candidate : candidates) {
|
|
||||||
final int start = buffer.getSpanStart(candidate);
|
|
||||||
final int end = buffer.getSpanEnd(candidate);
|
|
||||||
|
|
||||||
if ((start > selStart || selStart == selEnd) && end <= visibleEnd) {
|
|
||||||
if (start < bestStart) {
|
|
||||||
bestStart = start;
|
|
||||||
bestEnd = buffer.getSpanEnd(candidate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bestEnd < Integer.MAX_VALUE) {
|
|
||||||
// cool, we have managed to find next link without having to adjust self within view
|
|
||||||
Selection.setSelection(buffer, bestStart, bestEnd);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// there are no links within visible area, but still some text past visible area
|
|
||||||
// scroll visible area further in required direction
|
|
||||||
final float fourLines = view.getTextSize() * 4;
|
|
||||||
|
|
||||||
visibleRect.left = 0;
|
|
||||||
visibleRect.right = view.getWidth();
|
|
||||||
visibleRect.bottom = Math.min((int) (visibleBottomBorder + fourLines), view.getHeight());
|
|
||||||
visibleRect.top = visibleRect.bottom - rootHeight;
|
|
||||||
|
|
||||||
return view.requestRectangleOnScreen(visibleRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ViewGroup findScrollableParent(final View view) {
|
|
||||||
View current = view;
|
|
||||||
|
|
||||||
ViewParent parent;
|
|
||||||
do {
|
|
||||||
parent = current.getParent();
|
|
||||||
|
|
||||||
if (parent == current || !(parent instanceof View)) {
|
|
||||||
return (ViewGroup) view.getRootView();
|
|
||||||
}
|
|
||||||
|
|
||||||
current = (View) parent;
|
|
||||||
|
|
||||||
if (current.isScrollContainer()) {
|
|
||||||
return (ViewGroup) current;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int dirToRelative(final int dir) {
|
|
||||||
switch (dir) {
|
|
||||||
case View.FOCUS_DOWN:
|
|
||||||
case View.FOCUS_RIGHT:
|
|
||||||
return View.FOCUS_FORWARD;
|
|
||||||
case View.FOCUS_UP:
|
|
||||||
case View.FOCUS_LEFT:
|
|
||||||
return View.FOCUS_BACKWARD;
|
|
||||||
}
|
|
||||||
|
|
||||||
return dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int keyToDir(final int keyCode) {
|
|
||||||
switch (keyCode) {
|
|
||||||
case KeyEvent.KEYCODE_DPAD_UP:
|
|
||||||
case KeyEvent.KEYCODE_DPAD_LEFT:
|
|
||||||
return View.FOCUS_BACKWARD;
|
|
||||||
case KeyEvent.KEYCODE_DPAD_DOWN:
|
|
||||||
case KeyEvent.KEYCODE_DPAD_RIGHT:
|
|
||||||
return View.FOCUS_FORWARD;
|
|
||||||
}
|
|
||||||
|
|
||||||
return View.FOCUS_FORWARD;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user