mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Remove deprecated onSeekProcessed
This change removes it from `Player.Listener` and `AnalyticsListener`, use `onPositionDiscontinuity` with `DISCONTINUITY_REASON_SEEK` instead. #minor-release PiperOrigin-RevId: 534757426
This commit is contained in:
parent
66554b9b68
commit
5c713feb60
@ -125,6 +125,9 @@
|
||||
and/or `onVideoInputFormatChanged` instead.
|
||||
* `onDecoderDisabled`, use `onAudioDisabled` and/or `onVideoDisabled`
|
||||
instead.
|
||||
* Remove the deprecated `Player.Listener.onSeekProcessed` and
|
||||
`AnalyticsListener.onSeekProcessed`, use `onPositionDiscontinuity` with
|
||||
`DISCONTINUITY_REASON_SEEK` instead.
|
||||
* Core library:
|
||||
* Add `ExoPlayer.setVideoFrameProcessorFactory()` for using `Effect` with
|
||||
a custom `VideoFrameProcessor.Factory` during video playback.
|
||||
|
@ -394,8 +394,9 @@ public final class CastPlayer extends BasePlayer {
|
||||
return playWhenReady.value;
|
||||
}
|
||||
|
||||
// We still call Listener#onSeekProcessed() for backwards compatibility with listeners that
|
||||
// don't implement onPositionDiscontinuity().
|
||||
// We still call Listener#onPositionDiscontinuity(@DiscontinuityReason int) for backwards
|
||||
// compatibility with listeners that don't implement
|
||||
// onPositionDiscontinuity(PositionInfo, PositionInfo, @DiscontinuityReason int).
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
@VisibleForTesting(otherwise = PROTECTED)
|
||||
@ -449,8 +450,6 @@ public final class CastPlayer extends BasePlayer {
|
||||
}
|
||||
}
|
||||
updateAvailableCommandsAndNotifyIfChanged();
|
||||
} else if (pendingSeekCount == 0) {
|
||||
listeners.queueEvent(/* eventFlag= */ C.INDEX_UNSET, Listener::onSeekProcessed);
|
||||
}
|
||||
listeners.flushEvents();
|
||||
}
|
||||
@ -1437,9 +1436,6 @@ public final class CastPlayer extends BasePlayer {
|
||||
|
||||
private final class SeekResultCallback implements ResultCallback<MediaChannelResult> {
|
||||
|
||||
// We still call Listener#onSeekProcessed() for backwards compatibility with listeners that
|
||||
// don't implement onPositionDiscontinuity().
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public void onResult(MediaChannelResult result) {
|
||||
int statusCode = result.getStatus().getStatusCode();
|
||||
@ -1452,7 +1448,6 @@ public final class CastPlayer extends BasePlayer {
|
||||
currentWindowIndex = pendingSeekWindowIndex;
|
||||
pendingSeekWindowIndex = C.INDEX_UNSET;
|
||||
pendingSeekPositionMs = C.TIME_UNSET;
|
||||
listeners.sendEvent(/* eventFlag= */ C.INDEX_UNSET, Listener::onSeekProcessed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1066,12 +1066,6 @@ public class ForwardingPlayer implements Player {
|
||||
listener.onMaxSeekToPreviousPositionChanged(maxSeekToPreviousPositionMs);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public void onSeekProcessed() {
|
||||
listener.onSeekProcessed();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVideoSizeChanged(VideoSize videoSize) {
|
||||
listener.onVideoSizeChanged(videoSize);
|
||||
|
@ -1017,15 +1017,6 @@ public interface Player {
|
||||
*/
|
||||
default void onMaxSeekToPreviousPositionChanged(long maxSeekToPreviousPositionMs) {}
|
||||
|
||||
/**
|
||||
* @deprecated Seeks are processed without delay. Listen to {@link
|
||||
* #onPositionDiscontinuity(PositionInfo, PositionInfo, int)} with reason {@link
|
||||
* #DISCONTINUITY_REASON_SEEK} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
@UnstableApi
|
||||
default void onSeekProcessed() {}
|
||||
|
||||
/**
|
||||
* Called when the audio session ID changes.
|
||||
*
|
||||
|
@ -3438,9 +3438,6 @@ public abstract class SimpleBasePlayer extends BasePlayer {
|
||||
listeners.queueEvent(
|
||||
Player.EVENT_METADATA, listener -> listener.onMetadata(newState.timedMetadata));
|
||||
}
|
||||
if (positionDiscontinuityReason == Player.DISCONTINUITY_REASON_SEEK) {
|
||||
listeners.queueEvent(/* eventFlag= */ C.INDEX_UNSET, Listener::onSeekProcessed);
|
||||
}
|
||||
if (!previousState.availableCommands.equals(newState.availableCommands)) {
|
||||
listeners.queueEvent(
|
||||
Player.EVENT_AVAILABLE_COMMANDS_CHANGED,
|
||||
|
@ -1395,7 +1395,6 @@ public class SimpleBasePlayerTest {
|
||||
/* adIndexInAdGroup= */ C.INDEX_UNSET),
|
||||
Player.DISCONTINUITY_REASON_SEEK);
|
||||
verify(listener).onMediaItemTransition(mediaItem1, Player.MEDIA_ITEM_TRANSITION_REASON_SEEK);
|
||||
verify(listener).onSeekProcessed();
|
||||
verify(listener)
|
||||
.onEvents(
|
||||
player,
|
||||
@ -6911,7 +6910,6 @@ public class SimpleBasePlayerTest {
|
||||
verify(listener).onPositionDiscontinuity(Player.DISCONTINUITY_REASON_SEEK);
|
||||
verify(listener).onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_SEEK));
|
||||
verify(listener).onMediaItemTransition(newMediaItem, Player.MEDIA_ITEM_TRANSITION_REASON_SEEK);
|
||||
verify(listener).onSeekProcessed();
|
||||
verifyNoMoreInteractions(listener);
|
||||
}
|
||||
|
||||
@ -6962,7 +6960,6 @@ public class SimpleBasePlayerTest {
|
||||
verify(listener).onMediaItemTransition(newMediaItem, Player.MEDIA_ITEM_TRANSITION_REASON_SEEK);
|
||||
verify(listener).onPositionDiscontinuity(Player.DISCONTINUITY_REASON_SEEK);
|
||||
verify(listener).onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_SEEK));
|
||||
verify(listener).onSeekProcessed();
|
||||
verifyNoMoreInteractions(listener);
|
||||
|
||||
future.set(null);
|
||||
@ -7022,7 +7019,6 @@ public class SimpleBasePlayerTest {
|
||||
verify(listener).onMediaItemTransition(newMediaItem, Player.MEDIA_ITEM_TRANSITION_REASON_SEEK);
|
||||
verify(listener).onPositionDiscontinuity(Player.DISCONTINUITY_REASON_SEEK);
|
||||
verify(listener).onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_SEEK));
|
||||
verify(listener).onSeekProcessed();
|
||||
verifyNoMoreInteractions(listener);
|
||||
|
||||
future.set(null);
|
||||
@ -7074,7 +7070,6 @@ public class SimpleBasePlayerTest {
|
||||
assertThat(player.getTotalBufferedDuration()).isEqualTo(0);
|
||||
verify(listener).onPositionDiscontinuity(Player.DISCONTINUITY_REASON_SEEK);
|
||||
verify(listener).onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_SEEK));
|
||||
verify(listener).onSeekProcessed();
|
||||
verifyNoMoreInteractions(listener);
|
||||
|
||||
future.set(null);
|
||||
@ -7126,7 +7121,6 @@ public class SimpleBasePlayerTest {
|
||||
assertThat(player.getTotalBufferedDuration()).isEqualTo(0);
|
||||
verify(listener).onPositionDiscontinuity(Player.DISCONTINUITY_REASON_SEEK);
|
||||
verify(listener).onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_SEEK));
|
||||
verify(listener).onSeekProcessed();
|
||||
verifyNoMoreInteractions(listener);
|
||||
|
||||
future.set(null);
|
||||
@ -7178,7 +7172,6 @@ public class SimpleBasePlayerTest {
|
||||
assertThat(player.getTotalBufferedDuration()).isEqualTo(0);
|
||||
verify(listener).onPositionDiscontinuity(Player.DISCONTINUITY_REASON_SEEK);
|
||||
verify(listener).onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_SEEK));
|
||||
verify(listener).onSeekProcessed();
|
||||
verifyNoMoreInteractions(listener);
|
||||
|
||||
future.set(null);
|
||||
@ -7230,7 +7223,6 @@ public class SimpleBasePlayerTest {
|
||||
assertThat(player.getTotalBufferedDuration()).isEqualTo(7000);
|
||||
verify(listener).onPositionDiscontinuity(Player.DISCONTINUITY_REASON_SEEK);
|
||||
verify(listener).onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_SEEK));
|
||||
verify(listener).onSeekProcessed();
|
||||
verifyNoMoreInteractions(listener);
|
||||
|
||||
future.set(null);
|
||||
@ -7282,7 +7274,6 @@ public class SimpleBasePlayerTest {
|
||||
assertThat(player.getTotalBufferedDuration()).isEqualTo(3000);
|
||||
verify(listener).onPositionDiscontinuity(Player.DISCONTINUITY_REASON_SEEK);
|
||||
verify(listener).onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_SEEK));
|
||||
verify(listener).onSeekProcessed();
|
||||
verifyNoMoreInteractions(listener);
|
||||
|
||||
future.set(null);
|
||||
@ -7340,7 +7331,6 @@ public class SimpleBasePlayerTest {
|
||||
verify(listener).onPositionDiscontinuity(Player.DISCONTINUITY_REASON_SEEK);
|
||||
verify(listener).onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_SEEK));
|
||||
verify(listener).onMediaItemTransition(mediaItem, Player.MEDIA_ITEM_TRANSITION_REASON_SEEK);
|
||||
verify(listener).onSeekProcessed();
|
||||
verifyNoMoreInteractions(listener);
|
||||
|
||||
future.set(null);
|
||||
|
@ -547,7 +547,6 @@ import java.util.concurrent.TimeoutException;
|
||||
playbackInfo,
|
||||
/* ignored */ TIMELINE_CHANGE_REASON_SOURCE_UPDATE,
|
||||
/* ignored */ PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
||||
/* seekProcessed= */ false,
|
||||
/* positionDiscontinuity= */ false,
|
||||
/* ignored */ DISCONTINUITY_REASON_INTERNAL,
|
||||
/* ignored */ C.TIME_UNSET,
|
||||
@ -666,7 +665,6 @@ import java.util.concurrent.TimeoutException;
|
||||
newPlaybackInfo,
|
||||
/* timelineChangeReason= */ TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||
/* ignored */ PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
||||
/* seekProcessed= */ false,
|
||||
/* positionDiscontinuity= */ false,
|
||||
/* ignored */ DISCONTINUITY_REASON_INTERNAL,
|
||||
/* ignored */ C.TIME_UNSET,
|
||||
@ -691,7 +689,6 @@ import java.util.concurrent.TimeoutException;
|
||||
newPlaybackInfo,
|
||||
/* timelineChangeReason= */ TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||
/* ignored */ PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
||||
/* seekProcessed= */ false,
|
||||
positionDiscontinuity,
|
||||
DISCONTINUITY_REASON_REMOVE,
|
||||
/* discontinuityWindowStartPositionUs= */ getCurrentPositionUsInternal(newPlaybackInfo),
|
||||
@ -728,7 +725,6 @@ import java.util.concurrent.TimeoutException;
|
||||
newPlaybackInfo,
|
||||
/* timelineChangeReason= */ TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||
/* ignored */ PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
||||
/* seekProcessed= */ false,
|
||||
/* positionDiscontinuity= */ false,
|
||||
/* ignored */ DISCONTINUITY_REASON_INTERNAL,
|
||||
/* ignored */ C.TIME_UNSET,
|
||||
@ -753,7 +749,6 @@ import java.util.concurrent.TimeoutException;
|
||||
newPlaybackInfo,
|
||||
/* timelineChangeReason= */ TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||
/* ignored */ PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
||||
/* seekProcessed= */ false,
|
||||
/* positionDiscontinuity= */ false,
|
||||
/* ignored */ DISCONTINUITY_REASON_INTERNAL,
|
||||
/* ignored */ C.TIME_UNSET,
|
||||
@ -878,7 +873,6 @@ import java.util.concurrent.TimeoutException;
|
||||
newPlaybackInfo,
|
||||
/* ignored */ TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||
/* ignored */ PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
||||
/* seekProcessed= */ true,
|
||||
/* positionDiscontinuity= */ true,
|
||||
/* positionDiscontinuityReason= */ DISCONTINUITY_REASON_SEEK,
|
||||
/* discontinuityWindowStartPositionUs= */ getCurrentPositionUsInternal(newPlaybackInfo),
|
||||
@ -920,7 +914,6 @@ import java.util.concurrent.TimeoutException;
|
||||
newPlaybackInfo,
|
||||
/* ignored */ TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||
/* ignored */ PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
||||
/* seekProcessed= */ false,
|
||||
/* positionDiscontinuity= */ false,
|
||||
/* ignored */ DISCONTINUITY_REASON_INTERNAL,
|
||||
/* ignored */ C.TIME_UNSET,
|
||||
@ -1834,7 +1827,6 @@ import java.util.concurrent.TimeoutException;
|
||||
playbackInfo,
|
||||
/* ignored */ TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||
/* ignored */ PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
||||
/* seekProcessed= */ false,
|
||||
/* positionDiscontinuity= */ false,
|
||||
/* ignored */ DISCONTINUITY_REASON_INTERNAL,
|
||||
/* ignored */ C.TIME_UNSET,
|
||||
@ -1935,7 +1927,6 @@ import java.util.concurrent.TimeoutException;
|
||||
playbackInfoUpdate.playbackInfo,
|
||||
TIMELINE_CHANGE_REASON_SOURCE_UPDATE,
|
||||
pendingPlayWhenReadyChangeReason,
|
||||
/* seekProcessed= */ false,
|
||||
positionDiscontinuity,
|
||||
pendingDiscontinuityReason,
|
||||
discontinuityWindowStartPositionUs,
|
||||
@ -1950,7 +1941,6 @@ import java.util.concurrent.TimeoutException;
|
||||
PlaybackInfo playbackInfo,
|
||||
@TimelineChangeReason int timelineChangeReason,
|
||||
@PlayWhenReadyChangeReason int playWhenReadyChangeReason,
|
||||
boolean seekProcessed,
|
||||
boolean positionDiscontinuity,
|
||||
@DiscontinuityReason int positionDiscontinuityReason,
|
||||
long discontinuityWindowStartPositionUs,
|
||||
@ -2099,9 +2089,6 @@ import java.util.concurrent.TimeoutException;
|
||||
Player.EVENT_PLAYBACK_PARAMETERS_CHANGED,
|
||||
listener -> listener.onPlaybackParametersChanged(newPlaybackInfo.playbackParameters));
|
||||
}
|
||||
if (seekProcessed) {
|
||||
listeners.queueEvent(/* eventFlag= */ C.INDEX_UNSET, Listener::onSeekProcessed);
|
||||
}
|
||||
updateAvailableCommands();
|
||||
listeners.flushEvents();
|
||||
|
||||
@ -2323,7 +2310,6 @@ import java.util.concurrent.TimeoutException;
|
||||
newPlaybackInfo,
|
||||
/* timelineChangeReason= */ TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||
/* ignored */ PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
||||
/* seekProcessed= */ false,
|
||||
/* positionDiscontinuity= */ positionDiscontinuity,
|
||||
DISCONTINUITY_REASON_REMOVE,
|
||||
/* discontinuityWindowStartPositionUs= */ getCurrentPositionUsInternal(newPlaybackInfo),
|
||||
@ -2745,7 +2731,6 @@ import java.util.concurrent.TimeoutException;
|
||||
playbackInfo,
|
||||
/* ignored */ TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
|
||||
playWhenReadyChangeReason,
|
||||
/* seekProcessed= */ false,
|
||||
/* positionDiscontinuity= */ false,
|
||||
/* ignored */ DISCONTINUITY_REASON_INTERNAL,
|
||||
/* ignored */ C.TIME_UNSET,
|
||||
|
@ -621,14 +621,6 @@ public interface AnalyticsListener {
|
||||
@Deprecated
|
||||
default void onSeekStarted(EventTime eventTime) {}
|
||||
|
||||
/**
|
||||
* @deprecated Seeks are processed without delay. Use {@link #onPositionDiscontinuity(EventTime,
|
||||
* int)} with reason {@link Player#DISCONTINUITY_REASON_SEEK} instead.
|
||||
*/
|
||||
@UnstableApi
|
||||
@Deprecated
|
||||
default void onSeekProcessed(EventTime eventTime) {}
|
||||
|
||||
/**
|
||||
* Called when the playback parameters changed.
|
||||
*
|
||||
|
@ -711,14 +711,6 @@ public class DefaultAnalyticsCollector implements AnalyticsCollector {
|
||||
eventTime, AnalyticsListener.EVENT_CUES, listener -> listener.onCues(eventTime, cueGroup));
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation") // Implementing and calling deprecated listener method.
|
||||
@Override
|
||||
public final void onSeekProcessed() {
|
||||
EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime();
|
||||
sendEvent(
|
||||
eventTime, /* eventFlag= */ C.INDEX_UNSET, listener -> listener.onSeekProcessed(eventTime));
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {
|
||||
EventTime eventTime = generateReadingMediaPeriodEventTime();
|
||||
|
@ -147,7 +147,6 @@ public final class DefaultAnalyticsCollectorTest {
|
||||
// Deprecated event constants.
|
||||
private static final long EVENT_PLAYER_STATE_CHANGED = 1L << 63;
|
||||
private static final long EVENT_SEEK_STARTED = 1L << 62;
|
||||
private static final long EVENT_SEEK_PROCESSED = 1L << 61;
|
||||
|
||||
private static final UUID DRM_SCHEME_UUID =
|
||||
UUID.nameUUIDFromBytes(TestUtil.createByteArray(7, 8, 9));
|
||||
@ -471,7 +470,6 @@ public final class DefaultAnalyticsCollectorTest {
|
||||
.inOrder();
|
||||
assertThat(listener.getEvents(EVENT_POSITION_DISCONTINUITY)).containsExactly(period1);
|
||||
assertThat(listener.getEvents(EVENT_SEEK_STARTED)).containsExactly(period0);
|
||||
assertThat(listener.getEvents(EVENT_SEEK_PROCESSED)).containsExactly(period1);
|
||||
assertThat(listener.getEvents(EVENT_IS_LOADING_CHANGED))
|
||||
.containsExactly(period0, period0)
|
||||
.inOrder();
|
||||
@ -562,7 +560,6 @@ public final class DefaultAnalyticsCollectorTest {
|
||||
.containsExactly(period0, period1Seq2)
|
||||
.inOrder();
|
||||
assertThat(listener.getEvents(EVENT_SEEK_STARTED)).containsExactly(period0);
|
||||
assertThat(listener.getEvents(EVENT_SEEK_PROCESSED)).containsExactly(period0);
|
||||
assertThat(listener.getEvents(EVENT_IS_LOADING_CHANGED))
|
||||
.containsExactly(period0, period0, period0, period0)
|
||||
.inOrder();
|
||||
@ -763,7 +760,6 @@ public final class DefaultAnalyticsCollectorTest {
|
||||
.containsExactly(WINDOW_0 /* prepared */, WINDOW_0 /* prepared */);
|
||||
assertThat(listener.getEvents(EVENT_POSITION_DISCONTINUITY)).containsExactly(period0Seq0);
|
||||
assertThat(listener.getEvents(EVENT_SEEK_STARTED)).containsExactly(period0Seq0);
|
||||
assertThat(listener.getEvents(EVENT_SEEK_PROCESSED)).containsExactly(period0Seq0);
|
||||
assertThat(listener.getEvents(EVENT_IS_LOADING_CHANGED))
|
||||
.containsExactly(period0Seq0, period0Seq0, period0Seq0, period0Seq0);
|
||||
assertThat(listener.getEvents(EVENT_PLAYER_ERROR)).containsExactly(period0Seq0);
|
||||
@ -1293,7 +1289,6 @@ public final class DefaultAnalyticsCollectorTest {
|
||||
contentAfterMidroll /* ad transition */)
|
||||
.inOrder();
|
||||
assertThat(listener.getEvents(EVENT_SEEK_STARTED)).containsExactly(contentBeforeMidroll);
|
||||
assertThat(listener.getEvents(EVENT_SEEK_PROCESSED)).containsExactly(contentAfterMidroll);
|
||||
assertThat(listener.getEvents(EVENT_IS_LOADING_CHANGED))
|
||||
.containsExactly(contentBeforeMidroll, contentBeforeMidroll, midrollAd, midrollAd)
|
||||
.inOrder();
|
||||
@ -1360,7 +1355,6 @@ public final class DefaultAnalyticsCollectorTest {
|
||||
|
||||
populateEventIds(listener.lastReportedTimeline);
|
||||
assertThat(listener.getEvents(EVENT_SEEK_STARTED)).containsExactly(period0);
|
||||
assertThat(listener.getEvents(EVENT_SEEK_PROCESSED)).containsExactly(period0);
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -2124,12 +2118,6 @@ public final class DefaultAnalyticsCollectorTest {
|
||||
reportedEvents.add(new ReportedEvent(EVENT_SEEK_STARTED, eventTime));
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation") // Testing deprecated behaviour.
|
||||
@Override
|
||||
public void onSeekProcessed(EventTime eventTime) {
|
||||
reportedEvents.add(new ReportedEvent(EVENT_SEEK_PROCESSED, eventTime));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlaybackParametersChanged(
|
||||
EventTime eventTime, PlaybackParameters playbackParameters) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user