diff --git a/app/src/main/assets/svga/user_sound_play.svga b/app/src/main/assets/svga/user_sound_play.svga new file mode 100644 index 000000000..7de9152ea Binary files /dev/null and b/app/src/main/assets/svga/user_sound_play.svga differ diff --git a/app/src/main/java/com/yizhuan/erban/UIHelper.java b/app/src/main/java/com/yizhuan/erban/UIHelper.java index a37e61ae1..2ec34ab8b 100644 --- a/app/src/main/java/com/yizhuan/erban/UIHelper.java +++ b/app/src/main/java/com/yizhuan/erban/UIHelper.java @@ -23,6 +23,7 @@ import com.yizhuan.erban.ui.webview.CommonWebViewActivity; import com.yizhuan.xchat_android_core.UriProvider; import com.yizhuan.xchat_android_core.statistic.StatisticManager; import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol; +import com.yizhuan.xchat_android_core.user.bean.UserInfo; import com.yizhuan.xchat_android_library.utils.ResUtil; @@ -136,9 +137,10 @@ public class UIHelper { mActivity.startActivityForResult(intent, requestCode); } - public static void showSoundAct(Activity mActivity, int requestCode, String label) { + public static void showSoundAct(Activity mActivity, int requestCode, String label, UserInfo.SoundBean audioCard) { StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_MY_SOUND, ResUtil.getString(R.string.yizhuan_erban_uihelper_03) + label); Intent intent = new Intent(mActivity, SoundSignatureActivity.class); + intent.putExtra(SoundSignatureActivity.AUDIO_BEAN, audioCard); mActivity.startActivityForResult(intent, requestCode); } diff --git a/app/src/main/java/com/yizhuan/erban/audio/SoundSignatureActivity.kt b/app/src/main/java/com/yizhuan/erban/audio/SoundSignatureActivity.kt index 0bafaa9ad..d609e8067 100644 --- a/app/src/main/java/com/yizhuan/erban/audio/SoundSignatureActivity.kt +++ b/app/src/main/java/com/yizhuan/erban/audio/SoundSignatureActivity.kt @@ -19,7 +19,6 @@ import com.opensource.svgaplayer.SVGAParser import com.opensource.svgaplayer.SVGAVideoEntity import com.yizhuan.erban.R import com.yizhuan.erban.audio.helper.AudioPlayerHelper -import com.yizhuan.erban.audio.presenter.RecordingVoicePresenter import com.yizhuan.erban.audio.viewmodel.SoundViewModel import com.yizhuan.erban.base.BaseViewBindingActivity import com.yizhuan.erban.common.widget.dialog.DialogManager.OkCancelDialogListener @@ -29,6 +28,7 @@ import com.yizhuan.xchat_android_core.file.FileModel import com.yizhuan.xchat_android_core.room.model.AvRoomModel import com.yizhuan.xchat_android_core.statistic.StatisticManager import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol +import com.yizhuan.xchat_android_core.user.bean.UserInfo.SoundBean import com.yizhuan.xchat_android_library.utils.ResUtil import com.yizhuan.xchat_android_library.utils.SingleToastUtil import io.reactivex.SingleObserver @@ -43,6 +43,7 @@ class SoundSignatureActivity : BaseViewBindingActivity { + refreshButtonView(SoundViewModel.STATE_RECORD_NORMAL) + } + 1 -> { + val showStr = String.format( + Locale.getDefault(), + "%ds / %ds", + 0, + MAX_RECORD_VOICE_DURATION + ) + binding.tvSoundTime.text = showStr + soundViewModel.audioState = SoundViewModel.STATE_RECORD_SUCCESS + soundViewModel.audioUrl = audioCard.audioUrl ?: "" + refreshButtonView(SoundViewModel.STATE_RECORD_SAVE_SUCCESS) + } + 2 -> { + val showStr = String.format( + Locale.getDefault(), + "%ds / %ds", + 0, + MAX_RECORD_VOICE_DURATION + ) + binding.tvSoundTime.text = showStr + soundViewModel.audioState = SoundViewModel.STATE_RECORD_SUCCESS + soundViewModel.audioUrl = audioCard.audioUrl ?: "" + refreshButtonView(SoundViewModel.STATE_RECORD_AUDIT_SUCCESS) + } + else -> { + refreshButtonView(SoundViewModel.STATE_RECORD_NORMAL) + } + } } private fun setListener() { @@ -136,7 +169,7 @@ class SoundSignatureActivity : BaseViewBindingActivity {//保存按钮 finishRecord() @@ -251,7 +285,7 @@ class SoundSignatureActivity : BaseViewBindingActivity { binding.ivSoundStatus.post { binding.ivSoundStatus.setImageResource(R.drawable.ic_pause_record) } @@ -271,6 +305,15 @@ class SoundSignatureActivity : BaseViewBindingActivity { + binding.ivSoundStatus.post { binding.ivSoundStatus.setImageResource(R.drawable.ic_pause_record) } + binding.tvRecordTip.text = getString(R.string.click_to_listen) + binding.groupRsRecord.visibility = View.VISIBLE + binding.groupSaveSound.visibility = View.INVISIBLE + binding.groupDeleteSound.visibility = View.VISIBLE + binding.tvUnderReview.visibility = View.GONE + binding.svgRecorder.stopAnimation() + } } } @@ -286,7 +329,7 @@ class SoundSignatureActivity : BaseViewBindingActivity { try { ClipboardManager cm = (ClipboardManager) UserInfoActivity.this.getSystemService(Context.CLIPBOARD_SERVICE); @@ -607,7 +609,22 @@ public class UserInfoActivity extends BaseBindingActivity toggleAudio(skillEntity.getPropVals())); + mBinding.tvAudio.setText(String.valueOf(audioCard.getSecond())); + mBinding.livUser.stopAnimation(); + mBinding.llAudio.setOnClickListener(v -> toggleAudio(audioCard)); } else { mBinding.llAudio.setVisibility(View.GONE); } } - private void toggleAudio(List list) { - if (ListUtils.isListEmpty(list)) return; + private void toggleAudio(UserInfo.SoundBean audioCard) { String url = ""; - for (String s : list) { - if (s.contains("http")) { - url = s; - } + if (audioCard.getAudioUrl().contains("http")) { + url = audioCard.getAudioUrl(); } if (TextUtils.isEmpty(url)) return; if (!audioPlaying) { - playAudio(url); + playAudio(url, audioCard.getSecond()); } else { stopAudio(); } } - private void playAudio(String url) { + private void playAudio(String url, int second) { if (audioPlaying) return; audioPlaying = true; - mBinding.livUser.start(); + playSvgaBg(mBinding.livUser, "svga/user_sound_play.svga"); + startChronometer(second); mBinding.ivAudioControl.setImageResource(R.drawable.ic_skill_play); AudioPlayerHelper.get().playInThread(url, new OnPlayListener() { @@ -681,10 +697,34 @@ public class UserInfoActivity extends BaseBindingActivity { + long elapsedMillis = + SystemClock.elapsedRealtime() - chronometer.getBase(); + int second = (int) (elapsedMillis / 1000); + String showStr = String.format( + Locale.getDefault(), + "%d", + second + ); + if (second >= time) { + stopChronometer();// 录制时长超过上限时,停止录制 + } + chronometer.setText(showStr); + }); + mBinding.tvAudio.setBase(SystemClock.elapsedRealtime()); + mBinding.tvAudio.start(); + } + + private void stopChronometer(){ + mBinding.tvAudio.stop(); + } + private void stopAudio() { + stopChronometer(); if (!audioPlaying) return; audioPlaying = false; - mBinding.livUser.stop(); + mBinding.livUser.stopAnimation(); mBinding.ivAudioControl.setImageResource(R.drawable.ic_skill_pause); AudioPlayerHelper.get().endPlay(); } @@ -701,7 +741,6 @@ public class UserInfoActivity extends BaseBindingActivity - + + + android:format="60" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@color/white" + android:textSize="@dimen/sp_14" + tools:text="60" /> + + diff --git a/app/src/main/res/mipmap-xhdpi/user_sound_play.webp b/app/src/main/res/mipmap-xhdpi/user_sound_play.webp new file mode 100644 index 000000000..60b365c7d Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/user_sound_play.webp differ diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/user/bean/UserInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/user/bean/UserInfo.java index 362d5ac51..cf5e2c739 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/user/bean/UserInfo.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/user/bean/UserInfo.java @@ -821,7 +821,7 @@ public class UserInfo implements Serializable { * 声音签名 */ @Data - public static class SoundBean { + public static class SoundBean implements Serializable{ private long uid; private String audioUrl;//音频七牛云url private Integer second;//时间