- * PopupVideoPlayer.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 .
- */
-
-package org.schabi.newpipe.player;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.annotation.SuppressLint;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.SharedPreferences;
-import android.content.res.Configuration;
-import android.graphics.Bitmap;
-import android.graphics.PixelFormat;
-import android.os.Build;
-import android.os.IBinder;
-import android.preference.PreferenceManager;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.GestureDetector;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.view.animation.AnticipateInterpolator;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.PopupMenu;
-import android.widget.RemoteViews;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.core.app.NotificationCompat;
-
-import com.google.android.exoplayer2.C;
-import com.google.android.exoplayer2.PlaybackParameters;
-import com.google.android.exoplayer2.Player;
-import com.google.android.exoplayer2.text.CaptionStyleCompat;
-import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
-import com.google.android.exoplayer2.ui.SubtitleView;
-import com.google.android.material.floatingactionbutton.FloatingActionButton;
-import com.nostra13.universalimageloader.core.assist.FailReason;
-
-import org.schabi.newpipe.BuildConfig;
-import org.schabi.newpipe.R;
-import org.schabi.newpipe.extractor.stream.VideoStream;
-import org.schabi.newpipe.player.event.PlayerEventListener;
-import org.schabi.newpipe.player.helper.PlayerHelper;
-import org.schabi.newpipe.player.resolver.MediaSourceTag;
-import org.schabi.newpipe.player.resolver.VideoPlaybackResolver;
-import org.schabi.newpipe.util.ListHelper;
-import org.schabi.newpipe.util.NavigationHelper;
-import org.schabi.newpipe.util.ThemeHelper;
-
-import java.util.List;
-
-import static org.schabi.newpipe.player.BasePlayer.STATE_PLAYING;
-import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_DURATION;
-import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_HIDE_TIME;
-import static org.schabi.newpipe.util.AnimationUtils.animateView;
-import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
-
-/**
- * Service Popup Player implementing {@link VideoPlayer}.
- *
- * @author mauriciocolli
- */
-public final class PopupVideoPlayer extends Service {
- public static final String ACTION_CLOSE = "org.schabi.newpipe.player.PopupVideoPlayer.CLOSE";
- public static final String ACTION_PLAY_PAUSE
- = "org.schabi.newpipe.player.PopupVideoPlayer.PLAY_PAUSE";
- public static final String ACTION_REPEAT = "org.schabi.newpipe.player.PopupVideoPlayer.REPEAT";
- private static final String TAG = ".PopupVideoPlayer";
- private static final boolean DEBUG = BasePlayer.DEBUG;
- private static final int NOTIFICATION_ID = 40028922;
- private static final String POPUP_SAVED_WIDTH = "popup_saved_width";
- private static final String POPUP_SAVED_X = "popup_saved_x";
- private static final String POPUP_SAVED_Y = "popup_saved_y";
-
- private static final int MINIMUM_SHOW_EXTRA_WIDTH_DP = 300;
-
- private static final int IDLE_WINDOW_FLAGS = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
- private static final int ONGOING_PLAYBACK_WINDOW_FLAGS = IDLE_WINDOW_FLAGS
- | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
-
- private WindowManager windowManager;
- private WindowManager.LayoutParams popupLayoutParams;
- private GestureDetector popupGestureDetector;
-
- private View closeOverlayView;
- private FloatingActionButton closeOverlayButton;
-
- private int tossFlingVelocity;
-
- private float screenWidth;
- private float screenHeight;
- private float popupWidth;
- private float popupHeight;
-
- private float minimumWidth;
- private float minimumHeight;
- private float maximumWidth;
- private float maximumHeight;
-
- private NotificationManager notificationManager;
- private NotificationCompat.Builder notBuilder;
- private RemoteViews notRemoteView;
-
- private VideoPlayerImpl playerImpl;
- private boolean isPopupClosing = false;
-
- /*//////////////////////////////////////////////////////////////////////////
- // Service-Activity Binder
- //////////////////////////////////////////////////////////////////////////*/
-
- private PlayerEventListener activityListener;
- private IBinder mBinder;
-
- /*//////////////////////////////////////////////////////////////////////////
- // Service LifeCycle
- //////////////////////////////////////////////////////////////////////////*/
-
- @Override
- public void onCreate() {
- assureCorrectAppLanguage(this);
- windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
- notificationManager = ((NotificationManager) getSystemService(NOTIFICATION_SERVICE));
-
- playerImpl = new VideoPlayerImpl(this);
- ThemeHelper.setTheme(this);
-
- mBinder = new PlayerServiceBinder(playerImpl);
- }
-
- @Override
- public int onStartCommand(final Intent intent, final int flags, final int startId) {
- if (DEBUG) {
- Log.d(TAG, "onStartCommand() called with: intent = [" + intent + "], "
- + "flags = [" + flags + "], startId = [" + startId + "]");
- }
- if (playerImpl.getPlayer() == null) {
- initPopup();
- initPopupCloseOverlay();
- }
-
- playerImpl.handleIntent(intent);
-
- return START_NOT_STICKY;
- }
-
- @Override
- public void onConfigurationChanged(final Configuration newConfig) {
- assureCorrectAppLanguage(this);
- if (DEBUG) {
- Log.d(TAG, "onConfigurationChanged() called with: "
- + "newConfig = [" + newConfig + "]");
- }
- updateScreenSize();
- updatePopupSize(popupLayoutParams.width, -1);
- checkPopupPositionBounds();
- }
-
- @Override
- public void onDestroy() {
- if (DEBUG) {
- Log.d(TAG, "onDestroy() called");
- }
- closePopup();
- }
-
- @Override
- protected void attachBaseContext(final Context base) {
- super.attachBaseContext(AudioServiceLeakFix.preventLeakOf(base));
- }
-
- @Override
- public IBinder onBind(final Intent intent) {
- return mBinder;
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Init
- //////////////////////////////////////////////////////////////////////////*/
-
- @SuppressLint("RtlHardcoded")
- private void initPopup() {
- if (DEBUG) {
- Log.d(TAG, "initPopup() called");
- }
- View rootView = View.inflate(this, R.layout.player_popup, null);
- playerImpl.setup(rootView);
-
- tossFlingVelocity = PlayerHelper.getTossFlingVelocity(this);
-
- updateScreenSize();
-
- final boolean popupRememberSizeAndPos = PlayerHelper.isRememberingPopupDimensions(this);
- final float defaultSize = getResources().getDimension(R.dimen.popup_default_width);
- SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
- popupWidth = popupRememberSizeAndPos
- ? sharedPreferences.getFloat(POPUP_SAVED_WIDTH, defaultSize) : defaultSize;
-
- final int layoutParamType = Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O
- ? WindowManager.LayoutParams.TYPE_PHONE
- : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
-
- popupLayoutParams = new WindowManager.LayoutParams(
- (int) popupWidth, (int) getMinimumVideoHeight(popupWidth),
- layoutParamType,
- IDLE_WINDOW_FLAGS,
- PixelFormat.TRANSLUCENT);
- popupLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;
- popupLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
-
- int centerX = (int) (screenWidth / 2f - popupWidth / 2f);
- int centerY = (int) (screenHeight / 2f - popupHeight / 2f);
- popupLayoutParams.x = popupRememberSizeAndPos
- ? sharedPreferences.getInt(POPUP_SAVED_X, centerX) : centerX;
- popupLayoutParams.y = popupRememberSizeAndPos
- ? sharedPreferences.getInt(POPUP_SAVED_Y, centerY) : centerY;
-
- checkPopupPositionBounds();
-
- PopupWindowGestureListener listener = new PopupWindowGestureListener();
- popupGestureDetector = new GestureDetector(this, listener);
- rootView.setOnTouchListener(listener);
-
- playerImpl.getLoadingPanel().setMinimumWidth(popupLayoutParams.width);
- playerImpl.getLoadingPanel().setMinimumHeight(popupLayoutParams.height);
- windowManager.addView(rootView, popupLayoutParams);
- }
-
- @SuppressLint("RtlHardcoded")
- private void initPopupCloseOverlay() {
- if (DEBUG) {
- Log.d(TAG, "initPopupCloseOverlay() called");
- }
- closeOverlayView = View.inflate(this, R.layout.player_popup_close_overlay, null);
- closeOverlayButton = closeOverlayView.findViewById(R.id.closeButton);
-
- final int layoutParamType = Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O
- ? WindowManager.LayoutParams.TYPE_PHONE
- : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
- final int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
- | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
-
- WindowManager.LayoutParams closeOverlayLayoutParams = new WindowManager.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
- layoutParamType,
- flags,
- PixelFormat.TRANSLUCENT);
- closeOverlayLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;
- closeOverlayLayoutParams.softInputMode = WindowManager
- .LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
-
- closeOverlayButton.setVisibility(View.GONE);
- windowManager.addView(closeOverlayView, closeOverlayLayoutParams);
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Notification
- //////////////////////////////////////////////////////////////////////////*/
-
- private void resetNotification() {
- notBuilder = createNotification();
- }
-
- private NotificationCompat.Builder createNotification() {
- notRemoteView = new RemoteViews(BuildConfig.APPLICATION_ID,
- R.layout.player_popup_notification);
-
- notRemoteView.setTextViewText(R.id.notificationSongName, playerImpl.getVideoTitle());
- notRemoteView.setTextViewText(R.id.notificationArtist, playerImpl.getUploaderName());
- notRemoteView.setImageViewBitmap(R.id.notificationCover, playerImpl.getThumbnail());
-
- notRemoteView.setOnClickPendingIntent(R.id.notificationPlayPause,
- PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_PLAY_PAUSE),
- PendingIntent.FLAG_UPDATE_CURRENT));
- notRemoteView.setOnClickPendingIntent(R.id.notificationStop,
- PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_CLOSE),
- PendingIntent.FLAG_UPDATE_CURRENT));
- notRemoteView.setOnClickPendingIntent(R.id.notificationRepeat,
- PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_REPEAT),
- PendingIntent.FLAG_UPDATE_CURRENT));
-
- // Starts popup player activity -- attempts to unlock lockscreen
- final Intent intent = NavigationHelper.getBackgroundPlayerActivityIntent(this);
- notRemoteView.setOnClickPendingIntent(R.id.notificationContent,
- PendingIntent.getActivity(this, NOTIFICATION_ID, intent,
- PendingIntent.FLAG_UPDATE_CURRENT));
-
- setRepeatModeRemote(notRemoteView, playerImpl.getRepeatMode());
-
- NotificationCompat.Builder builder = new NotificationCompat
- .Builder(this, getString(R.string.notification_channel_id))
- .setOngoing(true)
- .setSmallIcon(R.drawable.ic_newpipe_triangle_white)
- .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
- .setContent(notRemoteView);
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
- builder.setPriority(NotificationCompat.PRIORITY_MAX);
- }
- return builder;
- }
-
- /**
- * Updates the notification, and the play/pause button in it.
- * Used for changes on the remoteView
- *
- * @param drawableId if != -1, sets the drawable with that id on the play/pause button
- */
- private void updateNotification(final int drawableId) {
- if (DEBUG) {
- Log.d(TAG, "updateNotification() called with: drawableId = [" + drawableId + "]");
- }
- if (notBuilder == null || notRemoteView == null) {
- return;
- }
- if (drawableId != -1) {
- notRemoteView.setImageViewResource(R.id.notificationPlayPause, drawableId);
- }
- notificationManager.notify(NOTIFICATION_ID, notBuilder.build());
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Misc
- //////////////////////////////////////////////////////////////////////////*/
-
- public void closePopup() {
- if (DEBUG) {
- Log.d(TAG, "closePopup() called, isPopupClosing = " + isPopupClosing);
- }
- if (isPopupClosing) {
- return;
- }
- isPopupClosing = true;
-
- if (playerImpl != null) {
- playerImpl.savePlaybackState();
- if (playerImpl.getRootView() != null) {
- windowManager.removeView(playerImpl.getRootView());
- }
- playerImpl.setRootView(null);
- playerImpl.stopActivityBinding();
- playerImpl.destroy();
- playerImpl = null;
- }
-
- mBinder = null;
- if (notificationManager != null) {
- notificationManager.cancel(NOTIFICATION_ID);
- }
-
- animateOverlayAndFinishService();
- }
-
- private void animateOverlayAndFinishService() {
- final int targetTranslationY = (int) (closeOverlayButton.getRootView().getHeight()
- - closeOverlayButton.getY());
-
- closeOverlayButton.animate().setListener(null).cancel();
- closeOverlayButton.animate()
- .setInterpolator(new AnticipateInterpolator())
- .translationY(targetTranslationY)
- .setDuration(400)
- .setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationCancel(final Animator animation) {
- end();
- }
-
- @Override
- public void onAnimationEnd(final Animator animation) {
- end();
- }
-
- private void end() {
- windowManager.removeView(closeOverlayView);
-
- stopForeground(true);
- stopSelf();
- }
- }).start();
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Utils
- //////////////////////////////////////////////////////////////////////////*/
-
- /**
- * @see #checkPopupPositionBounds(float, float)
- * @return if the popup was out of bounds and have been moved back to it
- */
- @SuppressWarnings("UnusedReturnValue")
- private boolean checkPopupPositionBounds() {
- return checkPopupPositionBounds(screenWidth, screenHeight);
- }
-
- /**
- * Check if {@link #popupLayoutParams}' position is within a arbitrary boundary
- * that goes from (0, 0) to (boundaryWidth, boundaryHeight).
- *
- * If it's out of these boundaries, {@link #popupLayoutParams}' position is changed
- * and {@code true} is returned to represent this change.
- *
- *
- * @param boundaryWidth width of the boundary
- * @param boundaryHeight height of the boundary
- * @return if the popup was out of bounds and have been moved back to it
- */
- private boolean checkPopupPositionBounds(final float boundaryWidth,
- final float boundaryHeight) {
- if (DEBUG) {
- Log.d(TAG, "checkPopupPositionBounds() called with: "
- + "boundaryWidth = [" + boundaryWidth + "], "
- + "boundaryHeight = [" + boundaryHeight + "]");
- }
-
- if (popupLayoutParams.x < 0) {
- popupLayoutParams.x = 0;
- return true;
- } else if (popupLayoutParams.x > boundaryWidth - popupLayoutParams.width) {
- popupLayoutParams.x = (int) (boundaryWidth - popupLayoutParams.width);
- return true;
- }
-
- if (popupLayoutParams.y < 0) {
- popupLayoutParams.y = 0;
- return true;
- } else if (popupLayoutParams.y > boundaryHeight - popupLayoutParams.height) {
- popupLayoutParams.y = (int) (boundaryHeight - popupLayoutParams.height);
- return true;
- }
-
- return false;
- }
-
- private void savePositionAndSize() {
- SharedPreferences sharedPreferences = PreferenceManager
- .getDefaultSharedPreferences(PopupVideoPlayer.this);
- sharedPreferences.edit().putInt(POPUP_SAVED_X, popupLayoutParams.x).apply();
- sharedPreferences.edit().putInt(POPUP_SAVED_Y, popupLayoutParams.y).apply();
- sharedPreferences.edit().putFloat(POPUP_SAVED_WIDTH, popupLayoutParams.width).apply();
- }
-
- private float getMinimumVideoHeight(final float width) {
- final float height = width / (16.0f / 9.0f); // Respect the 16:9 ratio that most videos have
-// if (DEBUG) {
-// Log.d(TAG, "getMinimumVideoHeight() called with: width = [" + width + "], "
-// + "returned: " + height);
-// }
- return height;
- }
-
- private void updateScreenSize() {
- DisplayMetrics metrics = new DisplayMetrics();
- windowManager.getDefaultDisplay().getMetrics(metrics);
-
- screenWidth = metrics.widthPixels;
- screenHeight = metrics.heightPixels;
- if (DEBUG) {
- Log.d(TAG, "updateScreenSize() called > screenWidth = " + screenWidth + ", "
- + "screenHeight = " + screenHeight);
- }
-
- popupWidth = getResources().getDimension(R.dimen.popup_default_width);
- popupHeight = getMinimumVideoHeight(popupWidth);
-
- minimumWidth = getResources().getDimension(R.dimen.popup_minimum_width);
- minimumHeight = getMinimumVideoHeight(minimumWidth);
-
- maximumWidth = screenWidth;
- maximumHeight = screenHeight;
- }
-
- private void updatePopupSize(final int width, final int height) {
- if (playerImpl == null) {
- return;
- }
- if (DEBUG) {
- Log.d(TAG, "updatePopupSize() called with: "
- + "width = [" + width + "], height = [" + height + "]");
- }
-
- final int actualWidth = (int) (width > maximumWidth ? maximumWidth
- : width < minimumWidth ? minimumWidth : width);
-
- final int actualHeight;
- if (height == -1) {
- actualHeight = (int) getMinimumVideoHeight(width);
- } else {
- actualHeight = (int) (height > maximumHeight ? maximumHeight
- : height < minimumHeight ? minimumHeight : height);
- }
-
- popupLayoutParams.width = actualWidth;
- popupLayoutParams.height = actualHeight;
- popupWidth = actualWidth;
- popupHeight = actualHeight;
-
- if (DEBUG) {
- Log.d(TAG, "updatePopupSize() updated values: "
- + "width = [" + actualWidth + "], height = [" + actualHeight + "]");
- }
- windowManager.updateViewLayout(playerImpl.getRootView(), popupLayoutParams);
- }
-
- protected void setRepeatModeRemote(final RemoteViews remoteViews, final int repeatMode) {
- final String methodName = "setImageResource";
-
- if (remoteViews == null) {
- return;
- }
-
- switch (repeatMode) {
- case Player.REPEAT_MODE_OFF:
- remoteViews.setInt(R.id.notificationRepeat, methodName,
- R.drawable.exo_controls_repeat_off);
- break;
- case Player.REPEAT_MODE_ONE:
- remoteViews.setInt(R.id.notificationRepeat, methodName,
- R.drawable.exo_controls_repeat_one);
- break;
- case Player.REPEAT_MODE_ALL:
- remoteViews.setInt(R.id.notificationRepeat, methodName,
- R.drawable.exo_controls_repeat_all);
- break;
- }
- }
-
- private void updateWindowFlags(final int flags) {
- if (popupLayoutParams == null || windowManager == null || playerImpl == null) {
- return;
- }
-
- popupLayoutParams.flags = flags;
- windowManager.updateViewLayout(playerImpl.getRootView(), popupLayoutParams);
- }
- ///////////////////////////////////////////////////////////////////////////
-
- protected class VideoPlayerImpl extends VideoPlayer implements View.OnLayoutChangeListener {
- private TextView resizingIndicator;
- private ImageButton fullScreenButton;
- private ImageView videoPlayPause;
-
- private View extraOptionsView;
- private View closingOverlayView;
-
- VideoPlayerImpl(final Context context) {
- super("VideoPlayerImpl" + PopupVideoPlayer.TAG, context);
- }
-
- @Override
- public void handleIntent(final Intent intent) {
- super.handleIntent(intent);
-
- resetNotification();
- startForeground(NOTIFICATION_ID, notBuilder.build());
- }
-
- @Override
- public void initViews(final View rootView) {
- super.initViews(rootView);
- resizingIndicator = rootView.findViewById(R.id.resizing_indicator);
- fullScreenButton = rootView.findViewById(R.id.fullScreenButton);
- fullScreenButton.setOnClickListener(v -> toggleFullscreen());
- videoPlayPause = rootView.findViewById(R.id.videoPlayPause);
-
- extraOptionsView = rootView.findViewById(R.id.extraOptionsView);
- closingOverlayView = rootView.findViewById(R.id.closingOverlay);
- rootView.addOnLayoutChangeListener(this);
- }
-
- @Override
- public void initListeners() {
- super.initListeners();
- videoPlayPause.setOnClickListener(v -> onPlayPause());
- }
-
- @Override
- protected void setupSubtitleView(@NonNull final SubtitleView view, final float captionScale,
- @NonNull final CaptionStyleCompat captionStyle) {
- float captionRatio = (captionScale - 1f) / 5f + 1f;
- view.setFractionalTextSize(SubtitleView.DEFAULT_TEXT_SIZE_FRACTION * captionRatio);
- view.setApplyEmbeddedStyles(captionStyle.equals(CaptionStyleCompat.DEFAULT));
- view.setStyle(captionStyle);
- }
-
- @Override
- @SuppressWarnings("checkstyle:ParameterNumber")
- public void onLayoutChange(final View view, final int left, final int top, final int right,
- final int bottom, final int oldLeft, final int oldTop,
- final int oldRight, final int oldBottom) {
- float widthDp = Math.abs(right - left) / getResources().getDisplayMetrics().density;
- final int visibility = widthDp > MINIMUM_SHOW_EXTRA_WIDTH_DP ? View.VISIBLE : View.GONE;
- extraOptionsView.setVisibility(visibility);
- }
-
- @Override
- public void destroy() {
- if (notRemoteView != null) {
- notRemoteView.setImageViewBitmap(R.id.notificationCover, null);
- }
- super.destroy();
- }
-
- @Override
- public void toggleFullscreen() {
- super.toggleFullscreen();
-
- if (DEBUG) {
- Log.d(TAG, "onFullScreenButtonClicked() called");
- }
-
- setRecovery();
- final Intent intent = NavigationHelper.getPlayerIntent(
- context,
- MainVideoPlayer.class,
- this.getPlayQueue(),
- this.getRepeatMode(),
- this.getPlaybackSpeed(),
- this.getPlaybackPitch(),
- this.getPlaybackSkipSilence(),
- this.getPlaybackQuality(),
- false,
- !isPlaying(),
- isMuted()
- );
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
- closePopup();
- }
-
- @Override
- public void onDismiss(final PopupMenu menu) {
- super.onDismiss(menu);
- if (isPlaying()) {
- hideControls(500, 0);
- }
- }
-
- @Override
- protected int nextResizeMode(final int resizeMode) {
- if (resizeMode == AspectRatioFrameLayout.RESIZE_MODE_FILL) {
- return AspectRatioFrameLayout.RESIZE_MODE_FIT;
- } else {
- return AspectRatioFrameLayout.RESIZE_MODE_FILL;
- }
- }
-
- @Override
- public void onStopTrackingTouch(final SeekBar seekBar) {
- super.onStopTrackingTouch(seekBar);
- if (wasPlaying()) {
- hideControls(100, 0);
- }
- }
-
- @Override
- public void onShuffleClicked() {
- super.onShuffleClicked();
- updatePlayback();
- }
-
- @Override
- public void onMuteUnmuteButtonClicked() {
- super.onMuteUnmuteButtonClicked();
- updatePlayback();
- }
-
- @Override
- public void onUpdateProgress(final int currentProgress, final int duration,
- final int bufferPercent) {
- updateProgress(currentProgress, duration, bufferPercent);
- super.onUpdateProgress(currentProgress, duration, bufferPercent);
- }
-
- @Override
- protected VideoPlaybackResolver.QualityResolver getQualityResolver() {
- return new VideoPlaybackResolver.QualityResolver() {
- @Override
- public int getDefaultResolutionIndex(final List sortedVideos) {
- return ListHelper.getPopupDefaultResolutionIndex(context, sortedVideos);
- }
-
- @Override
- public int getOverrideResolutionIndex(final List sortedVideos,
- final String playbackQuality) {
- return ListHelper.getPopupResolutionIndex(context, sortedVideos,
- playbackQuality);
- }
- };
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Thumbnail Loading
- //////////////////////////////////////////////////////////////////////////*/
-
- @Override
- public void onLoadingComplete(final String imageUri, final View view,
- final Bitmap loadedImage) {
- super.onLoadingComplete(imageUri, view, loadedImage);
- if (playerImpl == null) {
- return;
- }
- // rebuild notification here since remote view does not release bitmaps,
- // causing memory leaks
- resetNotification();
- updateNotification(-1);
- }
-
- @Override
- public void onLoadingFailed(final String imageUri, final View view,
- final FailReason failReason) {
- super.onLoadingFailed(imageUri, view, failReason);
- resetNotification();
- updateNotification(-1);
- }
-
- @Override
- public void onLoadingCancelled(final String imageUri, final View view) {
- super.onLoadingCancelled(imageUri, view);
- resetNotification();
- updateNotification(-1);
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Activity Event Listener
- //////////////////////////////////////////////////////////////////////////*/
-
- /*package-private*/ void setActivityListener(final PlayerEventListener listener) {
- activityListener = listener;
- updateMetadata();
- updatePlayback();
- triggerProgressUpdate();
- }
-
- /*package-private*/ void removeActivityListener(final PlayerEventListener listener) {
- if (activityListener == listener) {
- activityListener = null;
- }
- }
-
- private void updateMetadata() {
- if (activityListener != null && getCurrentMetadata() != null) {
- activityListener.onMetadataUpdate(getCurrentMetadata().getMetadata(), playQueue);
- }
- }
-
- private void updatePlayback() {
- if (activityListener != null && simpleExoPlayer != null && playQueue != null) {
- activityListener.onPlaybackUpdate(currentState, getRepeatMode(),
- playQueue.isShuffled(), simpleExoPlayer.getPlaybackParameters());
- }
- }
-
- private void updateProgress(final int currentProgress, final int duration,
- final int bufferPercent) {
- if (activityListener != null) {
- activityListener.onProgressUpdate(currentProgress, duration, bufferPercent);
- }
- }
-
- private void stopActivityBinding() {
- if (activityListener != null) {
- activityListener.onServiceStopped();
- activityListener = null;
- }
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // ExoPlayer Video Listener
- //////////////////////////////////////////////////////////////////////////*/
-
- @Override
- public void onRepeatModeChanged(final int i) {
- super.onRepeatModeChanged(i);
- setRepeatModeRemote(notRemoteView, i);
- updatePlayback();
- resetNotification();
- updateNotification(-1);
- }
-
- @Override
- public void onPlaybackParametersChanged(final PlaybackParameters playbackParameters) {
- super.onPlaybackParametersChanged(playbackParameters);
- updatePlayback();
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Playback Listener
- //////////////////////////////////////////////////////////////////////////*/
-
- protected void onMetadataChanged(@NonNull final MediaSourceTag tag) {
- super.onMetadataChanged(tag);
- resetNotification();
- updateNotification(-1);
- updateMetadata();
- }
-
- @Override
- public void onPlaybackShutdown() {
- super.onPlaybackShutdown();
- closePopup();
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Broadcast Receiver
- //////////////////////////////////////////////////////////////////////////*/
-
- @Override
- protected void setupBroadcastReceiver(final IntentFilter intentFltr) {
- super.setupBroadcastReceiver(intentFltr);
- if (DEBUG) {
- Log.d(TAG, "setupBroadcastReceiver() called with: "
- + "intentFilter = [" + intentFltr + "]");
- }
- intentFltr.addAction(ACTION_CLOSE);
- intentFltr.addAction(ACTION_PLAY_PAUSE);
- intentFltr.addAction(ACTION_REPEAT);
-
- intentFltr.addAction(Intent.ACTION_SCREEN_ON);
- intentFltr.addAction(Intent.ACTION_SCREEN_OFF);
- }
-
- @Override
- public void onBroadcastReceived(final Intent intent) {
- super.onBroadcastReceived(intent);
- if (intent == null || intent.getAction() == null) {
- return;
- }
- if (DEBUG) {
- Log.d(TAG, "onBroadcastReceived() called with: intent = [" + intent + "]");
- }
- switch (intent.getAction()) {
- case ACTION_CLOSE:
- closePopup();
- break;
- case ACTION_PLAY_PAUSE:
- onPlayPause();
- break;
- case ACTION_REPEAT:
- onRepeatClicked();
- break;
- case Intent.ACTION_SCREEN_ON:
- enableVideoRenderer(true);
- break;
- case Intent.ACTION_SCREEN_OFF:
- enableVideoRenderer(false);
- break;
- }
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // States
- //////////////////////////////////////////////////////////////////////////*/
-
- @Override
- public void changeState(final int state) {
- super.changeState(state);
- updatePlayback();
- }
-
- @Override
- public void onBlocked() {
- super.onBlocked();
- resetNotification();
- updateNotification(R.drawable.exo_controls_play);
- }
-
- @Override
- public void onPlaying() {
- super.onPlaying();
-
- updateWindowFlags(ONGOING_PLAYBACK_WINDOW_FLAGS);
-
- resetNotification();
- updateNotification(R.drawable.exo_controls_pause);
-
- videoPlayPause.setBackgroundResource(R.drawable.exo_controls_pause);
- hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME);
-
- startForeground(NOTIFICATION_ID, notBuilder.build());
- }
-
- @Override
- public void onBuffering() {
- super.onBuffering();
- resetNotification();
- updateNotification(R.drawable.exo_controls_play);
- }
-
- @Override
- public void onPaused() {
- super.onPaused();
-
- updateWindowFlags(IDLE_WINDOW_FLAGS);
-
- resetNotification();
- updateNotification(R.drawable.exo_controls_play);
- videoPlayPause.setBackgroundResource(R.drawable.exo_controls_play);
-
- stopForeground(false);
- }
-
- @Override
- public void onPausedSeek() {
- super.onPausedSeek();
- resetNotification();
- updateNotification(R.drawable.exo_controls_play);
-
- videoPlayPause.setBackgroundResource(R.drawable.exo_controls_play);
- }
-
- @Override
- public void onCompleted() {
- super.onCompleted();
-
- updateWindowFlags(IDLE_WINDOW_FLAGS);
-
- resetNotification();
- updateNotification(R.drawable.ic_replay_white_24dp);
- videoPlayPause.setBackgroundResource(R.drawable.ic_replay_white_24dp);
-
- stopForeground(false);
- }
-
- @Override
- public void showControlsThenHide() {
- videoPlayPause.setVisibility(View.VISIBLE);
- super.showControlsThenHide();
- }
-
- public void showControls(final long duration) {
- videoPlayPause.setVisibility(View.VISIBLE);
- super.showControls(duration);
- }
-
- public void hideControls(final long duration, final long delay) {
- super.hideControlsAndButton(duration, delay, videoPlayPause);
- }
-
- @Override
- public void hideSystemUIIfNeeded() { }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Utils
- //////////////////////////////////////////////////////////////////////////*/
-
- /*package-private*/ void enableVideoRenderer(final boolean enable) {
- final int videoRendererIndex = getRendererIndex(C.TRACK_TYPE_VIDEO);
- if (videoRendererIndex != RENDERER_UNAVAILABLE) {
- trackSelector.setParameters(trackSelector.buildUponParameters()
- .setRendererDisabled(videoRendererIndex, !enable));
- }
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Getters
- //////////////////////////////////////////////////////////////////////////*/
-
- @SuppressWarnings("WeakerAccess")
- public TextView getResizingIndicator() {
- return resizingIndicator;
- }
-
- public View getClosingOverlayView() {
- return closingOverlayView;
- }
- }
-
- private class PopupWindowGestureListener extends GestureDetector.SimpleOnGestureListener
- implements View.OnTouchListener {
- private int initialPopupX;
- private int initialPopupY;
- private boolean isMoving;
- private boolean isResizing;
-
- //initial co-ordinates and distance between fingers
- private double initPointerDistance = -1;
- private float initFirstPointerX = -1;
- private float initFirstPointerY = -1;
- private float initSecPointerX = -1;
- private float initSecPointerY = -1;
-
-
- @Override
- public boolean onDoubleTap(final MotionEvent e) {
- if (DEBUG) {
- Log.d(TAG, "onDoubleTap() called with: e = [" + e + "], "
- + "rawXy = " + e.getRawX() + ", " + e.getRawY()
- + ", xy = " + e.getX() + ", " + e.getY());
- }
- if (playerImpl == null || !playerImpl.isPlaying()) {
- return false;
- }
-
- playerImpl.hideControls(0, 0);
-
- if (e.getX() > popupWidth / 2) {
- playerImpl.onFastForward();
- } else {
- playerImpl.onFastRewind();
- }
-
- return true;
- }
-
- @Override
- public boolean onSingleTapConfirmed(final MotionEvent e) {
- if (DEBUG) {
- Log.d(TAG, "onSingleTapConfirmed() called with: e = [" + e + "]");
- }
- if (playerImpl == null || playerImpl.getPlayer() == null) {
- return false;
- }
- if (playerImpl.isControlsVisible()) {
- playerImpl.hideControls(100, 100);
- } else {
- playerImpl.showControlsThenHide();
-
- }
- return true;
- }
-
- @Override
- public boolean onDown(final MotionEvent e) {
- if (DEBUG) {
- Log.d(TAG, "onDown() called with: e = [" + e + "]");
- }
-
- // Fix popup position when the user touch it, it may have the wrong one
- // because the soft input is visible (the draggable area is currently resized).
- checkPopupPositionBounds(closeOverlayView.getWidth(), closeOverlayView.getHeight());
-
- initialPopupX = popupLayoutParams.x;
- initialPopupY = popupLayoutParams.y;
- popupWidth = popupLayoutParams.width;
- popupHeight = popupLayoutParams.height;
- return super.onDown(e);
- }
-
- @Override
- public void onLongPress(final MotionEvent e) {
- if (DEBUG) {
- Log.d(TAG, "onLongPress() called with: e = [" + e + "]");
- }
- updateScreenSize();
- checkPopupPositionBounds();
- updatePopupSize((int) screenWidth, -1);
- }
-
- @Override
- public boolean onScroll(final MotionEvent initialEvent, final MotionEvent movingEvent,
- final float distanceX, final float distanceY) {
- if (isResizing || playerImpl == null) {
- return super.onScroll(initialEvent, movingEvent, distanceX, distanceY);
- }
-
- if (!isMoving) {
- animateView(closeOverlayButton, true, 200);
- }
-
- isMoving = true;
-
- float diffX = (int) (movingEvent.getRawX() - initialEvent.getRawX());
- float posX = (int) (initialPopupX + diffX);
- float diffY = (int) (movingEvent.getRawY() - initialEvent.getRawY());
- float posY = (int) (initialPopupY + diffY);
-
- if (posX > (screenWidth - popupWidth)) {
- posX = (int) (screenWidth - popupWidth);
- } else if (posX < 0) {
- posX = 0;
- }
-
- if (posY > (screenHeight - popupHeight)) {
- posY = (int) (screenHeight - popupHeight);
- } else if (posY < 0) {
- posY = 0;
- }
-
- popupLayoutParams.x = (int) posX;
- popupLayoutParams.y = (int) posY;
-
- final View closingOverlayView = playerImpl.getClosingOverlayView();
- if (isInsideClosingRadius(movingEvent)) {
- if (closingOverlayView.getVisibility() == View.GONE) {
- animateView(closingOverlayView, true, 250);
- }
- } else {
- if (closingOverlayView.getVisibility() == View.VISIBLE) {
- animateView(closingOverlayView, false, 0);
- }
- }
-
-// if (DEBUG) {
-// Log.d(TAG, "PopupVideoPlayer.onScroll = "
-// + "e1.getRaw = [" + initialEvent.getRawX() + ", "
-// + initialEvent.getRawY() + "], "
-// + "e1.getX,Y = [" + initialEvent.getX() + ", "
-// + initialEvent.getY() + "], "
-// + "e2.getRaw = [" + movingEvent.getRawX() + ", "
-// + movingEvent.getRawY() + "], "
-// + "e2.getX,Y = [" + movingEvent.getX() + ", " + movingEvent.getY() + "], "
-// + "distanceX,Y = [" + distanceX + ", " + distanceY + "], "
-// + "posX,Y = [" + posX + ", " + posY + "], "
-// + "popupW,H = [" + popupWidth + " x " + popupHeight + "]");
-// }
- windowManager.updateViewLayout(playerImpl.getRootView(), popupLayoutParams);
- return true;
- }
-
- private void onScrollEnd(final MotionEvent event) {
- if (DEBUG) {
- Log.d(TAG, "onScrollEnd() called");
- }
- if (playerImpl == null) {
- return;
- }
- if (playerImpl.isControlsVisible() && playerImpl.getCurrentState() == STATE_PLAYING) {
- playerImpl.hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME);
- }
-
- if (isInsideClosingRadius(event)) {
- closePopup();
- } else {
- animateView(playerImpl.getClosingOverlayView(), false, 0);
-
- if (!isPopupClosing) {
- animateView(closeOverlayButton, false, 200);
- }
- }
- }
-
- @Override
- public boolean onFling(final MotionEvent e1, final MotionEvent e2,
- final float velocityX, final float velocityY) {
- if (DEBUG) {
- Log.d(TAG, "Fling velocity: dX=[" + velocityX + "], dY=[" + velocityY + "]");
- }
- if (playerImpl == null) {
- return false;
- }
-
- final float absVelocityX = Math.abs(velocityX);
- final float absVelocityY = Math.abs(velocityY);
- if (Math.max(absVelocityX, absVelocityY) > tossFlingVelocity) {
- if (absVelocityX > tossFlingVelocity) {
- popupLayoutParams.x = (int) velocityX;
- }
- if (absVelocityY > tossFlingVelocity) {
- popupLayoutParams.y = (int) velocityY;
- }
- checkPopupPositionBounds();
- windowManager.updateViewLayout(playerImpl.getRootView(), popupLayoutParams);
- return true;
- }
- return false;
- }
-
- @Override
- public boolean onTouch(final View v, final MotionEvent event) {
- popupGestureDetector.onTouchEvent(event);
- if (playerImpl == null) {
- return false;
- }
- if (event.getPointerCount() == 2 && !isMoving && !isResizing) {
- if (DEBUG) {
- Log.d(TAG, "onTouch() 2 finger pointer detected, enabling resizing.");
- }
- playerImpl.showAndAnimateControl(-1, true);
- playerImpl.getLoadingPanel().setVisibility(View.GONE);
-
- playerImpl.hideControls(0, 0);
- animateView(playerImpl.getCurrentDisplaySeek(), false, 0, 0);
- animateView(playerImpl.getResizingIndicator(), true, 200, 0);
-
- //record co-ordinates of fingers
- initFirstPointerX = event.getX(0);
- initFirstPointerY = event.getY(0);
- initSecPointerX = event.getX(1);
- initSecPointerY = event.getY(1);
- //record distance between fingers
- initPointerDistance = Math.hypot(initFirstPointerX - initSecPointerX,
- initFirstPointerY - initSecPointerY);
-
- isResizing = true;
- }
-
- if (event.getAction() == MotionEvent.ACTION_MOVE && !isMoving && isResizing) {
- if (DEBUG) {
- Log.d(TAG, "onTouch() ACTION_MOVE > v = [" + v + "], "
- + "e1.getRaw = [" + event.getRawX() + ", " + event.getRawY() + "]");
- }
- return handleMultiDrag(event);
- }
-
- if (event.getAction() == MotionEvent.ACTION_UP) {
- if (DEBUG) {
- Log.d(TAG, "onTouch() ACTION_UP > v = [" + v + "], "
- + "e1.getRaw = [" + event.getRawX() + ", " + event.getRawY() + "]");
- }
- if (isMoving) {
- isMoving = false;
- onScrollEnd(event);
- }
-
- if (isResizing) {
- isResizing = false;
-
- initPointerDistance = -1;
- initFirstPointerX = -1;
- initFirstPointerY = -1;
- initSecPointerX = -1;
- initSecPointerY = -1;
-
- animateView(playerImpl.getResizingIndicator(), false, 100, 0);
- playerImpl.changeState(playerImpl.getCurrentState());
- }
-
- if (!isPopupClosing) {
- savePositionAndSize();
- }
- }
-
- v.performClick();
- return true;
- }
-
- private boolean handleMultiDrag(final MotionEvent event) {
- if (initPointerDistance != -1 && event.getPointerCount() == 2) {
- // get the movements of the fingers
- double firstPointerMove = Math.hypot(event.getX(0) - initFirstPointerX,
- event.getY(0) - initFirstPointerY);
- double secPointerMove = Math.hypot(event.getX(1) - initSecPointerX,
- event.getY(1) - initSecPointerY);
-
- // minimum threshold beyond which pinch gesture will work
- int minimumMove = ViewConfiguration.get(PopupVideoPlayer.this).getScaledTouchSlop();
-
- if (Math.max(firstPointerMove, secPointerMove) > minimumMove) {
- // calculate current distance between the pointers
- double currentPointerDistance =
- Math.hypot(event.getX(0) - event.getX(1),
- event.getY(0) - event.getY(1));
-
- // change co-ordinates of popup so the center stays at the same position
- double newWidth = (popupWidth * currentPointerDistance / initPointerDistance);
- initPointerDistance = currentPointerDistance;
- popupLayoutParams.x += (popupWidth - newWidth) / 2;
-
- checkPopupPositionBounds();
- updateScreenSize();
-
- updatePopupSize((int) Math.min(screenWidth, newWidth), -1);
- return true;
- }
- }
- return false;
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Utils
- //////////////////////////////////////////////////////////////////////////*/
-
- private int distanceFromCloseButton(final MotionEvent popupMotionEvent) {
- final int closeOverlayButtonX = closeOverlayButton.getLeft()
- + closeOverlayButton.getWidth() / 2;
- final int closeOverlayButtonY = closeOverlayButton.getTop()
- + closeOverlayButton.getHeight() / 2;
-
- float fingerX = popupLayoutParams.x + popupMotionEvent.getX();
- float fingerY = popupLayoutParams.y + popupMotionEvent.getY();
-
- return (int) Math.sqrt(Math.pow(closeOverlayButtonX - fingerX, 2)
- + Math.pow(closeOverlayButtonY - fingerY, 2));
- }
-
- private float getClosingRadius() {
- final int buttonRadius = closeOverlayButton.getWidth() / 2;
- // 20% wider than the button itself
- return buttonRadius * 1.2f;
- }
-
- private boolean isInsideClosingRadius(final MotionEvent popupMotionEvent) {
- return distanceFromCloseButton(popupMotionEvent) <= getClosingRadius();
- }
- }
-}
diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayerActivity.java
deleted file mode 100644
index 7c5813bc4..000000000
--- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayerActivity.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.schabi.newpipe.player;
-
-import android.content.Intent;
-import android.view.Menu;
-import android.view.MenuItem;
-
-import org.schabi.newpipe.R;
-
-import static org.schabi.newpipe.player.PopupVideoPlayer.ACTION_CLOSE;
-
-public final class PopupVideoPlayerActivity extends ServicePlayerActivity {
-
- private static final String TAG = "PopupVideoPlayerActivity";
-
- @Override
- public String getTag() {
- return TAG;
- }
-
- @Override
- public String getSupportActionTitle() {
- return getResources().getString(R.string.title_activity_popup_player);
- }
-
- @Override
- public Intent getBindIntent() {
- return new Intent(this, PopupVideoPlayer.class);
- }
-
- @Override
- public void startPlayerListener() {
- if (player != null && player instanceof PopupVideoPlayer.VideoPlayerImpl) {
- ((PopupVideoPlayer.VideoPlayerImpl) player).setActivityListener(this);
- }
- }
-
- @Override
- public void stopPlayerListener() {
- if (player != null && player instanceof PopupVideoPlayer.VideoPlayerImpl) {
- ((PopupVideoPlayer.VideoPlayerImpl) player).removeActivityListener(this);
- }
- }
-
- @Override
- public int getPlayerOptionMenuResource() {
- return R.menu.menu_play_queue_popup;
- }
-
- @Override
- public boolean onPlayerOptionSelected(final MenuItem item) {
- if (item.getItemId() == R.id.action_switch_background) {
- this.player.setRecovery();
- getApplicationContext().sendBroadcast(getPlayerShutdownIntent());
- getApplicationContext().startService(
- getSwitchIntent(MainPlayer.class, MainPlayer.PlayerType.AUDIO)
- .putExtra(BasePlayer.START_PAUSED, !this.player.isPlaying())
- );
- return true;
- }
- return false;
- }
-
- @Override
- public void setupMenu(final Menu menu) {
-
- }
-
- //@Override
- public Intent getPlayerShutdownIntent() {
- return new Intent(ACTION_CLOSE);
- }
-}
diff --git a/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java b/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java
index d2eb591f4..0f98b2296 100644
--- a/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java
+++ b/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java
@@ -1,6 +1,6 @@
/*
* Copyright 2017 Mauricio Colli
- * PopupVideoPlayer.java is part of NewPipe
+ * Part of NewPipe
*
* License: GPL-3.0+
* This program is free software: you can redistribute it and/or modify
diff --git a/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java b/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java
index 9eb56ff84..e37a3a930 100644
--- a/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java
+++ b/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java
@@ -213,7 +213,7 @@ public class PlayerGestureListener
return false;
}
- /*if (DEBUG && false) Log.d(TAG, "MainVideoPlayer.onScroll = " +
+ /*if (DEBUG && false) Log.d(TAG, "onScrollInMain = " +
", e1.getRaw = [" + initialEvent.getRawX() + ", " + initialEvent.getRawY() + "]" +
", e2.getRaw = [" + movingEvent.getRawX() + ", " + movingEvent.getRawY() + "]" +
", distanceXy = [" + distanceX + ", " + distanceY + "]");*/
@@ -431,7 +431,7 @@ public class PlayerGestureListener
}
// if (DEBUG) {
-// Log.d(TAG, "PopupVideoPlayer.onScroll = "
+// Log.d(TAG, "onScrollInPopup = "
// + "e1.getRaw = [" + initialEvent.getRawX() + ", "
// + initialEvent.getRawY() + "], "
// + "e1.getX,Y = [" + initialEvent.getX() + ", "
diff --git a/app/src/main/res/layout/player_popup.xml b/app/src/main/res/layout/player_popup.xml
deleted file mode 100644
index 1ca07ca10..000000000
--- a/app/src/main/res/layout/player_popup.xml
+++ /dev/null
@@ -1,299 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/player_popup_notification.xml b/app/src/main/res/layout/player_popup_notification.xml
deleted file mode 100644
index e8b077ecc..000000000
--- a/app/src/main/res/layout/player_popup_notification.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_play_queue_popup.xml b/app/src/main/res/menu/menu_play_queue_popup.xml
deleted file mode 100644
index dd5177da9..000000000
--- a/app/src/main/res/menu/menu_play_queue_popup.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/app/src/main/res/menu/menu_videooptions.xml b/app/src/main/res/menu/menu_videooptions.xml
deleted file mode 100644
index f153ad31c..000000000
--- a/app/src/main/res/menu/menu_videooptions.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 2d007a043..d8ab4f6cd 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -227,8 +227,6 @@
الشائعة
أفضل 50
جديد وساخن
- مشغل الخلفية
- المشغل المنبثق
حذف
التفاصيل
الإعدادات الصوتية
diff --git a/app/src/main/res/values-b+zh+HANS+CN/strings.xml b/app/src/main/res/values-b+zh+HANS+CN/strings.xml
index 40712041e..5bae06248 100644
--- a/app/src/main/res/values-b+zh+HANS+CN/strings.xml
+++ b/app/src/main/res/values-b+zh+HANS+CN/strings.xml
@@ -273,8 +273,6 @@
无法播放此串流
发生无法恢复播放器错误
恢复播放器错误
- 后台播放
- 悬浮窗播放器
移除
详情
音频设置
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index fbd7a99c0..7088a324f 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -314,8 +314,6 @@
Трэнды
Топ 50
Новае і гарачае
- У фоне
- У акне
Выдаліць
Падрабязнасці
Налады аўдыё
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 400c8d280..e37a124a6 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -307,8 +307,6 @@
Набиращи популярност
Топ 50
Ново и горещо
- Във фонов режим
- В прозорец
Премахни
Детайли
Аудио настройки
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index d77c6a63a..726851fb4 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -259,8 +259,6 @@
Quiosc
Tendències
Els millors 50
- Reproductor en rerefons
- Reproductor emergent
Afegeix a la cua de reproducció en rerefons
Afegeix a la cua de reproducció emergent
Reprodueix aquí
diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml
index c913207cc..203391c36 100644
--- a/app/src/main/res/values-ckb/strings.xml
+++ b/app/src/main/res/values-ckb/strings.xml
@@ -188,7 +188,6 @@
ڕووكار
گۆڕین بۆ سەرەکی
دەقە بنچینەییەکان لە خزمەتگوزارییەکانەوە لە بابەتی پەخشەکاندا دیار دەبن
- کارپێکەری پەنجەرەی بچووک
داگرتن
ژێرنووسەکان
بەستەر هەڵەیە
@@ -601,7 +600,6 @@
دواین کارپێکراو
ناتوانرێ لیستی داگرتن دابنرێ
هێنانەوە/هاوردەکردن
- کارپێکەری پاشبنەما
وەشانی نوێی داوانامە بەردەستە!
وێنۆچکەی خشتەی کارپێکردن گۆڕدرا.
هێنانەوەی پەڕەی کەسی SoundCloud بەدانانی بەستەر یاخوود ئایدی:
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index f18da7ba0..c92727e7b 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -234,8 +234,6 @@ otevření ve vyskakovacím okně
Trendy
Top 50
Nové & hot
- Přehrávač na pozadí
- Přehrávač v okně
Odebrat
Podrobnosti
Nastavení zvuku
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 91ca1040f..2217f37e0 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -315,8 +315,6 @@
Populært lige nu
Top 50
Nyt og populært
- Baggrundsafspiller
- Pop op-afspiller
Fjern
Detaljer
Lydindstillinger
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 20c4e3286..3dd629323 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -225,8 +225,6 @@
Abonnement-Seite
Feed-Seite
Kanal-Seite
- Wiedergabe im Hintergrund
- Pop-up Player
Details
Top 50
Nicht behebbarer Wiedergabefehler aufgetreten
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index ed5a6b299..cd29ee996 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -307,8 +307,6 @@
Αυτό θα παρακάμψει τις τρέχουσες ρυθμίσεις σας.
Θέλετε επίσης να εισάγετε ρυθμίσεις;
Περίπτερο
- Συσκευή αναπαραγωγής Παρασκηνίου
- Συσκευή αναπαραγωγής Αναδυόμενου παραθύρου
Αφαίρεση
Λεπτομέρειες
Ρυθμίσεις ήχου
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index f219ee2e8..9144dfe58 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -162,8 +162,6 @@
Ne povis ludi tion torenton
Neatendebla eraro de ludilo okazis
Reakiri el eraro de la ludilo
- Fona ludilo
- Ŝprucfenestra ludilo
Retiri
Detalado
Sonaj parametroj
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index cbff74f70..8c412f8de 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -230,8 +230,6 @@
No se pudo reproducir este stream
Se produjo un error irrecuperable del reproductor
Recuperándose del error del reproductor
- Reproductor en segundo plano
- Reproductor emergente
Quitar
Detalles
Configuración de audio
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index a32d26af2..0bf400e19 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -295,8 +295,6 @@
Trendid
"Top 50 "
Uus ja kuum
- Taustapleier
- Hüpikpleier
Eemalda
Üksikasjad
Heli seaded
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index db02eaedc..3bd40df14 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -243,8 +243,6 @@
Joerak
Lehen 50ak
Berria eta arrakastatsua
- Bigarren planoko erreproduzigailua
- Laster-leiho erreproduzigailua
Kendu
Xehetasunak
Audio ezarpenak
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 8f40e68ff..0dbe5f978 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -258,7 +258,6 @@
محبوب
۵۰ ویدئوی برتر
جدید و داغ
- پخشکننده پسزمینه
حذف
جزئیات
تنظیمات صدا
@@ -371,7 +370,6 @@
قرار دادن در صف پخش به صورت تصویر در تصویر
خطای عدم احیای پخشکننده رخ داد
در حال احیا از خطای پخشکننده
- پخشکننده تصویر در تصویر
در صف پخش پسزمینه قرار بده
در صف پخش تصویر در تصویر قرار بده
شروع پخش در اینجا
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index d325f7ee4..c65af0bfd 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -230,8 +230,6 @@
Tätä suoratoistosisältöä ei voitu toistaa
Palautuskelvoton soittimen virhe
Palaudutaan soittimen virheestä
- Taustasoitin
- Ponnahdusikkunasoitin
Poista
Yksityiskohdat
Ääniasetukset
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 0d14f1390..1239c8abb 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -224,8 +224,6 @@
Impossible de lire ce flux
Une erreur irrécupérable du lecteur est survenue
Pas encore d’abonnements de chaîne
- Lecteur en arrière-plan
- Lecteur flottant
Retirer
Détails
Paramètres audios
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 8450d60c8..18178d4fd 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -341,8 +341,6 @@
Tendencias
Top 50
Novo e popular
- Reprodutor en segundo plano
- Reprodutor «popup»
Eliminar
Detalles
Opcións de audio
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index 0ac642b19..0091ba022 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -243,8 +243,6 @@
החמים
50 המובילים
חדש וחם
- נגן רקע
- נגן צף
הסרה
פרטים
אפשרויות שמע
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index ad1f3f5fc..1f5a033dc 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -232,8 +232,6 @@
kiosk
टॉप 50
नया और गरम
- पृष्ठभूमि प्लेयर
- पॉपअप प्लेयर
निकाले
विवरण
जोड़ने के लिए पकड़ें रहे
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 4512e265b..f413fe5d9 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -234,8 +234,6 @@
U trendu
Vrh 50
Novo i popularno
- Pozadinski player
- Skočni reproduktor
Ukloni
Detalji
Postavke zvuka
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 1dcfb9413..3848987bb 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -296,7 +296,6 @@
Felkapott
Top 50
Új és friss
- Felugró ablak lejátszó
Eltávolítás
Részletek
Hang beállítások
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index cc976ecff..f103d2641 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -270,8 +270,6 @@
Trending
Top 50
Baru & panas
- Pemutar latar belakang
- Pemutar popup
Hapus
Detail
Pengaturan Audio
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 0b2b3b44b..d6582ef36 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -231,8 +231,6 @@
Impossibile riprodurre questo flusso
Si è verificato un errore irreversibile
Ripristino dell\'errore del lettore multimediale
- Riproduzione in Sottofondo
- Lettore Popup
Rimuovi
Dettagli
Impostazioni Audio
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index f66930a0c..f9c3bb9e6 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -216,7 +216,6 @@
Kiosk
人気
トップ50
- ポップアップ再生
削除
詳細
音声の設定
@@ -241,7 +240,6 @@
有効な ZIP ファイルではありません
警告: すべてのファイルをインポートできませんでした。
これにより、現在の設定が上書きされます。
- バックグラウンド再生
ここから再生を開始
バックグラウンドで連続再生を開始
ドロワーを開く
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 78550ca5e..532dda837 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -230,8 +230,6 @@
인기 급상승
탑 50
신작 & 뜨는 동영상
- 백그라운드 플레이어
- 팝업 플레이어
제거
상세 정보
오디오 설정
diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml
index 47c46cc49..0bafd4b32 100644
--- a/app/src/main/res/values-ku/strings.xml
+++ b/app/src/main/res/values-ku/strings.xml
@@ -252,7 +252,6 @@
دواین کارپێکراو
زۆرترین کارپێکردن
ناوەڕۆکی پەڕەی سەرەکی
- کارپێکەری پەنجەرەی بچووک
لادان
وردەکارییەکان
ڕێکخستنەکانی دەنگ
@@ -434,7 +433,6 @@
پڕبینەرەکان
باشترین 50
نوێ & چالاک
- کارپێکەری پاشبنەما
پەنجەت داگرە بۆ ڕیزنەبوون
ڕیزنەبوون لە پاشبنەما
ڕیزنەبوون لە پەنجەرەی بچووک
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index fb05da09c..d9806e326 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -267,8 +267,6 @@
Tendencijos
Top 50
Nauja ir karšta
- Foninis grotuvas
- Langelio rėžimo grotuvas
Pašalinti
Detalės
Garso nustatymai
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index 660148f01..71f02b892 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -290,8 +290,6 @@
Популарни
Топ 50
Нови и жешки
- Позадински плеер
- Подпрозорче
Одстрани
Детали
Звучни поставки
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index bc27edaa4..67cb36731 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -79,8 +79,6 @@
ഓഡിയോ ക്രമീകരണങ്ങൾ
വിശദാംശങ്ങൾ
നീക്കം ചെയ്യുക
- പോപ്-അപ് പ്ലെയർ
- ബാക്ക്ഗ്രൗണ്ട് പ്ലേയർ
സമ്മേളനങ്ങൾ
ഏറ്റവും ഇഷ്ടപ്പെട്ടത്
സമീപകാലത്ത് ചേർത്തത്
diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml
index 1944877f8..069c33450 100644
--- a/app/src/main/res/values-ms/strings.xml
+++ b/app/src/main/res/values-ms/strings.xml
@@ -328,8 +328,6 @@
Top 50
Baru & panas
Persidangan
- Pemain latar belakang
- Pemain popup
Hapuskan
Butiran
Tetapan Audio
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index 6adb1c9f8..52e9653f1 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -222,8 +222,6 @@
Kiosk
Topp 50
Nytt og hett
- Bakgrunnsavspiller
- Oppsprettsavspiller
Fjern
Detaljer
Lydinnstillinger
diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml
index aac2a27ae..2a3cb7d9c 100644
--- a/app/src/main/res/values-ne/strings.xml
+++ b/app/src/main/res/values-ne/strings.xml
@@ -334,8 +334,6 @@
शीर्ष 50
नयाँ र तात्तातो
सम्मेलनहरु
- प्ले लाममा
- पपअप प्लयेर
हटाउ
विवरण
अडियो सेटिङहरू
diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml
index a80cec9cc..66843542c 100644
--- a/app/src/main/res/values-nl-rBE/strings.xml
+++ b/app/src/main/res/values-nl-rBE/strings.xml
@@ -291,8 +291,6 @@
Populair
Top 50
Nieuw en populair
- Achtergrondspeler
- Pop-upspeler
Verwijderen
Details
Audio-instellingen
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index ca4539a60..24ad14eeb 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -231,8 +231,6 @@
Populair
Top 50
Nieuw en populair
- Achtergrondspeler
- Pop-upspeler
Verwijderen
Details
Audio-instellingen
diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml
index 6a84b99a4..95608ba7a 100644
--- a/app/src/main/res/values-pa/strings.xml
+++ b/app/src/main/res/values-pa/strings.xml
@@ -299,8 +299,6 @@
ਰੁਝਾਨ ਵਿੱਚ
ਟੌਪ 50
ਨਵਾਂ ਅਤੇ ਗਰਮਾ-ਗਰਮ
- ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ
- ਪੌਪ-ਅਪ ਪਲੇਅਰ
ਹਟਾਓ
ਵੇਰਵੇ
ਆਡੀਓ ਸੈਟਿੰਗਾਂ
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index deef7afbd..22ef12114 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -240,8 +240,6 @@
Najpopularniejsze
50 najlepszych
Nowe i gorące
- Odtwarzanie w tle
- Odtwarzacz w trybie okienkowym
Usuń
Szczegóły
Ustawienia dźwięku
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index a0a62ca91..d15b5c54a 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -231,8 +231,6 @@
Este vídeo não pôde ser reproduzido
Ocorreu um erro irrecuperável no player
Recuperando do erro do player
- Player em segundo plano
- Player Popup
Remover
Detalhes
Configurações de áudio
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index a52946dbd..e807d44c5 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -225,8 +225,6 @@
Tendências
Top 50
Tendências
- Reprodutor em segundo plano
- Reprodutor \'popup\'
Remover
Detalhes
Definições de áudio
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 2d08addb9..7c7850bc1 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -286,8 +286,6 @@ pentru a deschide în mod pop-up
Nici-un fişier ZIP valid
Avertisment: Nu se pot importa fişierele.
Acest lucru o să vă reseteze setup-ul curent.
- Player în fundal
- Player popup
Şterge
Detalii
Setări Audio
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 913475d8e..e8e14692d 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -242,8 +242,6 @@
Показать подсказку при нажатии \"В окне\" или \"В фоне\" на странице сведений о видео
[Неизвестно]
Восстановление после ошибки плеера
- В фоне
- В окне
Зажмите, чтобы добавить в очередь
В очередь в фоне
В очередь в окне
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 3352c81f8..b1ef016af 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -276,8 +276,6 @@
Trendy
Top 50
Nové & horúce
- Prehrávač na pozadí
- Prehrávač v mini okne
Odstrániť
Podrobnosti
Nastavenie zvuku
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index c1cc8d963..2586a5106 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -280,8 +280,6 @@ odpiranje v pojavnem načinu
Izbor kanala
Najboljših 50
Novo in vroče
- Ozadnji predvajalnik
- Pojavni predvajalnik
Odstrani
Podrobnosti
Nastavitve zvoka
diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml
index 278e27371..c796efadf 100644
--- a/app/src/main/res/values-sq/strings.xml
+++ b/app/src/main/res/values-sq/strings.xml
@@ -226,8 +226,6 @@
Aranzhimet Audio
Detaje
Hiq
- Luajtësi popup
- Luajtësi në sfond
Konferencat
Më të pëlqyerat
Të shtuara së fundmi
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 1cd4d2baa..87e631aee 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -233,8 +233,6 @@
У тренду
Топ 50
Ново и вруће
- Позадински плејер
- Искачући плејер
Уклони
Детаљи
Поставке звука
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 23be5276b..cc613d2de 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -232,8 +232,6 @@
Trend
Topp 50
Aktuellt
- Bakgrundsspelare
- Popup-spelare
Ta bort
Detaljer
Ljudinställningar
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index 7910a29c7..952044208 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -311,8 +311,6 @@
50 อันดับแรก
ใหม่และมาแรง
การประชุม
- เครื่องเล่นพื้นหลัง
- เครื่องเล่นป๊อปอัพ
เอาออก
รายละเอียด
การตั้งค่าเสียง
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index bc4808f59..141331c68 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -228,8 +228,6 @@
Popüler
En iyi 50
En yeniler ve popülerler
- Arkaplan oynatıcı
- Açılır pencere oynatıcı
Kaldır
Ayrıntılar
Ses Ayarları
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 20e9dbde1..efaf1270a 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -289,8 +289,6 @@
Це перезапише ваші поточні налаштування.
Кіоски
Набуває популярності
- Програвач у тлі
- Програвач у вікні
Видалити
Утримуйте, щоб додати в чергу
Додати до фону
diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml
index 5609902e3..10b1c5524 100644
--- a/app/src/main/res/values-ur/strings.xml
+++ b/app/src/main/res/values-ur/strings.xml
@@ -288,8 +288,6 @@
رجحان میں
اوّل 50
نیا اور تازہ
- پس منظر پلیئر
- پوپ اپ پلیئر
ہٹائیں
تفصیلات
آڈیو کی ترتیبات
diff --git a/app/src/main/res/values-v28/styles.xml b/app/src/main/res/values-v28/styles.xml
deleted file mode 100644
index 92c2d9214..000000000
--- a/app/src/main/res/values-v28/styles.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 1795dd607..d77d1564c 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -307,8 +307,6 @@
Trang chủ
Xu hướng
Mới & hot
- Trình phát nền
- Trình phát popup
Tẩy xoá
Chi tiết
Cài đặt âm thanh
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 8b87e9b10..76fb80795 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -273,8 +273,6 @@
无法播放此串流
发生无法恢复播放器错误
恢复播放器错误
- 后台播放
- 悬浮窗播放器
移除
详情
音频设置
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index b71d64a1f..0a10f68a0 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -252,8 +252,6 @@
動向
前 50
最新和熱門
- 背景播放
- 懸浮視窗播放
移除
詳細資訊
音訊設定
diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml
index cdb8293af..bce920722 100644
--- a/app/src/main/res/values/settings_keys.xml
+++ b/app/src/main/res/values/settings_keys.xml
@@ -144,8 +144,6 @@
- @string/audio_webm_key
- last_orientation_landscape_key
-
last_resize_mode
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2da2a9b1c..be856ef01 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -429,8 +429,6 @@
%1$s/%2$s
Play queue
- Background player
- Popup player
Remove
Details
Audio Settings
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 9018a2d2a..9a81d01e1 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -330,5 +330,4 @@
- @null
-