mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2024-12-24 00:50:32 +00:00
Merge branch 'dev' into 1520_app_update_notif
This commit is contained in:
commit
7ed460ce02
44
.github/CONTRIBUTING.md
vendored
44
.github/CONTRIBUTING.md
vendored
@ -5,11 +5,14 @@ PLEASE READ THESE GUIDELINES CAREFULLY BEFORE ANY CONTRIBUTION!
|
|||||||
|
|
||||||
## Crash reporting
|
## Crash reporting
|
||||||
|
|
||||||
Do not report crashes in the GitHub issue tracker. NewPipe has an automated crash report system that will ask you to send a report via e-mail when a crash occurs. This contains all the data we need for debugging, and allows you to even add a comment to it. You'll see exactly what is sent, the system is 100% transparent.
|
Do not report crashes in the GitHub issue tracker. NewPipe has an automated crash report system that will ask you to
|
||||||
|
send a report via e-mail when a crash occurs. This contains all the data we need for debugging, and allows you to even
|
||||||
|
add a comment to it. You'll see exactly what is sent, the system is 100% transparent.
|
||||||
|
|
||||||
## Issue reporting/feature requests
|
## Issue reporting/feature requests
|
||||||
|
|
||||||
* Search the [existing issues](https://github.com/TeamNewPipe/NewPipe/issues) first to make sure your issue/feature hasn't been reported/requested before
|
* Search the [existing issues](https://github.com/TeamNewPipe/NewPipe/issues) first to make sure your issue/feature
|
||||||
|
hasn't been reported/requested before
|
||||||
* Check whether your issue/feature is already fixed/implemented
|
* Check whether your issue/feature is already fixed/implemented
|
||||||
* Check if the issue still exists in the latest release/beta version
|
* Check if the issue still exists in the latest release/beta version
|
||||||
* If you are an Android/Java developer, you are always welcome to fix/implement an issue/a feature yourself. PRs welcome!
|
* If you are an Android/Java developer, you are always welcome to fix/implement an issue/a feature yourself. PRs welcome!
|
||||||
@ -19,30 +22,47 @@ Do not report crashes in the GitHub issue tracker. NewPipe has an automated cras
|
|||||||
* Issues that only contain a generated bug report, but no describtion might be closed.
|
* Issues that only contain a generated bug report, but no describtion might be closed.
|
||||||
|
|
||||||
## Bug Fixing
|
## Bug Fixing
|
||||||
* If you want to help NewPipe to become free of bugs (this is our utopic goal for NewPipe), you can send us an email to tnp@newpipe.schabi.org to let me know that you intend to help. We'll send you further instructions. You may, on request, register at our [Sentry](https://sentry.schabi.org) instance (see section "Crash reporting" for more information.
|
* If you want to help NewPipe to become free of bugs (this is our utopic goal for NewPipe), you can send us an email to
|
||||||
|
tnp@newpipe.schabi.org to let me know that you intend to help. We'll send you further instructions. You may, on request,
|
||||||
|
register at our [Sentry](https://sentry.schabi.org) instance (see section "Crash reporting" for more information.
|
||||||
|
|
||||||
## Translation
|
## Translation
|
||||||
|
|
||||||
* NewPipe can be translated via [Weblate](https://hosted.weblate.org/projects/newpipe/strings/). You can log in there with your GitHub account.
|
* NewPipe can be translated via [Weblate](https://hosted.weblate.org/projects/newpipe/strings/). You can log in there
|
||||||
|
with your GitHub account.
|
||||||
|
|
||||||
## Code contribution
|
## Code contribution
|
||||||
|
|
||||||
* Stick to NewPipe's style conventions (well, just look the other code and then do it the same way :))
|
* Stick to NewPipe's style conventions (well, just look the other code and then do it the same way :))
|
||||||
* Do not bring non-free software (e.g., binary blobs) into the project. Also, make sure you do not introduce Google libraries.
|
* Do not bring non-free software (e.g., binary blobs) into the project. Also, make sure you do not introduce Google
|
||||||
|
libraries.
|
||||||
* Stick to [F-Droid contribution guidelines](https://f-droid.org/wiki/page/Inclusion_Policy)
|
* Stick to [F-Droid contribution guidelines](https://f-droid.org/wiki/page/Inclusion_Policy)
|
||||||
* Make changes on a separate branch, not on the master branch. This is commonly known as *feature branch workflow*. You may then send your changes as a pull request on GitHub. Patches to the email address mentioned in this document might not be considered, GitHub is the primary platform. (This only affects you if you are a member of TeamNewPipe)
|
* Make changes on a separate branch, not on the master branch. This is commonly known as *feature branch workflow*. You
|
||||||
* When submitting changes, you confirm that your code is licensed under the terms of the [GNU General Public License v3](https://www.gnu.org/licenses/gpl-3.0.html).
|
may then send your changes as a pull request on GitHub. Patches to the email address mentioned in this document might
|
||||||
* Please test (compile and run) your code before you submit changes! Ideally, provide test feedback in the PR description. Untested code will **not** be merged!
|
not be considered, GitHub is the primary platform. (This only affects you if you are a member of TeamNewPipe)
|
||||||
|
* When submitting changes, you confirm that your code is licensed under the terms of the
|
||||||
|
[GNU General Public License v3](https://www.gnu.org/licenses/gpl-3.0.html).
|
||||||
|
* Please test (compile and run) your code before you submit changes! Ideally, provide test feedback in the PR
|
||||||
|
description. Untested code will **not** be merged!
|
||||||
* Try to figure out yourself why builds on our CI fail.
|
* Try to figure out yourself why builds on our CI fail.
|
||||||
* Make sure your PR is up-to-date with the rest of the code. Often, a simple click on "Update branch" will do the job, but if not, you are asked to merge the master branch manually and resolve the problems on your own. That will make the maintainers' jobs way easier.
|
* Make sure your PR is up-to-date with the rest of the code. Often, a simple click on "Update branch" will do the job,
|
||||||
* Please show intention to maintain your features and code after you contributed it. Unmaintained code is a hassle for the core developers, and just adds work. If you do not intend to maintain features you contributed, please think again about submission, or clearly state that in the description of your PR.
|
but if not, you are asked to merge the master branch manually and resolve the problems on your own. That will make the
|
||||||
|
maintainers' jobs way easier.
|
||||||
|
* Please show intention to maintain your features and code after you contributed it. Unmaintained code is a hassle for
|
||||||
|
the core developers, and just adds work. If you do not intend to maintain features you contributed, please think again
|
||||||
|
about submission, or clearly state that in the description of your PR.
|
||||||
* Respond yourselves if someone requests changes or otherwise raises issues about your PRs.
|
* Respond yourselves if someone requests changes or otherwise raises issues about your PRs.
|
||||||
* Check if your contributions align with the [fdroid inclusion guidelines](https://f-droid.org/en/docs/Inclusion_Policy/).
|
* Check if your contributions align with the [fdroid inclusion guidelines](https://f-droid.org/en/docs/Inclusion_Policy/).
|
||||||
* Check if your submission can be build with the current fdroid build server setup.
|
* Check if your submission can be build with the current fdroid build server setup.
|
||||||
|
* Send PR that only cover one specific issue/solution/bug. Do not send PRs that are huge and consists of multiple
|
||||||
|
independent solutions.
|
||||||
|
|
||||||
## Communication
|
## Communication
|
||||||
|
|
||||||
* WE DO NOW HAVE A MAILING LIST: [newpipe@list.schabi.org](https://list.schabi.org/cgi-bin/mailman/listinfo/newpipe).
|
* WE DO NOW HAVE A MAILING LIST: [newpipe@list.schabi.org](https://list.schabi.org/cgi-bin/mailman/listinfo/newpipe).
|
||||||
* There is an IRC channel on Freenode which is regularly visited by the core team and other developers: [#newpipe](irc:irc.freenode.net/newpipe). [Click here for Webchat](https://webchat.freenode.net/?channels=newpipe)!
|
* There is an IRC channel on Freenode which is regularly visited by the core team and other developers:
|
||||||
* If you want to get in touch with the core team or one of our other contributors you can send an email to tnp(at)schabi.org. Please do not send issue reports, they will be ignored and remain unanswered! Use the GitHub issue tracker described above!
|
[#newpipe](irc:irc.freenode.net/newpipe). [Click here for Webchat](https://webchat.freenode.net/?channels=newpipe)!
|
||||||
|
* If you want to get in touch with the core team or one of our other contributors you can send an email to
|
||||||
|
tnp(at)schabi.org. Please do not send issue reports, they will be ignored and remain unanswered! Use the GitHub issue
|
||||||
|
tracker described above!
|
||||||
* Feel free to post suggestions, changes, ideas etc. on GitHub, IRC or the mailing list!
|
* Feel free to post suggestions, changes, ideas etc. on GitHub, IRC or the mailing list!
|
||||||
|
17
.github/stale.yml
vendored
Normal file
17
.github/stale.yml
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Number of days of inactivity before an issue becomes stale
|
||||||
|
daysUntilStale: 60
|
||||||
|
# Number of days of inactivity before a stale issue is closed
|
||||||
|
daysUntilClose: 7
|
||||||
|
# Issues with these labels will never be considered stale
|
||||||
|
exemptLabels:
|
||||||
|
- pinned
|
||||||
|
- security
|
||||||
|
# Label to use when marking an issue as stale
|
||||||
|
staleLabel: stale
|
||||||
|
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||||
|
markComment: >
|
||||||
|
This issue has been automatically marked as stale because it has not had
|
||||||
|
recent activity. It will be closed if no further activity occurs. Thank you
|
||||||
|
for your contributions.
|
||||||
|
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||||
|
closeComment: false
|
@ -6,7 +6,7 @@ android {
|
|||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "org.schabi.newpipe"
|
applicationId "org.schabi.newpipe"
|
||||||
minSdkVersion 15
|
minSdkVersion 19
|
||||||
targetSdkVersion 28
|
targetSdkVersion 28
|
||||||
versionCode 69
|
versionCode 69
|
||||||
versionName "0.14.2"
|
versionName "0.14.2"
|
||||||
|
@ -542,8 +542,7 @@ public class RouterActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
boolean isExtVideoEnabled = preferences.getBoolean(getString(R.string.use_external_video_player_key), false);
|
boolean isExtVideoEnabled = preferences.getBoolean(getString(R.string.use_external_video_player_key), false);
|
||||||
boolean isExtAudioEnabled = preferences.getBoolean(getString(R.string.use_external_audio_player_key), false);
|
boolean isExtAudioEnabled = preferences.getBoolean(getString(R.string.use_external_audio_player_key), false);;
|
||||||
boolean useOldVideoPlayer = PlayerHelper.isUsingOldPlayer(this);
|
|
||||||
|
|
||||||
PlayQueue playQueue;
|
PlayQueue playQueue;
|
||||||
String playerChoice = choice.playerChoice;
|
String playerChoice = choice.playerChoice;
|
||||||
@ -555,9 +554,6 @@ public class RouterActivity extends AppCompatActivity {
|
|||||||
} else if (playerChoice.equals(videoPlayerKey) && isExtVideoEnabled) {
|
} else if (playerChoice.equals(videoPlayerKey) && isExtVideoEnabled) {
|
||||||
NavigationHelper.playOnExternalVideoPlayer(this, (StreamInfo) info);
|
NavigationHelper.playOnExternalVideoPlayer(this, (StreamInfo) info);
|
||||||
|
|
||||||
} else if (playerChoice.equals(videoPlayerKey) && useOldVideoPlayer) {
|
|
||||||
NavigationHelper.playOnOldVideoPlayer(this, (StreamInfo) info);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
playQueue = new SinglePlayQueue((StreamInfo) info);
|
playQueue = new SinglePlayQueue((StreamInfo) info);
|
||||||
|
|
||||||
|
@ -73,7 +73,6 @@ import org.schabi.newpipe.local.history.HistoryRecordManager;
|
|||||||
import org.schabi.newpipe.player.MainVideoPlayer;
|
import org.schabi.newpipe.player.MainVideoPlayer;
|
||||||
import org.schabi.newpipe.player.PopupVideoPlayer;
|
import org.schabi.newpipe.player.PopupVideoPlayer;
|
||||||
import org.schabi.newpipe.player.helper.PlayerHelper;
|
import org.schabi.newpipe.player.helper.PlayerHelper;
|
||||||
import org.schabi.newpipe.player.old.PlayVideoActivity;
|
|
||||||
import org.schabi.newpipe.player.playqueue.PlayQueue;
|
import org.schabi.newpipe.player.playqueue.PlayQueue;
|
||||||
import org.schabi.newpipe.player.playqueue.SinglePlayQueue;
|
import org.schabi.newpipe.player.playqueue.SinglePlayQueue;
|
||||||
import org.schabi.newpipe.report.ErrorActivity;
|
import org.schabi.newpipe.report.ErrorActivity;
|
||||||
@ -921,7 +920,7 @@ public class VideoDetailFragment
|
|||||||
.getBoolean(this.getString(R.string.use_external_video_player_key), false)) {
|
.getBoolean(this.getString(R.string.use_external_video_player_key), false)) {
|
||||||
startOnExternalPlayer(activity, currentInfo, selectedVideoStream);
|
startOnExternalPlayer(activity, currentInfo, selectedVideoStream);
|
||||||
} else {
|
} else {
|
||||||
openNormalPlayer(selectedVideoStream);
|
openNormalPlayer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -934,24 +933,13 @@ public class VideoDetailFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void openNormalPlayer(VideoStream selectedVideoStream) {
|
private void openNormalPlayer() {
|
||||||
Intent mIntent;
|
Intent mIntent;
|
||||||
boolean useOldPlayer = PlayerHelper.isUsingOldPlayer(activity) || (Build.VERSION.SDK_INT < 16);
|
final PlayQueue playQueue = new SinglePlayQueue(currentInfo);
|
||||||
if (!useOldPlayer) {
|
mIntent = NavigationHelper.getPlayerIntent(activity,
|
||||||
// ExoPlayer
|
MainVideoPlayer.class,
|
||||||
final PlayQueue playQueue = new SinglePlayQueue(currentInfo);
|
playQueue,
|
||||||
mIntent = NavigationHelper.getPlayerIntent(activity,
|
getSelectedVideoStream().getResolution());
|
||||||
MainVideoPlayer.class,
|
|
||||||
playQueue,
|
|
||||||
getSelectedVideoStream().getResolution());
|
|
||||||
} else {
|
|
||||||
// Internal Player
|
|
||||||
mIntent = new Intent(activity, PlayVideoActivity.class)
|
|
||||||
.putExtra(PlayVideoActivity.VIDEO_TITLE, currentInfo.getName())
|
|
||||||
.putExtra(PlayVideoActivity.STREAM_URL, selectedVideoStream.getUrl())
|
|
||||||
.putExtra(PlayVideoActivity.VIDEO_URL, currentInfo.getUrl())
|
|
||||||
.putExtra(PlayVideoActivity.START_POSITION, currentInfo.getStartPosition());
|
|
||||||
}
|
|
||||||
startActivity(mIntent);
|
startActivity(mIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1134,6 +1134,7 @@ public abstract class BasePlayer implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPlaying() {
|
public boolean isPlaying() {
|
||||||
|
if (simpleExoPlayer == null) return false;
|
||||||
final int state = simpleExoPlayer.getPlaybackState();
|
final int state = simpleExoPlayer.getPlaybackState();
|
||||||
return (state == Player.STATE_READY || state == Player.STATE_BUFFERING)
|
return (state == Player.STATE_READY || state == Player.STATE_BUFFERING)
|
||||||
&& simpleExoPlayer.getPlayWhenReady();
|
&& simpleExoPlayer.getPlayWhenReady();
|
||||||
|
@ -68,7 +68,6 @@ import org.schabi.newpipe.extractor.stream.VideoStream;
|
|||||||
import org.schabi.newpipe.player.event.PlayerEventListener;
|
import org.schabi.newpipe.player.event.PlayerEventListener;
|
||||||
import org.schabi.newpipe.player.helper.LockManager;
|
import org.schabi.newpipe.player.helper.LockManager;
|
||||||
import org.schabi.newpipe.player.helper.PlayerHelper;
|
import org.schabi.newpipe.player.helper.PlayerHelper;
|
||||||
import org.schabi.newpipe.player.old.PlayVideoActivity;
|
|
||||||
import org.schabi.newpipe.player.resolver.MediaSourceTag;
|
import org.schabi.newpipe.player.resolver.MediaSourceTag;
|
||||||
import org.schabi.newpipe.player.resolver.VideoPlaybackResolver;
|
import org.schabi.newpipe.player.resolver.VideoPlaybackResolver;
|
||||||
import org.schabi.newpipe.util.ListHelper;
|
import org.schabi.newpipe.util.ListHelper;
|
||||||
@ -80,7 +79,6 @@ import java.util.List;
|
|||||||
import static org.schabi.newpipe.player.BasePlayer.STATE_PLAYING;
|
import static org.schabi.newpipe.player.BasePlayer.STATE_PLAYING;
|
||||||
import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_DURATION;
|
import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_DURATION;
|
||||||
import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_HIDE_TIME;
|
import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_HIDE_TIME;
|
||||||
import static org.schabi.newpipe.player.helper.PlayerHelper.isUsingOldPlayer;
|
|
||||||
import static org.schabi.newpipe.util.AnimationUtils.animateView;
|
import static org.schabi.newpipe.util.AnimationUtils.animateView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -554,27 +552,17 @@ public final class PopupVideoPlayer extends Service {
|
|||||||
if (DEBUG) Log.d(TAG, "onFullScreenButtonClicked() called");
|
if (DEBUG) Log.d(TAG, "onFullScreenButtonClicked() called");
|
||||||
|
|
||||||
setRecovery();
|
setRecovery();
|
||||||
Intent intent;
|
final Intent intent = NavigationHelper.getPlayerIntent(
|
||||||
if (!isUsingOldPlayer(getApplicationContext())) {
|
context,
|
||||||
intent = NavigationHelper.getPlayerIntent(
|
MainVideoPlayer.class,
|
||||||
context,
|
this.getPlayQueue(),
|
||||||
MainVideoPlayer.class,
|
this.getRepeatMode(),
|
||||||
this.getPlayQueue(),
|
this.getPlaybackSpeed(),
|
||||||
this.getRepeatMode(),
|
this.getPlaybackPitch(),
|
||||||
this.getPlaybackSpeed(),
|
this.getPlaybackSkipSilence(),
|
||||||
this.getPlaybackPitch(),
|
this.getPlaybackQuality()
|
||||||
this.getPlaybackSkipSilence(),
|
);
|
||||||
this.getPlaybackQuality()
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
);
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
||||||
} else {
|
|
||||||
intent = new Intent(PopupVideoPlayer.this, PlayVideoActivity.class)
|
|
||||||
.putExtra(PlayVideoActivity.VIDEO_TITLE, getVideoTitle())
|
|
||||||
.putExtra(PlayVideoActivity.STREAM_URL, getSelectedVideoStream().getUrl())
|
|
||||||
.putExtra(PlayVideoActivity.VIDEO_URL, getVideoUrl())
|
|
||||||
.putExtra(PlayVideoActivity.START_POSITION, Math.round(getPlayer().getCurrentPosition() / 1000f));
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
||||||
}
|
|
||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
closePopup();
|
closePopup();
|
||||||
}
|
}
|
||||||
|
@ -177,10 +177,6 @@ public class PlayerHelper {
|
|||||||
return isBrightnessGestureEnabled(context, true);
|
return isBrightnessGestureEnabled(context, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isUsingOldPlayer(@NonNull final Context context) {
|
|
||||||
return isUsingOldPlayer(context, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isRememberingPopupDimensions(@NonNull final Context context) {
|
public static boolean isRememberingPopupDimensions(@NonNull final Context context) {
|
||||||
return isRememberingPopupDimensions(context, true);
|
return isRememberingPopupDimensions(context, true);
|
||||||
}
|
}
|
||||||
@ -318,10 +314,6 @@ public class PlayerHelper {
|
|||||||
return getPreferences(context).getBoolean(context.getString(R.string.brightness_gesture_control_key), b);
|
return getPreferences(context).getBoolean(context.getString(R.string.brightness_gesture_control_key), b);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isUsingOldPlayer(@NonNull final Context context, final boolean b) {
|
|
||||||
return getPreferences(context).getBoolean(context.getString(R.string.use_old_player_key), b);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean isRememberingPopupDimensions(@NonNull final Context context, final boolean b) {
|
private static boolean isRememberingPopupDimensions(@NonNull final Context context, final boolean b) {
|
||||||
return getPreferences(context).getBoolean(context.getString(R.string.popup_remember_size_pos_key), b);
|
return getPreferences(context).getBoolean(context.getString(R.string.popup_remember_size_pos_key), b);
|
||||||
}
|
}
|
||||||
|
@ -1,369 +0,0 @@
|
|||||||
package org.schabi.newpipe.player.old;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.content.pm.ActivityInfo;
|
|
||||||
import android.content.res.Configuration;
|
|
||||||
import android.media.AudioManager;
|
|
||||||
import android.media.MediaPlayer;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.support.v7.app.ActionBar;
|
|
||||||
import android.support.v7.app.AppCompatActivity;
|
|
||||||
import android.util.DisplayMetrics;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Display;
|
|
||||||
import android.view.KeyEvent;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.WindowManager;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.MediaController;
|
|
||||||
import android.widget.ProgressBar;
|
|
||||||
import android.widget.VideoView;
|
|
||||||
|
|
||||||
import org.schabi.newpipe.R;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org>
|
|
||||||
* PlayVideoActivity.java is part of NewPipe.
|
|
||||||
*
|
|
||||||
* NewPipe is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* NewPipe is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class PlayVideoActivity extends AppCompatActivity {
|
|
||||||
|
|
||||||
//// TODO: 11.09.15 add "choose stream" menu
|
|
||||||
|
|
||||||
private static final String TAG = PlayVideoActivity.class.toString();
|
|
||||||
public static final String VIDEO_URL = "video_url";
|
|
||||||
public static final String STREAM_URL = "stream_url";
|
|
||||||
public static final String VIDEO_TITLE = "video_title";
|
|
||||||
private static final String POSITION = "position";
|
|
||||||
public static final String START_POSITION = "start_position";
|
|
||||||
|
|
||||||
private static final long HIDING_DELAY = 3000;
|
|
||||||
|
|
||||||
private String videoUrl = "";
|
|
||||||
|
|
||||||
private ActionBar actionBar;
|
|
||||||
private VideoView videoView;
|
|
||||||
private int position;
|
|
||||||
private MediaController mediaController;
|
|
||||||
private ProgressBar progressBar;
|
|
||||||
private View decorView;
|
|
||||||
private boolean uiIsHidden;
|
|
||||||
private static long lastUiShowTime;
|
|
||||||
private boolean isLandscape = true;
|
|
||||||
private boolean hasSoftKeys;
|
|
||||||
|
|
||||||
private SharedPreferences prefs;
|
|
||||||
private static final String PREF_IS_LANDSCAPE = "is_landscape";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
|
|
||||||
setContentView(R.layout.activity_play_video);
|
|
||||||
setVolumeControlStream(AudioManager.STREAM_MUSIC);
|
|
||||||
|
|
||||||
//set background arrow style
|
|
||||||
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_arrow_back_white_24dp);
|
|
||||||
|
|
||||||
isLandscape = checkIfLandscape();
|
|
||||||
hasSoftKeys = checkIfHasSoftKeys();
|
|
||||||
|
|
||||||
actionBar = getSupportActionBar();
|
|
||||||
assert actionBar != null;
|
|
||||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
|
||||||
Intent intent = getIntent();
|
|
||||||
if(mediaController == null) {
|
|
||||||
//prevents back button hiding media controller controls (after showing them)
|
|
||||||
//instead of exiting video
|
|
||||||
//see http://stackoverflow.com/questions/6051825
|
|
||||||
//also solves https://github.com/theScrabi/NewPipe/issues/99
|
|
||||||
mediaController = new MediaController(this) {
|
|
||||||
@Override
|
|
||||||
public boolean dispatchKeyEvent(KeyEvent event) {
|
|
||||||
int keyCode = event.getKeyCode();
|
|
||||||
final boolean uniqueDown = event.getRepeatCount() == 0
|
|
||||||
&& event.getAction() == KeyEvent.ACTION_DOWN;
|
|
||||||
if (keyCode == KeyEvent.KEYCODE_BACK) {
|
|
||||||
if (uniqueDown)
|
|
||||||
{
|
|
||||||
if (isShowing()) {
|
|
||||||
finish();
|
|
||||||
} else {
|
|
||||||
hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return super.dispatchKeyEvent(event);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
position = intent.getIntExtra(START_POSITION, 0)*1000;//convert from seconds to milliseconds
|
|
||||||
|
|
||||||
videoView = findViewById(R.id.video_view);
|
|
||||||
progressBar = findViewById(R.id.play_video_progress_bar);
|
|
||||||
try {
|
|
||||||
videoView.setMediaController(mediaController);
|
|
||||||
videoView.setVideoURI(Uri.parse(intent.getStringExtra(STREAM_URL)));
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
videoView.requestFocus();
|
|
||||||
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
|
|
||||||
@Override
|
|
||||||
public void onPrepared(MediaPlayer mp) {
|
|
||||||
progressBar.setVisibility(View.GONE);
|
|
||||||
videoView.seekTo(position);
|
|
||||||
if (position <= 0) {
|
|
||||||
videoView.start();
|
|
||||||
showUi();
|
|
||||||
} else {
|
|
||||||
videoView.pause();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
videoUrl = intent.getStringExtra(VIDEO_URL);
|
|
||||||
|
|
||||||
Button button = findViewById(R.id.content_button);
|
|
||||||
button.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
if(uiIsHidden) {
|
|
||||||
showUi();
|
|
||||||
} else {
|
|
||||||
hideUi();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
decorView = getWindow().getDecorView();
|
|
||||||
decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void onSystemUiVisibilityChange(int visibility) {
|
|
||||||
if (visibility == View.VISIBLE && uiIsHidden) {
|
|
||||||
showUi();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (android.os.Build.VERSION.SDK_INT >= 17) {
|
|
||||||
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
|
||||||
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
|
||||||
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
prefs = getPreferences(Context.MODE_PRIVATE);
|
|
||||||
if(prefs.getBoolean(PREF_IS_LANDSCAPE, false) && !isLandscape) {
|
|
||||||
toggleOrientation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCreatePanelMenu(int featured, Menu menu) {
|
|
||||||
super.onCreatePanelMenu(featured, menu);
|
|
||||||
MenuInflater inflater = getMenuInflater();
|
|
||||||
inflater.inflate(R.menu.video_player, menu);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause() {
|
|
||||||
super.onPause();
|
|
||||||
videoView.pause();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDestroy() {
|
|
||||||
super.onDestroy();
|
|
||||||
prefs = getPreferences(Context.MODE_PRIVATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
int id = item.getItemId();
|
|
||||||
switch(id) {
|
|
||||||
case android.R.id.home:
|
|
||||||
finish();
|
|
||||||
break;
|
|
||||||
case R.id.menu_item_share:
|
|
||||||
Intent intent = new Intent();
|
|
||||||
intent.setAction(Intent.ACTION_SEND);
|
|
||||||
intent.putExtra(Intent.EXTRA_TEXT, videoUrl);
|
|
||||||
intent.setType("text/plain");
|
|
||||||
startActivity(Intent.createChooser(intent, getString(R.string.share_dialog_title)));
|
|
||||||
break;
|
|
||||||
case R.id.menu_item_screen_rotation:
|
|
||||||
toggleOrientation();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Log.e(TAG, "Error: MenuItem not known");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onConfigurationChanged(Configuration config) {
|
|
||||||
super.onConfigurationChanged(config);
|
|
||||||
|
|
||||||
if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
|
|
||||||
isLandscape = true;
|
|
||||||
adjustMediaControlMetrics();
|
|
||||||
} else if (config.orientation == Configuration.ORIENTATION_PORTRAIT){
|
|
||||||
isLandscape = false;
|
|
||||||
adjustMediaControlMetrics();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSaveInstanceState(Bundle savedInstanceState) {
|
|
||||||
super.onSaveInstanceState(savedInstanceState);
|
|
||||||
//savedInstanceState.putInt(POSITION, videoView.getCurrentPosition());
|
|
||||||
//videoView.pause();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRestoreInstanceState(Bundle savedInstanceState) {
|
|
||||||
super.onRestoreInstanceState(savedInstanceState);
|
|
||||||
position = savedInstanceState.getInt(POSITION);
|
|
||||||
//videoView.seekTo(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showUi() {
|
|
||||||
try {
|
|
||||||
uiIsHidden = false;
|
|
||||||
mediaController.show(100000);
|
|
||||||
actionBar.show();
|
|
||||||
adjustMediaControlMetrics();
|
|
||||||
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
|
||||||
Handler handler = new Handler();
|
|
||||||
handler.postDelayed(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if ((System.currentTimeMillis() - lastUiShowTime) >= HIDING_DELAY) {
|
|
||||||
hideUi();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, HIDING_DELAY);
|
|
||||||
lastUiShowTime = System.currentTimeMillis();
|
|
||||||
}catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void hideUi() {
|
|
||||||
uiIsHidden = true;
|
|
||||||
actionBar.hide();
|
|
||||||
mediaController.hide();
|
|
||||||
if (android.os.Build.VERSION.SDK_INT >= 17) {
|
|
||||||
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
|
||||||
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
|
||||||
| View.SYSTEM_UI_FLAG_FULLSCREEN
|
|
||||||
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
|
|
||||||
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
|
||||||
}
|
|
||||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
|
|
||||||
WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void adjustMediaControlMetrics() {
|
|
||||||
MediaController.LayoutParams mediaControllerLayout
|
|
||||||
= new MediaController.LayoutParams(MediaController.LayoutParams.MATCH_PARENT,
|
|
||||||
MediaController.LayoutParams.WRAP_CONTENT);
|
|
||||||
|
|
||||||
if(!hasSoftKeys) {
|
|
||||||
mediaControllerLayout.setMargins(20, 0, 20, 20);
|
|
||||||
} else {
|
|
||||||
int width = getNavigationBarWidth();
|
|
||||||
int height = getNavigationBarHeight();
|
|
||||||
mediaControllerLayout.setMargins(width + 20, 0, width + 20, height + 20);
|
|
||||||
}
|
|
||||||
mediaController.setLayoutParams(mediaControllerLayout);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean checkIfHasSoftKeys(){
|
|
||||||
return Build.VERSION.SDK_INT >= 17 ||
|
|
||||||
getNavigationBarHeight() != 0 ||
|
|
||||||
getNavigationBarWidth() != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getNavigationBarHeight() {
|
|
||||||
if(Build.VERSION.SDK_INT >= 17) {
|
|
||||||
Display d = getWindowManager().getDefaultDisplay();
|
|
||||||
|
|
||||||
DisplayMetrics realDisplayMetrics = new DisplayMetrics();
|
|
||||||
d.getRealMetrics(realDisplayMetrics);
|
|
||||||
DisplayMetrics displayMetrics = new DisplayMetrics();
|
|
||||||
d.getMetrics(displayMetrics);
|
|
||||||
|
|
||||||
int realHeight = realDisplayMetrics.heightPixels;
|
|
||||||
int displayHeight = displayMetrics.heightPixels;
|
|
||||||
return realHeight - displayHeight;
|
|
||||||
} else {
|
|
||||||
return 50;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getNavigationBarWidth() {
|
|
||||||
if(Build.VERSION.SDK_INT >= 17) {
|
|
||||||
Display d = getWindowManager().getDefaultDisplay();
|
|
||||||
|
|
||||||
DisplayMetrics realDisplayMetrics = new DisplayMetrics();
|
|
||||||
d.getRealMetrics(realDisplayMetrics);
|
|
||||||
DisplayMetrics displayMetrics = new DisplayMetrics();
|
|
||||||
d.getMetrics(displayMetrics);
|
|
||||||
|
|
||||||
int realWidth = realDisplayMetrics.widthPixels;
|
|
||||||
int displayWidth = displayMetrics.widthPixels;
|
|
||||||
return realWidth - displayWidth;
|
|
||||||
} else {
|
|
||||||
return 50;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean checkIfLandscape() {
|
|
||||||
DisplayMetrics displayMetrics = new DisplayMetrics();
|
|
||||||
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
|
|
||||||
return displayMetrics.heightPixels < displayMetrics.widthPixels;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void toggleOrientation() {
|
|
||||||
if(isLandscape) {
|
|
||||||
isLandscape = false;
|
|
||||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
|
||||||
} else {
|
|
||||||
isLandscape = true;
|
|
||||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
|
|
||||||
}
|
|
||||||
SharedPreferences.Editor editor = prefs.edit();
|
|
||||||
editor.putBoolean(PREF_IS_LANDSCAPE, isLandscape);
|
|
||||||
editor.apply();
|
|
||||||
}
|
|
||||||
}
|
|
@ -49,7 +49,6 @@ import org.schabi.newpipe.player.MainVideoPlayer;
|
|||||||
import org.schabi.newpipe.player.PopupVideoPlayer;
|
import org.schabi.newpipe.player.PopupVideoPlayer;
|
||||||
import org.schabi.newpipe.player.PopupVideoPlayerActivity;
|
import org.schabi.newpipe.player.PopupVideoPlayerActivity;
|
||||||
import org.schabi.newpipe.player.VideoPlayer;
|
import org.schabi.newpipe.player.VideoPlayer;
|
||||||
import org.schabi.newpipe.player.old.PlayVideoActivity;
|
|
||||||
import org.schabi.newpipe.player.playqueue.PlayQueue;
|
import org.schabi.newpipe.player.playqueue.PlayQueue;
|
||||||
import org.schabi.newpipe.settings.SettingsActivity;
|
import org.schabi.newpipe.settings.SettingsActivity;
|
||||||
|
|
||||||
@ -117,26 +116,6 @@ public class NavigationHelper {
|
|||||||
context.startActivity(playerIntent);
|
context.startActivity(playerIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void playOnOldVideoPlayer(Context context, StreamInfo info) {
|
|
||||||
ArrayList<VideoStream> videoStreamsList = new ArrayList<>(ListHelper.getSortedStreamVideosList(context, info.getVideoStreams(), null, false));
|
|
||||||
int index = ListHelper.getDefaultResolutionIndex(context, videoStreamsList);
|
|
||||||
|
|
||||||
if (index == -1) {
|
|
||||||
Toast.makeText(context, R.string.video_streams_empty, Toast.LENGTH_SHORT).show();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
VideoStream videoStream = videoStreamsList.get(index);
|
|
||||||
Intent intent = new Intent(context, PlayVideoActivity.class)
|
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
|
||||||
.putExtra(PlayVideoActivity.VIDEO_TITLE, info.getName())
|
|
||||||
.putExtra(PlayVideoActivity.STREAM_URL, videoStream.getUrl())
|
|
||||||
.putExtra(PlayVideoActivity.VIDEO_URL, info.getUrl())
|
|
||||||
.putExtra(PlayVideoActivity.START_POSITION, info.getStartPosition());
|
|
||||||
|
|
||||||
context.startActivity(intent);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void playOnPopupPlayer(final Context context, final PlayQueue queue) {
|
public static void playOnPopupPlayer(final Context context, final PlayQueue queue) {
|
||||||
if (!PermissionHelper.isPopupEnabled(context)) {
|
if (!PermissionHelper.isPopupEnabled(context)) {
|
||||||
PermissionHelper.showPopupEnablementToast(context);
|
PermissionHelper.showPopupEnablementToast(context);
|
||||||
|
@ -165,8 +165,6 @@
|
|||||||
<string name="audio">الصوت</string>
|
<string name="audio">الصوت</string>
|
||||||
<string name="retry">إعادة المحاولة</string>
|
<string name="retry">إعادة المحاولة</string>
|
||||||
<string name="storage_permission_denied">تم رفض إذن الوصول إلى التخزين</string>
|
<string name="storage_permission_denied">تم رفض إذن الوصول إلى التخزين</string>
|
||||||
<string name="use_old_player_title">استخدام المشغل القديم</string>
|
|
||||||
<string name="use_old_player_summary">المشغل القديم المدمج في إطار Mediaframework</string>
|
|
||||||
|
|
||||||
<string name="short_thousand">ألف</string>
|
<string name="short_thousand">ألف</string>
|
||||||
<string name="short_million">مليون</string>
|
<string name="short_million">مليون</string>
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
<string name="use_external_video_player_key" translatable="false">use_external_video_player</string>
|
<string name="use_external_video_player_key" translatable="false">use_external_video_player</string>
|
||||||
<string name="use_external_audio_player_key" translatable="false">use_external_audio_player</string>
|
<string name="use_external_audio_player_key" translatable="false">use_external_audio_player</string>
|
||||||
<string name="autoplay_through_intent_key" translatable="false">autoplay_through_intent</string>
|
<string name="autoplay_through_intent_key" translatable="false">autoplay_through_intent</string>
|
||||||
<string name="use_old_player_key" translatable="false">use_oldplayer</string>
|
|
||||||
|
|
||||||
<string name="volume_gesture_control_key" translatable="false">volume_gesture_control</string>
|
<string name="volume_gesture_control_key" translatable="false">volume_gesture_control</string>
|
||||||
<string name="brightness_gesture_control_key" translatable="false">brightness_gesture_control</string>
|
<string name="brightness_gesture_control_key" translatable="false">brightness_gesture_control</string>
|
||||||
|
@ -244,8 +244,6 @@
|
|||||||
<string name="audio">Audio</string>
|
<string name="audio">Audio</string>
|
||||||
<string name="retry">Retry</string>
|
<string name="retry">Retry</string>
|
||||||
<string name="storage_permission_denied">Storage access permission denied</string>
|
<string name="storage_permission_denied">Storage access permission denied</string>
|
||||||
<string name="use_old_player_title">Use old player</string>
|
|
||||||
<string name="use_old_player_summary">Old built-in Mediaframework player</string>
|
|
||||||
|
|
||||||
<string name="short_thousand">K</string>
|
<string name="short_thousand">K</string>
|
||||||
<string name="short_million">M</string>
|
<string name="short_million">M</string>
|
||||||
|
@ -29,12 +29,6 @@
|
|||||||
android:summary="@string/show_search_suggestions_summary"
|
android:summary="@string/show_search_suggestions_summary"
|
||||||
android:title="@string/show_search_suggestions_title"/>
|
android:title="@string/show_search_suggestions_title"/>
|
||||||
|
|
||||||
<SwitchPreference
|
|
||||||
android:defaultValue="false"
|
|
||||||
android:key="@string/auto_queue_key"
|
|
||||||
android:summary="@string/auto_queue_summary"
|
|
||||||
android:title="@string/auto_queue_title"/>
|
|
||||||
|
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:defaultValue="true"
|
android:defaultValue="true"
|
||||||
android:key="@string/download_thumbnail_key"
|
android:key="@string/download_thumbnail_key"
|
||||||
|
@ -64,12 +64,6 @@
|
|||||||
android:key="@string/use_external_audio_player_key"
|
android:key="@string/use_external_audio_player_key"
|
||||||
android:title="@string/use_external_audio_player_title"/>
|
android:title="@string/use_external_audio_player_title"/>
|
||||||
|
|
||||||
<SwitchPreference
|
|
||||||
android:defaultValue="false"
|
|
||||||
android:key="@string/use_old_player_key"
|
|
||||||
android:summary="@string/use_old_player_summary"
|
|
||||||
android:title="@string/use_old_player_title"/>
|
|
||||||
|
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="@string/show_play_with_kodi_key"
|
android:key="@string/show_play_with_kodi_key"
|
||||||
@ -98,6 +92,12 @@
|
|||||||
android:summary="@string/minimize_on_exit_summary"
|
android:summary="@string/minimize_on_exit_summary"
|
||||||
android:title="@string/minimize_on_exit_title"/>
|
android:title="@string/minimize_on_exit_title"/>
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="@string/auto_queue_key"
|
||||||
|
android:summary="@string/auto_queue_summary"
|
||||||
|
android:title="@string/auto_queue_title"/>
|
||||||
|
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="@string/resume_on_audio_focus_gain_key"
|
android:key="@string/resume_on_audio_focus_gain_key"
|
||||||
|
Loading…
Reference in New Issue
Block a user