diff --git a/app/src/main/java/com/zs/smarthuman/ui/MainActivity.kt b/app/src/main/java/com/zs/smarthuman/ui/MainActivity.kt index f2338f0..54365fe 100644 --- a/app/src/main/java/com/zs/smarthuman/ui/MainActivity.kt +++ b/app/src/main/java/com/zs/smarthuman/ui/MainActivity.kt @@ -56,6 +56,7 @@ import com.zs.smarthuman.utils.DangerousUtils import com.zs.smarthuman.utils.UnityPlayerHolder import com.zs.smarthuman.utils.ViewSlideAnimator import com.zs.smarthuman.viewmodel.MainViewModel +import com.zs.smarthuman.widget.VersionUpdateDialog import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -93,6 +94,8 @@ class MainActivity : BaseViewModelActivity() private val audioFormat = AudioFormat.ENCODING_PCM_16BIT private var mVerticalAnimator: ViewSlideAnimator? = null + private var versionUpdateDialog: VersionUpdateDialog? = null + override fun getViewBinding(): ActivityMainBinding = ActivityMainBinding.inflate(layoutInflater) override fun initView() { UnityPlayerHolder.getInstance().initialize(this) @@ -101,6 +104,7 @@ class MainActivity : BaseViewModelActivity() .setDirection(ViewSlideAnimator.Direction.VERTICAL) .setAnimationDuration(300) .build() + } override fun initData() { @@ -131,7 +135,7 @@ class MainActivity : BaseViewModelActivity() mViewModel?.getUserInfo() } - private fun versionUpdate(){ + private fun versionUpdate() { mViewModel?.versionUpdate() } @@ -164,13 +168,16 @@ class MainActivity : BaseViewModelActivity() - mViewModel?.versionUpdateLiveData?.observe(this){ - when(it){ + mViewModel?.versionUpdateLiveData?.observe(this) { + when (it) { is ApiResult.Error -> {} is ApiResult.Success -> { - if (it.data.versionCode > BuildConfig.VERSION_CODE) - {//有新版本 - + if (it.data.versionCode > BuildConfig.VERSION_CODE) {//有新版本 + versionUpdateDialog = VersionUpdateDialog(this, it.data) + versionUpdateDialog?.show() + lifecycleScope.launch(Dispatchers.IO) { + downloadApk(it.data.downloadUrl) + } } } } @@ -190,7 +197,8 @@ class MainActivity : BaseViewModelActivity() voiceInfo = mutableListOf().apply { add( VoiceBeanResp( - audioUrl = UserInfoManager.userInfo?.wakeUpAudioUrl ?: "https://static.seerteach.net/aidialogue/systemVoice/aliyun-nv.mp3" + audioUrl = UserInfoManager.userInfo?.wakeUpAudioUrl + ?: "https://static.seerteach.net/aidialogue/systemVoice/aliyun-nv.mp3" ) ) } @@ -209,7 +217,7 @@ class MainActivity : BaseViewModelActivity() ) AudioDebugUtil.saveFloatPcmAsWav(audio, file) LogUtils.dTag("audioxx", "WAV saved: ${file.path}, samples=${audio.size}") - lifecycleScope.launch(Dispatchers.Main){ + lifecycleScope.launch(Dispatchers.Main) { mVerticalAnimator?.show() } @@ -235,11 +243,13 @@ class MainActivity : BaseViewModelActivity() VoiceState.WAIT_SPEECH -> { } + VoiceState.RECORDING -> { startRecording() } - VoiceState.PLAYING_PROMPT ->{} - VoiceState.PLAYING_BACKEND ->{} + + VoiceState.PLAYING_PROMPT -> {} + VoiceState.PLAYING_BACKEND -> {} VoiceState.UPLOADING -> {} VoiceState.WAIT_SPEECH_COOLDOWN -> {} @@ -340,7 +350,11 @@ class MainActivity : BaseViewModelActivity() if (isRecording) return if (audioRecord == null && !initMicrophone()) return - try { audioRecord?.startRecording() } catch (e: IllegalStateException) { recreateAudioRecord(); return } + try { + audioRecord?.startRecording() + } catch (e: IllegalStateException) { + recreateAudioRecord(); return + } isRecording = true lifecycleScope.launch(Dispatchers.IO) { @@ -359,7 +373,6 @@ class MainActivity : BaseViewModelActivity() } - private fun recreateAudioRecord() { stopRecording() try { @@ -403,8 +416,8 @@ class MainActivity : BaseViewModelActivity() word: String, audioUrl: String ) { - val wakeupUrl = UserInfoManager.userInfo?.wakeUpAudioUrl ?: - "https://static.seerteach.net/aidialogue/systemVoice/aliyun-nv.mp3" + val wakeupUrl = UserInfoManager.userInfo?.wakeUpAudioUrl + ?: "https://static.seerteach.net/aidialogue/systemVoice/aliyun-nv.mp3" if (audioUrl != wakeupUrl) return @@ -487,24 +500,24 @@ class MainActivity : BaseViewModelActivity() .toDownloadFlow(destPath) .onProgress { lifecycleScope.launch(Dispatchers.Main) { - + versionUpdateDialog?.updateProgress(it.progress) } }.catch { lifecycleScope.launch(Dispatchers.Main) { - + versionUpdateDialog?.dismiss() } }.collect { //下载完成 if (AppUtils.isAppRoot()) { lifecycleScope.launch(Dispatchers.Main) { DangerousUtils.installAppSilent(it, "-r") - + versionUpdateDialog?.dismiss() } } else { lifecycleScope.launch(Dispatchers.Main) { AppUtils.installApp(it) - + versionUpdateDialog?.dismiss() } } diff --git a/app/src/main/java/com/zs/smarthuman/widget/BaseDialog.kt b/app/src/main/java/com/zs/smarthuman/widget/BaseDialog.kt new file mode 100644 index 0000000..e4a3a53 --- /dev/null +++ b/app/src/main/java/com/zs/smarthuman/widget/BaseDialog.kt @@ -0,0 +1,65 @@ +package com.zs.smarthuman.widget + +import android.annotation.SuppressLint +import android.app.Dialog +import android.content.Context +import android.os.Build +import android.os.Bundle +import android.view.View +import android.view.WindowManager +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.viewbinding.ViewBinding +import com.zs.smarthuman.R +import kotlin.let + +/** + * @author lrs + * @date 2025/4/12 19:35 + * @description 基础dialog + */ +abstract class BaseDialog(context: Context) : Dialog(context,R.style.LightDialog) { + lateinit var binding: T + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = getViewBinding() + setContentView(binding.root) + initView() + } + protected abstract fun getViewBinding(): T + + + + override fun show() { + this.window?.setFlags( + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + ) + super.show() + window?.let { + fullScreenImmersive(it.decorView) + it.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) + it.setDimAmount(0.85f) + } + //设置dialog弹窗宽高 + val params: WindowManager.LayoutParams = window!!.attributes + params.height = ConstraintLayout.LayoutParams.MATCH_PARENT + params.width = ConstraintLayout.LayoutParams.MATCH_PARENT + window?.attributes = params + } + + + @SuppressLint("ObsoleteSdkInt") + private fun fullScreenImmersive(view: View) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + val uiOptions = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE + or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + or View.SYSTEM_UI_FLAG_FULLSCREEN) + view.systemUiVisibility = uiOptions + } + } + + abstract fun initView() +} \ No newline at end of file diff --git a/app/src/main/java/com/zs/smarthuman/widget/VersionUpdateDialog.kt b/app/src/main/java/com/zs/smarthuman/widget/VersionUpdateDialog.kt new file mode 100644 index 0000000..b328909 --- /dev/null +++ b/app/src/main/java/com/zs/smarthuman/widget/VersionUpdateDialog.kt @@ -0,0 +1,24 @@ +package com.zs.smarthuman.widget + +import android.content.Context +import com.zs.smarthuman.bean.VersionUpdateResp +import com.zs.smarthuman.databinding.DialogVersionUpdateBinding + +/** + * @description: + * @author: lrs + * @date: 2026/1/5 9:41 + */ +class VersionUpdateDialog(context: Context, val versionUpdateResp: VersionUpdateResp) : + BaseDialog(context) { + override fun getViewBinding(): DialogVersionUpdateBinding = + DialogVersionUpdateBinding.inflate(layoutInflater) + + override fun initView() { + binding.tvDesc.text = versionUpdateResp.updateLog + } + + fun updateProgress(current: Int){ + binding.pb.progress = current + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_version_update_dialog.xml b/app/src/main/res/drawable/bg_version_update_dialog.xml new file mode 100644 index 0000000..c4eb971 --- /dev/null +++ b/app/src/main/res/drawable/bg_version_update_dialog.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_rocket.png b/app/src/main/res/drawable/icon_rocket.png new file mode 100644 index 0000000..667eb4b Binary files /dev/null and b/app/src/main/res/drawable/icon_rocket.png differ diff --git a/app/src/main/res/drawable/version_update_progress.xml b/app/src/main/res/drawable/version_update_progress.xml new file mode 100644 index 0000000..7ec4bd2 --- /dev/null +++ b/app/src/main/res/drawable/version_update_progress.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_version_update.xml b/app/src/main/res/layout/dialog_version_update.xml new file mode 100644 index 0000000..bcc3604 --- /dev/null +++ b/app/src/main/res/layout/dialog_version_update.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 05520ad..4464725 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -17,4 +17,15 @@ true false + + \ No newline at end of file