Marked many (too many) variables as final
This commit is contained in:
parent
a7fbe05a73
commit
b2164ce5fc
13 changed files with 295 additions and 273 deletions
|
@ -23,13 +23,13 @@ public final class FlingBehavior extends AppBarLayout.Behavior {
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean allowScroll = true;
|
private boolean allowScroll = true;
|
||||||
private Rect globalRect = new Rect();
|
private final Rect globalRect = new Rect();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) {
|
public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) {
|
||||||
ViewGroup playQueue = child.findViewById(R.id.playQueuePanel);
|
final ViewGroup playQueue = child.findViewById(R.id.playQueuePanel);
|
||||||
if (playQueue != null) {
|
if (playQueue != null) {
|
||||||
boolean visible = playQueue.getGlobalVisibleRect(globalRect);
|
final boolean visible = playQueue.getGlobalVisibleRect(globalRect);
|
||||||
if (visible && globalRect.contains((int) ev.getRawX(), (int) ev.getRawY())) {
|
if (visible && globalRect.contains((int) ev.getRawX(), (int) ev.getRawY())) {
|
||||||
allowScroll = false;
|
allowScroll = false;
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -45,7 +45,6 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
||||||
import com.google.android.material.navigation.NavigationView;
|
import com.google.android.material.navigation.NavigationView;
|
||||||
|
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.ServiceList;
|
|
||||||
import org.schabi.newpipe.extractor.StreamingService;
|
import org.schabi.newpipe.extractor.StreamingService;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
||||||
import org.schabi.newpipe.extractor.services.peertube.PeertubeInstance;
|
import org.schabi.newpipe.extractor.services.peertube.PeertubeInstance;
|
||||||
|
@ -453,21 +452,21 @@ public class MainActivity extends AppCompatActivity {
|
||||||
public void onBackPressed() {
|
public void onBackPressed() {
|
||||||
if (DEBUG) Log.d(TAG, "onBackPressed() called");
|
if (DEBUG) Log.d(TAG, "onBackPressed() called");
|
||||||
|
|
||||||
FrameLayout bottomSheetLayout = findViewById(R.id.fragment_player_holder);
|
final FrameLayout bottomSheetLayout = findViewById(R.id.fragment_player_holder);
|
||||||
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetLayout);
|
final BottomSheetBehavior<FrameLayout> bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetLayout);
|
||||||
|
|
||||||
final int sheetState = bottomSheetBehavior.getState();
|
final int sheetState = bottomSheetBehavior.getState();
|
||||||
// In case bottomSheet is not visible on the screen or collapsed we can assume that the user interacts with a fragment
|
// In case bottomSheet is not visible on the screen or collapsed we can assume that the user interacts with a fragment
|
||||||
// inside fragment_holder so all back presses should be handled by it
|
// inside fragment_holder so all back presses should be handled by it
|
||||||
if (sheetState == BottomSheetBehavior.STATE_HIDDEN || sheetState == BottomSheetBehavior.STATE_COLLAPSED) {
|
if (sheetState == BottomSheetBehavior.STATE_HIDDEN || sheetState == BottomSheetBehavior.STATE_COLLAPSED) {
|
||||||
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_holder);
|
final Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_holder);
|
||||||
// If current fragment implements BackPressable (i.e. can/wanna handle back press) delegate the back press to it
|
// If current fragment implements BackPressable (i.e. can/wanna handle back press) delegate the back press to it
|
||||||
if (fragment instanceof BackPressable) {
|
if (fragment instanceof BackPressable) {
|
||||||
if (((BackPressable) fragment).onBackPressed()) return;
|
if (((BackPressable) fragment).onBackPressed()) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Fragment fragmentPlayer = getSupportFragmentManager().findFragmentById(R.id.fragment_player_holder);
|
final Fragment fragmentPlayer = getSupportFragmentManager().findFragmentById(R.id.fragment_player_holder);
|
||||||
// If current fragment implements BackPressable (i.e. can/wanna handle back press) delegate the back press to it
|
// If current fragment implements BackPressable (i.e. can/wanna handle back press) delegate the back press to it
|
||||||
if (fragmentPlayer instanceof BackPressable) {
|
if (fragmentPlayer instanceof BackPressable) {
|
||||||
if (!((BackPressable) fragmentPlayer).onBackPressed())
|
if (!((BackPressable) fragmentPlayer).onBackPressed())
|
||||||
|
|
|
@ -10,7 +10,7 @@ class StackItem implements Serializable {
|
||||||
private String url;
|
private String url;
|
||||||
private PlayQueue playQueue;
|
private PlayQueue playQueue;
|
||||||
|
|
||||||
StackItem(int serviceId, String url, String title, PlayQueue playQueue) {
|
StackItem(final int serviceId, final String url, final String title, final PlayQueue playQueue) {
|
||||||
this.serviceId = serviceId;
|
this.serviceId = serviceId;
|
||||||
this.url = url;
|
this.url = url;
|
||||||
this.title = title;
|
this.title = title;
|
||||||
|
|
|
@ -73,10 +73,7 @@ import org.schabi.newpipe.util.*;
|
||||||
import org.schabi.newpipe.views.AnimatedProgressBar;
|
import org.schabi.newpipe.views.AnimatedProgressBar;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import icepick.State;
|
import icepick.State;
|
||||||
|
@ -143,7 +140,7 @@ public class VideoDetailFragment
|
||||||
|
|
||||||
private List<VideoStream> sortedVideoStreams;
|
private List<VideoStream> sortedVideoStreams;
|
||||||
private int selectedVideoStreamIndex = -1;
|
private int selectedVideoStreamIndex = -1;
|
||||||
private BottomSheetBehavior bottomSheetBehavior;
|
private BottomSheetBehavior<FrameLayout> bottomSheetBehavior;
|
||||||
private BroadcastReceiver broadcastReceiver;
|
private BroadcastReceiver broadcastReceiver;
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -210,19 +207,19 @@ public class VideoDetailFragment
|
||||||
// Service management
|
// Service management
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
private ServiceConnection getServiceConnection(boolean playAfterConnect) {
|
private ServiceConnection getServiceConnection(final boolean playAfterConnect) {
|
||||||
return new ServiceConnection() {
|
return new ServiceConnection() {
|
||||||
@Override
|
@Override
|
||||||
public void onServiceDisconnected(ComponentName name) {
|
public void onServiceDisconnected(final ComponentName name) {
|
||||||
if (DEBUG) Log.d(TAG, "Player service is disconnected");
|
if (DEBUG) Log.d(TAG, "Player service is disconnected");
|
||||||
|
|
||||||
unbind();
|
unbind();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onServiceConnected(ComponentName compName, IBinder service) {
|
public void onServiceConnected(final ComponentName compName, final IBinder service) {
|
||||||
if (DEBUG) Log.d(TAG, "Player service is connected");
|
if (DEBUG) Log.d(TAG, "Player service is connected");
|
||||||
MainPlayer.LocalBinder localBinder = (MainPlayer.LocalBinder) service;
|
final MainPlayer.LocalBinder localBinder = (MainPlayer.LocalBinder) service;
|
||||||
|
|
||||||
playerService = localBinder.getService();
|
playerService = localBinder.getService();
|
||||||
player = localBinder.getPlayer();
|
player = localBinder.getPlayer();
|
||||||
|
@ -255,18 +252,16 @@ public class VideoDetailFragment
|
||||||
private void bind() {
|
private void bind() {
|
||||||
if (DEBUG) Log.d(TAG, "bind() called");
|
if (DEBUG) Log.d(TAG, "bind() called");
|
||||||
|
|
||||||
Intent serviceIntent = new Intent(getContext(), MainPlayer.class);
|
final Intent serviceIntent = new Intent(getContext(), MainPlayer.class);
|
||||||
final boolean success = getContext().bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
|
bound = requireContext().bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
|
||||||
|
if (!bound) requireContext().unbindService(serviceConnection);
|
||||||
if (!success) getContext().unbindService(serviceConnection);
|
|
||||||
bound = success;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void unbind() {
|
private void unbind() {
|
||||||
if (DEBUG) Log.d(TAG, "unbind() called");
|
if (DEBUG) Log.d(TAG, "unbind() called");
|
||||||
|
|
||||||
if (bound) {
|
if (bound) {
|
||||||
getContext().unbindService(serviceConnection);
|
requireContext().unbindService(serviceConnection);
|
||||||
bound = false;
|
bound = false;
|
||||||
stopPlayerListener();
|
stopPlayerListener();
|
||||||
playerService = null;
|
playerService = null;
|
||||||
|
@ -286,20 +281,20 @@ public class VideoDetailFragment
|
||||||
// startService() can be called concurrently and it will give a random crashes and NullPointerExceptions
|
// startService() can be called concurrently and it will give a random crashes and NullPointerExceptions
|
||||||
// inside the service because the service will be bound twice. Prevent it with unbinding first
|
// inside the service because the service will be bound twice. Prevent it with unbinding first
|
||||||
unbind();
|
unbind();
|
||||||
getContext().startService(new Intent(getContext(), MainPlayer.class));
|
requireContext().startService(new Intent(getContext(), MainPlayer.class));
|
||||||
serviceConnection = getServiceConnection(playAfterConnect);
|
serviceConnection = getServiceConnection(playAfterConnect);
|
||||||
bind();
|
bind();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void stopService() {
|
private void stopService() {
|
||||||
unbind();
|
unbind();
|
||||||
getContext().stopService(new Intent(getContext(), MainPlayer.class));
|
requireContext().stopService(new Intent(getContext(), MainPlayer.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*////////////////////////////////////////////////////////////////////////*/
|
/*////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
public static VideoDetailFragment getInstance(int serviceId, String videoUrl, String name, PlayQueue playQueue) {
|
public static VideoDetailFragment getInstance(final int serviceId, final String videoUrl, final String name, final PlayQueue playQueue) {
|
||||||
VideoDetailFragment instance = new VideoDetailFragment();
|
VideoDetailFragment instance = new VideoDetailFragment();
|
||||||
instance.setInitialData(serviceId, videoUrl, name, playQueue);
|
instance.setInitialData(serviceId, videoUrl, name, playQueue);
|
||||||
return instance;
|
return instance;
|
||||||
|
@ -330,7 +325,7 @@ public class VideoDetailFragment
|
||||||
|
|
||||||
settingsContentObserver = new ContentObserver(new Handler()) {
|
settingsContentObserver = new ContentObserver(new Handler()) {
|
||||||
@Override
|
@Override
|
||||||
public void onChange(boolean selfChange) {
|
public void onChange(final boolean selfChange) {
|
||||||
if (activity != null && !PlayerHelper.globalScreenOrientationLocked(activity))
|
if (activity != null && !PlayerHelper.globalScreenOrientationLocked(activity))
|
||||||
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
|
||||||
}
|
}
|
||||||
|
@ -402,10 +397,9 @@ public class VideoDetailFragment
|
||||||
|
|
||||||
if (positionSubscriber != null) positionSubscriber.dispose();
|
if (positionSubscriber != null) positionSubscriber.dispose();
|
||||||
if (currentWorker != null) currentWorker.dispose();
|
if (currentWorker != null) currentWorker.dispose();
|
||||||
if (disposables != null) disposables.clear();
|
disposables.clear();
|
||||||
positionSubscriber = null;
|
positionSubscriber = null;
|
||||||
currentWorker = null;
|
currentWorker = null;
|
||||||
disposables = null;
|
|
||||||
bottomSheetBehavior.setBottomSheetCallback(null);
|
bottomSheetBehavior.setBottomSheetCallback(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -523,8 +517,7 @@ public class VideoDetailFragment
|
||||||
player.onPlayPause();
|
player.onPlayPause();
|
||||||
player.hideControls(0, 0);
|
player.hideControls(0, 0);
|
||||||
showSystemUi();
|
showSystemUi();
|
||||||
}
|
} else openVideoPlayer();
|
||||||
else openVideoPlayer();
|
|
||||||
|
|
||||||
setOverlayPlayPauseImage();
|
setOverlayPlayPauseImage();
|
||||||
break;
|
break;
|
||||||
|
@ -754,12 +747,13 @@ public class VideoDetailFragment
|
||||||
// Remove top
|
// Remove top
|
||||||
stack.pop();
|
stack.pop();
|
||||||
// Get stack item from the new top
|
// Get stack item from the new top
|
||||||
|
assert stack.peek() != null;
|
||||||
setupFromHistoryItem(stack.peek());
|
setupFromHistoryItem(stack.peek());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupFromHistoryItem(StackItem item) {
|
private void setupFromHistoryItem(final StackItem item) {
|
||||||
setAutoplay(false);
|
setAutoplay(false);
|
||||||
hideMainPlayer();
|
hideMainPlayer();
|
||||||
|
|
||||||
|
@ -773,9 +767,9 @@ public class VideoDetailFragment
|
||||||
// Maybe an item was deleted in background activity
|
// Maybe an item was deleted in background activity
|
||||||
if (item.getPlayQueue().getItem() == null) return;
|
if (item.getPlayQueue().getItem() == null) return;
|
||||||
|
|
||||||
PlayQueueItem playQueueItem = item.getPlayQueue().getItem();
|
final PlayQueueItem playQueueItem = item.getPlayQueue().getItem();
|
||||||
// Update title, url, uploader from the last item in the stack (it's current now)
|
// Update title, url, uploader from the last item in the stack (it's current now)
|
||||||
boolean isPlayerStopped = player == null || player.isPlayerStopped();
|
final boolean isPlayerStopped = player == null || player.isPlayerStopped();
|
||||||
if (playQueueItem != null && isPlayerStopped)
|
if (playQueueItem != null && isPlayerStopped)
|
||||||
updateOverlayData(playQueueItem.getTitle(), playQueueItem.getUploader(), playQueueItem.getThumbnailUrl());
|
updateOverlayData(playQueueItem.getTitle(), playQueueItem.getUploader(), playQueueItem.getThumbnailUrl());
|
||||||
}
|
}
|
||||||
|
@ -792,7 +786,7 @@ public class VideoDetailFragment
|
||||||
else prepareAndHandleInfo(currentInfo, false);
|
else prepareAndHandleInfo(currentInfo, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void selectAndLoadVideo(int serviceId, String videoUrl, String name, PlayQueue playQueue) {
|
public void selectAndLoadVideo(final int serviceId, final String videoUrl, final String name, final PlayQueue playQueue) {
|
||||||
// Situation when user switches from players to main player. All needed data is here, we can start watching
|
// Situation when user switches from players to main player. All needed data is here, we can start watching
|
||||||
if (this.playQueue != null && this.playQueue.equals(playQueue)) {
|
if (this.playQueue != null && this.playQueue.equals(playQueue)) {
|
||||||
openVideoPlayer();
|
openVideoPlayer();
|
||||||
|
@ -802,7 +796,7 @@ public class VideoDetailFragment
|
||||||
startLoading(false, true);
|
startLoading(false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void prepareAndHandleInfo(final StreamInfo info, boolean scrollToTop) {
|
public void prepareAndHandleInfo(final StreamInfo info, final boolean scrollToTop) {
|
||||||
if (DEBUG) Log.d(TAG, "prepareAndHandleInfo() called with: info = ["
|
if (DEBUG) Log.d(TAG, "prepareAndHandleInfo() called with: info = ["
|
||||||
+ info + "], scrollToTop = [" + scrollToTop + "]");
|
+ info + "], scrollToTop = [" + scrollToTop + "]");
|
||||||
|
|
||||||
|
@ -821,7 +815,7 @@ public class VideoDetailFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startLoading(boolean forceLoad) {
|
public void startLoading(final boolean forceLoad) {
|
||||||
super.startLoading(forceLoad);
|
super.startLoading(forceLoad);
|
||||||
|
|
||||||
initTabs();
|
initTabs();
|
||||||
|
@ -831,7 +825,7 @@ public class VideoDetailFragment
|
||||||
runWorker(forceLoad, stack.isEmpty());
|
runWorker(forceLoad, stack.isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startLoading(boolean forceLoad, boolean addToBackStack) {
|
private void startLoading(final boolean forceLoad, final boolean addToBackStack) {
|
||||||
super.startLoading(false);
|
super.startLoading(false);
|
||||||
|
|
||||||
initTabs();
|
initTabs();
|
||||||
|
@ -841,7 +835,7 @@ public class VideoDetailFragment
|
||||||
runWorker(forceLoad, addToBackStack);
|
runWorker(forceLoad, addToBackStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void runWorker(boolean forceLoad, boolean addToBackStack) {
|
private void runWorker(final boolean forceLoad, final boolean addToBackStack) {
|
||||||
currentWorker = ExtractorHelper.getStreamInfo(serviceId, url, forceLoad)
|
currentWorker = ExtractorHelper.getStreamInfo(serviceId, url, forceLoad)
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
@ -885,7 +879,7 @@ public class VideoDetailFragment
|
||||||
if (pageAdapter.getCount() < 2) {
|
if (pageAdapter.getCount() < 2) {
|
||||||
tabLayout.setVisibility(View.GONE);
|
tabLayout.setVisibility(View.GONE);
|
||||||
} else {
|
} else {
|
||||||
int position = pageAdapter.getItemPositionByTitle(selectedTabTag);
|
final int position = pageAdapter.getItemPositionByTitle(selectedTabTag);
|
||||||
if (position != -1) viewPager.setCurrentItem(position);
|
if (position != -1) viewPager.setCurrentItem(position);
|
||||||
tabLayout.setVisibility(View.VISIBLE);
|
tabLayout.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
@ -911,10 +905,10 @@ public class VideoDetailFragment
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
private void openBackgroundPlayer(final boolean append) {
|
private void openBackgroundPlayer(final boolean append) {
|
||||||
AudioStream audioStream = currentInfo.getAudioStreams()
|
final AudioStream audioStream = currentInfo.getAudioStreams()
|
||||||
.get(ListHelper.getDefaultAudioFormat(activity, currentInfo.getAudioStreams()));
|
.get(ListHelper.getDefaultAudioFormat(activity, currentInfo.getAudioStreams()));
|
||||||
|
|
||||||
boolean useExternalAudioPlayer = PreferenceManager.getDefaultSharedPreferences(activity)
|
final boolean useExternalAudioPlayer = PreferenceManager.getDefaultSharedPreferences(activity)
|
||||||
.getBoolean(activity.getString(R.string.use_external_audio_player_key), false);
|
.getBoolean(activity.getString(R.string.use_external_audio_player_key), false);
|
||||||
|
|
||||||
// If a user watched video inside fullscreen mode and than chose another player return to non-fullscreen mode
|
// If a user watched video inside fullscreen mode and than chose another player return to non-fullscreen mode
|
||||||
|
@ -939,7 +933,7 @@ public class VideoDetailFragment
|
||||||
// If a user watched video inside fullscreen mode and than chose another player return to non-fullscreen mode
|
// If a user watched video inside fullscreen mode and than chose another player return to non-fullscreen mode
|
||||||
if (player != null && player.isFullscreen()) player.toggleFullscreen();
|
if (player != null && player.isFullscreen()) player.toggleFullscreen();
|
||||||
|
|
||||||
PlayQueue queue = setupPlayQueueForIntent(append);
|
final PlayQueue queue = setupPlayQueueForIntent(append);
|
||||||
if (append) {
|
if (append) {
|
||||||
NavigationHelper.enqueueOnPopupPlayer(activity, queue, false);
|
NavigationHelper.enqueueOnPopupPlayer(activity, queue, false);
|
||||||
} else {
|
} else {
|
||||||
|
@ -950,7 +944,8 @@ public class VideoDetailFragment
|
||||||
private void openVideoPlayer() {
|
private void openVideoPlayer() {
|
||||||
if (PreferenceManager.getDefaultSharedPreferences(activity)
|
if (PreferenceManager.getDefaultSharedPreferences(activity)
|
||||||
.getBoolean(this.getString(R.string.use_external_video_player_key), false)) {
|
.getBoolean(this.getString(R.string.use_external_video_player_key), false)) {
|
||||||
VideoStream selectedVideoStream = getSelectedVideoStream();
|
final VideoStream selectedVideoStream = getSelectedVideoStream();
|
||||||
|
if (selectedVideoStream == null) return;
|
||||||
startOnExternalPlayer(activity, currentInfo, selectedVideoStream);
|
startOnExternalPlayer(activity, currentInfo, selectedVideoStream);
|
||||||
} else {
|
} else {
|
||||||
replaceQueueIfUserConfirms(this::openMainPlayer);
|
replaceQueueIfUserConfirms(this::openMainPlayer);
|
||||||
|
@ -961,7 +956,7 @@ public class VideoDetailFragment
|
||||||
// See UI changes while remote playQueue changes
|
// See UI changes while remote playQueue changes
|
||||||
if (!bound) startService(false);
|
if (!bound) startService(false);
|
||||||
|
|
||||||
PlayQueue queue = setupPlayQueueForIntent(append);
|
final PlayQueue queue = setupPlayQueueForIntent(append);
|
||||||
if (append) {
|
if (append) {
|
||||||
NavigationHelper.enqueueOnBackgroundPlayer(activity, queue, false);
|
NavigationHelper.enqueueOnBackgroundPlayer(activity, queue, false);
|
||||||
} else {
|
} else {
|
||||||
|
@ -976,13 +971,13 @@ public class VideoDetailFragment
|
||||||
}
|
}
|
||||||
if (currentInfo == null) return;
|
if (currentInfo == null) return;
|
||||||
|
|
||||||
PlayQueue queue = setupPlayQueueForIntent(false);
|
final PlayQueue queue = setupPlayQueueForIntent(false);
|
||||||
|
|
||||||
// Video view can have elements visible from popup, We hide it here but once it ready the view will be shown in handleIntent()
|
// Video view can have elements visible from popup, We hide it here but once it ready the view will be shown in handleIntent()
|
||||||
playerService.getView().setVisibility(View.GONE);
|
Objects.requireNonNull(playerService.getView()).setVisibility(View.GONE);
|
||||||
addVideoPlayerView();
|
addVideoPlayerView();
|
||||||
|
|
||||||
Intent playerIntent = NavigationHelper.getPlayerIntent(getContext(), MainPlayer.class, queue, null, true);
|
final Intent playerIntent = NavigationHelper.getPlayerIntent(requireContext(), MainPlayer.class, queue, null, true);
|
||||||
activity.startService(playerIntent);
|
activity.startService(playerIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -995,7 +990,7 @@ public class VideoDetailFragment
|
||||||
playerService.getView().setVisibility(View.GONE);
|
playerService.getView().setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private PlayQueue setupPlayQueueForIntent(boolean append) {
|
private PlayQueue setupPlayQueueForIntent(final boolean append) {
|
||||||
if (append) return new SinglePlayQueue(currentInfo);
|
if (append) return new SinglePlayQueue(currentInfo);
|
||||||
|
|
||||||
PlayQueue queue = playQueue;
|
PlayQueue queue = playQueue;
|
||||||
|
@ -1026,7 +1021,7 @@ public class VideoDetailFragment
|
||||||
// Utils
|
// Utils
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
public void setAutoplay(boolean autoplay) {
|
public void setAutoplay(final boolean autoplay) {
|
||||||
this.autoPlayEnabled = autoplay;
|
this.autoPlayEnabled = autoplay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1076,7 +1071,7 @@ public class VideoDetailFragment
|
||||||
private void addVideoPlayerView() {
|
private void addVideoPlayerView() {
|
||||||
if (player == null || getView() == null) return;
|
if (player == null || getView() == null) return;
|
||||||
|
|
||||||
FrameLayout viewHolder = getView().findViewById(R.id.player_placeholder);
|
final FrameLayout viewHolder = getView().findViewById(R.id.player_placeholder);
|
||||||
|
|
||||||
// Check if viewHolder already contains a child
|
// Check if viewHolder already contains a child
|
||||||
if (player.getRootView().getParent() != viewHolder) removeVideoPlayerView();
|
if (player.getRootView().getParent() != viewHolder) removeVideoPlayerView();
|
||||||
|
@ -1095,7 +1090,7 @@ public class VideoDetailFragment
|
||||||
private void makeDefaultHeightForVideoPlaceholder() {
|
private void makeDefaultHeightForVideoPlaceholder() {
|
||||||
if (getView() == null) return;
|
if (getView() == null) return;
|
||||||
|
|
||||||
FrameLayout viewHolder = getView().findViewById(R.id.player_placeholder);
|
final FrameLayout viewHolder = getView().findViewById(R.id.player_placeholder);
|
||||||
viewHolder.getLayoutParams().height = FrameLayout.LayoutParams.MATCH_PARENT;
|
viewHolder.getLayoutParams().height = FrameLayout.LayoutParams.MATCH_PARENT;
|
||||||
viewHolder.requestLayout();
|
viewHolder.requestLayout();
|
||||||
}
|
}
|
||||||
|
@ -1113,7 +1108,7 @@ public class VideoDetailFragment
|
||||||
|
|
||||||
disposables.add(Single.just(descriptionHtml)
|
disposables.add(Single.just(descriptionHtml)
|
||||||
.map((@io.reactivex.annotations.NonNull String description) -> {
|
.map((@io.reactivex.annotations.NonNull String description) -> {
|
||||||
Spanned parsedDescription;
|
final Spanned parsedDescription;
|
||||||
if (Build.VERSION.SDK_INT >= 24) {
|
if (Build.VERSION.SDK_INT >= 24) {
|
||||||
parsedDescription = Html.fromHtml(description, 0);
|
parsedDescription = Html.fromHtml(description, 0);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1137,11 +1132,11 @@ public class VideoDetailFragment
|
||||||
*/
|
*/
|
||||||
private void setHeightThumbnail() {
|
private void setHeightThumbnail() {
|
||||||
final DisplayMetrics metrics = getResources().getDisplayMetrics();
|
final DisplayMetrics metrics = getResources().getDisplayMetrics();
|
||||||
boolean isPortrait = metrics.heightPixels > metrics.widthPixels;
|
final boolean isPortrait = metrics.heightPixels > metrics.widthPixels;
|
||||||
|
|
||||||
int height;
|
final int height;
|
||||||
if (player != null && player.isFullscreen())
|
if (player != null && player.isFullscreen())
|
||||||
height = isInMultiWindow() ? getView().getHeight() : activity.getWindow().getDecorView().getHeight();
|
height = isInMultiWindow() ? Objects.requireNonNull(getView()).getHeight() : activity.getWindow().getDecorView().getHeight();
|
||||||
else
|
else
|
||||||
height = isPortrait
|
height = isPortrait
|
||||||
? (int) (metrics.widthPixels / (16.0f / 9.0f))
|
? (int) (metrics.widthPixels / (16.0f / 9.0f))
|
||||||
|
@ -1150,7 +1145,7 @@ public class VideoDetailFragment
|
||||||
thumbnailImageView.setLayoutParams(new FrameLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height));
|
thumbnailImageView.setLayoutParams(new FrameLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height));
|
||||||
thumbnailImageView.setMinimumHeight(height);
|
thumbnailImageView.setMinimumHeight(height);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
int maxHeight = (int) (metrics.heightPixels * MAX_PLAYER_HEIGHT);
|
final int maxHeight = (int) (metrics.heightPixels * MAX_PLAYER_HEIGHT);
|
||||||
player.getSurfaceView().setHeights(height, player.isFullscreen() ? height : maxHeight);
|
player.getSurfaceView().setHeights(height, player.isFullscreen() ? height : maxHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1159,7 +1154,7 @@ public class VideoDetailFragment
|
||||||
contentRootLayoutHiding.setVisibility(View.VISIBLE);
|
contentRootLayoutHiding.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setInitialData(int serviceId, String url, String name, PlayQueue playQueue) {
|
protected void setInitialData(final int serviceId, final String url, final String name, final PlayQueue playQueue) {
|
||||||
this.serviceId = serviceId;
|
this.serviceId = serviceId;
|
||||||
this.url = url;
|
this.url = url;
|
||||||
this.name = !TextUtils.isEmpty(name) ? name : "";
|
this.name = !TextUtils.isEmpty(name) ? name : "";
|
||||||
|
@ -1359,6 +1354,12 @@ public class VideoDetailFragment
|
||||||
videoUploadDateView.setVisibility(View.GONE);
|
videoUploadDateView.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sortedVideoStreams = ListHelper.getSortedStreamVideosList(
|
||||||
|
activity,
|
||||||
|
info.getVideoStreams(),
|
||||||
|
info.getVideoOnlyStreams(),
|
||||||
|
false);
|
||||||
|
selectedVideoStreamIndex = ListHelper.getDefaultResolutionIndex(activity, sortedVideoStreams);
|
||||||
prepareDescription(info.getDescription());
|
prepareDescription(info.getDescription());
|
||||||
updateProgressInfo(info);
|
updateProgressInfo(info);
|
||||||
initThumbnailViews(info);
|
initThumbnailViews(info);
|
||||||
|
@ -1394,7 +1395,7 @@ public class VideoDetailFragment
|
||||||
|
|
||||||
public void openDownloadDialog() {
|
public void openDownloadDialog() {
|
||||||
try {
|
try {
|
||||||
DownloadDialog downloadDialog = DownloadDialog.newInstance(currentInfo);
|
final DownloadDialog downloadDialog = DownloadDialog.newInstance(currentInfo);
|
||||||
downloadDialog.setVideoStreams(sortedVideoStreams);
|
downloadDialog.setVideoStreams(sortedVideoStreams);
|
||||||
downloadDialog.setAudioStreams(currentInfo.getAudioStreams());
|
downloadDialog.setAudioStreams(currentInfo.getAudioStreams());
|
||||||
downloadDialog.setSelectedVideoStream(selectedVideoStreamIndex);
|
downloadDialog.setSelectedVideoStream(selectedVideoStreamIndex);
|
||||||
|
@ -1402,7 +1403,7 @@ public class VideoDetailFragment
|
||||||
|
|
||||||
downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog");
|
downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ErrorActivity.ErrorInfo info = ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR,
|
final ErrorActivity.ErrorInfo info = ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR,
|
||||||
ServiceList.all()
|
ServiceList.all()
|
||||||
.get(currentInfo
|
.get(currentInfo
|
||||||
.getServiceId())
|
.getServiceId())
|
||||||
|
@ -1428,7 +1429,7 @@ public class VideoDetailFragment
|
||||||
else if (exception instanceof ContentNotAvailableException) {
|
else if (exception instanceof ContentNotAvailableException) {
|
||||||
showError(getString(R.string.content_not_available), false);
|
showError(getString(R.string.content_not_available), false);
|
||||||
} else {
|
} else {
|
||||||
int errorId = exception instanceof YoutubeStreamExtractor.DecryptException
|
final int errorId = exception instanceof YoutubeStreamExtractor.DecryptException
|
||||||
? R.string.youtube_signature_decryption_error
|
? R.string.youtube_signature_decryption_error
|
||||||
: exception instanceof ParsingException
|
: exception instanceof ParsingException
|
||||||
? R.string.parsing_error
|
? R.string.parsing_error
|
||||||
|
@ -1484,7 +1485,7 @@ public class VideoDetailFragment
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showPlaybackProgress(long progress, long duration) {
|
private void showPlaybackProgress(final long progress, final long duration) {
|
||||||
final int progressSeconds = (int) TimeUnit.MILLISECONDS.toSeconds(progress);
|
final int progressSeconds = (int) TimeUnit.MILLISECONDS.toSeconds(progress);
|
||||||
final int durationSeconds = (int) TimeUnit.MILLISECONDS.toSeconds(duration);
|
final int durationSeconds = (int) TimeUnit.MILLISECONDS.toSeconds(duration);
|
||||||
positionView.setMax(durationSeconds);
|
positionView.setMax(durationSeconds);
|
||||||
|
@ -1501,9 +1502,9 @@ public class VideoDetailFragment
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onQueueUpdate(PlayQueue queue) {
|
public void onQueueUpdate(final PlayQueue queue) {
|
||||||
playQueue = queue;
|
playQueue = queue;
|
||||||
StackItem stackWithQueue;
|
final StackItem stackWithQueue;
|
||||||
// This should be the only place where we push data to stack. It will allow to have live instance of PlayQueue with actual
|
// This should be the only place where we push data to stack. It will allow to have live instance of PlayQueue with actual
|
||||||
// information about deleted/added items inside Channel/Playlist queue and makes possible to have a history of played items
|
// information about deleted/added items inside Channel/Playlist queue and makes possible to have a history of played items
|
||||||
if (stack.isEmpty() || !stack.peek().getPlayQueue().equals(queue)) {
|
if (stack.isEmpty() || !stack.peek().getPlayQueue().equals(queue)) {
|
||||||
|
@ -1522,7 +1523,7 @@ public class VideoDetailFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlaybackUpdate(int state, int repeatMode, boolean shuffled, PlaybackParameters parameters) {
|
public void onPlaybackUpdate(final int state, final int repeatMode, final boolean shuffled, final PlaybackParameters parameters) {
|
||||||
setOverlayPlayPauseImage();
|
setOverlayPlayPauseImage();
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
|
@ -1542,7 +1543,7 @@ public class VideoDetailFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onProgressUpdate(int currentProgress, int duration, int bufferPercent) {
|
public void onProgressUpdate(final int currentProgress, final int duration, final int bufferPercent) {
|
||||||
// Progress updates every second even if media is paused. It's useless until playing
|
// Progress updates every second even if media is paused. It's useless until playing
|
||||||
if (!player.getPlayer().isPlaying() || playQueue == null) return;
|
if (!player.getPlayer().isPlaying() || playQueue == null) return;
|
||||||
|
|
||||||
|
@ -1551,8 +1552,8 @@ public class VideoDetailFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onMetadataUpdate(StreamInfo info, PlayQueue queue) {
|
public void onMetadataUpdate(final StreamInfo info, final PlayQueue queue) {
|
||||||
StackItem item = findQueueInStack(queue);
|
final StackItem item = findQueueInStack(queue);
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
// When PlayQueue can have multiple streams (PlaylistPlayQueue or ChannelPlayQueue) every new played stream gives
|
// When PlayQueue can have multiple streams (PlaylistPlayQueue or ChannelPlayQueue) every new played stream gives
|
||||||
// new title and url. StackItem contains information about first played stream. Let's update it here
|
// new title and url. StackItem contains information about first played stream. Let's update it here
|
||||||
|
@ -1573,7 +1574,7 @@ public class VideoDetailFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerError(ExoPlaybackException error) {
|
public void onPlayerError(final ExoPlaybackException error) {
|
||||||
if (error.type == ExoPlaybackException.TYPE_SOURCE || error.type == ExoPlaybackException.TYPE_UNEXPECTED) {
|
if (error.type == ExoPlaybackException.TYPE_SOURCE || error.type == ExoPlaybackException.TYPE_UNEXPECTED) {
|
||||||
hideMainPlayer();
|
hideMainPlayer();
|
||||||
if (playerService != null && player.isFullscreen())
|
if (playerService != null && player.isFullscreen())
|
||||||
|
@ -1590,12 +1591,12 @@ public class VideoDetailFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFullscreenStateChanged(boolean fullscreen) {
|
public void onFullscreenStateChanged(final boolean fullscreen) {
|
||||||
if (playerService.getView() == null || player.getParentActivity() == null)
|
if (playerService.getView() == null || player.getParentActivity() == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
View view = playerService.getView();
|
final View view = playerService.getView();
|
||||||
ViewGroup parent = (ViewGroup) view.getParent();
|
final ViewGroup parent = (ViewGroup) view.getParent();
|
||||||
if (parent == null) return;
|
if (parent == null) return;
|
||||||
|
|
||||||
if (fullscreen) {
|
if (fullscreen) {
|
||||||
|
@ -1619,7 +1620,7 @@ public class VideoDetailFragment
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int newOrientation = isLandscape() ?
|
final int newOrientation = isLandscape() ?
|
||||||
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
|
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
|
||||||
: ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
|
: ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
|
||||||
|
|
||||||
|
@ -1631,9 +1632,9 @@ public class VideoDetailFragment
|
||||||
* */
|
* */
|
||||||
@Override
|
@Override
|
||||||
public void onMoreOptionsLongClicked() {
|
public void onMoreOptionsLongClicked() {
|
||||||
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
|
final CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
|
||||||
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
|
final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
|
||||||
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, -getView().findViewById(R.id.player_placeholder).getHeight());
|
final ValueAnimator valueAnimator = ValueAnimator.ofInt(0, -getView().findViewById(R.id.player_placeholder).getHeight());
|
||||||
valueAnimator.setInterpolator(new DecelerateInterpolator());
|
valueAnimator.setInterpolator(new DecelerateInterpolator());
|
||||||
valueAnimator.addUpdateListener(animation -> {
|
valueAnimator.addUpdateListener(animation -> {
|
||||||
behavior.setTopAndBottomOffset((int) animation.getAnimatedValue());
|
behavior.setTopAndBottomOffset((int) animation.getAnimatedValue());
|
||||||
|
@ -1662,7 +1663,7 @@ public class VideoDetailFragment
|
||||||
|
|
||||||
if (activity == null) return;
|
if (activity == null) return;
|
||||||
|
|
||||||
int visibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
final int visibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
||||||
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||||
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
||||||
| View.SYSTEM_UI_FLAG_FULLSCREEN
|
| View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||||
|
@ -1683,12 +1684,10 @@ public class VideoDetailFragment
|
||||||
return player != null && player.getPlayer() != null && player.getPlayer().getPlaybackState() != Player.STATE_IDLE;
|
return player != null && player.getPlayer() != null && player.getPlayer().getPlaybackState() != Player.STATE_IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupBrightness(boolean save) {
|
private void setupBrightness(final boolean save) {
|
||||||
if (activity == null) return;
|
if (activity == null) return;
|
||||||
|
|
||||||
WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
|
final WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
|
||||||
float brightnessLevel;
|
|
||||||
|
|
||||||
if (save) {
|
if (save) {
|
||||||
// Save current brightness level
|
// Save current brightness level
|
||||||
PlayerHelper.setScreenBrightness(activity, lp.screenBrightness);
|
PlayerHelper.setScreenBrightness(activity, lp.screenBrightness);
|
||||||
|
@ -1698,7 +1697,7 @@ public class VideoDetailFragment
|
||||||
lp.screenBrightness = -1;
|
lp.screenBrightness = -1;
|
||||||
} else {
|
} else {
|
||||||
// Restore already saved brightness level
|
// Restore already saved brightness level
|
||||||
brightnessLevel = PlayerHelper.getScreenBrightness(activity);
|
final float brightnessLevel = PlayerHelper.getScreenBrightness(activity);
|
||||||
if (brightnessLevel <= 0.0f && brightnessLevel > 1.0f)
|
if (brightnessLevel <= 0.0f && brightnessLevel > 1.0f)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1712,7 +1711,7 @@ public class VideoDetailFragment
|
||||||
setAutoplay(true);
|
setAutoplay(true);
|
||||||
|
|
||||||
player.checkLandscape();
|
player.checkLandscape();
|
||||||
boolean orientationLocked = PlayerHelper.globalScreenOrientationLocked(activity);
|
final boolean orientationLocked = PlayerHelper.globalScreenOrientationLocked(activity);
|
||||||
// Let's give a user time to look at video information page if video is not playing
|
// Let's give a user time to look at video information page if video is not playing
|
||||||
if (orientationLocked && !player.isPlaying()) {
|
if (orientationLocked && !player.isPlaying()) {
|
||||||
player.onPlay();
|
player.onPlay();
|
||||||
|
@ -1735,11 +1734,11 @@ public class VideoDetailFragment
|
||||||
return url == null;
|
return url == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private StackItem findQueueInStack(PlayQueue queue) {
|
private StackItem findQueueInStack(final PlayQueue queue) {
|
||||||
StackItem item = null;
|
StackItem item = null;
|
||||||
Iterator<StackItem> iterator = stack.descendingIterator();
|
final Iterator<StackItem> iterator = stack.descendingIterator();
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
StackItem next = iterator.next();
|
final StackItem next = iterator.next();
|
||||||
if (next.getPlayQueue().equals(queue)) {
|
if (next.getPlayQueue().equals(queue)) {
|
||||||
item = next;
|
item = next;
|
||||||
break;
|
break;
|
||||||
|
@ -1763,7 +1762,7 @@ public class VideoDetailFragment
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showClearingQueueConfirmation(Runnable onAllow) {
|
private void showClearingQueueConfirmation(final Runnable onAllow) {
|
||||||
new AlertDialog.Builder(activity)
|
new AlertDialog.Builder(activity)
|
||||||
.setTitle(R.string.confirm_prompt)
|
.setTitle(R.string.confirm_prompt)
|
||||||
.setMessage(R.string.clear_queue_confirmation_description)
|
.setMessage(R.string.clear_queue_confirmation_description)
|
||||||
|
@ -1792,10 +1791,10 @@ public class VideoDetailFragment
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
private void setupBottomPlayer() {
|
private void setupBottomPlayer() {
|
||||||
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
|
final CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
|
||||||
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
|
final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
|
||||||
|
|
||||||
FrameLayout bottomSheetLayout = activity.findViewById(R.id.fragment_player_holder);
|
final FrameLayout bottomSheetLayout = activity.findViewById(R.id.fragment_player_holder);
|
||||||
bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetLayout);
|
bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetLayout);
|
||||||
bottomSheetBehavior.setState(bottomSheetState);
|
bottomSheetBehavior.setState(bottomSheetState);
|
||||||
final int peekHeight = getResources().getDimensionPixelSize(R.dimen.mini_player_height);
|
final int peekHeight = getResources().getDimensionPixelSize(R.dimen.mini_player_height);
|
||||||
|
@ -1810,7 +1809,8 @@ public class VideoDetailFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
|
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
|
||||||
@Override public void onStateChanged(@NonNull View bottomSheet, int newState) {
|
@Override
|
||||||
|
public void onStateChanged(@NonNull final View bottomSheet, final int newState) {
|
||||||
bottomSheetState = newState;
|
bottomSheetState = newState;
|
||||||
|
|
||||||
switch (newState) {
|
switch (newState) {
|
||||||
|
@ -1843,7 +1843,9 @@ public class VideoDetailFragment
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Override public void onSlide(@NonNull View bottomSheet, float slideOffset) {
|
|
||||||
|
@Override
|
||||||
|
public void onSlide(@NonNull final View bottomSheet, final float slideOffset) {
|
||||||
setOverlayLook(appBarLayout, behavior, slideOffset);
|
setOverlayLook(appBarLayout, behavior, slideOffset);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1855,7 +1857,7 @@ public class VideoDetailFragment
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateOverlayData(@Nullable String title, @Nullable String uploader, @Nullable String thumbnailUrl) {
|
private void updateOverlayData(@Nullable final String title, @Nullable final String uploader, @Nullable final String thumbnailUrl) {
|
||||||
overlayTitleTextView.setText(TextUtils.isEmpty(title) ? "" : title);
|
overlayTitleTextView.setText(TextUtils.isEmpty(title) ? "" : title);
|
||||||
overlayChannelTextView.setText(TextUtils.isEmpty(uploader) ? "" : uploader);
|
overlayChannelTextView.setText(TextUtils.isEmpty(uploader) ? "" : uploader);
|
||||||
overlayThumbnailImageView.setImageResource(R.drawable.dummy_thumbnail_dark);
|
overlayThumbnailImageView.setImageResource(R.drawable.dummy_thumbnail_dark);
|
||||||
|
@ -1865,11 +1867,11 @@ public class VideoDetailFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setOverlayPlayPauseImage() {
|
private void setOverlayPlayPauseImage() {
|
||||||
int attr = player != null && player.getPlayer().getPlayWhenReady() ? R.attr.pause : R.attr.play;
|
final int attr = player != null && player.getPlayer().getPlayWhenReady() ? R.attr.pause : R.attr.play;
|
||||||
overlayPlayPauseButton.setImageResource(ThemeHelper.resolveResourceIdFromAttr(activity, attr));
|
overlayPlayPauseButton.setImageResource(ThemeHelper.resolveResourceIdFromAttr(activity, attr));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setOverlayLook(AppBarLayout appBarLayout, AppBarLayout.Behavior behavior, float slideOffset) {
|
private void setOverlayLook(final AppBarLayout appBarLayout, final AppBarLayout.Behavior behavior, final float slideOffset) {
|
||||||
if (behavior != null) {
|
if (behavior != null) {
|
||||||
overlay.setAlpha(Math.min(MAX_OVERLAY_ALPHA, 1 - slideOffset));
|
overlay.setAlpha(Math.min(MAX_OVERLAY_ALPHA, 1 - slideOffset));
|
||||||
|
|
||||||
|
@ -1879,7 +1881,7 @@ public class VideoDetailFragment
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setOverlayElementsClickable(boolean enable) {
|
private void setOverlayElementsClickable(final boolean enable) {
|
||||||
overlayThumbnailImageView.setClickable(enable);
|
overlayThumbnailImageView.setClickable(enable);
|
||||||
overlayThumbnailImageView.setLongClickable(enable);
|
overlayThumbnailImageView.setLongClickable(enable);
|
||||||
overlayMetadata.setClickable(enable);
|
overlayMetadata.setClickable(enable);
|
||||||
|
|
|
@ -274,7 +274,7 @@ public abstract class BasePlayer implements
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean samePlayQueue = playQueue != null && playQueue.equals(queue);
|
final boolean samePlayQueue = playQueue != null && playQueue.equals(queue);
|
||||||
|
|
||||||
final int repeatMode = intent.getIntExtra(REPEAT_MODE, getRepeatMode());
|
final int repeatMode = intent.getIntExtra(REPEAT_MODE, getRepeatMode());
|
||||||
final float playbackSpeed = intent.getFloatExtra(PLAYBACK_SPEED, getPlaybackSpeed());
|
final float playbackSpeed = intent.getFloatExtra(PLAYBACK_SPEED, getPlaybackSpeed());
|
||||||
|
|
|
@ -102,7 +102,7 @@ public final class MainPlayer extends Service {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createView() {
|
private void createView() {
|
||||||
View layout = View.inflate(this, R.layout.activity_main_player, null);
|
final View layout = View.inflate(this, R.layout.activity_main_player, null);
|
||||||
|
|
||||||
playerImpl = new VideoPlayerImpl(this);
|
playerImpl = new VideoPlayerImpl(this);
|
||||||
playerImpl.setup(layout);
|
playerImpl.setup(layout);
|
||||||
|
@ -124,7 +124,7 @@ public final class MainPlayer extends Service {
|
||||||
return START_NOT_STICKY;
|
return START_NOT_STICKY;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop(boolean autoplayEnabled) {
|
public void stop(final boolean autoplayEnabled) {
|
||||||
if (DEBUG) Log.d(TAG, "stop() called");
|
if (DEBUG) Log.d(TAG, "stop() called");
|
||||||
|
|
||||||
if (playerImpl.getPlayer() != null) {
|
if (playerImpl.getPlayer() != null) {
|
||||||
|
@ -212,7 +212,7 @@ public final class MainPlayer extends Service {
|
||||||
if (getView().getParent() != null) {
|
if (getView().getParent() != null) {
|
||||||
if (playerImpl.getParentActivity() != null) {
|
if (playerImpl.getParentActivity() != null) {
|
||||||
// This means view was added to fragment
|
// This means view was added to fragment
|
||||||
ViewGroup parent = (ViewGroup) getView().getParent();
|
final ViewGroup parent = (ViewGroup) getView().getParent();
|
||||||
parent.removeView(getView());
|
parent.removeView(getView());
|
||||||
} else
|
} else
|
||||||
// This means view was added by windowManager for popup player
|
// This means view was added by windowManager for popup player
|
||||||
|
@ -244,7 +244,7 @@ public final class MainPlayer extends Service {
|
||||||
setupNotification(notRemoteView);
|
setupNotification(notRemoteView);
|
||||||
setupNotification(bigNotRemoteView);
|
setupNotification(bigNotRemoteView);
|
||||||
|
|
||||||
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, getString(R.string.notification_channel_id))
|
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this, getString(R.string.notification_channel_id))
|
||||||
.setOngoing(true)
|
.setOngoing(true)
|
||||||
.setSmallIcon(R.drawable.ic_newpipe_triangle_white)
|
.setSmallIcon(R.drawable.ic_newpipe_triangle_white)
|
||||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||||
|
@ -254,7 +254,7 @@ public final class MainPlayer extends Service {
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupNotification(RemoteViews remoteViews) {
|
private void setupNotification(final RemoteViews remoteViews) {
|
||||||
// Don't show anything until player is playing
|
// Don't show anything until player is playing
|
||||||
if (playerImpl == null) return;
|
if (playerImpl == null) return;
|
||||||
|
|
||||||
|
@ -298,7 +298,7 @@ public final class MainPlayer extends Service {
|
||||||
*
|
*
|
||||||
* @param drawableId if != -1, sets the drawable with that id on the play/pause button
|
* @param drawableId if != -1, sets the drawable with that id on the play/pause button
|
||||||
*/
|
*/
|
||||||
synchronized void updateNotification(int drawableId) {
|
synchronized void updateNotification(final int drawableId) {
|
||||||
//if (DEBUG) Log.d(TAG, "updateNotification() called with: drawableId = [" + drawableId + "]");
|
//if (DEBUG) Log.d(TAG, "updateNotification() called with: drawableId = [" + drawableId + "]");
|
||||||
if (notBuilder == null) return;
|
if (notBuilder == null) return;
|
||||||
if (drawableId != -1) {
|
if (drawableId != -1) {
|
||||||
|
@ -329,7 +329,7 @@ public final class MainPlayer extends Service {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Intent getIntentForNotification() {
|
private Intent getIntentForNotification() {
|
||||||
Intent intent;
|
final Intent intent;
|
||||||
if (playerImpl.audioPlayerSelected() || playerImpl.popupPlayerSelected()) {
|
if (playerImpl.audioPlayerSelected() || playerImpl.popupPlayerSelected()) {
|
||||||
// Means we play in popup or audio only. Let's show BackgroundPlayerActivity
|
// Means we play in popup or audio only. Let's show BackgroundPlayerActivity
|
||||||
intent = NavigationHelper.getBackgroundPlayerActivityIntent(getApplicationContext());
|
intent = NavigationHelper.getBackgroundPlayerActivityIntent(getApplicationContext());
|
||||||
|
|
|
@ -186,7 +186,7 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
|
||||||
}
|
}
|
||||||
|
|
||||||
Intent getSwitchIntent(final Class clazz, final MainPlayer.PlayerType playerType) {
|
Intent getSwitchIntent(final Class clazz, final MainPlayer.PlayerType playerType) {
|
||||||
Intent intent = NavigationHelper.getPlayerIntent(
|
final Intent intent = NavigationHelper.getPlayerIntent(
|
||||||
getApplicationContext(),
|
getApplicationContext(),
|
||||||
clazz,
|
clazz,
|
||||||
this.player.getPlayQueue(),
|
this.player.getPlayQueue(),
|
||||||
|
|
|
@ -97,7 +97,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
View.OnLongClickListener {
|
View.OnLongClickListener {
|
||||||
private static final String TAG = ".VideoPlayerImpl";
|
private static final String TAG = ".VideoPlayerImpl";
|
||||||
|
|
||||||
private final float MAX_GESTURE_LENGTH = 0.75f;
|
private static final float MAX_GESTURE_LENGTH = 0.75f;
|
||||||
|
|
||||||
private TextView titleTextView;
|
private TextView titleTextView;
|
||||||
private TextView channelTextView;
|
private TextView channelTextView;
|
||||||
|
@ -142,11 +142,11 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
private boolean isVerticalVideo = false;
|
private boolean isVerticalVideo = false;
|
||||||
boolean shouldUpdateOnProgress;
|
boolean shouldUpdateOnProgress;
|
||||||
|
|
||||||
private MainPlayer service;
|
private final MainPlayer service;
|
||||||
private PlayerServiceEventListener fragmentListener;
|
private PlayerServiceEventListener fragmentListener;
|
||||||
private PlayerEventListener activityListener;
|
private PlayerEventListener activityListener;
|
||||||
private GestureDetector gestureDetector;
|
private GestureDetector gestureDetector;
|
||||||
private SharedPreferences defaultPreferences;
|
private final SharedPreferences defaultPreferences;
|
||||||
private ContentObserver settingsContentObserver;
|
private ContentObserver settingsContentObserver;
|
||||||
@NonNull
|
@NonNull
|
||||||
final private AudioPlaybackResolver resolver;
|
final private AudioPlaybackResolver resolver;
|
||||||
|
@ -184,7 +184,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
public void handleIntent(Intent intent) {
|
public void handleIntent(Intent intent) {
|
||||||
if (intent.getStringExtra(VideoPlayer.PLAY_QUEUE_KEY) == null) return;
|
if (intent.getStringExtra(VideoPlayer.PLAY_QUEUE_KEY) == null) return;
|
||||||
|
|
||||||
MainPlayer.PlayerType oldPlayerType = playerType;
|
final MainPlayer.PlayerType oldPlayerType = playerType;
|
||||||
choosePlayerTypeFromIntent(intent);
|
choosePlayerTypeFromIntent(intent);
|
||||||
audioOnly = audioPlayerSelected();
|
audioOnly = audioPlayerSelected();
|
||||||
|
|
||||||
|
@ -350,8 +350,8 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
*/
|
*/
|
||||||
private void setupElementsSize() {
|
private void setupElementsSize() {
|
||||||
if (popupPlayerSelected()) {
|
if (popupPlayerSelected()) {
|
||||||
int controlsPadding = service.getResources().getDimensionPixelSize(R.dimen.player_popup_controls_padding);
|
final int controlsPadding = service.getResources().getDimensionPixelSize(R.dimen.player_popup_controls_padding);
|
||||||
int buttonsPadding = service.getResources().getDimensionPixelSize(R.dimen.player_popup_buttons_padding);
|
final int buttonsPadding = service.getResources().getDimensionPixelSize(R.dimen.player_popup_buttons_padding);
|
||||||
getTopControlsRoot().setPaddingRelative(controlsPadding, 0, controlsPadding, 0);
|
getTopControlsRoot().setPaddingRelative(controlsPadding, 0, controlsPadding, 0);
|
||||||
getBottomControlsRoot().setPaddingRelative(controlsPadding, 0, controlsPadding, 0);
|
getBottomControlsRoot().setPaddingRelative(controlsPadding, 0, controlsPadding, 0);
|
||||||
getQualityTextView().setPadding(buttonsPadding, buttonsPadding, buttonsPadding, buttonsPadding);
|
getQualityTextView().setPadding(buttonsPadding, buttonsPadding, buttonsPadding, buttonsPadding);
|
||||||
|
@ -361,10 +361,10 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
getQualityTextView().setMinimumWidth(0);
|
getQualityTextView().setMinimumWidth(0);
|
||||||
getPlaybackSpeedTextView().setMinimumWidth(0);
|
getPlaybackSpeedTextView().setMinimumWidth(0);
|
||||||
} else if (videoPlayerSelected()) {
|
} else if (videoPlayerSelected()) {
|
||||||
int buttonsMinWidth = service.getResources().getDimensionPixelSize(R.dimen.player_main_buttons_min_width);
|
final int buttonsMinWidth = service.getResources().getDimensionPixelSize(R.dimen.player_main_buttons_min_width);
|
||||||
int playerTopPadding = service.getResources().getDimensionPixelSize(R.dimen.player_main_top_padding);
|
final int playerTopPadding = service.getResources().getDimensionPixelSize(R.dimen.player_main_top_padding);
|
||||||
int controlsPadding = service.getResources().getDimensionPixelSize(R.dimen.player_main_controls_padding);
|
final int controlsPadding = service.getResources().getDimensionPixelSize(R.dimen.player_main_controls_padding);
|
||||||
int buttonsPadding = service.getResources().getDimensionPixelSize(R.dimen.player_main_buttons_padding);
|
final int buttonsPadding = service.getResources().getDimensionPixelSize(R.dimen.player_main_buttons_padding);
|
||||||
getTopControlsRoot().setPaddingRelative(controlsPadding, playerTopPadding, controlsPadding, 0);
|
getTopControlsRoot().setPaddingRelative(controlsPadding, playerTopPadding, controlsPadding, 0);
|
||||||
getBottomControlsRoot().setPaddingRelative(controlsPadding, 0, controlsPadding, 0);
|
getBottomControlsRoot().setPaddingRelative(controlsPadding, 0, controlsPadding, 0);
|
||||||
getQualityTextView().setPadding(buttonsPadding, buttonsPadding, buttonsPadding, buttonsPadding);
|
getQualityTextView().setPadding(buttonsPadding, buttonsPadding, buttonsPadding, buttonsPadding);
|
||||||
|
@ -379,7 +379,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
public void initListeners() {
|
public void initListeners() {
|
||||||
super.initListeners();
|
super.initListeners();
|
||||||
|
|
||||||
PlayerGestureListener listener = new PlayerGestureListener(this, service);
|
final PlayerGestureListener listener = new PlayerGestureListener(this, service);
|
||||||
gestureDetector = new GestureDetector(context, listener);
|
gestureDetector = new GestureDetector(context, listener);
|
||||||
getRootView().setOnTouchListener(listener);
|
getRootView().setOnTouchListener(listener);
|
||||||
|
|
||||||
|
@ -415,7 +415,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
if (getRootView() == null || getRootView().getParent() == null || !(getRootView().getParent() instanceof ViewGroup))
|
if (getRootView() == null || getRootView().getParent() == null || !(getRootView().getParent() instanceof ViewGroup))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
ViewGroup parent = (ViewGroup) getRootView().getParent();
|
final ViewGroup parent = (ViewGroup) getRootView().getParent();
|
||||||
return (AppCompatActivity) parent.getContext();
|
return (AppCompatActivity) parent.getContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -509,7 +509,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onUpdateProgress(int currentProgress, int duration, int bufferPercent) {
|
public void onUpdateProgress(final int currentProgress, final int duration, final int bufferPercent) {
|
||||||
super.onUpdateProgress(currentProgress, duration, bufferPercent);
|
super.onUpdateProgress(currentProgress, duration, bufferPercent);
|
||||||
|
|
||||||
updateProgress(currentProgress, duration, bufferPercent);
|
updateProgress(currentProgress, duration, bufferPercent);
|
||||||
|
@ -560,7 +560,8 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void initPlayback(@NonNull PlayQueue queue, int repeatMode, float playbackSpeed, float playbackPitch, boolean playbackSkipSilence, boolean playOnReady) {
|
protected void initPlayback(@NonNull PlayQueue queue, int repeatMode, float playbackSpeed,
|
||||||
|
float playbackPitch, boolean playbackSkipSilence, boolean playOnReady) {
|
||||||
super.initPlayback(queue, repeatMode, playbackSpeed, playbackPitch, playbackSkipSilence, playOnReady);
|
super.initPlayback(queue, repeatMode, playbackSpeed, playbackPitch, playbackSkipSilence, playOnReady);
|
||||||
updateQueue();
|
updateQueue();
|
||||||
}
|
}
|
||||||
|
@ -760,16 +761,16 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupScreenRotationButton() {
|
private void setupScreenRotationButton() {
|
||||||
boolean orientationLocked = PlayerHelper.globalScreenOrientationLocked(service);
|
final boolean orientationLocked = PlayerHelper.globalScreenOrientationLocked(service);
|
||||||
boolean tabletInLandscape = isTablet(service) && service.isLandscape();
|
final boolean tabletInLandscape = isTablet(service) && service.isLandscape();
|
||||||
boolean showButton = videoPlayerSelected() && (orientationLocked || isVerticalVideo || tabletInLandscape);
|
final boolean showButton = videoPlayerSelected() && (orientationLocked || isVerticalVideo || tabletInLandscape);
|
||||||
screenRotationButton.setVisibility(showButton ? View.VISIBLE : View.GONE);
|
screenRotationButton.setVisibility(showButton ? View.VISIBLE : View.GONE);
|
||||||
screenRotationButton.setImageDrawable(service.getResources().getDrawable(
|
screenRotationButton.setImageDrawable(service.getResources().getDrawable(
|
||||||
isFullscreen() ? R.drawable.ic_fullscreen_exit_white : R.drawable.ic_fullscreen_white));
|
isFullscreen() ? R.drawable.ic_fullscreen_exit_white : R.drawable.ic_fullscreen_white));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void prepareOrientation() {
|
private void prepareOrientation() {
|
||||||
boolean orientationLocked = PlayerHelper.globalScreenOrientationLocked(service);
|
final boolean orientationLocked = PlayerHelper.globalScreenOrientationLocked(service);
|
||||||
if (orientationLocked && isFullscreen() && service.isLandscape() == isVerticalVideo && fragmentListener != null)
|
if (orientationLocked && isFullscreen() && service.isLandscape() == isVerticalVideo && fragmentListener != null)
|
||||||
fragmentListener.onScreenRotationButtonClicked();
|
fragmentListener.onScreenRotationButtonClicked();
|
||||||
}
|
}
|
||||||
|
@ -1068,8 +1069,8 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
// because in that case the controls should be aligned to another side of a screen. The problem is when user leaves
|
// because in that case the controls should be aligned to another side of a screen. The problem is when user leaves
|
||||||
// the app and returns back (while the app in landscape) Android reports via DisplayMetrics that orientation is
|
// the app and returns back (while the app in landscape) Android reports via DisplayMetrics that orientation is
|
||||||
// portrait and it gives wrong sizes calculations. Let's skip re-calculation in every case but landscape
|
// portrait and it gives wrong sizes calculations. Let's skip re-calculation in every case but landscape
|
||||||
boolean reportedOrientationIsLandscape = service.isLandscape();
|
final boolean reportedOrientationIsLandscape = service.isLandscape();
|
||||||
boolean actualOrientationIsLandscape = context.getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE;
|
final boolean actualOrientationIsLandscape = context.getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE;
|
||||||
if (reportedOrientationIsLandscape && actualOrientationIsLandscape) setControlsSize();
|
if (reportedOrientationIsLandscape && actualOrientationIsLandscape) setControlsSize();
|
||||||
// Close it because when changing orientation from portrait (in fullscreen mode) the size of queue layout can be
|
// Close it because when changing orientation from portrait (in fullscreen mode) the size of queue layout can be
|
||||||
// larger than the screen size
|
// larger than the screen size
|
||||||
|
@ -1130,7 +1131,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void choosePlayerTypeFromIntent(Intent intent) {
|
private void choosePlayerTypeFromIntent(final Intent intent) {
|
||||||
// If you want to open popup from the app just include Constants.POPUP_ONLY into an extra
|
// If you want to open popup from the app just include Constants.POPUP_ONLY into an extra
|
||||||
if (intent.getIntExtra(PLAYER_TYPE, PLAYER_TYPE_VIDEO) == PLAYER_TYPE_AUDIO) {
|
if (intent.getIntExtra(PLAYER_TYPE, PLAYER_TYPE_VIDEO) == PLAYER_TYPE_AUDIO) {
|
||||||
playerType = MainPlayer.PlayerType.AUDIO;
|
playerType = MainPlayer.PlayerType.AUDIO;
|
||||||
|
@ -1165,12 +1166,12 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
return getPlayer() == null || getPlayer().getPlaybackState() == SimpleExoPlayer.STATE_IDLE;
|
return getPlayer() == null || getPlayer().getPlaybackState() == SimpleExoPlayer.STATE_IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int distanceFromCloseButton(MotionEvent popupMotionEvent) {
|
private int distanceFromCloseButton(final MotionEvent popupMotionEvent) {
|
||||||
final int closeOverlayButtonX = closeOverlayButton.getLeft() + closeOverlayButton.getWidth() / 2;
|
final int closeOverlayButtonX = closeOverlayButton.getLeft() + closeOverlayButton.getWidth() / 2;
|
||||||
final int closeOverlayButtonY = closeOverlayButton.getTop() + closeOverlayButton.getHeight() / 2;
|
final int closeOverlayButtonY = closeOverlayButton.getTop() + closeOverlayButton.getHeight() / 2;
|
||||||
|
|
||||||
float fingerX = popupLayoutParams.x + popupMotionEvent.getX();
|
final float fingerX = popupLayoutParams.x + popupMotionEvent.getX();
|
||||||
float fingerY = popupLayoutParams.y + popupMotionEvent.getY();
|
final float fingerY = popupLayoutParams.y + popupMotionEvent.getY();
|
||||||
|
|
||||||
return (int) Math.sqrt(Math.pow(closeOverlayButtonX - fingerX, 2) + Math.pow(closeOverlayButtonY - fingerY, 2));
|
return (int) Math.sqrt(Math.pow(closeOverlayButtonX - fingerX, 2) + Math.pow(closeOverlayButtonY - fingerY, 2));
|
||||||
}
|
}
|
||||||
|
@ -1181,7 +1182,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
return buttonRadius * 1.2f;
|
return buttonRadius * 1.2f;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInsideClosingRadius(MotionEvent popupMotionEvent) {
|
public boolean isInsideClosingRadius(final MotionEvent popupMotionEvent) {
|
||||||
return distanceFromCloseButton(popupMotionEvent) <= getClosingRadius();
|
return distanceFromCloseButton(popupMotionEvent) <= getClosingRadius();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1199,7 +1200,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void showControls(long duration) {
|
public void showControls(final long duration) {
|
||||||
if (queueVisible) return;
|
if (queueVisible) return;
|
||||||
|
|
||||||
showOrHideButtons();
|
showOrHideButtons();
|
||||||
|
@ -1208,7 +1209,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hideControls(final long duration, long delay) {
|
public void hideControls(final long duration, final long delay) {
|
||||||
if (DEBUG) Log.d(TAG, "hideControls() called with: delay = [" + delay + "]");
|
if (DEBUG) Log.d(TAG, "hideControls() called with: delay = [" + delay + "]");
|
||||||
|
|
||||||
showOrHideButtons();
|
showOrHideButtons();
|
||||||
|
@ -1231,7 +1232,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
|
|
||||||
private void showSystemUIPartially() {
|
private void showSystemUIPartially() {
|
||||||
if (isFullscreen() && getParentActivity() != null) {
|
if (isFullscreen() && getParentActivity() != null) {
|
||||||
int visibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
|
final int visibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
|
||||||
getParentActivity().getWindow().getDecorView().setSystemUiVisibility(visibility);
|
getParentActivity().getWindow().getDecorView().setSystemUiVisibility(visibility);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1247,40 +1248,40 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
* NavigationBar and notches but not under them. Tablets have only bottom NavigationBar
|
* NavigationBar and notches but not under them. Tablets have only bottom NavigationBar
|
||||||
*/
|
*/
|
||||||
public void setControlsSize() {
|
public void setControlsSize() {
|
||||||
Point size = new Point();
|
final Point size = new Point();
|
||||||
Display display = getRootView().getDisplay();
|
final Display display = getRootView().getDisplay();
|
||||||
if (display == null || !videoPlayerSelected()) return;
|
if (display == null || !videoPlayerSelected()) return;
|
||||||
// This method will give a correct size of a usable area of a window.
|
// This method will give a correct size of a usable area of a window.
|
||||||
// It doesn't include NavigationBar, notches, etc.
|
// It doesn't include NavigationBar, notches, etc.
|
||||||
display.getSize(size);
|
display.getSize(size);
|
||||||
|
|
||||||
int width = isFullscreen ? (service.isLandscape() ? size.x : size.y) : ViewGroup.LayoutParams.MATCH_PARENT;
|
final int width = isFullscreen ? (service.isLandscape() ? size.x : size.y) : ViewGroup.LayoutParams.MATCH_PARENT;
|
||||||
int gravity = isFullscreen ? (display.getRotation() == Surface.ROTATION_90 ? Gravity.START : Gravity.END) : Gravity.TOP;
|
final int gravity = isFullscreen ? (display.getRotation() == Surface.ROTATION_90 ? Gravity.START : Gravity.END) : Gravity.TOP;
|
||||||
|
|
||||||
getTopControlsRoot().getLayoutParams().width = width;
|
getTopControlsRoot().getLayoutParams().width = width;
|
||||||
RelativeLayout.LayoutParams topParams = ((RelativeLayout.LayoutParams) getTopControlsRoot().getLayoutParams());
|
final RelativeLayout.LayoutParams topParams = ((RelativeLayout.LayoutParams) getTopControlsRoot().getLayoutParams());
|
||||||
topParams.removeRule(RelativeLayout.ALIGN_PARENT_START);
|
topParams.removeRule(RelativeLayout.ALIGN_PARENT_START);
|
||||||
topParams.removeRule(RelativeLayout.ALIGN_PARENT_END);
|
topParams.removeRule(RelativeLayout.ALIGN_PARENT_END);
|
||||||
topParams.addRule(gravity == Gravity.END ? RelativeLayout.ALIGN_PARENT_END : RelativeLayout.ALIGN_PARENT_START);
|
topParams.addRule(gravity == Gravity.END ? RelativeLayout.ALIGN_PARENT_END : RelativeLayout.ALIGN_PARENT_START);
|
||||||
getTopControlsRoot().requestLayout();
|
getTopControlsRoot().requestLayout();
|
||||||
|
|
||||||
getBottomControlsRoot().getLayoutParams().width = width;
|
getBottomControlsRoot().getLayoutParams().width = width;
|
||||||
RelativeLayout.LayoutParams bottomParams = ((RelativeLayout.LayoutParams) getBottomControlsRoot().getLayoutParams());
|
final RelativeLayout.LayoutParams bottomParams = ((RelativeLayout.LayoutParams) getBottomControlsRoot().getLayoutParams());
|
||||||
bottomParams.removeRule(RelativeLayout.ALIGN_PARENT_START);
|
bottomParams.removeRule(RelativeLayout.ALIGN_PARENT_START);
|
||||||
bottomParams.removeRule(RelativeLayout.ALIGN_PARENT_END);
|
bottomParams.removeRule(RelativeLayout.ALIGN_PARENT_END);
|
||||||
bottomParams.addRule(gravity == Gravity.END ? RelativeLayout.ALIGN_PARENT_END : RelativeLayout.ALIGN_PARENT_START);
|
bottomParams.addRule(gravity == Gravity.END ? RelativeLayout.ALIGN_PARENT_END : RelativeLayout.ALIGN_PARENT_START);
|
||||||
getBottomControlsRoot().requestLayout();
|
getBottomControlsRoot().requestLayout();
|
||||||
|
|
||||||
ViewGroup controlsRoot = getRootView().findViewById(R.id.playbackWindowRoot);
|
final ViewGroup controlsRoot = getRootView().findViewById(R.id.playbackWindowRoot);
|
||||||
// In tablet navigationBar located at the bottom of the screen. And the situations when we need to set custom height is
|
// In tablet navigationBar located at the bottom of the screen. And the situations when we need to set custom height is
|
||||||
// in fullscreen mode in tablet in non-multiWindow mode or with vertical video. Other than that MATCH_PARENT is good
|
// in fullscreen mode in tablet in non-multiWindow mode or with vertical video. Other than that MATCH_PARENT is good
|
||||||
boolean navBarAtTheBottom = PlayerHelper.isTablet(service) || !service.isLandscape();
|
final boolean navBarAtTheBottom = PlayerHelper.isTablet(service) || !service.isLandscape();
|
||||||
controlsRoot.getLayoutParams().height = isFullscreen && !isInMultiWindow() && navBarAtTheBottom
|
controlsRoot.getLayoutParams().height = isFullscreen && !isInMultiWindow() && navBarAtTheBottom
|
||||||
? size.y
|
? size.y
|
||||||
: ViewGroup.LayoutParams.MATCH_PARENT;
|
: ViewGroup.LayoutParams.MATCH_PARENT;
|
||||||
controlsRoot.requestLayout();
|
controlsRoot.requestLayout();
|
||||||
|
|
||||||
int topPadding = isFullscreen && !isInMultiWindow() ? getStatusBarHeight() : 0;
|
final int topPadding = isFullscreen && !isInMultiWindow() ? getStatusBarHeight() : 0;
|
||||||
getRootView().findViewById(R.id.playbackWindowRoot).setPadding(0, topPadding, 0, 0);
|
getRootView().findViewById(R.id.playbackWindowRoot).setPadding(0, topPadding, 0, 0);
|
||||||
getRootView().findViewById(R.id.playbackWindowRoot).requestLayout();
|
getRootView().findViewById(R.id.playbackWindowRoot).requestLayout();
|
||||||
}
|
}
|
||||||
|
@ -1290,11 +1291,11 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
*/
|
*/
|
||||||
private int getStatusBarHeight() {
|
private int getStatusBarHeight() {
|
||||||
int statusBarHeight = 0;
|
int statusBarHeight = 0;
|
||||||
int resourceId = service.getResources().getIdentifier("status_bar_height_landscape", "dimen", "android");
|
final int resourceId = service.getResources().getIdentifier("status_bar_height_landscape", "dimen", "android");
|
||||||
if (resourceId > 0) statusBarHeight = service.getResources().getDimensionPixelSize(resourceId);
|
if (resourceId > 0) statusBarHeight = service.getResources().getDimensionPixelSize(resourceId);
|
||||||
if (statusBarHeight == 0) {
|
if (statusBarHeight == 0) {
|
||||||
// Some devices provide wrong value for status bar height in landscape mode, this is workaround
|
// Some devices provide wrong value for status bar height in landscape mode, this is workaround
|
||||||
DisplayMetrics metrics = getRootView().getResources().getDisplayMetrics();
|
final DisplayMetrics metrics = getRootView().getResources().getDisplayMetrics();
|
||||||
statusBarHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, metrics);
|
statusBarHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, metrics);
|
||||||
}
|
}
|
||||||
return statusBarHeight;
|
return statusBarHeight;
|
||||||
|
@ -1304,7 +1305,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
* @return true if main player is attached to activity and activity inside multiWindow mode
|
* @return true if main player is attached to activity and activity inside multiWindow mode
|
||||||
*/
|
*/
|
||||||
private boolean isInMultiWindow() {
|
private boolean isInMultiWindow() {
|
||||||
AppCompatActivity parent = getParentActivity();
|
final AppCompatActivity parent = getParentActivity();
|
||||||
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && parent != null && parent.isInMultiWindowMode();
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && parent != null && parent.isInMultiWindowMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1317,9 +1318,9 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkLandscape() {
|
public void checkLandscape() {
|
||||||
AppCompatActivity parent = getParentActivity();
|
final AppCompatActivity parent = getParentActivity();
|
||||||
boolean videoInLandscapeButNotInFullscreen = service.isLandscape() && !isFullscreen() && videoPlayerSelected() && !audioOnly;
|
final boolean videoInLandscapeButNotInFullscreen = service.isLandscape() && !isFullscreen() && videoPlayerSelected() && !audioOnly;
|
||||||
boolean playingState = getCurrentState() != STATE_COMPLETED && getCurrentState() != STATE_PAUSED;
|
final boolean playingState = getCurrentState() != STATE_COMPLETED && getCurrentState() != STATE_PAUSED;
|
||||||
if (parent != null && videoInLandscapeButNotInFullscreen && playingState && !PlayerHelper.isTablet(service))
|
if (parent != null && videoInLandscapeButNotInFullscreen && playingState && !PlayerHelper.isTablet(service))
|
||||||
toggleFullscreen();
|
toggleFullscreen();
|
||||||
|
|
||||||
|
@ -1342,7 +1343,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
itemsListCloseButton.setOnClickListener(view -> onQueueClosed());
|
itemsListCloseButton.setOnClickListener(view -> onQueueClosed());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void useVideoSource(boolean video) {
|
public void useVideoSource(final boolean video) {
|
||||||
if (playQueue == null || audioOnly == !video || audioPlayerSelected())
|
if (playQueue == null || audioOnly == !video || audioPlayerSelected())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1415,7 +1416,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
|
|
||||||
final boolean popupRememberSizeAndPos = PlayerHelper.isRememberingPopupDimensions(service);
|
final boolean popupRememberSizeAndPos = PlayerHelper.isRememberingPopupDimensions(service);
|
||||||
final float defaultSize = service.getResources().getDimension(R.dimen.popup_default_width);
|
final float defaultSize = service.getResources().getDimension(R.dimen.popup_default_width);
|
||||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(service);
|
final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(service);
|
||||||
popupWidth = popupRememberSizeAndPos ? sharedPreferences.getFloat(POPUP_SAVED_WIDTH, defaultSize) : defaultSize;
|
popupWidth = popupRememberSizeAndPos ? sharedPreferences.getFloat(POPUP_SAVED_WIDTH, defaultSize) : defaultSize;
|
||||||
popupHeight = getMinimumVideoHeight(popupWidth);
|
popupHeight = getMinimumVideoHeight(popupWidth);
|
||||||
|
|
||||||
|
@ -1428,8 +1429,8 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
popupLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
|
popupLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
|
||||||
getSurfaceView().setHeights((int) popupHeight, (int) popupHeight);
|
getSurfaceView().setHeights((int) popupHeight, (int) popupHeight);
|
||||||
|
|
||||||
int centerX = (int) (screenWidth / 2f - popupWidth / 2f);
|
final int centerX = (int) (screenWidth / 2f - popupWidth / 2f);
|
||||||
int centerY = (int) (screenHeight / 2f - popupHeight / 2f);
|
final int centerY = (int) (screenHeight / 2f - popupHeight / 2f);
|
||||||
popupLayoutParams.x = popupRememberSizeAndPos ? sharedPreferences.getInt(POPUP_SAVED_X, centerX) : centerX;
|
popupLayoutParams.x = popupRememberSizeAndPos ? sharedPreferences.getInt(POPUP_SAVED_X, centerX) : centerX;
|
||||||
popupLayoutParams.y = popupRememberSizeAndPos ? sharedPreferences.getInt(POPUP_SAVED_Y, centerY) : centerY;
|
popupLayoutParams.y = popupRememberSizeAndPos ? sharedPreferences.getInt(POPUP_SAVED_Y, centerY) : centerY;
|
||||||
|
|
||||||
|
@ -1458,7 +1459,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
final int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
|
final int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
|
||||||
| WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
|
| WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
|
||||||
|
|
||||||
WindowManager.LayoutParams closeOverlayLayoutParams = new WindowManager.LayoutParams(
|
final WindowManager.LayoutParams closeOverlayLayoutParams = new WindowManager.LayoutParams(
|
||||||
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
|
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
|
||||||
popupLayoutParamType(),
|
popupLayoutParamType(),
|
||||||
flags,
|
flags,
|
||||||
|
@ -1523,19 +1524,19 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
}
|
}
|
||||||
|
|
||||||
public void savePositionAndSize() {
|
public void savePositionAndSize() {
|
||||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(service);
|
final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(service);
|
||||||
sharedPreferences.edit().putInt(POPUP_SAVED_X, popupLayoutParams.x).apply();
|
sharedPreferences.edit().putInt(POPUP_SAVED_X, popupLayoutParams.x).apply();
|
||||||
sharedPreferences.edit().putInt(POPUP_SAVED_Y, popupLayoutParams.y).apply();
|
sharedPreferences.edit().putInt(POPUP_SAVED_Y, popupLayoutParams.y).apply();
|
||||||
sharedPreferences.edit().putFloat(POPUP_SAVED_WIDTH, popupLayoutParams.width).apply();
|
sharedPreferences.edit().putFloat(POPUP_SAVED_WIDTH, popupLayoutParams.width).apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
private float getMinimumVideoHeight(float width) {
|
private float getMinimumVideoHeight(final float width) {
|
||||||
//if (DEBUG) Log.d(TAG, "getMinimumVideoHeight() called with: width = [" + width + "], returned: " + height);
|
//if (DEBUG) Log.d(TAG, "getMinimumVideoHeight() called with: width = [" + width + "], returned: " + height);
|
||||||
return width / (16.0f / 9.0f); // Respect the 16:9 ratio that most videos have
|
return width / (16.0f / 9.0f); // Respect the 16:9 ratio that most videos have
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateScreenSize() {
|
public void updateScreenSize() {
|
||||||
DisplayMetrics metrics = new DisplayMetrics();
|
final DisplayMetrics metrics = new DisplayMetrics();
|
||||||
windowManager.getDefaultDisplay().getMetrics(metrics);
|
windowManager.getDefaultDisplay().getMetrics(metrics);
|
||||||
|
|
||||||
screenWidth = metrics.widthPixels;
|
screenWidth = metrics.widthPixels;
|
||||||
|
@ -1604,7 +1605,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removePopupFromView() {
|
public void removePopupFromView() {
|
||||||
boolean isCloseOverlayHasParent = closeOverlayView != null && closeOverlayView.getParent() != null;
|
final boolean isCloseOverlayHasParent = closeOverlayView != null && closeOverlayView.getParent() != null;
|
||||||
if (popupHasParent())
|
if (popupHasParent())
|
||||||
windowManager.removeView(getRootView());
|
windowManager.removeView(getRootView());
|
||||||
if (isCloseOverlayHasParent)
|
if (isCloseOverlayHasParent)
|
||||||
|
@ -1640,7 +1641,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean popupHasParent() {
|
private boolean popupHasParent() {
|
||||||
View root = getRootView();
|
final View root = getRootView();
|
||||||
return root != null && root.getLayoutParams() instanceof WindowManager.LayoutParams && root.getParent() != null;
|
return root != null && root.getLayoutParams() instanceof WindowManager.LayoutParams && root.getParent() != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1648,27 +1649,27 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
// Manipulations with listener
|
// Manipulations with listener
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
public void setFragmentListener(PlayerServiceEventListener listener) {
|
public void setFragmentListener(final PlayerServiceEventListener listener) {
|
||||||
fragmentListener = listener;
|
fragmentListener = listener;
|
||||||
updateMetadata();
|
updateMetadata();
|
||||||
updatePlayback();
|
updatePlayback();
|
||||||
triggerProgressUpdate();
|
triggerProgressUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeFragmentListener(PlayerServiceEventListener listener) {
|
public void removeFragmentListener(final PlayerServiceEventListener listener) {
|
||||||
if (fragmentListener == listener) {
|
if (fragmentListener == listener) {
|
||||||
fragmentListener = null;
|
fragmentListener = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*package-private*/ void setActivityListener(PlayerEventListener listener) {
|
void setActivityListener(final PlayerEventListener listener) {
|
||||||
activityListener = listener;
|
activityListener = listener;
|
||||||
updateMetadata();
|
updateMetadata();
|
||||||
updatePlayback();
|
updatePlayback();
|
||||||
triggerProgressUpdate();
|
triggerProgressUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*package-private*/ void removeActivityListener(PlayerEventListener listener) {
|
void removeActivityListener(final PlayerEventListener listener) {
|
||||||
if (activityListener == listener) {
|
if (activityListener == listener) {
|
||||||
activityListener = null;
|
activityListener = null;
|
||||||
}
|
}
|
||||||
|
@ -1703,7 +1704,7 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateProgress(int currentProgress, int duration, int bufferPercent) {
|
private void updateProgress(final int currentProgress, final int duration, final int bufferPercent) {
|
||||||
if (fragmentListener != null) {
|
if (fragmentListener != null) {
|
||||||
fragmentListener.onProgressUpdate(currentProgress, duration, bufferPercent);
|
fragmentListener.onProgressUpdate(currentProgress, duration, bufferPercent);
|
||||||
}
|
}
|
||||||
|
@ -1787,11 +1788,11 @@ public class VideoPlayerImpl extends VideoPlayer
|
||||||
return popupHeight;
|
return popupHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPopupWidth(float width) {
|
public void setPopupWidth(final float width) {
|
||||||
popupWidth = width;
|
popupWidth = width;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPopupHeight(float height) {
|
public void setPopupHeight(final float height) {
|
||||||
popupHeight = height;
|
popupHeight = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,14 +16,14 @@ import java.util.List;
|
||||||
|
|
||||||
public class CustomBottomSheetBehavior extends BottomSheetBehavior<FrameLayout> {
|
public class CustomBottomSheetBehavior extends BottomSheetBehavior<FrameLayout> {
|
||||||
|
|
||||||
public CustomBottomSheetBehavior(Context context, AttributeSet attrs) {
|
public CustomBottomSheetBehavior(final Context context, final AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean visible;
|
boolean visible;
|
||||||
Rect globalRect = new Rect();
|
Rect globalRect = new Rect();
|
||||||
private boolean skippingInterception = false;
|
private boolean skippingInterception = false;
|
||||||
private List<Integer> skipInterceptionOfElements = Arrays.asList(
|
private final List<Integer> skipInterceptionOfElements = Arrays.asList(
|
||||||
R.id.detail_content_root_layout, R.id.relatedStreamsLayout, R.id.playQueuePanel, R.id.viewpager);
|
R.id.detail_content_root_layout, R.id.relatedStreamsLayout, R.id.playQueuePanel, R.id.viewpager);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -38,8 +38,8 @@ public class CustomBottomSheetBehavior extends BottomSheetBehavior<FrameLayout>
|
||||||
// Don't need to do anything if bottomSheet isn't expanded
|
// Don't need to do anything if bottomSheet isn't expanded
|
||||||
if (getState() == BottomSheetBehavior.STATE_EXPANDED) {
|
if (getState() == BottomSheetBehavior.STATE_EXPANDED) {
|
||||||
// Without overriding scrolling will not work when user touches these elements
|
// Without overriding scrolling will not work when user touches these elements
|
||||||
for (Integer element : skipInterceptionOfElements) {
|
for (final Integer element : skipInterceptionOfElements) {
|
||||||
ViewGroup viewGroup = child.findViewById(element);
|
final ViewGroup viewGroup = child.findViewById(element);
|
||||||
if (viewGroup != null) {
|
if (viewGroup != null) {
|
||||||
visible = viewGroup.getGlobalVisibleRect(globalRect);
|
visible = viewGroup.getGlobalVisibleRect(globalRect);
|
||||||
if (visible && globalRect.contains((int) event.getRawX(), (int) event.getRawY())) {
|
if (visible && globalRect.contains((int) event.getRawX(), (int) event.getRawY())) {
|
||||||
|
|
|
@ -20,8 +20,8 @@ public class PlayerGestureListener extends GestureDetector.SimpleOnGestureListen
|
||||||
private static final String TAG = ".PlayerGestureListener";
|
private static final String TAG = ".PlayerGestureListener";
|
||||||
private static final boolean DEBUG = BasePlayer.DEBUG;
|
private static final boolean DEBUG = BasePlayer.DEBUG;
|
||||||
|
|
||||||
private VideoPlayerImpl playerImpl;
|
private final VideoPlayerImpl playerImpl;
|
||||||
private MainPlayer service;
|
private final MainPlayer service;
|
||||||
|
|
||||||
private int initialPopupX, initialPopupY;
|
private int initialPopupX, initialPopupY;
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ public class PlayerGestureListener extends GestureDetector.SimpleOnGestureListen
|
||||||
|
|
||||||
private boolean isResizing;
|
private boolean isResizing;
|
||||||
|
|
||||||
private int tossFlingVelocity;
|
private final int tossFlingVelocity;
|
||||||
|
|
||||||
private final boolean isVolumeGestureEnabled;
|
private final boolean isVolumeGestureEnabled;
|
||||||
private final boolean isBrightnessGestureEnabled;
|
private final boolean isBrightnessGestureEnabled;
|
||||||
|
@ -114,9 +114,9 @@ public class PlayerGestureListener extends GestureDetector.SimpleOnGestureListen
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
private boolean onDoubleTapInMain(MotionEvent e) {
|
private boolean onDoubleTapInMain(MotionEvent e) {
|
||||||
if (e.getX() > playerImpl.getRootView().getWidth() * 2 / 3) {
|
if (e.getX() > playerImpl.getRootView().getWidth() * 2.0 / 3.0) {
|
||||||
playerImpl.onFastForward();
|
playerImpl.onFastForward();
|
||||||
} else if (e.getX() < playerImpl.getRootView().getWidth() / 3) {
|
} else if (e.getX() < playerImpl.getRootView().getWidth() / 3.0) {
|
||||||
playerImpl.onFastRewind();
|
playerImpl.onFastRewind();
|
||||||
} else {
|
} else {
|
||||||
playerImpl.getPlayPauseButton().performClick();
|
playerImpl.getPlayPauseButton().performClick();
|
||||||
|
@ -143,7 +143,8 @@ public class PlayerGestureListener extends GestureDetector.SimpleOnGestureListen
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean onScrollInMain(MotionEvent initialEvent, MotionEvent movingEvent, float distanceX, float distanceY) {
|
private boolean onScrollInMain(final MotionEvent initialEvent, final MotionEvent movingEvent,
|
||||||
|
final float distanceX, final float distanceY) {
|
||||||
if (!isVolumeGestureEnabled && !isBrightnessGestureEnabled) return false;
|
if (!isVolumeGestureEnabled && !isBrightnessGestureEnabled) return false;
|
||||||
|
|
||||||
//noinspection PointlessBooleanExpression
|
//noinspection PointlessBooleanExpression
|
||||||
|
@ -162,9 +163,9 @@ public class PlayerGestureListener extends GestureDetector.SimpleOnGestureListen
|
||||||
|
|
||||||
if (isVolumeGestureEnabled && initialEvent.getX() > playerImpl.getRootView().getWidth() / 2.0) {
|
if (isVolumeGestureEnabled && initialEvent.getX() > playerImpl.getRootView().getWidth() / 2.0) {
|
||||||
playerImpl.getVolumeProgressBar().incrementProgressBy((int) distanceY);
|
playerImpl.getVolumeProgressBar().incrementProgressBy((int) distanceY);
|
||||||
float currentProgressPercent =
|
final float currentProgressPercent =
|
||||||
(float) playerImpl.getVolumeProgressBar().getProgress() / playerImpl.getMaxGestureLength();
|
(float) playerImpl.getVolumeProgressBar().getProgress() / playerImpl.getMaxGestureLength();
|
||||||
int currentVolume = (int) (maxVolume * currentProgressPercent);
|
final int currentVolume = (int) (maxVolume * currentProgressPercent);
|
||||||
playerImpl.getAudioReactor().setVolume(currentVolume);
|
playerImpl.getAudioReactor().setVolume(currentVolume);
|
||||||
|
|
||||||
if (DEBUG) Log.d(TAG, "onScroll().volumeControl, currentVolume = " + currentVolume);
|
if (DEBUG) Log.d(TAG, "onScroll().volumeControl, currentVolume = " + currentVolume);
|
||||||
|
@ -183,15 +184,15 @@ public class PlayerGestureListener extends GestureDetector.SimpleOnGestureListen
|
||||||
playerImpl.getBrightnessRelativeLayout().setVisibility(View.GONE);
|
playerImpl.getBrightnessRelativeLayout().setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
} else if (isBrightnessGestureEnabled && initialEvent.getX() <= playerImpl.getRootView().getWidth() / 2.0) {
|
} else if (isBrightnessGestureEnabled && initialEvent.getX() <= playerImpl.getRootView().getWidth() / 2.0) {
|
||||||
Activity parent = playerImpl.getParentActivity();
|
final Activity parent = playerImpl.getParentActivity();
|
||||||
if (parent == null) return true;
|
if (parent == null) return true;
|
||||||
|
|
||||||
Window window = parent.getWindow();
|
final Window window = parent.getWindow();
|
||||||
|
|
||||||
playerImpl.getBrightnessProgressBar().incrementProgressBy((int) distanceY);
|
playerImpl.getBrightnessProgressBar().incrementProgressBy((int) distanceY);
|
||||||
float currentProgressPercent =
|
final float currentProgressPercent =
|
||||||
(float) playerImpl.getBrightnessProgressBar().getProgress() / playerImpl.getMaxGestureLength();
|
(float) playerImpl.getBrightnessProgressBar().getProgress() / playerImpl.getMaxGestureLength();
|
||||||
WindowManager.LayoutParams layoutParams = window.getAttributes();
|
final WindowManager.LayoutParams layoutParams = window.getAttributes();
|
||||||
layoutParams.screenBrightness = currentProgressPercent;
|
layoutParams.screenBrightness = currentProgressPercent;
|
||||||
window.setAttributes(layoutParams);
|
window.setAttributes(layoutParams);
|
||||||
|
|
||||||
|
@ -306,8 +307,10 @@ public class PlayerGestureListener extends GestureDetector.SimpleOnGestureListen
|
||||||
|
|
||||||
isMovingInPopup = true;
|
isMovingInPopup = true;
|
||||||
|
|
||||||
float diffX = (int) (movingEvent.getRawX() - initialEvent.getRawX()), posX = (int) (initialPopupX + diffX);
|
final float diffX = (int) (movingEvent.getRawX() - initialEvent.getRawX());
|
||||||
float diffY = (int) (movingEvent.getRawY() - initialEvent.getRawY()), posY = (int) (initialPopupY + diffY);
|
float posX = (int) (initialPopupX + diffX);
|
||||||
|
final float diffY = (int) (movingEvent.getRawY() - initialEvent.getRawY());
|
||||||
|
float posY = (int) (initialPopupY + diffY);
|
||||||
|
|
||||||
if (posX > (playerImpl.getScreenWidth() - playerImpl.getPopupWidth())) posX = (int) (playerImpl.getScreenWidth() - playerImpl.getPopupWidth());
|
if (posX > (playerImpl.getScreenWidth() - playerImpl.getPopupWidth())) posX = (int) (playerImpl.getScreenWidth() - playerImpl.getPopupWidth());
|
||||||
else if (posX < 0) posX = 0;
|
else if (posX < 0) posX = 0;
|
||||||
|
|
|
@ -46,7 +46,7 @@ public abstract class PlayQueue implements Serializable {
|
||||||
|
|
||||||
private ArrayList<PlayQueueItem> backup;
|
private ArrayList<PlayQueueItem> backup;
|
||||||
private ArrayList<PlayQueueItem> streams;
|
private ArrayList<PlayQueueItem> streams;
|
||||||
private ArrayList<PlayQueueItem> history;
|
private final ArrayList<PlayQueueItem> history;
|
||||||
@NonNull private final AtomicInteger queueIndex;
|
@NonNull private final AtomicInteger queueIndex;
|
||||||
|
|
||||||
private transient BehaviorSubject<PlayQueueEvent> eventBroadcast;
|
private transient BehaviorSubject<PlayQueueEvent> eventBroadcast;
|
||||||
|
@ -132,7 +132,7 @@ public abstract class PlayQueue implements Serializable {
|
||||||
* Returns the item at the given index.
|
* Returns the item at the given index.
|
||||||
* May throw {@link IndexOutOfBoundsException}.
|
* May throw {@link IndexOutOfBoundsException}.
|
||||||
* */
|
* */
|
||||||
public PlayQueueItem getItem(int index) {
|
public PlayQueueItem getItem(final int index) {
|
||||||
if (index < 0 || index >= streams.size() || streams.get(index) == null) return null;
|
if (index < 0 || index >= streams.size() || streams.get(index) == null) return null;
|
||||||
return streams.get(index);
|
return streams.get(index);
|
||||||
}
|
}
|
||||||
|
@ -235,7 +235,7 @@ public abstract class PlayQueue implements Serializable {
|
||||||
* Will emit a {@link AppendEvent} on any given context.
|
* Will emit a {@link AppendEvent} on any given context.
|
||||||
* */
|
* */
|
||||||
public synchronized void append(@NonNull final List<PlayQueueItem> items) {
|
public synchronized void append(@NonNull final List<PlayQueueItem> items) {
|
||||||
List<PlayQueueItem> itemList = new ArrayList<>(items);
|
final List<PlayQueueItem> itemList = new ArrayList<>(items);
|
||||||
|
|
||||||
if (isShuffled()) {
|
if (isShuffled()) {
|
||||||
backup.addAll(itemList);
|
backup.addAll(itemList);
|
||||||
|
@ -300,8 +300,7 @@ public abstract class PlayQueue implements Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (backup != null) {
|
if (backup != null) {
|
||||||
final int backupIndex = backup.indexOf(getItem(removeIndex));
|
backup.remove(getItem(removeIndex));
|
||||||
backup.remove(backupIndex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
history.remove(streams.remove(removeIndex));
|
history.remove(streams.remove(removeIndex));
|
||||||
|
@ -332,7 +331,7 @@ public abstract class PlayQueue implements Serializable {
|
||||||
queueIndex.incrementAndGet();
|
queueIndex.incrementAndGet();
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayQueueItem playQueueItem = streams.remove(source);
|
final PlayQueueItem playQueueItem = streams.remove(source);
|
||||||
playQueueItem.setAutoQueued(false);
|
playQueueItem.setAutoQueued(false);
|
||||||
streams.add(target, playQueueItem);
|
streams.add(target, playQueueItem);
|
||||||
broadcast(new MoveEvent(source, target));
|
broadcast(new MoveEvent(source, target));
|
||||||
|
@ -431,7 +430,7 @@ public abstract class PlayQueue implements Serializable {
|
||||||
|
|
||||||
history.remove(history.size() - 1);
|
history.remove(history.size() - 1);
|
||||||
|
|
||||||
PlayQueueItem last = history.remove(history.size() - 1);
|
final PlayQueueItem last = history.remove(history.size() - 1);
|
||||||
setIndex(indexOf(last));
|
setIndex(indexOf(last));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -443,11 +442,11 @@ public abstract class PlayQueue implements Serializable {
|
||||||
* VideoDetailFragment without duplicating items from two identical queues
|
* VideoDetailFragment without duplicating items from two identical queues
|
||||||
* */
|
* */
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(@Nullable Object obj) {
|
public boolean equals(@Nullable final Object obj) {
|
||||||
if (!(obj instanceof PlayQueue) || getStreams().size() != ((PlayQueue) obj).getStreams().size())
|
if (!(obj instanceof PlayQueue) || getStreams().size() != ((PlayQueue) obj).getStreams().size())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
PlayQueue other = (PlayQueue) obj;
|
final PlayQueue other = (PlayQueue) obj;
|
||||||
for (int i = 0; i < getStreams().size(); i++) {
|
for (int i = 0; i < getStreams().size(); i++) {
|
||||||
if (!getItem(i).getUrl().equals(other.getItem(i).getUrl()))
|
if (!getItem(i).getUrl().equals(other.getItem(i).getUrl()))
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -114,13 +114,25 @@ public class NavigationHelper {
|
||||||
.putExtra(BasePlayer.PLAYBACK_SKIP_SILENCE, playbackSkipSilence);
|
.putExtra(BasePlayer.PLAYBACK_SKIP_SILENCE, playbackSkipSilence);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void playOnMainPlayer(final AppCompatActivity activity, final PlayQueue queue, final boolean autoPlay) {
|
public static void playOnMainPlayer(
|
||||||
|
final AppCompatActivity activity,
|
||||||
|
final PlayQueue queue,
|
||||||
|
final boolean autoPlay) {
|
||||||
playOnMainPlayer(activity.getSupportFragmentManager(), queue, autoPlay);
|
playOnMainPlayer(activity.getSupportFragmentManager(), queue, autoPlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void playOnMainPlayer(final FragmentManager fragmentManager, final PlayQueue queue, boolean autoPlay) {
|
public static void playOnMainPlayer(
|
||||||
PlayQueueItem currentStream = queue.getItem();
|
final FragmentManager fragmentManager,
|
||||||
openVideoDetailFragment(fragmentManager, currentStream.getServiceId(), currentStream.getUrl(), currentStream.getTitle(), autoPlay, queue);
|
final PlayQueue queue,
|
||||||
|
final boolean autoPlay) {
|
||||||
|
final PlayQueueItem currentStream = queue.getItem();
|
||||||
|
openVideoDetailFragment(
|
||||||
|
fragmentManager,
|
||||||
|
currentStream.getServiceId(),
|
||||||
|
currentStream.getUrl(),
|
||||||
|
currentStream.getTitle(),
|
||||||
|
autoPlay,
|
||||||
|
queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void playOnMainPlayer(@NonNull final Context context,
|
public static void playOnMainPlayer(@NonNull final Context context,
|
||||||
|
@ -131,7 +143,7 @@ public class NavigationHelper {
|
||||||
final boolean autoPlay,
|
final boolean autoPlay,
|
||||||
final boolean resumePlayback) {
|
final boolean resumePlayback) {
|
||||||
|
|
||||||
Intent intent = getPlayerIntent(context, MainActivity.class, queue, resumePlayback);
|
final Intent intent = getPlayerIntent(context, MainActivity.class, queue, resumePlayback);
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
intent.putExtra(Constants.KEY_LINK_TYPE, linkType);
|
intent.putExtra(Constants.KEY_LINK_TYPE, linkType);
|
||||||
intent.putExtra(Constants.KEY_URL, url);
|
intent.putExtra(Constants.KEY_URL, url);
|
||||||
|
@ -147,14 +159,14 @@ public class NavigationHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
Toast.makeText(context, R.string.popup_playing_toast, Toast.LENGTH_SHORT).show();
|
Toast.makeText(context, R.string.popup_playing_toast, Toast.LENGTH_SHORT).show();
|
||||||
Intent intent = getPlayerIntent(context, MainPlayer.class, queue, resumePlayback);
|
final Intent intent = getPlayerIntent(context, MainPlayer.class, queue, resumePlayback);
|
||||||
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_POPUP);
|
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_POPUP);
|
||||||
startService(context, intent);
|
startService(context, intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void playOnBackgroundPlayer(final Context context, final PlayQueue queue, final boolean resumePlayback) {
|
public static void playOnBackgroundPlayer(final Context context, final PlayQueue queue, final boolean resumePlayback) {
|
||||||
Toast.makeText(context, R.string.background_player_playing_toast, Toast.LENGTH_SHORT).show();
|
Toast.makeText(context, R.string.background_player_playing_toast, Toast.LENGTH_SHORT).show();
|
||||||
Intent intent = getPlayerIntent(context, MainPlayer.class, queue, resumePlayback);
|
final Intent intent = getPlayerIntent(context, MainPlayer.class, queue, resumePlayback);
|
||||||
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_AUDIO);
|
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_AUDIO);
|
||||||
startService(context, intent);
|
startService(context, intent);
|
||||||
}
|
}
|
||||||
|
@ -170,7 +182,7 @@ public class NavigationHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
Toast.makeText(context, R.string.popup_playing_append, Toast.LENGTH_SHORT).show();
|
Toast.makeText(context, R.string.popup_playing_append, Toast.LENGTH_SHORT).show();
|
||||||
Intent intent = getPlayerEnqueueIntent(context, MainPlayer.class, queue, selectOnAppend, resumePlayback);
|
final Intent intent = getPlayerEnqueueIntent(context, MainPlayer.class, queue, selectOnAppend, resumePlayback);
|
||||||
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_POPUP);
|
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_POPUP);
|
||||||
startService(context, intent);
|
startService(context, intent);
|
||||||
}
|
}
|
||||||
|
@ -179,9 +191,9 @@ public class NavigationHelper {
|
||||||
enqueueOnBackgroundPlayer(context, queue, false, resumePlayback);
|
enqueueOnBackgroundPlayer(context, queue, false, resumePlayback);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void enqueueOnBackgroundPlayer(final Context context, final PlayQueue queue, boolean selectOnAppend, final boolean resumePlayback) {
|
public static void enqueueOnBackgroundPlayer(final Context context, final PlayQueue queue, final boolean selectOnAppend, final boolean resumePlayback) {
|
||||||
Toast.makeText(context, R.string.background_player_append, Toast.LENGTH_SHORT).show();
|
Toast.makeText(context, R.string.background_player_append, Toast.LENGTH_SHORT).show();
|
||||||
Intent intent = getPlayerEnqueueIntent(context, MainPlayer.class, queue, selectOnAppend, resumePlayback);
|
final Intent intent = getPlayerEnqueueIntent(context, MainPlayer.class, queue, selectOnAppend, resumePlayback);
|
||||||
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_AUDIO);
|
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_AUDIO);
|
||||||
startService(context, intent);
|
startService(context, intent);
|
||||||
}
|
}
|
||||||
|
@ -307,25 +319,31 @@ public class NavigationHelper {
|
||||||
openVideoDetailFragment(fragmentManager, serviceId, url, title, true, null);
|
openVideoDetailFragment(fragmentManager, serviceId, url, title, true, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void openVideoDetailFragment(FragmentManager fragmentManager, int serviceId, String url, String title, boolean autoPlay, PlayQueue playQueue) {
|
public static void openVideoDetailFragment(
|
||||||
Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_player_holder);
|
FragmentManager fragmentManager,
|
||||||
|
int serviceId,
|
||||||
|
String url,
|
||||||
|
String title,
|
||||||
|
boolean autoPlay,
|
||||||
|
PlayQueue playQueue) {
|
||||||
|
final Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_player_holder);
|
||||||
if (title == null) title = "";
|
if (title == null) title = "";
|
||||||
|
|
||||||
if (fragment instanceof VideoDetailFragment && fragment.isVisible()) {
|
if (fragment instanceof VideoDetailFragment && fragment.isVisible()) {
|
||||||
expandMainPlayer(fragment.getActivity());
|
expandMainPlayer(fragment.requireActivity());
|
||||||
VideoDetailFragment detailFragment = (VideoDetailFragment) fragment;
|
final VideoDetailFragment detailFragment = (VideoDetailFragment) fragment;
|
||||||
detailFragment.setAutoplay(autoPlay);
|
detailFragment.setAutoplay(autoPlay);
|
||||||
detailFragment.selectAndLoadVideo(serviceId, url, title, playQueue);
|
detailFragment.selectAndLoadVideo(serviceId, url, title, playQueue);
|
||||||
detailFragment.scrollToTop();
|
detailFragment.scrollToTop();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
VideoDetailFragment instance = VideoDetailFragment.getInstance(serviceId, url, title, playQueue);
|
final VideoDetailFragment instance = VideoDetailFragment.getInstance(serviceId, url, title, playQueue);
|
||||||
instance.setAutoplay(autoPlay);
|
instance.setAutoplay(autoPlay);
|
||||||
|
|
||||||
defaultTransaction(fragmentManager)
|
defaultTransaction(fragmentManager)
|
||||||
.replace(R.id.fragment_player_holder, instance)
|
.replace(R.id.fragment_player_holder, instance)
|
||||||
.runOnCommit(() -> expandMainPlayer(instance.getActivity()))
|
.runOnCommit(() -> expandMainPlayer(instance.requireActivity()))
|
||||||
.commit();
|
.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,9 +353,9 @@ public class NavigationHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void openChannelFragment(
|
public static void openChannelFragment(
|
||||||
FragmentManager fragmentManager,
|
final FragmentManager fragmentManager,
|
||||||
int serviceId,
|
final int serviceId,
|
||||||
String url,
|
final String url,
|
||||||
String name) {
|
String name) {
|
||||||
if (name == null) name = "";
|
if (name == null) name = "";
|
||||||
defaultTransaction(fragmentManager)
|
defaultTransaction(fragmentManager)
|
||||||
|
@ -558,6 +576,7 @@ public class NavigationHelper {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start an activity to install Kore
|
* Start an activity to install Kore
|
||||||
|
*
|
||||||
* @param context the context
|
* @param context the context
|
||||||
*/
|
*/
|
||||||
public static void installKore(Context context) {
|
public static void installKore(Context context) {
|
||||||
|
@ -566,7 +585,7 @@ public class NavigationHelper {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start Kore app to show a video on Kodi
|
* Start Kore app to show a video on Kodi
|
||||||
*
|
* <p>
|
||||||
* For a list of supported urls see the
|
* For a list of supported urls see the
|
||||||
* <a href="https://github.com/xbmc/Kore/blob/master/app/src/main/AndroidManifest.xml">
|
* <a href="https://github.com/xbmc/Kore/blob/master/app/src/main/AndroidManifest.xml">
|
||||||
* Kore source code
|
* Kore source code
|
||||||
|
|
|
@ -25,14 +25,14 @@ public class ExpandableSurfaceView extends SurfaceView {
|
||||||
if (videoAspectRatio == 0.0f) return;
|
if (videoAspectRatio == 0.0f) return;
|
||||||
|
|
||||||
int width = MeasureSpec.getSize(widthMeasureSpec);
|
int width = MeasureSpec.getSize(widthMeasureSpec);
|
||||||
boolean verticalVideo = videoAspectRatio < 1;
|
final boolean verticalVideo = videoAspectRatio < 1;
|
||||||
// Use maxHeight only on non-fit resize mode and in vertical videos
|
// Use maxHeight only on non-fit resize mode and in vertical videos
|
||||||
int height = maxHeight != 0 && resizeMode != AspectRatioFrameLayout.RESIZE_MODE_FIT && verticalVideo ? maxHeight : baseHeight;
|
int height = maxHeight != 0 && resizeMode != AspectRatioFrameLayout.RESIZE_MODE_FIT && verticalVideo ? maxHeight : baseHeight;
|
||||||
|
|
||||||
if (height == 0) return;
|
if (height == 0) return;
|
||||||
|
|
||||||
float viewAspectRatio = width / ((float) height);
|
final float viewAspectRatio = width / ((float) height);
|
||||||
float aspectDeformation = videoAspectRatio / viewAspectRatio - 1;
|
final float aspectDeformation = videoAspectRatio / viewAspectRatio - 1;
|
||||||
scaleX = 1.0f;
|
scaleX = 1.0f;
|
||||||
scaleY = 1.0f;
|
scaleY = 1.0f;
|
||||||
|
|
||||||
|
@ -73,15 +73,14 @@ public class ExpandableSurfaceView extends SurfaceView {
|
||||||
* @param base The height that will be used in every resize mode as a minimum height
|
* @param base The height that will be used in every resize mode as a minimum height
|
||||||
* @param max The max height for vertical videos in non-FIT resize modes
|
* @param max The max height for vertical videos in non-FIT resize modes
|
||||||
*/
|
*/
|
||||||
public void setHeights(int base, int max) {
|
public void setHeights(final int base, final int max) {
|
||||||
if (baseHeight == base && maxHeight == max) return;
|
if (baseHeight == base && maxHeight == max) return;
|
||||||
baseHeight = base;
|
baseHeight = base;
|
||||||
maxHeight = max;
|
maxHeight = max;
|
||||||
requestLayout();
|
requestLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
@AspectRatioFrameLayout.ResizeMode
|
public void setResizeMode(@AspectRatioFrameLayout.ResizeMode final int newResizeMode) {
|
||||||
public void setResizeMode(int newResizeMode) {
|
|
||||||
if (resizeMode == newResizeMode) return;
|
if (resizeMode == newResizeMode) return;
|
||||||
|
|
||||||
resizeMode = newResizeMode;
|
resizeMode = newResizeMode;
|
||||||
|
@ -93,7 +92,7 @@ public class ExpandableSurfaceView extends SurfaceView {
|
||||||
return resizeMode;
|
return resizeMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAspectRatio(float aspectRatio) {
|
public void setAspectRatio(final float aspectRatio) {
|
||||||
if (videoAspectRatio == aspectRatio) return;
|
if (videoAspectRatio == aspectRatio) return;
|
||||||
|
|
||||||
videoAspectRatio = aspectRatio;
|
videoAspectRatio = aspectRatio;
|
||||||
|
|
Loading…
Reference in a new issue