Skip to content

Commit

Permalink
[PBE-4800] fix found voice recording issues (#5412)
Browse files Browse the repository at this point in the history
* fix N2

* fix N9

* fix N3

* fix N7

* fix N4

* fix N1

* fix N6

* code clean up

* fix N8

* spotless & ktlint

* fix N12

* fix N11

* fix 10

* fix N13

* spotless, api_dump, ktlint

* fix unit tests

* fix N14

* fix N14 - extra1

* fix N14 - extra2

* fix detekt

* fix N15

* fix N16

* fix N17

* fix spotless

* fix ktlint

---------

Co-authored-by: Aleksandar Apostolov <[email protected]>
Co-authored-by: Alexey Alter-Pesotskiy <[email protected]>
  • Loading branch information
3 people authored Sep 25, 2024
1 parent 3e4b227 commit 0794b28
Show file tree
Hide file tree
Showing 36 changed files with 1,066 additions and 500 deletions.
2 changes: 2 additions & 0 deletions stream-chat-android-client/api/stream-chat-android-client.api
Original file line number Diff line number Diff line change
Expand Up @@ -2222,6 +2222,7 @@ public final class io/getstream/chat/android/client/extensions/AttachmentExtensi
public static final field EXTRA_UPLOAD_ID Ljava/lang/String;
public static final field EXTRA_WAVEFORM_DATA Ljava/lang/String;
public static final fun getDuration (Lio/getstream/chat/android/models/Attachment;)Ljava/lang/Float;
public static final fun getDurationInMs (Lio/getstream/chat/android/models/Attachment;)Ljava/lang/Integer;
public static final fun getUploadId (Lio/getstream/chat/android/models/Attachment;)Ljava/lang/String;
public static final fun getWaveformData (Lio/getstream/chat/android/models/Attachment;)Ljava/util/List;
}
Expand Down Expand Up @@ -2870,6 +2871,7 @@ public final class io/getstream/chat/android/client/utils/internal/toggle/Toggle
}

public final class io/getstream/chat/android/client/utils/message/MessageUtils {
public static final fun hasAudioRecording (Lio/getstream/chat/android/models/Message;)Z
public static final fun isDeleted (Lio/getstream/chat/android/models/Message;)Z
public static final fun isEphemeral (Lio/getstream/chat/android/models/Message;)Z
public static final fun isError (Lio/getstream/chat/android/models/Message;)Z
Expand Down
1 change: 1 addition & 0 deletions stream-chat-android-client/detekt-baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<ID>LongMethod:ChatClientDebuggerTest.kt$ChatClientDebuggerTest$@BeforeEach fun setUp()</ID>
<ID>LongMethod:ChatSocket.kt$ChatSocket$@Suppress("ComplexMethod") private fun observeSocketStateService(): Job</ID>
<ID>LongMethod:PinnedMessagesRequest.kt$PinnedMessagesRequest.Companion$fun create( limit: Int, sort: QuerySorter&lt;Message>, pagination: PinnedMessagesPagination, ): PinnedMessagesRequest</ID>
<ID>MagicNumber:AttachmentExtensions.kt$1000</ID>
<ID>MagicNumber:Identifiers.kt$31</ID>
<ID>MagicNumber:StreamDateFormatter.kt$StreamDateFormatter$100</ID>
<ID>MagicNumber:StreamDateFormatter.kt$StreamDateFormatter$10000</ID>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3564,7 +3564,7 @@ internal constructor(
}
},
userScope = userScope,
isMarshmallowOrHigher = { Build.VERSION.SDK_INT >= Build.VERSION_CODES.M },
isMarshmallowOrHigher = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M,
)

return ChatClient(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ public interface AudioPlayer {
*/
public val currentState: AudioState

/**
* The identifier of the current audio track.
* If there is no current audio track, it returns -1.
*/
public val currentPlayingId: Int

/**
* Subscribing for audio state changes for the audio of the hash
*
Expand Down Expand Up @@ -101,6 +107,13 @@ public interface AudioPlayer {
*/
public fun currentSpeed(): Float

/**
* Returns the current position of the audio track in milliseconds.
*
* @param audioHash the identifier of the audio track
*/
public fun getCurrentPositionInMs(audioHash: Int): Int

/**
* Removes the current audio form the reproduction queue and removes the listeners
*/
Expand All @@ -111,6 +124,11 @@ public interface AudioPlayer {
*/
public fun removeAudios(audioHashList: List<Int>)

/**
* Resets the player to the initial state and removes all audios.
*/
public fun reset()

/**
* Disposes the MediaPlayer and remove all audios.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,24 @@ internal class NativeMediaPlayerImpl(

private val logger by taggedLogger("Chat:NativeMediaPlayer")

private val _onErrorListener = MediaPlayer.OnErrorListener { mp, what, extra ->
if (DEBUG) logger.e { "[onError] what: $what, extra: $extra, mp: ${mp.hashCode()}" }
state = NativeMediaPlayerState.ERROR
onErrorListener?.invoke(what, extra) ?: false
}

private val _onPreparedListener = MediaPlayer.OnPreparedListener {
if (DEBUG) logger.d { "[onPrepared] no args" }
state = NativeMediaPlayerState.PREPARED
onPreparedListener?.invoke()
}

private val _onCompletionListener = MediaPlayer.OnCompletionListener {
if (DEBUG) logger.d { "[onCompletion] no args" }
state = NativeMediaPlayerState.PLAYBACK_COMPLETED
onCompletionListener?.invoke()
}

private var _mediaPlayer: MediaPlayer? = null
set(value) {
if (DEBUG) logger.i { "[setMediaPlayerInstance] instance: $value" }
Expand Down Expand Up @@ -374,7 +392,8 @@ internal class NativeMediaPlayerImpl(
@RequiresApi(Build.VERSION_CODES.M)
@Throws(IllegalStateException::class, IllegalArgumentException::class)
set(value) {
if (DEBUG) logger.d { "[setSpeed] speed: $value" }
val mediaPlayer = mediaPlayer
if (DEBUG) logger.d { "[setSpeed] mediaPlayer: ${mediaPlayer.hashCode()}, speed: $value" }
mediaPlayer.playbackParams = mediaPlayer.playbackParams.setSpeed(value)
}
override val currentPosition: Int
Expand All @@ -390,61 +409,73 @@ internal class NativeMediaPlayerImpl(
IllegalStateException::class,
)
override fun setDataSource(path: String) {
if (DEBUG) logger.d { "[setDataSource] path: $path" }
val mediaPlayer = mediaPlayer
if (DEBUG) logger.d { "[setDataSource] mediaPlayer: ${mediaPlayer.hashCode()}, path: $path" }
mediaPlayer.setDataSource(path)
state = NativeMediaPlayerState.INITIALIZED
}

@Throws(IllegalStateException::class)
override fun prepareAsync() {
if (DEBUG) logger.d { "[prepareAsync] no args" }
val mediaPlayer = mediaPlayer
if (DEBUG) logger.d { "[prepareAsync] mediaPlayer: ${mediaPlayer.hashCode()}" }
mediaPlayer.prepareAsync()
state = NativeMediaPlayerState.PREPARING
}

@Throws(IOException::class, IllegalStateException::class)
override fun prepare() {
if (DEBUG) logger.d { "[prepare] no args" }
val mediaPlayer = mediaPlayer
if (DEBUG) logger.d { "[prepare] mediaPlayer: ${mediaPlayer.hashCode()}" }
mediaPlayer.prepare()
state = NativeMediaPlayerState.PREPARED
}

@Throws(IllegalStateException::class)
override fun seekTo(msec: Int) {
if (DEBUG) logger.d { "[seekTo] msec: $msec" }
val mediaPlayer = mediaPlayer
if (DEBUG) logger.d { "[seekTo] mediaPlayer: ${mediaPlayer.hashCode()}, msec: $msec" }
mediaPlayer.seekTo(msec)
}

@Throws(IllegalStateException::class)
override fun start() {
if (DEBUG) logger.d { "[start] no args" }
val mediaPlayer = mediaPlayer
if (DEBUG) logger.d { "[start] mediaPlayer: ${mediaPlayer.hashCode()}" }
mediaPlayer.start()
state = NativeMediaPlayerState.STARTED
}

@Throws(IllegalStateException::class)
override fun pause() {
if (DEBUG) logger.d { "[pause] no args" }
val mediaPlayer = mediaPlayer
if (DEBUG) logger.d { "[pause] mediaPlayer: ${mediaPlayer.hashCode()}" }
mediaPlayer.pause()
state = NativeMediaPlayerState.PAUSED
}

@Throws(IllegalStateException::class)
override fun stop() {
if (DEBUG) logger.d { "[stop] no args" }
val mediaPlayer = mediaPlayer
if (DEBUG) logger.d { "[stop] mediaPlayer: ${mediaPlayer.hashCode()}" }
mediaPlayer.stop()
state = NativeMediaPlayerState.STOPPED
}

override fun reset() {
if (DEBUG) logger.d { "[reset] no args" }
val mediaPlayer = mediaPlayer
if (DEBUG) logger.d { "[reset] mediaPlayer: ${mediaPlayer.hashCode()}" }
mediaPlayer.reset()
state = NativeMediaPlayerState.IDLE
}

override fun release() {
if (DEBUG) logger.d { "[release] no args" }
mediaPlayer.release()
val mediaPlayer = _mediaPlayer ?: run {
if (DEBUG) logger.d { "[release] mediaPlayer is null" }
return
}
if (DEBUG) logger.d { "[release] mediaPlayer: ${mediaPlayer.hashCode()}" }
mediaPlayer.clearListeners().release()
state = NativeMediaPlayerState.END
_mediaPlayer = null
}
Expand All @@ -465,22 +496,18 @@ internal class NativeMediaPlayerImpl(
}

private fun MediaPlayer.setupListeners(): MediaPlayer {
setOnErrorListener { _, what, extra ->
if (DEBUG) logger.e { "[onError] what: $what, extra: $extra" }
state = NativeMediaPlayerState.ERROR
_mediaPlayer = null
onErrorListener?.invoke(what, extra) ?: false
}
setOnPreparedListener {
if (DEBUG) logger.d { "[onPrepared] no args" }
state = NativeMediaPlayerState.PREPARED
onPreparedListener?.invoke()
}
setOnCompletionListener {
if (DEBUG) logger.d { "[onCompletion] no args" }
state = NativeMediaPlayerState.PLAYBACK_COMPLETED
onCompletionListener?.invoke()
}
if (DEBUG) logger.d { "[setupListeners] mediaPlayer: ${this.hashCode()}" }
setOnErrorListener(_onErrorListener)
setOnPreparedListener(_onPreparedListener)
setOnCompletionListener(_onCompletionListener)
return this
}

private fun MediaPlayer.clearListeners(): MediaPlayer {
if (DEBUG) logger.d { "[clearListeners] mediaPlayer: ${this.hashCode()}" }
setOnErrorListener(null)
setOnPreparedListener(null)
setOnCompletionListener(null)
return this
}
}
Loading

0 comments on commit 0794b28

Please sign in to comment.