-Removed redundant track removal after playing.

-Reverted thumbnail loader to use ImageLoader.
This commit is contained in:
John Zhen M 2017-09-07 21:47:43 -07:00 committed by John Zhen Mo
parent 150c3b413a
commit 53cec61cdf
3 changed files with 17 additions and 76 deletions

View File

@ -173,11 +173,6 @@ public class BackgroundPlayer extends Service {
} }
private void setupNotification(RemoteViews remoteViews) { private void setupNotification(RemoteViews remoteViews) {
//if (videoThumbnail != null) remoteViews.setImageViewBitmap(R.id.notificationCover, videoThumbnail);
///else remoteViews.setImageViewResource(R.id.notificationCover, R.drawable.dummy_thumbnail);
// remoteViews.setTextViewText(R.id.notificationSongName, basePlayerImpl.getVideoTitle());
// remoteViews.setTextViewText(R.id.notificationArtist, basePlayerImpl.getUploaderName());
remoteViews.setOnClickPendingIntent(R.id.notificationPlayPause, remoteViews.setOnClickPendingIntent(R.id.notificationPlayPause,
PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_PLAY_PAUSE), PendingIntent.FLAG_UPDATE_CURRENT)); PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_PLAY_PAUSE), PendingIntent.FLAG_UPDATE_CURRENT));
remoteViews.setOnClickPendingIntent(R.id.notificationStop, remoteViews.setOnClickPendingIntent(R.id.notificationStop,
@ -213,7 +208,7 @@ public class BackgroundPlayer 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
*/ */
private synchronized void updateNotification(int drawableId) { private synchronized void updateNotification(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) {
if (notRemoteView != null) notRemoteView.setImageViewResource(R.id.notificationPlayPause, drawableId); if (notRemoteView != null) notRemoteView.setImageViewResource(R.id.notificationPlayPause, drawableId);
@ -287,14 +282,11 @@ public class BackgroundPlayer extends Service {
super.onThumbnailReceived(thumbnail); super.onThumbnailReceived(thumbnail);
if (thumbnail != null) { if (thumbnail != null) {
videoThumbnail = thumbnail;
// rebuild notification here since remote view does not release bitmaps, causing memory leaks // rebuild notification here since remote view does not release bitmaps, causing memory leaks
// remove this line to see for yourself
notBuilder = createNotification(); notBuilder = createNotification();
if (notRemoteView != null) notRemoteView.setImageViewBitmap(R.id.notificationCover, videoThumbnail); if (notRemoteView != null) notRemoteView.setImageViewBitmap(R.id.notificationCover, thumbnail);
if (bigNotRemoteView != null) bigNotRemoteView.setImageViewBitmap(R.id.notificationCover, videoThumbnail); if (bigNotRemoteView != null) bigNotRemoteView.setImageViewBitmap(R.id.notificationCover, thumbnail);
updateNotification(-1); updateNotification(-1);
} }

View File

@ -33,6 +33,7 @@ import android.net.Uri;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
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;
@ -64,6 +65,7 @@ import com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvicto
import com.google.android.exoplayer2.upstream.cache.SimpleCache; import com.google.android.exoplayer2.upstream.cache.SimpleCache;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import org.schabi.newpipe.Downloader; import org.schabi.newpipe.Downloader;
import org.schabi.newpipe.R; import org.schabi.newpipe.R;
@ -85,19 +87,15 @@ import java.util.ArrayList;
import java.util.Formatter; import java.util.Formatter;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.Single;
import io.reactivex.SingleObserver;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull; import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposable;
import io.reactivex.disposables.SerialDisposable; import io.reactivex.disposables.SerialDisposable;
import io.reactivex.functions.Consumer; import io.reactivex.functions.Consumer;
import io.reactivex.functions.Predicate; import io.reactivex.functions.Predicate;
import io.reactivex.schedulers.Schedulers;
/** /**
* Base for the players, joining the common properties * Base for the players, joining the common properties
@ -138,7 +136,6 @@ public abstract class BasePlayer implements Player.EventListener,
public static final String RESTORE_QUEUE_INDEX = "restore_queue_index"; public static final String RESTORE_QUEUE_INDEX = "restore_queue_index";
public static final String RESTORE_WINDOW_POS = "restore_window_pos"; public static final String RESTORE_WINDOW_POS = "restore_window_pos";
protected Bitmap videoThumbnail = null;
protected String videoUrl = ""; protected String videoUrl = "";
protected String videoTitle = ""; protected String videoTitle = "";
protected String videoThumbnailUrl = ""; protected String videoThumbnailUrl = "";
@ -168,11 +165,9 @@ public abstract class BasePlayer implements Player.EventListener,
protected final DefaultExtractorsFactory extractorsFactory = new DefaultExtractorsFactory(); protected final DefaultExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
protected final DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter(); protected final DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
protected int PROGRESS_LOOP_INTERVAL = 100; protected int PROGRESS_LOOP_INTERVAL = 500;
protected Disposable progressUpdateReactor; protected Disposable progressUpdateReactor;
protected SerialDisposable thumbnailReactor;
//////////////////////////////////////////////////////////////////////////*/ //////////////////////////////////////////////////////////////////////////*/
public BasePlayer(Context context) { public BasePlayer(Context context) {
@ -189,8 +184,6 @@ public abstract class BasePlayer implements Player.EventListener,
this.intentFilter = new IntentFilter(); this.intentFilter = new IntentFilter();
setupBroadcastReceiver(intentFilter); setupBroadcastReceiver(intentFilter);
context.registerReceiver(broadcastReceiver, intentFilter); context.registerReceiver(broadcastReceiver, intentFilter);
this.thumbnailReactor = new SerialDisposable();
} }
public void setup() { public void setup() {
@ -301,34 +294,20 @@ public abstract class BasePlayer implements Player.EventListener,
} }
public void initThumbnail(final String url) { public void initThumbnail(final String url) {
final Callable<Bitmap> bitmapCallable = new Callable<Bitmap>() { if (DEBUG) Log.d(TAG, "initThumbnail() called");
if (url == null || url.isEmpty()) return;
ImageLoader.getInstance().resume();
ImageLoader.getInstance().loadImage(url, new SimpleImageLoadingListener() {
@Override @Override
public Bitmap call() throws Exception { public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
return ImageLoader.getInstance().loadImageSync(url); if (simpleExoPlayer == null) return;
if (DEBUG) Log.d(TAG, "onLoadingComplete() called with: imageUri = [" + imageUri + "], view = [" + view + "], loadedImage = [" + loadedImage + "]");
onThumbnailReceived(loadedImage);
} }
}; });
Single.fromCallable(bitmapCallable)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<Bitmap>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
thumbnailReactor.set(d);
}
@Override
public void onSuccess(@NonNull Bitmap bitmap) {
onThumbnailReceived(bitmap);
}
@Override
public void onError(@NonNull Throwable e) {
Log.e(TAG, "Thumbnail Fetch Failed.", e);
}
});
} }
public void onThumbnailReceived(Bitmap thumbnail) { public void onThumbnailReceived(Bitmap thumbnail) {
if (DEBUG) Log.d(TAG, "onThumbnailReceived() called with: thumbnail = [" + thumbnail + "]"); if (DEBUG) Log.d(TAG, "onThumbnailReceived() called with: thumbnail = [" + thumbnail + "]");
} }
@ -351,10 +330,6 @@ public abstract class BasePlayer implements Player.EventListener,
destroyPlayer(); destroyPlayer();
unregisterBroadcastReceiver(); unregisterBroadcastReceiver();
thumbnailReactor.dispose();
thumbnailReactor = null;
videoThumbnail = null;
simpleExoPlayer = null; simpleExoPlayer = null;
} }
@ -891,14 +866,6 @@ public abstract class BasePlayer implements Player.EventListener,
isPrepared = prepared; isPrepared = prepared;
} }
public Bitmap getVideoThumbnail() {
return videoThumbnail;
}
public void setVideoThumbnail(Bitmap videoThumbnail) {
this.videoThumbnail = videoThumbnail;
}
public String getVideoThumbnailUrl() { public String getVideoThumbnailUrl() {
return videoThumbnailUrl; return videoThumbnailUrl;
} }

View File

@ -83,9 +83,6 @@ public class PlaybackManager {
public void refresh(final int newSourceIndex) { public void refresh(final int newSourceIndex) {
if (sourceToQueueIndex.indexOf(newSourceIndex) != -1 && newSourceIndex == getCurrentSourceIndex() + 1) { if (sourceToQueueIndex.indexOf(newSourceIndex) != -1 && newSourceIndex == getCurrentSourceIndex() + 1) {
playQueue.offsetIndex(+1); playQueue.offsetIndex(+1);
// free up some memory
if (sourceToQueueIndex.size() > 1) remove(sourceToQueueIndex.get(0));
} }
} }
@ -163,9 +160,7 @@ public class PlaybackManager {
remove(removeEvent.index()); remove(removeEvent.index());
break; break;
case MOVE: case MOVE:
final MoveEvent moveEvent = (MoveEvent) event; throw new UnsupportedOperationException("Move not yet supported");
move(moveEvent.getFrom(), moveEvent.getTo());
break;
default: default:
break; break;
} }
@ -340,17 +335,4 @@ public class PlaybackManager {
} }
} }
} }
private void move(final int source, final int target) {
final int sourceIndex = sourceToQueueIndex.indexOf(source);
final int targetIndex = sourceToQueueIndex.indexOf(target);
if (sourceIndex != -1 && targetIndex != -1) {
sources.moveMediaSource(sourceIndex, targetIndex);
} else if (sourceIndex != -1) {
remove(sourceIndex);
} else if (targetIndex != -1) {
remove(targetIndex);
}
}
} }