diff --git a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java index e385cd52e9..6538160b8b 100644 --- a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java +++ b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java @@ -72,7 +72,7 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab this.context = context; this.player = player; this.updatePeriodMs = updatePeriodMs; - handler = Util.createHandler(); + handler = Util.createHandlerForCurrentOrMainLooper(); componentListener = new ComponentListener(); controlDispatcher = new DefaultControlDispatcher(); } diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java index b74ad9701f..f3edfa3545 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java @@ -437,7 +437,7 @@ public final class MediaSessionConnector { */ public MediaSessionConnector(MediaSessionCompat mediaSession) { this.mediaSession = mediaSession; - looper = Util.getLooper(); + looper = Util.getCurrentOrMainLooper(); componentListener = new ComponentListener(); commandReceivers = new ArrayList<>(); customCommandReceivers = new ArrayList<>(); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java b/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java index 09303c4a9c..96c2d3622a 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java @@ -399,8 +399,8 @@ public final class Util { *

If the current thread doesn't have a {@link Looper}, the application's main thread {@link * Looper} is used. */ - public static Handler createHandler() { - return createHandler(/* callback= */ null); + public static Handler createHandlerForCurrentOrMainLooper() { + return createHandlerForCurrentOrMainLooper(/* callback= */ null); } /** @@ -416,8 +416,9 @@ public final class Util { * callback is required. * @return A {@link Handler} with the specified callback on the current {@link Looper} thread. */ - public static Handler createHandler(@Nullable Handler.@UnknownInitialization Callback callback) { - return createHandler(getLooper(), callback); + public static Handler createHandlerForCurrentOrMainLooper( + @Nullable Handler.@UnknownInitialization Callback callback) { + return createHandler(getCurrentOrMainLooper(), callback); } /** @@ -441,8 +442,8 @@ public final class Util { * Returns the {@link Looper} associated with the current thread, or the {@link Looper} of the * application's main thread if the current thread doesn't have a {@link Looper}. */ - public static Looper getLooper() { - Looper myLooper = Looper.myLooper(); + public static Looper getCurrentOrMainLooper() { + @Nullable Looper myLooper = Looper.myLooper(); return myLooper != null ? myLooper : Looper.getMainLooper(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index b4cd9a399d..9990e77f3a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -209,7 +209,7 @@ public interface ExoPlayer extends Player { this.mediaSourceFactory = mediaSourceFactory; this.loadControl = loadControl; this.bandwidthMeter = bandwidthMeter; - looper = Util.getLooper(); + looper = Util.getCurrentOrMainLooper(); useLazyPreparation = true; seekParameters = SeekParameters.DEFAULT; clock = Clock.DEFAULT; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java index 2c07593aaa..dcdce89489 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java @@ -101,11 +101,7 @@ public final class ExoPlayerFactory { TrackSelector trackSelector, LoadControl loadControl) { return newSimpleInstance( - context, - renderersFactory, - trackSelector, - loadControl, - Util.getLooper()); + context, renderersFactory, trackSelector, loadControl, Util.getCurrentOrMainLooper()); } /** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */ @@ -124,7 +120,7 @@ public final class ExoPlayerFactory { loadControl, bandwidthMeter, new AnalyticsCollector(Clock.DEFAULT), - Util.getLooper()); + Util.getCurrentOrMainLooper()); } /** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */ @@ -142,7 +138,7 @@ public final class ExoPlayerFactory { trackSelector, loadControl, analyticsCollector, - Util.getLooper()); + Util.getCurrentOrMainLooper()); } /** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */ @@ -220,7 +216,8 @@ public final class ExoPlayerFactory { @SuppressWarnings("deprecation") public static ExoPlayer newInstance( Context context, Renderer[] renderers, TrackSelector trackSelector, LoadControl loadControl) { - return newInstance(context, renderers, trackSelector, loadControl, Util.getLooper()); + return newInstance( + context, renderers, trackSelector, loadControl, Util.getCurrentOrMainLooper()); } /** @deprecated Use {@link ExoPlayer.Builder} instead. */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java b/library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java index e690ea3626..cffad118ad 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java @@ -437,8 +437,8 @@ import java.util.Set; (source, timeline) -> mediaSourceListInfoListener.onPlaylistUpdateRequested(); ForwardingEventListener eventListener = new ForwardingEventListener(holder); childSources.put(holder, new MediaSourceAndListener(mediaSource, caller, eventListener)); - mediaSource.addEventListener(Util.createHandler(), eventListener); - mediaSource.addDrmEventListener(Util.createHandler(), eventListener); + mediaSource.addEventListener(Util.createHandlerForCurrentOrMainLooper(), eventListener); + mediaSource.addDrmEventListener(Util.createHandlerForCurrentOrMainLooper(), eventListener); mediaSource.prepareSource(caller, mediaTransferListener); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index d1f0cfc798..db2602ea85 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -199,7 +199,7 @@ public class SimpleExoPlayer extends BasePlayer this.loadControl = loadControl; this.bandwidthMeter = bandwidthMeter; this.analyticsCollector = analyticsCollector; - looper = Util.getLooper(); + looper = Util.getCurrentOrMainLooper(); audioAttributes = AudioAttributes.DEFAULT; wakeMode = C.WAKE_MODE_NONE; videoScalingMode = Renderer.VIDEO_SCALING_MODE_DEFAULT; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilitiesReceiver.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilitiesReceiver.java index 991ed9ee97..c9c78a7422 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilitiesReceiver.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilitiesReceiver.java @@ -65,7 +65,7 @@ public final class AudioCapabilitiesReceiver { context = context.getApplicationContext(); this.context = context; this.listener = Assertions.checkNotNull(listener); - handler = new Handler(Util.getLooper()); + handler = Util.createHandlerForCurrentOrMainLooper(); receiver = Util.SDK_INT >= 21 ? new HdmiAudioPlugBroadcastReceiver() : null; Uri externalSurroundSoundUri = AudioCapabilities.getExternalSurroundSoundGlobalSettingUri(); externalSurroundSoundSettingObserver = diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java index 11933e7834..51b939f6ce 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java @@ -156,7 +156,7 @@ public final class DownloadHelper { public static RendererCapabilities[] getRendererCapabilities(RenderersFactory renderersFactory) { Renderer[] renderers = renderersFactory.createRenderers( - Util.createHandler(), + Util.createHandlerForCurrentOrMainLooper(), new VideoRendererEventListener() {}, new AudioRendererEventListener() {}, (cues) -> {}, @@ -501,7 +501,7 @@ public final class DownloadHelper { this.rendererCapabilities = rendererCapabilities; this.scratchSet = new SparseIntArray(); trackSelector.init(/* listener= */ () -> {}, new DummyBandwidthMeter()); - callbackHandler = new Handler(Util.getLooper()); + callbackHandler = Util.createHandlerForCurrentOrMainLooper(); window = new Timeline.Window(); } @@ -970,7 +970,8 @@ public final class DownloadHelper { allocator = new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE); pendingMediaPeriods = new ArrayList<>(); @SuppressWarnings("methodref.receiver.bound.invalid") - Handler downloadThreadHandler = Util.createHandler(this::handleDownloadHelperCallbackMessage); + Handler downloadThreadHandler = + Util.createHandlerForCurrentOrMainLooper(this::handleDownloadHelperCallbackMessage); this.downloadHelperHandler = downloadThreadHandler; mediaSourceThread = new HandlerThread("ExoPlayer:DownloadHelper"); mediaSourceThread.start(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java index 12f8182980..50df4a0e8a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java @@ -228,7 +228,7 @@ public final class DownloadManager { listeners = new CopyOnWriteArraySet<>(); @SuppressWarnings("methodref.receiver.bound.invalid") - Handler mainHandler = Util.createHandler(this::handleMainMessage); + Handler mainHandler = Util.createHandlerForCurrentOrMainLooper(this::handleMainMessage); this.applicationHandler = mainHandler; HandlerThread internalThread = new HandlerThread("ExoPlayer:DownloadManager"); internalThread.start(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java index a0c08071db..527c51ea83 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java @@ -950,7 +950,7 @@ public abstract class DownloadService extends Service { // DownloadService.getForegroundNotification, and concrete subclass implementations may // not anticipate the possibility of this method being called before their onCreate // implementation has finished executing. - Util.createHandler() + Util.createHandlerForCurrentOrMainLooper() .postAtFrontOfQueue( () -> downloadService.notifyDownloads(downloadManager.getCurrentDownloads())); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/scheduler/RequirementsWatcher.java b/library/core/src/main/java/com/google/android/exoplayer2/scheduler/RequirementsWatcher.java index 849511ef3f..f0a9ae3efc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/scheduler/RequirementsWatcher.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/scheduler/RequirementsWatcher.java @@ -71,7 +71,7 @@ public final class RequirementsWatcher { this.context = context.getApplicationContext(); this.listener = listener; this.requirements = requirements; - handler = new Handler(Util.getLooper()); + handler = Util.createHandlerForCurrentOrMainLooper(); } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java index b742d3b431..6693e53abe 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java @@ -48,7 +48,7 @@ public abstract class CompositeMediaSource extends BaseMediaSource { @CallSuper protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) { this.mediaTransferListener = mediaTransferListener; - eventHandler = Util.createHandler(); + eventHandler = Util.createHandlerForCurrentOrMainLooper(); } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java index d879671c83..25283a0ecf 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java @@ -192,7 +192,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; .onContinueLoadingRequested(ProgressiveMediaPeriod.this); } }; - handler = Util.createHandler(); + handler = Util.createHandlerForCurrentOrMainLooper(); sampleQueueTrackIds = new TrackId[0]; sampleQueues = new SampleQueue[0]; pendingResetPositionUs = C.TIME_UNSET; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java index 27df9a66f3..3688c63ec1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java @@ -336,7 +336,7 @@ public final class AdsMediaSource extends CompositeMediaSource { * events on the external event listener thread. */ public ComponentListener() { - playerHandler = Util.createHandler(); + playerHandler = Util.createHandlerForCurrentOrMainLooper(); } /** Releases the component listener. */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index aefd52ab11..814937717e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -1763,7 +1763,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { private final Handler handler; public OnFrameRenderedListenerV23(MediaCodec codec) { - handler = Util.createHandler(/* callback= */ this); + handler = Util.createHandlerForCurrentOrMainLooper(/* callback= */ this); codec.setOnFrameRenderedListener(/* listener= */ this, handler); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/ClippingMediaSourceTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/ClippingMediaSourceTest.java index d3e85233e9..4f9331be62 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/ClippingMediaSourceTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/ClippingMediaSourceTest.java @@ -599,7 +599,7 @@ public final class ClippingMediaSourceTest { testRunner.runOnPlaybackThread( () -> clippingMediaSource.addEventListener( - Util.createHandler(), + Util.createHandlerForCurrentOrMainLooper(), new MediaSourceEventListener() { @Override public void onDownstreamFormatChanged( diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/ConcatenatingMediaSourceTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/ConcatenatingMediaSourceTest.java index cf2e3e879d..90e1eed47f 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/ConcatenatingMediaSourceTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/ConcatenatingMediaSourceTest.java @@ -412,7 +412,9 @@ public final class ConcatenatingMediaSourceTest { dummyMainThread.runOnMainThread( () -> mediaSource.addMediaSource( - createFakeMediaSource(), Util.createHandler(), runnableInvoked::countDown)); + createFakeMediaSource(), + Util.createHandlerForCurrentOrMainLooper(), + runnableInvoked::countDown)); runnableInvoked.await(MediaSourceTestRunner.TIMEOUT_MS, TimeUnit.MILLISECONDS); dummyMainThread.release(); @@ -428,7 +430,7 @@ public final class ConcatenatingMediaSourceTest { () -> mediaSource.addMediaSources( Arrays.asList(new MediaSource[] {createFakeMediaSource(), createFakeMediaSource()}), - Util.createHandler(), + Util.createHandlerForCurrentOrMainLooper(), runnableInvoked::countDown)); runnableInvoked.await(MediaSourceTestRunner.TIMEOUT_MS, TimeUnit.MILLISECONDS); dummyMainThread.release(); @@ -446,7 +448,7 @@ public final class ConcatenatingMediaSourceTest { mediaSource.addMediaSource( /* index */ 0, createFakeMediaSource(), - Util.createHandler(), + Util.createHandlerForCurrentOrMainLooper(), runnableInvoked::countDown)); runnableInvoked.await(MediaSourceTestRunner.TIMEOUT_MS, TimeUnit.MILLISECONDS); dummyMainThread.release(); @@ -464,7 +466,7 @@ public final class ConcatenatingMediaSourceTest { mediaSource.addMediaSources( /* index */ 0, Arrays.asList(new MediaSource[] {createFakeMediaSource(), createFakeMediaSource()}), - Util.createHandler(), + Util.createHandlerForCurrentOrMainLooper(), runnableInvoked::countDown)); runnableInvoked.await(MediaSourceTestRunner.TIMEOUT_MS, TimeUnit.MILLISECONDS); dummyMainThread.release(); @@ -481,7 +483,9 @@ public final class ConcatenatingMediaSourceTest { () -> { mediaSource.addMediaSource(createFakeMediaSource()); mediaSource.removeMediaSource( - /* index */ 0, Util.createHandler(), runnableInvoked::countDown); + /* index */ 0, + Util.createHandlerForCurrentOrMainLooper(), + runnableInvoked::countDown); }); runnableInvoked.await(MediaSourceTestRunner.TIMEOUT_MS, TimeUnit.MILLISECONDS); dummyMainThread.release(); @@ -499,7 +503,10 @@ public final class ConcatenatingMediaSourceTest { mediaSource.addMediaSources( Arrays.asList(new MediaSource[] {createFakeMediaSource(), createFakeMediaSource()})); mediaSource.moveMediaSource( - /* fromIndex */ 1, /* toIndex */ 0, Util.createHandler(), runnableInvoked::countDown); + /* fromIndex */ 1, /* toIndex */ + 0, + Util.createHandlerForCurrentOrMainLooper(), + runnableInvoked::countDown); }); runnableInvoked.await(MediaSourceTestRunner.TIMEOUT_MS, TimeUnit.MILLISECONDS); dummyMainThread.release(); @@ -516,7 +523,9 @@ public final class ConcatenatingMediaSourceTest { dummyMainThread.runOnMainThread( () -> mediaSource.addMediaSource( - createFakeMediaSource(), Util.createHandler(), timelineGrabber)); + createFakeMediaSource(), + Util.createHandlerForCurrentOrMainLooper(), + timelineGrabber)); Timeline timeline = timelineGrabber.assertTimelineChangeBlocking(); assertThat(timeline.getWindowCount()).isEqualTo(1); } finally { @@ -535,7 +544,7 @@ public final class ConcatenatingMediaSourceTest { mediaSource.addMediaSources( Arrays.asList( new MediaSource[] {createFakeMediaSource(), createFakeMediaSource()}), - Util.createHandler(), + Util.createHandlerForCurrentOrMainLooper(), timelineGrabber)); Timeline timeline = timelineGrabber.assertTimelineChangeBlocking(); assertThat(timeline.getWindowCount()).isEqualTo(2); @@ -553,7 +562,10 @@ public final class ConcatenatingMediaSourceTest { dummyMainThread.runOnMainThread( () -> mediaSource.addMediaSource( - /* index */ 0, createFakeMediaSource(), Util.createHandler(), timelineGrabber)); + /* index */ 0, + createFakeMediaSource(), + Util.createHandlerForCurrentOrMainLooper(), + timelineGrabber)); Timeline timeline = timelineGrabber.assertTimelineChangeBlocking(); assertThat(timeline.getWindowCount()).isEqualTo(1); } finally { @@ -573,7 +585,7 @@ public final class ConcatenatingMediaSourceTest { /* index */ 0, Arrays.asList( new MediaSource[] {createFakeMediaSource(), createFakeMediaSource()}), - Util.createHandler(), + Util.createHandlerForCurrentOrMainLooper(), timelineGrabber)); Timeline timeline = timelineGrabber.assertTimelineChangeBlocking(); assertThat(timeline.getWindowCount()).isEqualTo(2); @@ -593,7 +605,8 @@ public final class ConcatenatingMediaSourceTest { final TimelineGrabber timelineGrabber = new TimelineGrabber(testRunner); dummyMainThread.runOnMainThread( () -> - mediaSource.removeMediaSource(/* index */ 0, Util.createHandler(), timelineGrabber)); + mediaSource.removeMediaSource( + /* index */ 0, Util.createHandlerForCurrentOrMainLooper(), timelineGrabber)); Timeline timeline = timelineGrabber.assertTimelineChangeBlocking(); assertThat(timeline.getWindowCount()).isEqualTo(0); } finally { @@ -617,7 +630,10 @@ public final class ConcatenatingMediaSourceTest { dummyMainThread.runOnMainThread( () -> mediaSource.moveMediaSource( - /* fromIndex */ 1, /* toIndex */ 0, Util.createHandler(), timelineGrabber)); + /* fromIndex */ 1, /* toIndex */ + 0, + Util.createHandlerForCurrentOrMainLooper(), + timelineGrabber)); Timeline timeline = timelineGrabber.assertTimelineChangeBlocking(); assertThat(timeline.getWindowCount()).isEqualTo(2); } finally { @@ -638,7 +654,7 @@ public final class ConcatenatingMediaSourceTest { mediaSource.moveMediaSource( /* currentIndex= */ 0, /* newIndex= */ 1, - Util.createHandler(), + Util.createHandlerForCurrentOrMainLooper(), callbackCalledCondition::countDown); mediaSource.releaseSource(caller); }); @@ -890,7 +906,8 @@ public final class ConcatenatingMediaSourceTest { testRunner.prepareSource(); final TimelineGrabber timelineGrabber = new TimelineGrabber(testRunner); - dummyMainThread.runOnMainThread(() -> mediaSource.clear(Util.createHandler(), timelineGrabber)); + dummyMainThread.runOnMainThread( + () -> mediaSource.clear(Util.createHandlerForCurrentOrMainLooper(), timelineGrabber)); Timeline timeline = timelineGrabber.assertTimelineChangeBlocking(); assertThat(timeline.isEmpty()).isTrue(); @@ -1042,7 +1059,7 @@ public final class ConcatenatingMediaSourceTest { () -> mediaSource.setShuffleOrder( new ShuffleOrder.UnshuffledShuffleOrder(/* length= */ 0), - Util.createHandler(), + Util.createHandlerForCurrentOrMainLooper(), runnableInvoked::countDown)); runnableInvoked.await(MediaSourceTestRunner.TIMEOUT_MS, TimeUnit.MILLISECONDS); dummyMainThread.release(); @@ -1062,7 +1079,7 @@ public final class ConcatenatingMediaSourceTest { () -> mediaSource.setShuffleOrder( new ShuffleOrder.UnshuffledShuffleOrder(/* length= */ 3), - Util.createHandler(), + Util.createHandlerForCurrentOrMainLooper(), timelineGrabber)); Timeline timeline = timelineGrabber.assertTimelineChangeBlocking(); assertThat(timeline.getFirstWindowIndex(/* shuffleModeEnabled= */ true)).isEqualTo(0); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/util/MediaSourceEventDispatcherTest.java b/library/core/src/test/java/com/google/android/exoplayer2/util/MediaSourceEventDispatcherTest.java index 8d110a8776..debf839a43 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/util/MediaSourceEventDispatcherTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/util/MediaSourceEventDispatcherTest.java @@ -65,7 +65,9 @@ public class MediaSourceEventDispatcherTest { @Test public void listenerReceivesEventPopulatedWithMediaPeriodInfo() { eventDispatcher.addEventListener( - Util.createHandler(), mediaSourceEventListener, MediaSourceEventListener.class); + Util.createHandlerForCurrentOrMainLooper(), + mediaSourceEventListener, + MediaSourceEventListener.class); eventDispatcher.dispatch( MediaSourceEventListener::onMediaPeriodCreated, MediaSourceEventListener.class); @@ -76,9 +78,13 @@ public class MediaSourceEventDispatcherTest { @Test public void sameListenerObjectRegisteredTwiceOnlyReceivesEventsOnce() { eventDispatcher.addEventListener( - Util.createHandler(), mediaSourceEventListener, MediaSourceEventListener.class); + Util.createHandlerForCurrentOrMainLooper(), + mediaSourceEventListener, + MediaSourceEventListener.class); eventDispatcher.addEventListener( - Util.createHandler(), mediaSourceEventListener, MediaSourceEventListener.class); + Util.createHandlerForCurrentOrMainLooper(), + mediaSourceEventListener, + MediaSourceEventListener.class); eventDispatcher.dispatch( MediaSourceEventListener::onMediaPeriodCreated, MediaSourceEventListener.class); @@ -154,7 +160,9 @@ public class MediaSourceEventDispatcherTest { @Test public void listenersAreCopiedToNewDispatcher() { eventDispatcher.addEventListener( - Util.createHandler(), mediaSourceEventListener, MediaSourceEventListener.class); + Util.createHandlerForCurrentOrMainLooper(), + mediaSourceEventListener, + MediaSourceEventListener.class); MediaSource.MediaPeriodId newPeriodId = new MediaSource.MediaPeriodId("different uid"); MediaSourceEventDispatcher newEventDispatcher = @@ -170,7 +178,9 @@ public class MediaSourceEventDispatcherTest { @Test public void removingListenerStopsEventDispatch() { eventDispatcher.addEventListener( - Util.createHandler(), mediaSourceEventListener, MediaSourceEventListener.class); + Util.createHandlerForCurrentOrMainLooper(), + mediaSourceEventListener, + MediaSourceEventListener.class); eventDispatcher.removeEventListener(mediaSourceEventListener, MediaSourceEventListener.class); eventDispatcher.dispatch( @@ -182,7 +192,9 @@ public class MediaSourceEventDispatcherTest { @Test public void removingListenerWithDifferentTypeToRegistrationDoesntRemove() { eventDispatcher.addEventListener( - Util.createHandler(), mediaAndDrmEventListener, MediaSourceEventListener.class); + Util.createHandlerForCurrentOrMainLooper(), + mediaAndDrmEventListener, + MediaSourceEventListener.class); eventDispatcher.removeEventListener(mediaAndDrmEventListener, DrmSessionEventListener.class); eventDispatcher.dispatch( @@ -195,9 +207,13 @@ public class MediaSourceEventDispatcherTest { public void listenersAreCountedBasedOnListenerAndType() { // Add the listener twice and remove it once. eventDispatcher.addEventListener( - Util.createHandler(), mediaSourceEventListener, MediaSourceEventListener.class); + Util.createHandlerForCurrentOrMainLooper(), + mediaSourceEventListener, + MediaSourceEventListener.class); eventDispatcher.addEventListener( - Util.createHandler(), mediaSourceEventListener, MediaSourceEventListener.class); + Util.createHandlerForCurrentOrMainLooper(), + mediaSourceEventListener, + MediaSourceEventListener.class); eventDispatcher.removeEventListener(mediaSourceEventListener, MediaSourceEventListener.class); eventDispatcher.dispatch( diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index 747a24ca63..103b689dc2 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -680,7 +680,7 @@ public final class DashMediaSource extends BaseMediaSource { } else { dataSource = manifestDataSourceFactory.createDataSource(); loader = new Loader("Loader:DashMediaSource"); - handler = Util.createHandler(); + handler = Util.createHandlerForCurrentOrMainLooper(); startLoadingManifest(); } } diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java index 7888841e23..fed5ab74f5 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java @@ -105,7 +105,7 @@ public final class PlayerEmsgHandler implements Handler.Callback { this.allocator = allocator; manifestPublishTimeToExpiryTimeUs = new TreeMap<>(); - handler = Util.createHandler(/* callback= */ this); + handler = Util.createHandlerForCurrentOrMainLooper(/* callback= */ this); decoder = new EventMessageDecoder(); lastLoadedChunkEndTimeUs = C.TIME_UNSET; lastLoadedChunkEndTimeBeforeRefreshUs = C.TIME_UNSET; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 979b24f939..579af21bc4 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -227,7 +227,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @SuppressWarnings("nullness:methodref.receiver.bound.invalid") Runnable onTracksEndedRunnable = this::onTracksEnded; this.onTracksEndedRunnable = onTracksEndedRunnable; - handler = Util.createHandler(); + handler = Util.createHandlerForCurrentOrMainLooper(); lastSeekPositionUs = positionUs; pendingResetPositionUs = positionUs; } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java index d43284a211..2806a0bdd4 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java @@ -121,7 +121,7 @@ public final class DefaultHlsPlaylistTracker Uri initialPlaylistUri, EventDispatcher eventDispatcher, PrimaryPlaylistListener primaryPlaylistListener) { - this.playlistRefreshHandler = Util.createHandler(); + this.playlistRefreshHandler = Util.createHandlerForCurrentOrMainLooper(); this.eventDispatcher = eventDispatcher; this.primaryPlaylistListener = primaryPlaylistListener; ParsingLoadable masterPlaylistLoadable = diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java index 6b9a00b486..9f63a54650 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java @@ -620,7 +620,7 @@ public final class SsMediaSource extends BaseMediaSource manifestDataSource = manifestDataSourceFactory.createDataSource(); manifestLoader = new Loader("Loader:Manifest"); manifestLoaderErrorThrower = manifestLoader; - manifestRefreshHandler = Util.createHandler(); + manifestRefreshHandler = Util.createHandlerForCurrentOrMainLooper(); startLoadingManifest(); } } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java index 8fe58aa45b..5b8d501d00 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java @@ -602,7 +602,7 @@ public abstract class Action { } else { message.setPosition(positionMs); } - message.setHandler(Util.createHandler()); + message.setHandler(Util.createHandlerForCurrentOrMainLooper()); message.setDeleteAfterDelivery(deleteAfterDelivery); message.send(); } @@ -684,7 +684,7 @@ public abstract class Action { @Nullable Surface surface, HandlerWrapper handler, @Nullable ActionNode nextAction) { - Handler testThreadHandler = Util.createHandler(); + Handler testThreadHandler = Util.createHandlerForCurrentOrMainLooper(); // Schedule a message on the playback thread to ensure the player is paused immediately. player .createMessage( @@ -1048,7 +1048,7 @@ public abstract class Action { player .createMessage( (type, data) -> nextAction.schedule(player, trackSelector, surface, handler)) - .setHandler(Util.createHandler()) + .setHandler(Util.createHandlerForCurrentOrMainLooper()) .send(); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java index ea3c74f26f..d8dabf05b0 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java @@ -137,7 +137,8 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest { player.addAnalyticsListener(this); player.addAnalyticsListener(new EventLogger(trackSelector, tag)); // Schedule any pending actions. - actionHandler = Clock.DEFAULT.createHandler(Util.getLooper(), /* callback= */ null); + actionHandler = + Clock.DEFAULT.createHandler(Util.getCurrentOrMainLooper(), /* callback= */ null); if (pendingSchedule != null) { pendingSchedule.start(player, trackSelector, surface, actionHandler, /* callback= */ null); pendingSchedule = null; diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java index 35fd2d7f0e..4e3d15b43f 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java @@ -162,7 +162,7 @@ public class FakeMediaPeriod implements MediaPeriod { /* mediaEndTimeUs = */ C.TIME_UNSET); prepareCallback = callback; if (deferOnPrepared) { - playerHandler = Util.createHandler(); + playerHandler = Util.createHandlerForCurrentOrMainLooper(); } else { finishPreparation(); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSource.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSource.java index 2c5a471c58..ded1da49b9 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSource.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSource.java @@ -176,7 +176,7 @@ public class FakeMediaSource extends BaseMediaSource { drmSessionManager.prepare(); preparedSource = true; releasedSource = false; - sourceInfoRefreshHandler = Util.createHandler(); + sourceInfoRefreshHandler = Util.createHandlerForCurrentOrMainLooper(); if (timeline != null) { finishSourcePreparation(/* sendManifestLoadEvents= */ true); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayer.java index 139088aeb6..548c0a0ccf 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayer.java @@ -490,7 +490,7 @@ public class TestExoPlayer { AtomicBoolean receivedMessageCallback = new AtomicBoolean(false); player .createMessage((type, data) -> receivedMessageCallback.set(true)) - .setHandler(Util.createHandler()) + .setHandler(Util.createHandlerForCurrentOrMainLooper()) .send(); runMainLooperUntil(receivedMessageCallback::get); }