Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
SDK
/
exoplayer
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
0bb32a8f
authored
Apr 30, 2019
by
tonihei
Committed by
Oliver Woodman
Apr 30, 2019
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Add IntDef for Player states.
PiperOrigin-RevId: 245925254
parent
f64011ae
Hide whitespace changes
Inline
Side-by-side
Showing
27 changed files
with
55 additions
and
39 deletions
demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DefaultReceiverPlayerManager.java
demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java
extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java
extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java
extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java
extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java
extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java
extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java
extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java
extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java
library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java
library/core/src/main/java/com/google/android/exoplayer2/PlaybackInfo.java
library/core/src/main/java/com/google/android/exoplayer2/Player.java
library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java
library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java
library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java
library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java
library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java
library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java
library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java
library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java
library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java
library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java
testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java
testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java
testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java
testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java
demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DefaultReceiverPlayerManager.java
View file @
0bb32a8f
...
...
@@ -255,7 +255,7 @@ import java.util.ArrayList;
// Player.EventListener implementation.
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
updateCurrentItemIndex
();
}
...
...
demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java
View file @
0bb32a8f
...
...
@@ -627,7 +627,7 @@ public class PlayerActivity extends AppCompatActivity
private
class
PlayerEventListener
implements
Player
.
EventListener
{
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
if
(
playbackState
==
Player
.
STATE_ENDED
)
{
showControls
();
}
...
...
extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java
View file @
0bb32a8f
...
...
@@ -94,7 +94,7 @@ public final class CastPlayer extends BasePlayer {
private
CastTimeline
currentTimeline
;
private
TrackGroupArray
currentTrackGroups
;
private
TrackSelectionArray
currentTrackSelection
;
private
int
playbackState
;
@Player
.
State
private
int
playbackState
;
private
int
repeatMode
;
private
int
currentWindowIndex
;
private
boolean
playWhenReady
;
...
...
@@ -305,6 +305,7 @@ public final class CastPlayer extends BasePlayer {
}
@Override
@Player
.
State
public
int
getPlaybackState
()
{
return
playbackState
;
}
...
...
extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java
View file @
0bb32a8f
...
...
@@ -101,7 +101,7 @@ public class FlacPlaybackTest {
}
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
if
(
playbackState
==
Player
.
STATE_ENDED
||
(
playbackState
==
Player
.
STATE_IDLE
&&
playbackException
!=
null
))
{
player
.
release
();
...
...
extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java
View file @
0bb32a8f
...
...
@@ -963,7 +963,7 @@ public final class ImaAdsLoader
}
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
if
(
adsManager
==
null
)
{
return
;
}
...
...
extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java
View file @
0bb32a8f
...
...
@@ -31,7 +31,7 @@ import java.util.ArrayList;
private
final
Timeline
timeline
;
private
boolean
prepared
;
private
int
state
;
@Player
.
State
private
int
state
;
private
boolean
playWhenReady
;
private
long
position
;
private
long
contentPosition
;
...
...
@@ -96,8 +96,8 @@ import java.util.ArrayList;
}
}
/** Sets the
state of this player with the given {@code STATE} constant
. */
public
void
setState
(
int
state
,
boolean
playWhenReady
)
{
/** Sets the
{@link Player.State} of this player
. */
public
void
setState
(
@Player
.
State
int
state
,
boolean
playWhenReady
)
{
boolean
notify
=
this
.
state
!=
state
||
this
.
playWhenReady
!=
playWhenReady
;
this
.
state
=
state
;
this
.
playWhenReady
=
playWhenReady
;
...
...
@@ -131,6 +131,7 @@ import java.util.ArrayList;
}
@Override
@Player
.
State
public
int
getPlaybackState
()
{
return
state
;
}
...
...
extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java
View file @
0bb32a8f
...
...
@@ -18,13 +18,13 @@ package com.google.android.exoplayer2.ext.leanback;
import
android.content.Context
;
import
android.os.Handler
;
import
androidx.annotation.Nullable
;
import
android.util.Pair
;
import
android.view.Surface
;
import
android.view.SurfaceHolder
;
import
androidx.leanback.R
;
import
androidx.leanback.media.PlaybackGlueHost
;
import
androidx.leanback.media.PlayerAdapter
;
import
androidx.leanback.media.SurfaceHolderGlueHost
;
import
android.util.Pair
;
import
android.view.Surface
;
import
android.view.SurfaceHolder
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.ControlDispatcher
;
import
com.google.android.exoplayer2.DefaultControlDispatcher
;
...
...
@@ -271,7 +271,7 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab
// Player.EventListener implementation.
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
notifyStateChanged
();
}
...
...
extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java
View file @
0bb32a8f
...
...
@@ -994,7 +994,7 @@ public final class MediaSessionConnector {
}
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
invalidateMediaSessionPlaybackState
();
}
...
...
extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java
View file @
0bb32a8f
...
...
@@ -101,7 +101,7 @@ public class OpusPlaybackTest {
}
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
if
(
playbackState
==
Player
.
STATE_ENDED
||
(
playbackState
==
Player
.
STATE_IDLE
&&
playbackException
!=
null
))
{
player
.
release
();
...
...
extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java
View file @
0bb32a8f
...
...
@@ -139,7 +139,7 @@ public class VpxPlaybackTest {
}
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
if
(
playbackState
==
Player
.
STATE_ENDED
||
(
playbackState
==
Player
.
STATE_IDLE
&&
playbackException
!=
null
))
{
player
.
release
();
...
...
library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java
View file @
0bb32a8f
...
...
@@ -193,6 +193,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
}
@Override
@Player
.
State
public
int
getPlaybackState
()
{
return
playbackInfo
.
playbackState
;
}
...
...
@@ -658,7 +659,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
}
private
PlaybackInfo
getResetPlaybackInfo
(
boolean
resetPosition
,
boolean
resetState
,
int
playbackState
)
{
boolean
resetPosition
,
boolean
resetState
,
@Player
.
State
int
playbackState
)
{
if
(
resetPosition
)
{
maskingWindowIndex
=
0
;
maskingPeriodIndex
=
0
;
...
...
library/core/src/main/java/com/google/android/exoplayer2/PlaybackInfo.java
View file @
0bb32a8f
...
...
@@ -52,7 +52,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
*/
public
final
long
contentPositionUs
;
/** The current playback state. One of the {@link Player}.STATE_ constants. */
public
final
int
playbackState
;
@Player
.
State
public
final
int
playbackState
;
/** Whether the player is currently loading. */
public
final
boolean
isLoading
;
/** The currently available track groups. */
...
...
@@ -128,7 +128,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
MediaPeriodId
periodId
,
long
startPositionUs
,
long
contentPositionUs
,
int
playbackState
,
@Player
.
State
int
playbackState
,
boolean
isLoading
,
TrackGroupArray
trackGroups
,
TrackSelectorResult
trackSelectorResult
,
...
...
library/core/src/main/java/com/google/android/exoplayer2/Player.java
View file @
0bb32a8f
...
...
@@ -361,9 +361,9 @@ public interface Player {
* #getPlaybackState()} changes.
*
* @param playWhenReady Whether playback will proceed when ready.
* @param playbackState
One of the {@code STATE} constants
.
* @param playbackState
The new {@link State playback state}
.
*/
default
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{}
default
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@State
int
playbackState
)
{}
/**
* Called when the value of {@link #getRepeatMode()} changes.
...
...
@@ -444,6 +444,14 @@ public interface Player {
}
/**
* Playback state. One of {@link #STATE_IDLE}, {@link #STATE_BUFFERING}, {@link #STATE_READY} or
* {@link #STATE_ENDED}.
*/
@Documented
@Retention
(
RetentionPolicy
.
SOURCE
)
@IntDef
({
STATE_IDLE
,
STATE_BUFFERING
,
STATE_READY
,
STATE_ENDED
})
@interface
State
{}
/**
* The player does not have any media to play.
*/
int
STATE_IDLE
=
1
;
...
...
@@ -581,10 +589,11 @@ public interface Player {
void
removeListener
(
EventListener
listener
);
/**
* Returns the current
state
of the player.
* Returns the current
{@link State playback state}
of the player.
*
* @return
One of the {@code STATE} constants defined in this interface
.
* @return
The current {@link State playback state}
.
*/
@State
int
getPlaybackState
();
/**
...
...
library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java
View file @
0bb32a8f
...
...
@@ -873,6 +873,7 @@ public class SimpleExoPlayer extends BasePlayer
}
@Override
@Player
.
State
public
int
getPlaybackState
()
{
verifyApplicationThread
();
return
player
.
getPlaybackState
();
...
...
library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java
View file @
0bb32a8f
...
...
@@ -464,7 +464,7 @@ public class AnalyticsCollector
}
@Override
public
final
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
final
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
EventTime
eventTime
=
generatePlayingMediaPeriodEventTime
();
for
(
AnalyticsListener
listener
:
listeners
)
{
listener
.
onPlayerStateChanged
(
eventTime
,
playWhenReady
,
playbackState
);
...
...
library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java
View file @
0bb32a8f
...
...
@@ -127,10 +127,10 @@ public interface AnalyticsListener {
*
* @param eventTime The event time.
* @param playWhenReady Whether the playback will proceed when ready.
* @param playbackState
One of the {@link Player}.STATE constants
.
* @param playbackState
The new {@link Player.State playback state}
.
*/
default
void
onPlayerStateChanged
(
EventTime
eventTime
,
boolean
playWhenReady
,
int
playbackState
)
{}
EventTime
eventTime
,
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{}
/**
* Called when the timeline changed.
...
...
library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java
View file @
0bb32a8f
...
...
@@ -93,7 +93,8 @@ public class EventLogger implements AnalyticsListener {
}
@Override
public
void
onPlayerStateChanged
(
EventTime
eventTime
,
boolean
playWhenReady
,
int
state
)
{
public
void
onPlayerStateChanged
(
EventTime
eventTime
,
boolean
playWhenReady
,
@Player
.
State
int
state
)
{
logd
(
eventTime
,
"state"
,
playWhenReady
+
", "
+
getStateString
(
state
));
}
...
...
library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java
View file @
0bb32a8f
...
...
@@ -509,7 +509,7 @@ public final class ExoPlayerTest {
private
int
currentPlaybackState
=
Player
.
STATE_IDLE
;
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
currentPlaybackState
=
playbackState
;
}
...
...
@@ -2113,7 +2113,7 @@ public final class ExoPlayerTest {
final
EventListener
eventListener1
=
new
EventListener
()
{
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
eventListener1States
.
add
(
playbackState
);
if
(
playbackState
==
Player
.
STATE_READY
)
{
playerReference
.
get
().
stop
(
/* reset= */
true
);
...
...
@@ -2123,7 +2123,7 @@ public final class ExoPlayerTest {
final
EventListener
eventListener2
=
new
EventListener
()
{
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
eventListener2States
.
add
(
playbackState
);
}
};
...
...
@@ -2170,7 +2170,7 @@ public final class ExoPlayerTest {
}
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
eventListenerPlayWhenReady
.
add
(
playWhenReady
);
eventListenerStates
.
add
(
playbackState
);
if
(
playbackState
==
Player
.
STATE_READY
)
{
...
...
@@ -2219,7 +2219,7 @@ public final class ExoPlayerTest {
EventListener
eventListener
=
new
EventListener
()
{
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
if
(
playbackState
==
Player
.
STATE_READY
&&
clockAtStartMs
.
get
()
==
C
.
TIME_UNSET
)
{
clockAtStartMs
.
set
(
clock
.
elapsedRealtime
());
}
...
...
library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java
View file @
0bb32a8f
...
...
@@ -913,7 +913,7 @@ public final class AnalyticsCollectorTest {
@Override
public
void
onPlayerStateChanged
(
EventTime
eventTime
,
boolean
playWhenReady
,
int
playbackState
)
{
EventTime
eventTime
,
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
reportedEvents
.
add
(
new
ReportedEvent
(
EVENT_PLAYER_STATE_CHANGED
,
eventTime
));
}
...
...
library/ui/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java
View file @
0bb32a8f
...
...
@@ -79,7 +79,7 @@ public class DebugTextViewHelper implements Player.EventListener, Runnable {
// Player.EventListener implementation.
@Override
public
final
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
final
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
updateAndPost
();
}
...
...
library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java
View file @
0bb32a8f
...
...
@@ -1130,7 +1130,7 @@ public class PlayerControlView extends FrameLayout {
}
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
updatePlayPauseButton
();
updateProgress
();
}
...
...
library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java
View file @
0bb32a8f
...
...
@@ -1276,7 +1276,7 @@ public class PlayerNotificationManager {
private
class
PlayerListener
implements
Player
.
EventListener
{
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
if
(
wasPlayWhenReady
!=
playWhenReady
||
lastPlaybackState
!=
playbackState
)
{
startOrUpdateNotification
();
wasPlayWhenReady
=
playWhenReady
;
...
...
library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java
View file @
0bb32a8f
...
...
@@ -1427,7 +1427,7 @@ public class PlayerView extends FrameLayout implements AdsLoader.AdViewProvider
// Player.EventListener implementation
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
updateBuffering
();
updateErrorMessage
();
if
(
isPlayingAd
()
&&
controllerHideDuringAds
)
{
...
...
testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java
View file @
0bb32a8f
...
...
@@ -669,7 +669,8 @@ public abstract class Action {
player
.
addListener
(
new
Player
.
EventListener
()
{
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
if
(
targetPlaybackState
==
playbackState
)
{
player
.
removeListener
(
this
);
nextAction
.
schedule
(
player
,
trackSelector
,
surface
,
handler
);
...
...
testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java
View file @
0bb32a8f
...
...
@@ -183,7 +183,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest {
@Override
public
final
void
onPlayerStateChanged
(
EventTime
eventTime
,
boolean
playWhenReady
,
int
playbackState
)
{
EventTime
eventTime
,
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
Log
.
d
(
tag
,
"state ["
+
playWhenReady
+
", "
+
playbackState
+
"]"
);
playerWasPrepared
|=
playbackState
!=
Player
.
STATE_IDLE
;
if
(
playbackState
==
Player
.
STATE_ENDED
...
...
testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java
View file @
0bb32a8f
...
...
@@ -589,7 +589,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc
}
@Override
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
int
playbackState
)
{
public
void
onPlayerStateChanged
(
boolean
playWhenReady
,
@Player
.
State
int
playbackState
)
{
playerWasPrepared
|=
playbackState
!=
Player
.
STATE_IDLE
;
if
(
playbackState
==
Player
.
STATE_ENDED
||
(
playbackState
==
Player
.
STATE_IDLE
&&
playerWasPrepared
))
{
...
...
testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java
View file @
0bb32a8f
...
...
@@ -75,6 +75,7 @@ public abstract class StubExoPlayer extends BasePlayer implements ExoPlayer {
}
@Override
@Player
.
State
public
int
getPlaybackState
()
{
throw
new
UnsupportedOperationException
();
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment