Commit b22783f8 by bachinger Committed by Oliver Woodman

Rename sourceUri to uri

PiperOrigin-RevId: 308918151
parent 284b843d
Showing with 119 additions and 151 deletions
......@@ -41,19 +41,19 @@ import java.util.List;
// Clear content.
samples.add(
new MediaItem.Builder()
.setSourceUri("https://storage.googleapis.com/wvmedia/clear/h264/tears/tears.mpd")
.setUri("https://storage.googleapis.com/wvmedia/clear/h264/tears/tears.mpd")
.setMediaMetadata(new MediaMetadata.Builder().setTitle("Clear DASH: Tears").build())
.setMimeType(MIME_TYPE_DASH)
.build());
samples.add(
new MediaItem.Builder()
.setSourceUri("https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/hls.m3u8")
.setUri("https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/hls.m3u8")
.setMediaMetadata(new MediaMetadata.Builder().setTitle("Clear HLS: Angel one").build())
.setMimeType(MIME_TYPE_HLS)
.build());
samples.add(
new MediaItem.Builder()
.setSourceUri("https://html5demos.com/assets/dizzy.mp4")
.setUri("https://html5demos.com/assets/dizzy.mp4")
.setMediaMetadata(new MediaMetadata.Builder().setTitle("Clear MP4: Dizzy").build())
.setMimeType(MIME_TYPE_VIDEO_MP4)
.build());
......@@ -61,8 +61,7 @@ import java.util.List;
// DRM content.
samples.add(
new MediaItem.Builder()
.setSourceUri(
Uri.parse("https://storage.googleapis.com/wvmedia/cenc/h264/tears/tears.mpd"))
.setUri(Uri.parse("https://storage.googleapis.com/wvmedia/cenc/h264/tears/tears.mpd"))
.setMediaMetadata(
new MediaMetadata.Builder().setTitle("Widevine DASH cenc: Tears").build())
.setMimeType(MIME_TYPE_DASH)
......@@ -71,8 +70,7 @@ import java.util.List;
.build());
samples.add(
new MediaItem.Builder()
.setSourceUri(
"https://storage.googleapis.com/wvmedia/cbc1/h264/tears/tears_aes_cbc1.mpd")
.setUri("https://storage.googleapis.com/wvmedia/cbc1/h264/tears/tears_aes_cbc1.mpd")
.setMediaMetadata(
new MediaMetadata.Builder().setTitle("Widevine DASH cbc1: Tears").build())
.setMimeType(MIME_TYPE_DASH)
......@@ -81,8 +79,7 @@ import java.util.List;
.build());
samples.add(
new MediaItem.Builder()
.setSourceUri(
"https://storage.googleapis.com/wvmedia/cbcs/h264/tears/tears_aes_cbcs.mpd")
.setUri("https://storage.googleapis.com/wvmedia/cbcs/h264/tears/tears_aes_cbcs.mpd")
.setMediaMetadata(
new MediaMetadata.Builder().setTitle("Widevine DASH cbcs: Tears").build())
.setMimeType(MIME_TYPE_DASH)
......
......@@ -85,7 +85,7 @@ public class DownloadTracker {
}
public boolean isDownloaded(MediaItem mediaItem) {
Download download = downloads.get(checkNotNull(mediaItem.playbackProperties).sourceUri);
Download download = downloads.get(checkNotNull(mediaItem.playbackProperties).uri);
return download != null && download.state != Download.STATE_FAILED;
}
......@@ -96,7 +96,7 @@ public class DownloadTracker {
public void toggleDownload(
FragmentManager fragmentManager, MediaItem mediaItem, RenderersFactory renderersFactory) {
Download download = downloads.get(checkNotNull(mediaItem.playbackProperties).sourceUri);
Download download = downloads.get(checkNotNull(mediaItem.playbackProperties).uri);
if (download != null) {
DownloadService.sendRemoveDownload(
context, DemoDownloadService.class, download.request.id, /* foreground= */ false);
......@@ -125,20 +125,19 @@ public class DownloadTracker {
MediaItem.PlaybackProperties playbackProperties = checkNotNull(mediaItem.playbackProperties);
@C.ContentType
int type =
Util.inferContentTypeWithMimeType(
playbackProperties.sourceUri, playbackProperties.mimeType);
Util.inferContentTypeWithMimeType(playbackProperties.uri, playbackProperties.mimeType);
switch (type) {
case C.TYPE_DASH:
return DownloadHelper.forDash(
context, playbackProperties.sourceUri, dataSourceFactory, renderersFactory);
context, playbackProperties.uri, dataSourceFactory, renderersFactory);
case C.TYPE_SS:
return DownloadHelper.forSmoothStreaming(
context, playbackProperties.sourceUri, dataSourceFactory, renderersFactory);
context, playbackProperties.uri, dataSourceFactory, renderersFactory);
case C.TYPE_HLS:
return DownloadHelper.forHls(
context, playbackProperties.sourceUri, dataSourceFactory, renderersFactory);
context, playbackProperties.uri, dataSourceFactory, renderersFactory);
case C.TYPE_OTHER:
return DownloadHelper.forProgressive(context, playbackProperties.sourceUri);
return DownloadHelper.forProgressive(context, playbackProperties.uri);
default:
throw new IllegalStateException("Unsupported type: " + type);
}
......
......@@ -125,14 +125,14 @@ public class IntentUtil {
if (mediaItems.size() == 1) {
MediaItem.PlaybackProperties playbackProperties =
checkNotNull(mediaItems.get(0).playbackProperties);
intent.setAction(IntentUtil.ACTION_VIEW).setData(playbackProperties.sourceUri);
intent.setAction(IntentUtil.ACTION_VIEW).setData(playbackProperties.uri);
addPlaybackPropertiesToIntent(playbackProperties, intent, /* extrasKeySuffix= */ "");
} else {
intent.setAction(IntentUtil.ACTION_VIEW_LIST);
for (int i = 0; i < mediaItems.size(); i++) {
MediaItem.PlaybackProperties playbackProperties =
checkNotNull(mediaItems.get(i).playbackProperties);
intent.putExtra(IntentUtil.URI_EXTRA + ("_" + i), playbackProperties.sourceUri.toString());
intent.putExtra(IntentUtil.URI_EXTRA + ("_" + i), playbackProperties.uri.toString());
addPlaybackPropertiesToIntent(playbackProperties, intent, /* extrasKeySuffix= */ "_" + i);
}
}
......@@ -165,7 +165,7 @@ public class IntentUtil {
}
MediaItem.Builder builder =
new MediaItem.Builder()
.setSourceUri(uri)
.setUri(uri)
.setStreamKeys(downloadRequest != null ? downloadRequest.streamKeys : null)
.setCustomCacheKey(downloadRequest != null ? downloadRequest.customCacheKey : null)
.setMimeType(mimeType)
......
......@@ -278,7 +278,7 @@ public class SampleChooserActivity extends AppCompatActivity
if (playbackProperties.adTagUri != null) {
return R.string.download_ads_unsupported;
}
String scheme = playbackProperties.sourceUri.getScheme();
String scheme = playbackProperties.uri.getScheme();
if (!("http".equals(scheme) || "https".equals(scheme))) {
return R.string.download_scheme_unsupported;
}
......@@ -457,7 +457,7 @@ public class SampleChooserActivity extends AppCompatActivity
return new PlaylistHolder(title, mediaItems);
} else {
mediaItem
.setSourceUri(uri)
.setUri(uri)
.setMediaMetadata(new MediaMetadata.Builder().setTitle(title).build())
.setMimeType(IntentUtil.inferAdaptiveStreamMimeType(uri, extension))
.setTag(new IntentUtil.Tag(isLive, sphericalStereoMode));
......
......@@ -59,7 +59,7 @@ public final class DefaultMediaItemConverter implements MediaItemConverter {
metadata.putString(MediaMetadata.KEY_TITLE, item.mediaMetadata.title);
}
MediaInfo mediaInfo =
new MediaInfo.Builder(item.playbackProperties.sourceUri.toString())
new MediaInfo.Builder(item.playbackProperties.uri.toString())
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setContentType(item.playbackProperties.mimeType)
.setMetadata(metadata)
......@@ -74,7 +74,7 @@ public final class DefaultMediaItemConverter implements MediaItemConverter {
try {
JSONObject mediaItemJson = customData.getJSONObject(KEY_MEDIA_ITEM);
MediaItem.Builder builder = new MediaItem.Builder();
builder.setSourceUri(Uri.parse(mediaItemJson.getString(KEY_URI)));
builder.setUri(Uri.parse(mediaItemJson.getString(KEY_URI)));
if (mediaItemJson.has(KEY_TITLE)) {
com.google.android.exoplayer2.MediaMetadata mediaMetadata =
new com.google.android.exoplayer2.MediaMetadata.Builder()
......@@ -127,7 +127,7 @@ public final class DefaultMediaItemConverter implements MediaItemConverter {
Assertions.checkNotNull(mediaItem.playbackProperties);
JSONObject json = new JSONObject();
json.put(KEY_TITLE, mediaItem.mediaMetadata.title);
json.put(KEY_URI, mediaItem.playbackProperties.sourceUri.toString());
json.put(KEY_URI, mediaItem.playbackProperties.uri.toString());
json.put(KEY_MIME_TYPE, mediaItem.playbackProperties.mimeType);
if (mediaItem.playbackProperties.drmConfiguration != null) {
json.put(
......
......@@ -232,36 +232,30 @@ public class CastPlayerTest {
@Test
public void setMediaItems_callsRemoteMediaClient() {
List<MediaItem> mediaItems = new ArrayList<>();
String sourceUri1 = "http://www.google.com/video1";
String sourceUri2 = "http://www.google.com/video2";
String uri1 = "http://www.google.com/video1";
String uri2 = "http://www.google.com/video2";
mediaItems.add(
new MediaItem.Builder()
.setSourceUri(sourceUri1)
.setMimeType(MimeTypes.APPLICATION_MPD)
.build());
new MediaItem.Builder().setUri(uri1).setMimeType(MimeTypes.APPLICATION_MPD).build());
mediaItems.add(
new MediaItem.Builder()
.setSourceUri(sourceUri2)
.setMimeType(MimeTypes.APPLICATION_MP4)
.build());
new MediaItem.Builder().setUri(uri2).setMimeType(MimeTypes.APPLICATION_MP4).build());
castPlayer.setMediaItems(mediaItems, /* startWindowIndex= */ 1, /* startPositionMs= */ 2000L);
verify(mockRemoteMediaClient)
.queueLoad(queueItemsArgumentCaptor.capture(), eq(1), anyInt(), eq(2000L), any());
MediaQueueItem[] mediaQueueItems = queueItemsArgumentCaptor.getValue();
assertThat(mediaQueueItems[0].getMedia().getContentId()).isEqualTo(sourceUri1);
assertThat(mediaQueueItems[1].getMedia().getContentId()).isEqualTo(sourceUri2);
assertThat(mediaQueueItems[0].getMedia().getContentId()).isEqualTo(uri1);
assertThat(mediaQueueItems[1].getMedia().getContentId()).isEqualTo(uri2);
}
@Test
public void setMediaItems_doNotReset_callsRemoteMediaClient() {
MediaItem.Builder builder = new MediaItem.Builder();
List<MediaItem> mediaItems = new ArrayList<>();
String sourceUri1 = "http://www.google.com/video1";
String sourceUri2 = "http://www.google.com/video2";
mediaItems.add(builder.setSourceUri(sourceUri1).setMimeType(MimeTypes.APPLICATION_MPD).build());
mediaItems.add(builder.setSourceUri(sourceUri2).setMimeType(MimeTypes.APPLICATION_MP4).build());
String uri1 = "http://www.google.com/video1";
String uri2 = "http://www.google.com/video2";
mediaItems.add(builder.setUri(uri1).setMimeType(MimeTypes.APPLICATION_MPD).build());
mediaItems.add(builder.setUri(uri2).setMimeType(MimeTypes.APPLICATION_MP4).build());
int startWindowIndex = C.INDEX_UNSET;
long startPositionMs = 2000L;
......@@ -271,18 +265,18 @@ public class CastPlayerTest {
.queueLoad(queueItemsArgumentCaptor.capture(), eq(0), anyInt(), eq(0L), any());
MediaQueueItem[] mediaQueueItems = queueItemsArgumentCaptor.getValue();
assertThat(mediaQueueItems[0].getMedia().getContentId()).isEqualTo(sourceUri1);
assertThat(mediaQueueItems[1].getMedia().getContentId()).isEqualTo(sourceUri2);
assertThat(mediaQueueItems[0].getMedia().getContentId()).isEqualTo(uri1);
assertThat(mediaQueueItems[1].getMedia().getContentId()).isEqualTo(uri2);
}
@Test
public void addMediaItems_callsRemoteMediaClient() {
MediaItem.Builder builder = new MediaItem.Builder();
List<MediaItem> mediaItems = new ArrayList<>();
String sourceUri1 = "http://www.google.com/video1";
String sourceUri2 = "http://www.google.com/video2";
mediaItems.add(builder.setSourceUri(sourceUri1).setMimeType(MimeTypes.APPLICATION_MPD).build());
mediaItems.add(builder.setSourceUri(sourceUri2).setMimeType(MimeTypes.APPLICATION_MP4).build());
String uri1 = "http://www.google.com/video1";
String uri2 = "http://www.google.com/video2";
mediaItems.add(builder.setUri(uri1).setMimeType(MimeTypes.APPLICATION_MPD).build());
mediaItems.add(builder.setUri(uri2).setMimeType(MimeTypes.APPLICATION_MP4).build());
castPlayer.addMediaItems(mediaItems);
......@@ -291,8 +285,8 @@ public class CastPlayerTest {
queueItemsArgumentCaptor.capture(), eq(MediaQueueItem.INVALID_ITEM_ID), any());
MediaQueueItem[] mediaQueueItems = queueItemsArgumentCaptor.getValue();
assertThat(mediaQueueItems[0].getMedia().getContentId()).isEqualTo(sourceUri1);
assertThat(mediaQueueItems[1].getMedia().getContentId()).isEqualTo(sourceUri2);
assertThat(mediaQueueItems[0].getMedia().getContentId()).isEqualTo(uri1);
assertThat(mediaQueueItems[1].getMedia().getContentId()).isEqualTo(uri2);
}
@SuppressWarnings("ConstantConditions")
......@@ -301,12 +295,9 @@ public class CastPlayerTest {
int[] mediaQueueItemIds = createMediaQueueItemIds(/* numberOfIds= */ 2);
List<MediaItem> mediaItems = createMediaItems(mediaQueueItemIds);
fillTimeline(mediaItems, mediaQueueItemIds);
String sourceUri = "http://www.google.com/video3";
String uri = "http://www.google.com/video3";
MediaItem anotherMediaItem =
new MediaItem.Builder()
.setSourceUri(sourceUri)
.setMimeType(MimeTypes.APPLICATION_MPD)
.build();
new MediaItem.Builder().setUri(uri).setMimeType(MimeTypes.APPLICATION_MPD).build();
// Add another on position 1
int index = 1;
......@@ -319,7 +310,7 @@ public class CastPlayerTest {
any());
MediaQueueItem[] mediaQueueItems = queueItemsArgumentCaptor.getValue();
assertThat(mediaQueueItems[0].getMedia().getContentId()).isEqualTo(sourceUri);
assertThat(mediaQueueItems[0].getMedia().getContentId()).isEqualTo(uri);
}
@Test
......@@ -477,7 +468,7 @@ public class CastPlayerTest {
for (int mediaQueueItemId : mediaQueueItemIds) {
MediaItem mediaItem =
builder
.setSourceUri("http://www.google.com/video" + mediaQueueItemId)
.setUri("http://www.google.com/video" + mediaQueueItemId)
.setMimeType(MimeTypes.APPLICATION_MPD)
.setTag(mediaQueueItemId)
.build();
......
......@@ -36,7 +36,7 @@ public class DefaultMediaItemConverterTest {
public void serialize_deserialize_minimal() {
MediaItem.Builder builder = new MediaItem.Builder();
MediaItem item =
builder.setSourceUri("http://example.com").setMimeType(MimeTypes.APPLICATION_MPD).build();
builder.setUri("http://example.com").setMimeType(MimeTypes.APPLICATION_MPD).build();
DefaultMediaItemConverter converter = new DefaultMediaItemConverter();
MediaQueueItem queueItem = converter.toMediaQueueItem(item);
......@@ -50,7 +50,7 @@ public class DefaultMediaItemConverterTest {
MediaItem.Builder builder = new MediaItem.Builder();
MediaItem item =
builder
.setSourceUri(Uri.parse("http://example.com"))
.setUri(Uri.parse("http://example.com"))
.setMediaMetadata(new MediaMetadata.Builder().build())
.setMimeType(MimeTypes.APPLICATION_MPD)
.setDrmUuid(C.WIDEVINE_UUID)
......
......@@ -213,7 +213,7 @@ public final class Util {
if (mediaItem.playbackProperties == null) {
continue;
}
if (isLocalFileUri(mediaItem.playbackProperties.sourceUri)) {
if (isLocalFileUri(mediaItem.playbackProperties.uri)) {
return requestExternalStoragePermission(activity);
}
for (int i = 0; i < mediaItem.playbackProperties.subtitles.size(); i++) {
......@@ -241,7 +241,7 @@ public final class Util {
if (mediaItem.playbackProperties == null) {
continue;
}
if (isTrafficRestricted(mediaItem.playbackProperties.sourceUri)) {
if (isTrafficRestricted(mediaItem.playbackProperties.uri)) {
return false;
}
for (int i = 0; i < mediaItem.playbackProperties.subtitles.size(); i++) {
......
......@@ -38,26 +38,26 @@ public class MediaItemTest {
private static final String URI_STRING = "http://www.google.com";
@Test
public void builder_needsSourceUriOrMediaId() {
public void builder_needsUriOrMediaId() {
assertThrows(NullPointerException.class, () -> new MediaItem.Builder().build());
}
@Test
public void builderWithUri_setsSourceUri() {
public void builderWithUri_setsUri() {
Uri uri = Uri.parse(URI_STRING);
MediaItem mediaItem = MediaItem.fromUri(uri);
assertThat(mediaItem.playbackProperties.sourceUri.toString()).isEqualTo(URI_STRING);
assertThat(mediaItem.playbackProperties.uri.toString()).isEqualTo(URI_STRING);
assertThat(mediaItem.mediaId).isEqualTo(URI_STRING);
assertThat(mediaItem.mediaMetadata).isNotNull();
}
@Test
public void builderWithUriAsString_setsSourceUri() {
public void builderWithUriAsString_setsUri() {
MediaItem mediaItem = MediaItem.fromUri(URI_STRING);
assertThat(mediaItem.playbackProperties.sourceUri.toString()).isEqualTo(URI_STRING);
assertThat(mediaItem.playbackProperties.uri.toString()).isEqualTo(URI_STRING);
assertThat(mediaItem.mediaId).isEqualTo(URI_STRING);
}
......@@ -71,10 +71,7 @@ public class MediaItemTest {
@Test
public void builderSetMimeType_setsMimeType() {
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_STRING)
.setMimeType(MimeTypes.APPLICATION_MPD)
.build();
new MediaItem.Builder().setUri(URI_STRING).setMimeType(MimeTypes.APPLICATION_MPD).build();
assertThat(mediaItem.playbackProperties.mimeType).isEqualTo(MimeTypes.APPLICATION_MPD);
}
......@@ -82,7 +79,7 @@ public class MediaItemTest {
@Test
public void builderSetDrmConfig_isNullByDefault() {
// Null value by default.
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_STRING).build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNull();
}
......@@ -94,7 +91,7 @@ public class MediaItemTest {
byte[] keySetId = new byte[] {1, 2, 3};
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_STRING)
.setUri(URI_STRING)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri(licenseUri)
.setDrmLicenseRequestHeaders(requestHeaders)
......@@ -121,7 +118,7 @@ public class MediaItemTest {
Uri licenseUri = Uri.parse(URI_STRING);
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_STRING)
.setUri(URI_STRING)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri(licenseUri)
.setDrmSessionForClearTypes(Arrays.asList(C.TRACK_TYPE_AUDIO))
......@@ -138,7 +135,7 @@ public class MediaItemTest {
IllegalStateException.class,
() ->
new MediaItem.Builder()
.setSourceUri(URI_STRING)
.setUri(URI_STRING)
// missing uuid
.setDrmLicenseUri(Uri.parse(URI_STRING))
.build());
......@@ -147,7 +144,7 @@ public class MediaItemTest {
@Test
public void builderSetCustomCacheKey_setsCustomCacheKey() {
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setCustomCacheKey("key").build();
new MediaItem.Builder().setUri(URI_STRING).setCustomCacheKey("key").build();
assertThat(mediaItem.playbackProperties.customCacheKey).isEqualTo("key");
}
......@@ -159,7 +156,7 @@ public class MediaItemTest {
streamKeys.add(new StreamKey(0, 1, 1));
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setStreamKeys(streamKeys).build();
new MediaItem.Builder().setUri(URI_STRING).setStreamKeys(streamKeys).build();
assertThat(mediaItem.playbackProperties.streamKeys).isEqualTo(streamKeys);
}
......@@ -177,14 +174,14 @@ public class MediaItemTest {
C.SELECTION_FLAG_DEFAULT));
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setSubtitles(subtitles).build();
new MediaItem.Builder().setUri(URI_STRING).setSubtitles(subtitles).build();
assertThat(mediaItem.playbackProperties.subtitles).isEqualTo(subtitles);
}
@Test
public void builderSetTag_isNullByDefault() {
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_STRING).build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build();
assertThat(mediaItem.playbackProperties.tag).isNull();
}
......@@ -193,7 +190,7 @@ public class MediaItemTest {
public void builderSetTag_setsTag() {
Object tag = new Object();
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_STRING).setTag(tag).build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setTag(tag).build();
assertThat(mediaItem.playbackProperties.tag).isEqualTo(tag);
}
......@@ -201,14 +198,14 @@ public class MediaItemTest {
@Test
public void builderSetStartPositionMs_setsStartPositionMs() {
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setClipStartPositionMs(1000L).build();
new MediaItem.Builder().setUri(URI_STRING).setClipStartPositionMs(1000L).build();
assertThat(mediaItem.clippingProperties.startPositionMs).isEqualTo(1000L);
}
@Test
public void builderSetStartPositionMs_zeroByDefault() {
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_STRING).build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build();
assertThat(mediaItem.clippingProperties.startPositionMs).isEqualTo(0);
}
......@@ -223,14 +220,14 @@ public class MediaItemTest {
@Test
public void builderSetEndPositionMs_setsEndPositionMs() {
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setClipEndPositionMs(1000L).build();
new MediaItem.Builder().setUri(URI_STRING).setClipEndPositionMs(1000L).build();
assertThat(mediaItem.clippingProperties.endPositionMs).isEqualTo(1000L);
}
@Test
public void builderSetEndPositionMs_timeEndOfSourceByDefault() {
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_STRING).build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build();
assertThat(mediaItem.clippingProperties.endPositionMs).isEqualTo(C.TIME_END_OF_SOURCE);
}
......@@ -239,7 +236,7 @@ public class MediaItemTest {
public void builderSetEndPositionMs_timeEndOfSource_setsEndPositionMs() {
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_STRING)
.setUri(URI_STRING)
.setClipEndPositionMs(1000)
.setClipEndPositionMs(C.TIME_END_OF_SOURCE)
.build();
......@@ -258,7 +255,7 @@ public class MediaItemTest {
public void builderSetClippingFlags_setsClippingFlags() {
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_STRING)
.setUri(URI_STRING)
.setClipRelativeToDefaultPosition(true)
.setClipRelativeToLiveWindow(true)
.setClipStartsAtKeyFrame(true)
......@@ -273,8 +270,7 @@ public class MediaItemTest {
public void builderSetAdTagUri_setsAdTagUri() {
Uri adTagUri = Uri.parse(URI_STRING + "/ad");
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setAdTagUri(adTagUri).build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setAdTagUri(adTagUri).build();
assertThat(mediaItem.playbackProperties.adTagUri).isEqualTo(adTagUri);
}
......@@ -284,7 +280,7 @@ public class MediaItemTest {
MediaMetadata mediaMetadata = new MediaMetadata.Builder().setTitle("title").build();
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setMediaMetadata(mediaMetadata).build();
new MediaItem.Builder().setUri(URI_STRING).setMediaMetadata(mediaMetadata).build();
assertThat(mediaItem.mediaMetadata).isEqualTo(mediaMetadata);
}
......@@ -311,7 +307,7 @@ public class MediaItemTest {
.setMediaId("mediaId")
.setMediaMetadata(new MediaMetadata.Builder().setTitle("title").build())
.setMimeType(MimeTypes.APPLICATION_MP4)
.setSourceUri(URI_STRING)
.setUri(URI_STRING)
.setStreamKeys(Collections.singletonList(new StreamKey(1, 0, 0)))
.setSubtitles(
Collections.singletonList(
......
......@@ -52,25 +52,24 @@ import java.util.Map;
* factories:
*
* <ul>
* <li>{@code DashMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#sourceUri
* sourceUri} ends in '.mpd' or if its {@link MediaItem.PlaybackProperties#mimeType mimeType
* field} is explicitly set to {@link MimeTypes#APPLICATION_MPD} (Requires the <a
* <li>{@code DashMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#uri uri}
* ends in '.mpd' or if its {@link MediaItem.PlaybackProperties#mimeType mimeType field} is
* explicitly set to {@link MimeTypes#APPLICATION_MPD} (Requires the <a
* href="https://exoplayer.dev/hello-world.html#add-exoplayer-modules">exoplayer-dash module
* to be added</a> to the app).
* <li>{@code HlsMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#sourceUri
* sourceUri} ends in '.m3u8' or if its {@link MediaItem.PlaybackProperties#mimeType mimeType
* field} is explicitly set to {@link MimeTypes#APPLICATION_M3U8} (Requires the <a
* <li>{@code HlsMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#uri uri}
* ends in '.m3u8' or if its {@link MediaItem.PlaybackProperties#mimeType mimeType field} is
* explicitly set to {@link MimeTypes#APPLICATION_M3U8} (Requires the <a
* href="https://exoplayer.dev/hello-world.html#add-exoplayer-modules">exoplayer-hls module to
* be added</a> to the app).
* <li>{@code SsMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#sourceUri
* sourceUri} ends in '.ism', '.ism/Manifest' or if its {@link
* MediaItem.PlaybackProperties#mimeType mimeType field} is explicitly set to {@link
* MimeTypes#APPLICATION_SS} (Requires the <a
* <li>{@code SsMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#uri uri}
* ends in '.ism', '.ism/Manifest' or if its {@link MediaItem.PlaybackProperties#mimeType
* mimeType field} is explicitly set to {@link MimeTypes#APPLICATION_SS} (Requires the <a
* href="https://exoplayer.dev/hello-world.html#add-exoplayer-modules">
* exoplayer-smoothstreaming module to be added</a> to the app).
* <li>{@link ProgressiveMediaSource.Factory} serves as a fallback if the item's {@link
* MediaItem.PlaybackProperties#sourceUri sourceUri} doesn't match one of the above. It tries
* to infer the required extractor by using the {@link
* MediaItem.PlaybackProperties#uri uri} doesn't match one of the above. It tries to infer the
* required extractor by using the {@link
* com.google.android.exoplayer2.extractor.DefaultExtractorsFactory}. An {@link
* UnrecognizedInputFormatException} is thrown if none of the available extractors can read
* the stream.
......@@ -249,7 +248,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
@C.ContentType
int type =
Util.inferContentTypeWithMimeType(
mediaItem.playbackProperties.sourceUri, mediaItem.playbackProperties.mimeType);
mediaItem.playbackProperties.uri, mediaItem.playbackProperties.mimeType);
@Nullable MediaSourceFactory mediaSourceFactory = mediaSourceFactories.get(type);
Assertions.checkNotNull(
mediaSourceFactory, "No suitable media source factory found for content type: " + type);
......
......@@ -173,7 +173,7 @@ public final class ExtractorMediaSource extends CompositeMediaSource<Void> {
@Deprecated
@Override
public ExtractorMediaSource createMediaSource(Uri uri) {
return createMediaSource(new MediaItem.Builder().setSourceUri(uri).build());
return createMediaSource(new MediaItem.Builder().setUri(uri).build());
}
/**
......@@ -187,7 +187,7 @@ public final class ExtractorMediaSource extends CompositeMediaSource<Void> {
public ExtractorMediaSource createMediaSource(MediaItem mediaItem) {
Assertions.checkNotNull(mediaItem.playbackProperties);
return new ExtractorMediaSource(
mediaItem.playbackProperties.sourceUri,
mediaItem.playbackProperties.uri,
dataSourceFactory,
extractorsFactory,
loadErrorHandlingPolicy,
......
......@@ -166,7 +166,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
@Deprecated
@Override
public ProgressiveMediaSource createMediaSource(Uri uri) {
return createMediaSource(new MediaItem.Builder().setSourceUri(uri).build());
return createMediaSource(new MediaItem.Builder().setUri(uri).build());
}
/**
......@@ -180,7 +180,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
public ProgressiveMediaSource createMediaSource(MediaItem mediaItem) {
Assertions.checkNotNull(mediaItem.playbackProperties);
return new ProgressiveMediaSource(
mediaItem.playbackProperties.sourceUri,
mediaItem.playbackProperties.uri,
dataSourceFactory,
extractorsFactory,
drmSessionManager,
......
......@@ -46,7 +46,7 @@ public final class DefaultMediaSourceFactoryTest {
public void createMediaSource_withoutMimeType_progressiveSource() {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_MEDIA).build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -58,7 +58,7 @@ public final class DefaultMediaSourceFactoryTest {
Object tag = new Object();
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_MEDIA).setTag(tag).build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setTag(tag).build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -69,7 +69,7 @@ public final class DefaultMediaSourceFactoryTest {
public void createMediaSource_withPath_progressiveSource() {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_MEDIA + "/file.mp3").build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mp3").build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -80,7 +80,7 @@ public final class DefaultMediaSourceFactoryTest {
public void createMediaSource_withNull_usesNonNullDefaults() {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_MEDIA).build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build();
MediaSource mediaSource =
defaultMediaSourceFactory
......@@ -101,8 +101,7 @@ public final class DefaultMediaSourceFactoryTest {
new MediaItem.Subtitle(Uri.parse(URI_TEXT), MimeTypes.APPLICATION_TTML, "en"),
new MediaItem.Subtitle(
Uri.parse(URI_TEXT), MimeTypes.APPLICATION_TTML, "de", C.SELECTION_FLAG_DEFAULT));
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_MEDIA).setSubtitles(subtitles).build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setSubtitles(subtitles).build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -117,7 +116,7 @@ public final class DefaultMediaSourceFactoryTest {
MediaItem mediaItem =
new MediaItem.Builder()
.setTag(tag)
.setSourceUri(URI_MEDIA)
.setUri(URI_MEDIA)
.setSubtitles(
Collections.singletonList(
new MediaItem.Subtitle(Uri.parse(URI_TEXT), MimeTypes.APPLICATION_TTML, "en")))
......@@ -133,7 +132,7 @@ public final class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_MEDIA).setClipStartPositionMs(1000L).build();
new MediaItem.Builder().setUri(URI_MEDIA).setClipStartPositionMs(1000L).build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -145,7 +144,7 @@ public final class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_MEDIA).setClipEndPositionMs(1000L).build();
new MediaItem.Builder().setUri(URI_MEDIA).setClipEndPositionMs(1000L).build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -157,10 +156,7 @@ public final class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setClipRelativeToDefaultPosition(true)
.build();
new MediaItem.Builder().setUri(URI_MEDIA).setClipRelativeToDefaultPosition(true).build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -173,7 +169,7 @@ public final class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setUri(URI_MEDIA)
.setClipEndPositionMs(C.TIME_END_OF_SOURCE)
.build();
......@@ -195,8 +191,7 @@ public final class DefaultMediaSourceFactoryTest {
public void createMediaSource_withAdTagUri_callsAdsLoader() {
Context applicationContext = ApplicationProvider.getApplicationContext();
Uri adTagUri = Uri.parse(URI_MEDIA);
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_MEDIA).setAdTagUri(adTagUri).build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(adTagUri).build();
DefaultMediaSourceFactory defaultMediaSourceFactory =
new DefaultMediaSourceFactory(
applicationContext,
......@@ -212,7 +207,7 @@ public final class DefaultMediaSourceFactoryTest {
public void createMediaSource_withAdTagUriAdsLoaderNull_playsWithoutAdNoException() {
Context applicationContext = ApplicationProvider.getApplicationContext();
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_MEDIA).setAdTagUri(Uri.parse(URI_MEDIA)).build();
new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(Uri.parse(URI_MEDIA)).build();
DefaultMediaSourceFactory defaultMediaSourceFactory =
new DefaultMediaSourceFactory(
applicationContext,
......@@ -228,7 +223,7 @@ public final class DefaultMediaSourceFactoryTest {
public void createMediaSource_withAdTagUriProvidersNull_playsWithoutAdNoException() {
Context applicationContext = ApplicationProvider.getApplicationContext();
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_MEDIA).setAdTagUri(Uri.parse(URI_MEDIA)).build();
new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(Uri.parse(URI_MEDIA)).build();
MediaSource mediaSource =
DefaultMediaSourceFactory.newInstance(applicationContext).createMediaSource(mediaItem);
......
......@@ -313,7 +313,7 @@ public final class DashMediaSource extends BaseMediaSource {
@Deprecated
@Override
public DashMediaSource createMediaSource(Uri uri) {
return createMediaSource(new MediaItem.Builder().setSourceUri(uri).build());
return createMediaSource(new MediaItem.Builder().setUri(uri).build());
}
/**
......@@ -339,7 +339,7 @@ public final class DashMediaSource extends BaseMediaSource {
}
return new DashMediaSource(
/* manifest= */ null,
mediaItem.playbackProperties.sourceUri,
mediaItem.playbackProperties.uri,
manifestDataSourceFactory,
manifestParser,
chunkSourceFactory,
......
......@@ -38,10 +38,7 @@ public class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setMimeType(MimeTypes.APPLICATION_MPD)
.build();
new MediaItem.Builder().setUri(URI_MEDIA).setMimeType(MimeTypes.APPLICATION_MPD).build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -55,7 +52,7 @@ public class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setUri(URI_MEDIA)
.setMimeType(MimeTypes.APPLICATION_MPD)
.setTag(tag)
.build();
......@@ -69,7 +66,7 @@ public class DefaultMediaSourceFactoryTest {
public void createMediaSource_withPath_dashSource() {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_MEDIA + "/file.mpd").build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mpd").build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -80,7 +77,7 @@ public class DefaultMediaSourceFactoryTest {
public void createMediaSource_withNull_usesNonNullDefaults() {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_MEDIA + "/file.mpd").build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mpd").build();
MediaSource mediaSource =
defaultMediaSourceFactory
......
......@@ -332,7 +332,7 @@ public final class HlsMediaSource extends BaseMediaSource
@Deprecated
@Override
public HlsMediaSource createMediaSource(Uri uri) {
return createMediaSource(new MediaItem.Builder().setSourceUri(uri).build());
return createMediaSource(new MediaItem.Builder().setUri(uri).build());
}
/**
......@@ -355,7 +355,7 @@ public final class HlsMediaSource extends BaseMediaSource
new FilteringHlsPlaylistParserFactory(playlistParserFactory, streamKeys);
}
return new HlsMediaSource(
mediaItem.playbackProperties.sourceUri,
mediaItem.playbackProperties.uri,
hlsDataSourceFactory,
extractorFactory,
compositeSequenceableLoaderFactory,
......
......@@ -38,10 +38,7 @@ public class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setMimeType(MimeTypes.APPLICATION_M3U8)
.build();
new MediaItem.Builder().setUri(URI_MEDIA).setMimeType(MimeTypes.APPLICATION_M3U8).build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -55,7 +52,7 @@ public class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setUri(URI_MEDIA)
.setMimeType(MimeTypes.APPLICATION_M3U8)
.setTag(tag)
.build();
......@@ -69,7 +66,7 @@ public class DefaultMediaSourceFactoryTest {
public void createMediaSource_withPath_hlsSource() {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_MEDIA + "/file.m3u8").build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.m3u8").build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -80,7 +77,7 @@ public class DefaultMediaSourceFactoryTest {
public void createMediaSource_withNull_usesNonNullDefaults() {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_MEDIA + "/file.m3u8").build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.m3u8").build();
MediaSource mediaSource =
defaultMediaSourceFactory
......
......@@ -223,7 +223,7 @@ public final class SsMediaSource extends BaseMediaSource
@Deprecated
@Override
public SsMediaSource createMediaSource(Uri uri) {
return createMediaSource(new MediaItem.Builder().setSourceUri(uri).build());
return createMediaSource(new MediaItem.Builder().setUri(uri).build());
}
/**
......@@ -307,7 +307,7 @@ public final class SsMediaSource extends BaseMediaSource
}
return new SsMediaSource(
/* manifest= */ null,
mediaItem.playbackProperties.sourceUri,
mediaItem.playbackProperties.uri,
manifestDataSourceFactory,
manifestParser,
chunkSourceFactory,
......
......@@ -40,10 +40,7 @@ public class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setMimeType(MimeTypes.APPLICATION_SS)
.build();
new MediaItem.Builder().setUri(URI_MEDIA).setMimeType(MimeTypes.APPLICATION_SS).build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
assertThat(mediaSource).isInstanceOf(SsMediaSource.class);
}
......@@ -55,7 +52,7 @@ public class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setUri(URI_MEDIA)
.setMimeType(MimeTypes.APPLICATION_SS)
.setTag(tag)
.build();
......@@ -69,7 +66,7 @@ public class DefaultMediaSourceFactoryTest {
public void createMediaSource_withIsmPath_smoothstreamingSource() {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_MEDIA + "/file.ism").build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.ism").build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -80,7 +77,7 @@ public class DefaultMediaSourceFactoryTest {
public void createMediaSource_withManifestPath_smoothstreamingSource() {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_MEDIA + ".ism/Manifest").build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + ".ism/Manifest").build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
......@@ -91,7 +88,7 @@ public class DefaultMediaSourceFactoryTest {
public void createMediaSource_withNull_usesNonNullDefaults() {
DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_MEDIA + "/file.ism").build();
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.ism").build();
MediaSource mediaSource =
defaultMediaSourceFactory
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment