mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-31 15:23:00 +00:00 
			
		
		
		
	Merge remote-tracking branch 'origin/master'
This commit is contained in:
		| @@ -67,7 +67,7 @@ dependencies { | |||||||
|     compile 'de.hdodenhof:circleimageview:2.0.0' |     compile 'de.hdodenhof:circleimageview:2.0.0' | ||||||
|     compile 'com.github.nirhart:parallaxscroll:1.0' |     compile 'com.github.nirhart:parallaxscroll:1.0' | ||||||
|     compile 'com.nononsenseapps:filepicker:3.0.0' |     compile 'com.nononsenseapps:filepicker:3.0.0' | ||||||
|     compile 'com.google.android.exoplayer:exoplayer:r2.4.2' |     compile 'com.google.android.exoplayer:exoplayer:r2.5.1' | ||||||
|  |  | ||||||
|     debugCompile 'com.facebook.stetho:stetho:1.5.0' |     debugCompile 'com.facebook.stetho:stetho:1.5.0' | ||||||
|     debugCompile 'com.facebook.stetho:stetho-urlconnection:1.5.0' |     debugCompile 'com.facebook.stetho:stetho-urlconnection:1.5.0' | ||||||
|   | |||||||
| @@ -1,7 +1,10 @@ | |||||||
| package org.schabi.newpipe; | package org.schabi.newpipe; | ||||||
|  |  | ||||||
| import android.app.Application; | import android.app.Application; | ||||||
|  | import android.app.NotificationChannel; | ||||||
|  | import android.app.NotificationManager; | ||||||
| import android.content.Context; | import android.content.Context; | ||||||
|  | import android.os.Build; | ||||||
|  |  | ||||||
| import com.facebook.stetho.Stetho; | import com.facebook.stetho.Stetho; | ||||||
| import com.nostra13.universalimageloader.core.ImageLoader; | import com.nostra13.universalimageloader.core.ImageLoader; | ||||||
| @@ -89,6 +92,8 @@ public class App extends Application { | |||||||
|         SettingsActivity.initSettings(this); |         SettingsActivity.initSettings(this); | ||||||
|  |  | ||||||
|         ThemeHelper.setTheme(getApplicationContext()); |         ThemeHelper.setTheme(getApplicationContext()); | ||||||
|  |  | ||||||
|  |         initNotificationChannel(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -112,4 +117,23 @@ public class App extends Application { | |||||||
|     public static boolean isUsingTor() { |     public static boolean isUsingTor() { | ||||||
|         return useTor; |         return useTor; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public void initNotificationChannel() { | ||||||
|  |         if (Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         final String id = getString(R.string.notification_channel_id); | ||||||
|  |         final CharSequence name = getString(R.string.notification_channel_name); | ||||||
|  |         final String description = getString(R.string.notification_channel_description); | ||||||
|  |  | ||||||
|  |         // Keep this below DEFAULT to avoid making noise on every notification update | ||||||
|  |         final int importance = NotificationManager.IMPORTANCE_LOW; | ||||||
|  |  | ||||||
|  |         NotificationChannel mChannel = new NotificationChannel(id, name, importance); | ||||||
|  |         mChannel.setDescription(description); | ||||||
|  |  | ||||||
|  |         NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); | ||||||
|  |         mNotificationManager.createNotificationChannel(mChannel); | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -145,13 +145,13 @@ public class BackgroundPlayer extends Service { | |||||||
|         setupNotification(notRemoteView); |         setupNotification(notRemoteView); | ||||||
|         setupNotification(bigNotRemoteView); |         setupNotification(bigNotRemoteView); | ||||||
|  |  | ||||||
|         NotificationCompat.Builder builder = new NotificationCompat.Builder(this) |         NotificationCompat.Builder builder = new NotificationCompat.Builder(this, getString(R.string.notification_channel_id)) | ||||||
|                 .setOngoing(true) |                 .setOngoing(true) | ||||||
|                 .setSmallIcon(R.drawable.ic_play_circle_filled_white_24dp) |                 .setSmallIcon(R.drawable.ic_play_circle_filled_white_24dp) | ||||||
|                 .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) |                 .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) | ||||||
|                 .setCustomContentView(notRemoteView) |                 .setCustomContentView(notRemoteView) | ||||||
|                 .setCustomBigContentView(bigNotRemoteView); |                 .setCustomBigContentView(bigNotRemoteView); | ||||||
|         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) builder.setPriority(Notification.PRIORITY_MAX); |         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) builder.setPriority(NotificationCompat.PRIORITY_MAX); | ||||||
|         return builder; |         return builder; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -342,6 +342,11 @@ public class BackgroundPlayer extends Service { | |||||||
|             // Disable default behavior |             // Disable default behavior | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         @Override | ||||||
|  |         public void onRepeatModeChanged(int i) { | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |  | ||||||
|         @Override |         @Override | ||||||
|         public void destroy() { |         public void destroy() { | ||||||
|             super.destroy(); |             super.destroy(); | ||||||
|   | |||||||
| @@ -19,10 +19,12 @@ import android.view.View; | |||||||
|  |  | ||||||
| import com.google.android.exoplayer2.C; | import com.google.android.exoplayer2.C; | ||||||
| import com.google.android.exoplayer2.DefaultLoadControl; | import com.google.android.exoplayer2.DefaultLoadControl; | ||||||
|  | import com.google.android.exoplayer2.DefaultRenderersFactory; | ||||||
| import com.google.android.exoplayer2.ExoPlaybackException; | import com.google.android.exoplayer2.ExoPlaybackException; | ||||||
| import com.google.android.exoplayer2.ExoPlayer; |  | ||||||
| import com.google.android.exoplayer2.ExoPlayerFactory; | import com.google.android.exoplayer2.ExoPlayerFactory; | ||||||
| import com.google.android.exoplayer2.PlaybackParameters; | import com.google.android.exoplayer2.PlaybackParameters; | ||||||
|  | import com.google.android.exoplayer2.Player; | ||||||
|  | import com.google.android.exoplayer2.RenderersFactory; | ||||||
| import com.google.android.exoplayer2.SimpleExoPlayer; | import com.google.android.exoplayer2.SimpleExoPlayer; | ||||||
| import com.google.android.exoplayer2.Timeline; | import com.google.android.exoplayer2.Timeline; | ||||||
| import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; | import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; | ||||||
| @@ -62,7 +64,7 @@ import java.util.concurrent.atomic.AtomicBoolean; | |||||||
|  * @author mauriciocolli |  * @author mauriciocolli | ||||||
|  */ |  */ | ||||||
| @SuppressWarnings({"WeakerAccess", "unused"}) | @SuppressWarnings({"WeakerAccess", "unused"}) | ||||||
| public abstract class BasePlayer implements ExoPlayer.EventListener, AudioManager.OnAudioFocusChangeListener { | public abstract class BasePlayer implements Player.EventListener, AudioManager.OnAudioFocusChangeListener { | ||||||
|     public static final boolean DEBUG = false; |     public static final boolean DEBUG = false; | ||||||
|     public static final String TAG = "BasePlayer"; |     public static final String TAG = "BasePlayer"; | ||||||
|  |  | ||||||
| @@ -158,7 +160,8 @@ public abstract class BasePlayer implements ExoPlayer.EventListener, AudioManage | |||||||
|         DefaultTrackSelector defaultTrackSelector = new DefaultTrackSelector(trackSelectionFactory); |         DefaultTrackSelector defaultTrackSelector = new DefaultTrackSelector(trackSelectionFactory); | ||||||
|         DefaultLoadControl loadControl = new DefaultLoadControl(); |         DefaultLoadControl loadControl = new DefaultLoadControl(); | ||||||
|  |  | ||||||
|         simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(context, defaultTrackSelector, loadControl); |         final RenderersFactory renderFactory = new DefaultRenderersFactory(context); | ||||||
|  |         simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(renderFactory, defaultTrackSelector, loadControl); | ||||||
|         simpleExoPlayer.addListener(this); |         simpleExoPlayer.addListener(this); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -220,7 +223,7 @@ public abstract class BasePlayer implements ExoPlayer.EventListener, AudioManage | |||||||
|         isPrepared = false; |         isPrepared = false; | ||||||
|         mediaSource = buildMediaSource(url, format); |         mediaSource = buildMediaSource(url, format); | ||||||
|  |  | ||||||
|         if (simpleExoPlayer.getPlaybackState() != ExoPlayer.STATE_IDLE) simpleExoPlayer.stop(); |         if (simpleExoPlayer.getPlaybackState() != Player.STATE_IDLE) simpleExoPlayer.stop(); | ||||||
|         if (videoStartPos > 0) simpleExoPlayer.seekTo(videoStartPos); |         if (videoStartPos > 0) simpleExoPlayer.seekTo(videoStartPos); | ||||||
|         simpleExoPlayer.prepare(mediaSource); |         simpleExoPlayer.prepare(mediaSource); | ||||||
|         simpleExoPlayer.setPlayWhenReady(autoPlay); |         simpleExoPlayer.setPlayWhenReady(autoPlay); | ||||||
| @@ -477,13 +480,13 @@ public abstract class BasePlayer implements ExoPlayer.EventListener, AudioManage | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         switch (playbackState) { |         switch (playbackState) { | ||||||
|             case ExoPlayer.STATE_IDLE: // 1 |             case Player.STATE_IDLE: // 1 | ||||||
|                 isPrepared = false; |                 isPrepared = false; | ||||||
|                 break; |                 break; | ||||||
|             case ExoPlayer.STATE_BUFFERING: // 2 |             case Player.STATE_BUFFERING: // 2 | ||||||
|                 if (isPrepared && getCurrentState() != STATE_LOADING) changeState(STATE_BUFFERING); |                 if (isPrepared && getCurrentState() != STATE_LOADING) changeState(STATE_BUFFERING); | ||||||
|                 break; |                 break; | ||||||
|             case ExoPlayer.STATE_READY: //3 |             case Player.STATE_READY: //3 | ||||||
|                 if (!isPrepared) { |                 if (!isPrepared) { | ||||||
|                     isPrepared = true; |                     isPrepared = true; | ||||||
|                     onPrepared(playWhenReady); |                     onPrepared(playWhenReady); | ||||||
| @@ -492,7 +495,7 @@ public abstract class BasePlayer implements ExoPlayer.EventListener, AudioManage | |||||||
|                 if (currentState == STATE_PAUSED_SEEK) break; |                 if (currentState == STATE_PAUSED_SEEK) break; | ||||||
|                 changeState(playWhenReady ? STATE_PLAYING : STATE_PAUSED); |                 changeState(playWhenReady ? STATE_PLAYING : STATE_PAUSED); | ||||||
|                 break; |                 break; | ||||||
|             case ExoPlayer.STATE_ENDED: // 4 |             case Player.STATE_ENDED: // 4 | ||||||
|                 changeState(STATE_COMPLETED); |                 changeState(STATE_COMPLETED); | ||||||
|                 isPrepared = false; |                 isPrepared = false; | ||||||
|                 break; |                 break; | ||||||
| @@ -569,7 +572,7 @@ public abstract class BasePlayer implements ExoPlayer.EventListener, AudioManage | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isPlaying() { |     public boolean isPlaying() { | ||||||
|         return simpleExoPlayer.getPlaybackState() == ExoPlayer.STATE_READY && simpleExoPlayer.getPlayWhenReady(); |         return simpleExoPlayer.getPlaybackState() == Player.STATE_READY && simpleExoPlayer.getPlayWhenReady(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /*////////////////////////////////////////////////////////////////////////// |     /*////////////////////////////////////////////////////////////////////////// | ||||||
| @@ -715,7 +718,7 @@ public abstract class BasePlayer implements ExoPlayer.EventListener, AudioManage | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isCompleted() { |     public boolean isCompleted() { | ||||||
|         return simpleExoPlayer != null && simpleExoPlayer.getPlaybackState() == ExoPlayer.STATE_ENDED; |         return simpleExoPlayer != null && simpleExoPlayer.getPlaybackState() == Player.STATE_ENDED; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isPrepared() { |     public boolean isPrepared() { | ||||||
|   | |||||||
| @@ -422,6 +422,11 @@ public class MainVideoPlayer extends Activity { | |||||||
|         public ImageButton getPlayPauseButton() { |         public ImageButton getPlayPauseButton() { | ||||||
|             return playPauseButton; |             return playPauseButton; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         @Override | ||||||
|  |         public void onRepeatModeChanged(int i) { | ||||||
|  |  | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private class MySimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener { |     private class MySimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener { | ||||||
|   | |||||||
| @@ -168,9 +168,11 @@ public class PopupVideoPlayer extends Service { | |||||||
|         float defaultSize = getResources().getDimension(R.dimen.popup_default_width); |         float defaultSize = getResources().getDimension(R.dimen.popup_default_width); | ||||||
|         popupWidth = popupRememberSizeAndPos ? sharedPreferences.getFloat(POPUP_SAVED_WIDTH, defaultSize) : defaultSize; |         popupWidth = popupRememberSizeAndPos ? sharedPreferences.getFloat(POPUP_SAVED_WIDTH, defaultSize) : defaultSize; | ||||||
|  |  | ||||||
|  |         final int layoutParamType = Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O ? WindowManager.LayoutParams.TYPE_PHONE : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; | ||||||
|  |  | ||||||
|         windowLayoutParams = new WindowManager.LayoutParams( |         windowLayoutParams = new WindowManager.LayoutParams( | ||||||
|                 (int) popupWidth, (int) getMinimumVideoHeight(popupWidth), |                 (int) popupWidth, (int) getMinimumVideoHeight(popupWidth), | ||||||
|                 WindowManager.LayoutParams.TYPE_PHONE, |                 layoutParamType, | ||||||
|                 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, |                 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, | ||||||
|                 PixelFormat.TRANSLUCENT); |                 PixelFormat.TRANSLUCENT); | ||||||
|         windowLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; |         windowLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; | ||||||
| @@ -225,7 +227,7 @@ public class PopupVideoPlayer extends Service { | |||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return new NotificationCompat.Builder(this) |         return new NotificationCompat.Builder(this, getString(R.string.notification_channel_id)) | ||||||
|                 .setOngoing(true) |                 .setOngoing(true) | ||||||
|                 .setSmallIcon(R.drawable.ic_play_arrow_white) |                 .setSmallIcon(R.drawable.ic_play_arrow_white) | ||||||
|                 .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) |                 .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) | ||||||
| @@ -429,7 +431,7 @@ public class PopupVideoPlayer extends Service { | |||||||
|                 hideControls(100, 0); |                 hideControls(100, 0); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| /*////////////////////////////////////////////////////////////////////////// |         /*////////////////////////////////////////////////////////////////////////// | ||||||
|         // Broadcast Receiver |         // Broadcast Receiver | ||||||
|         //////////////////////////////////////////////////////////////////////////*/ |         //////////////////////////////////////////////////////////////////////////*/ | ||||||
|  |  | ||||||
| @@ -509,6 +511,10 @@ public class PopupVideoPlayer extends Service { | |||||||
|         public TextView getResizingIndicator() { |         public TextView getResizingIndicator() { | ||||||
|             return resizingIndicator; |             return resizingIndicator; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         @Override | ||||||
|  |         public void onRepeatModeChanged(int i) { | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private class MySimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener { |     private class MySimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener { | ||||||
|   | |||||||
| @@ -27,6 +27,7 @@ import android.widget.SeekBar; | |||||||
| import android.widget.TextView; | import android.widget.TextView; | ||||||
|  |  | ||||||
| import com.google.android.exoplayer2.ExoPlayer; | import com.google.android.exoplayer2.ExoPlayer; | ||||||
|  | import com.google.android.exoplayer2.Player; | ||||||
| import com.google.android.exoplayer2.SimpleExoPlayer; | import com.google.android.exoplayer2.SimpleExoPlayer; | ||||||
| import com.google.android.exoplayer2.source.ExtractorMediaSource; | import com.google.android.exoplayer2.source.ExtractorMediaSource; | ||||||
| import com.google.android.exoplayer2.source.MediaSource; | import com.google.android.exoplayer2.source.MediaSource; | ||||||
| @@ -52,7 +53,7 @@ import static org.schabi.newpipe.util.AnimationUtils.animateView; | |||||||
|  * @author mauriciocolli |  * @author mauriciocolli | ||||||
|  */ |  */ | ||||||
| @SuppressWarnings({"WeakerAccess", "unused"}) | @SuppressWarnings({"WeakerAccess", "unused"}) | ||||||
| public abstract class VideoPlayer extends BasePlayer implements SimpleExoPlayer.VideoListener, SeekBar.OnSeekBarChangeListener, View.OnClickListener, ExoPlayer.EventListener, PopupMenu.OnMenuItemClickListener, PopupMenu.OnDismissListener { | public abstract class VideoPlayer extends BasePlayer implements SimpleExoPlayer.VideoListener, SeekBar.OnSeekBarChangeListener, View.OnClickListener, Player.EventListener, PopupMenu.OnMenuItemClickListener, PopupMenu.OnDismissListener { | ||||||
|     public static final boolean DEBUG = BasePlayer.DEBUG; |     public static final boolean DEBUG = BasePlayer.DEBUG; | ||||||
|     public final String TAG; |     public final String TAG; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -98,7 +98,7 @@ public class DownloadManagerService extends Service { | |||||||
|  |  | ||||||
|         Drawable icon = ContextCompat.getDrawable(this, R.mipmap.ic_launcher); |         Drawable icon = ContextCompat.getDrawable(this, R.mipmap.ic_launcher); | ||||||
|  |  | ||||||
|         Builder builder = new Builder(this) |         Builder builder = new Builder(this, getString(R.string.notification_channel_id)) | ||||||
|                 .setContentIntent(pendingIntent) |                 .setContentIntent(pendingIntent) | ||||||
|                 .setSmallIcon(android.R.drawable.stat_sys_download) |                 .setSmallIcon(android.R.drawable.stat_sys_download) | ||||||
|                 .setLargeIcon(((BitmapDrawable) icon).getBitmap()) |                 .setLargeIcon(((BitmapDrawable) icon).getBitmap()) | ||||||
|   | |||||||
| @@ -117,6 +117,10 @@ | |||||||
|     <string name="popup_resizing_indicator_title">Resizing</string> |     <string name="popup_resizing_indicator_title">Resizing</string> | ||||||
|     <string name="best_resolution">Best resolution</string> |     <string name="best_resolution">Best resolution</string> | ||||||
|  |  | ||||||
|  |     <string name="notification_channel_id" translatable="false">newpipe</string> | ||||||
|  |     <string name="notification_channel_name">NewPipe Notification</string> | ||||||
|  |     <string name="notification_channel_description">Notifications For NewPipe Background and Popup Players</string> | ||||||
|  |  | ||||||
|     <!-- error strings --> |     <!-- error strings --> | ||||||
|     <string name="general_error">Error</string> |     <string name="general_error">Error</string> | ||||||
|     <string name="network_error">Network error</string> |     <string name="network_error">Network error</string> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Weblate
					Weblate