|
44 | 44 | import com.google.android.exoplayer2.drm.DummyExoMediaDrm;
|
45 | 45 | import com.google.android.exoplayer2.drm.FrameworkMediaDrm;
|
46 | 46 | import com.google.android.exoplayer2.drm.HttpMediaDrmCallback;
|
| 47 | +import com.google.android.exoplayer2.drm.LocalMediaDrmCallback; |
47 | 48 | import com.google.android.exoplayer2.drm.UnsupportedDrmException;
|
48 | 49 | import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
|
49 | 50 | import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
|
@@ -111,6 +112,7 @@ final class BetterPlayer {
|
111 | 112 | private WorkManager workManager;
|
112 | 113 | private HashMap<UUID, Observer<WorkInfo>> workerObserverMap;
|
113 | 114 | private CustomDefaultLoadControl customDefaultLoadControl;
|
| 115 | + private long lastSendBufferedPosition = 0L; |
114 | 116 |
|
115 | 117 |
|
116 | 118 | BetterPlayer(
|
@@ -147,7 +149,7 @@ void setDataSource(
|
147 | 149 | Context context, String key, String dataSource, String formatHint, Result result,
|
148 | 150 | Map<String, String> headers, boolean useCache, long maxCacheSize, long maxCacheFileSize,
|
149 | 151 | long overriddenDuration, String licenseUrl, Map<String, String> drmHeaders,
|
150 |
| - String cacheKey) { |
| 152 | + String cacheKey, String clearKey) { |
151 | 153 | this.key = key;
|
152 | 154 | isInitialized = false;
|
153 | 155 |
|
@@ -189,6 +191,16 @@ void setDataSource(
|
189 | 191 | .build(httpMediaDrmCallback);
|
190 | 192 | }
|
191 | 193 | }
|
| 194 | + } else if (clearKey != null && !clearKey.isEmpty()) { |
| 195 | + if (Util.SDK_INT < 18) { |
| 196 | + Log.e(TAG, "Protected content not supported on API levels below 18"); |
| 197 | + drmSessionManager = null; |
| 198 | + } else { |
| 199 | + drmSessionManager = new DefaultDrmSessionManager.Builder() |
| 200 | + .setUuidAndExoMediaDrmProvider(C.CLEARKEY_UUID, FrameworkMediaDrm.DEFAULT_PROVIDER). |
| 201 | + build(new LocalMediaDrmCallback(clearKey.getBytes())); |
| 202 | + } |
| 203 | + |
192 | 204 | } else {
|
193 | 205 | drmSessionManager = null;
|
194 | 206 | }
|
@@ -556,8 +568,9 @@ public void onCancel(Object o) {
|
556 | 568 | exoPlayer.addListener(new Player.Listener() {
|
557 | 569 | @Override
|
558 | 570 | public void onPlaybackStateChanged(int playbackState) {
|
| 571 | + |
559 | 572 | if (playbackState == Player.STATE_BUFFERING) {
|
560 |
| - sendBufferingUpdate(); |
| 573 | + sendBufferingUpdate(true); |
561 | 574 | Map<String, Object> event = new HashMap<>();
|
562 | 575 | event.put("event", "bufferingStart");
|
563 | 576 | eventSink.success(event);
|
@@ -590,13 +603,17 @@ public void onPlayerError(final ExoPlaybackException error) {
|
590 | 603 | result.success(reply);
|
591 | 604 | }
|
592 | 605 |
|
593 |
| - void sendBufferingUpdate() { |
594 |
| - Map<String, Object> event = new HashMap<>(); |
595 |
| - event.put("event", "bufferingUpdate"); |
596 |
| - List<? extends Number> range = Arrays.asList(0, exoPlayer.getBufferedPosition()); |
597 |
| - // iOS supports a list of buffered ranges, so here is a list with a single range. |
598 |
| - event.put("values", Collections.singletonList(range)); |
599 |
| - eventSink.success(event); |
| 606 | + void sendBufferingUpdate(boolean isFromBufferingStart) { |
| 607 | + long bufferedPosition = exoPlayer.getBufferedPosition(); |
| 608 | + if (isFromBufferingStart || bufferedPosition != lastSendBufferedPosition) { |
| 609 | + Map<String, Object> event = new HashMap<>(); |
| 610 | + event.put("event", "bufferingUpdate"); |
| 611 | + List<? extends Number> range = Arrays.asList(0, bufferedPosition); |
| 612 | + // iOS supports a list of buffered ranges, so here is a list with a single range. |
| 613 | + event.put("values", Collections.singletonList(range)); |
| 614 | + eventSink.success(event); |
| 615 | + lastSendBufferedPosition = bufferedPosition; |
| 616 | + } |
600 | 617 | }
|
601 | 618 |
|
602 | 619 | private void setAudioAttributes(SimpleExoPlayer exoPlayer, Boolean mixWithOthers) {
|
|
0 commit comments