Browse Source

Refactor: move music player to view model

liweihao 6 years ago
parent
commit
3cb5611558

+ 27 - 36
src/main/java/com/bomostory/sceneeditmodule/screen/movie/MovieEditActivity.kt

@@ -31,7 +31,6 @@ import com.bomostory.sceneeditmodule.share.ExportPdfDialog
 import com.bomostory.sceneeditmodule.share.ShareDialog
 import com.bomostory.sceneeditmodule.utils.FileUtils
 import com.bomostory.sceneeditmodule.utils.MoviePlayerV2
-import com.bomostory.sceneeditmodule.utils.MusicPlayerV2
 import com.bomostory.sceneeditmodule.utils.Utils
 import com.example.exportmedia.MediaHelper
 import com.example.tfat.myapplication.R
@@ -53,45 +52,27 @@ class MovieEditActivity : AppCompatActivity(),
         viewModel.importMusic(music)
         moviePlayer.init()
 
-        val dialogFragment = supportFragmentManager.findFragmentByTag(MUSIC_SELECT_DIALOG_TAG) as DialogFragment
-        dialogFragment.dismiss()
+        musicSelectDialog?.dismiss()
     }
 
     override fun onMusicPreCastClick(music: Music) {
-        musicPlayer.apply {
-            this.music = music
-            stop()
-            init()
-            start()
-        }
+        viewModel.precastMusic(music)
     }
 
     override fun onMusicPlayClick(music: Music, startPosition: Int) {
-        musicPlayer.apply {
-            this.music = music
-            playChangedListener = object : MusicPlayerV2.OnPlayChangedListener {
-                override fun OnPlayChanged(position: Int) {
-                    runOnUiThread {
-                        musicEditDialog?.currentPosition = position
-                    }
-                }
-            }
-            init()
-            seekTo(startPosition)
-            start()
-        }
+        viewModel.playMusic(music, startPosition)
     }
 
     override fun onMusicVolumeChanged(volume: Float) {
-        musicPlayer.setVolume(volume)
+        viewModel.setMusicVolume(volume)
     }
 
     override fun onMusicPauseClick() {
-        musicPlayer.pause()
+        viewModel.pauseMusic()
     }
 
     override fun onMusicStop() {
-        musicPlayer.stop()
+        viewModel.stopMusic()
     }
 
     override fun onMusicEditFinish(music: Music) {
@@ -100,11 +81,13 @@ class MovieEditActivity : AppCompatActivity(),
     }
 
     override fun onDismiss(dialog: DialogInterface?) {
-        musicPlayer.stop()
+        viewModel.stopMusic()
         delayedHide(100)
     }
 
     private var musicEditDialog: MusicEditDialog? = null
+    private var musicSelectDialog: MusicSelectDialog? = null
+
     private val shareDialog = ShareDialog()
     private lateinit var progressDialog: ProgressDialog
 
@@ -127,8 +110,6 @@ class MovieEditActivity : AppCompatActivity(),
 
     private val moviePlayer = MoviePlayerV2()
 
-    private val musicPlayer = MusicPlayerV2()
-
     private val mediaHelper = MediaHelper()
 
     companion object {
@@ -178,7 +159,11 @@ class MovieEditActivity : AppCompatActivity(),
                 movieEditView.currentAudioPosition = indexOf(it)
             }
         })
-
+        viewModel.musicPlayPosition.observe(this, Observer {
+            it?.let {
+                musicEditDialog?.currentPosition = it
+            }
+        })
         viewModel.showProgressingLiveData.observe(this, Observer {
             it?.let {
                 if (it) {
@@ -297,8 +282,8 @@ class MovieEditActivity : AppCompatActivity(),
     private fun addMusic(view: View) {
         viewModel.parseDeviceMusic(contentResolver)
 
-        val musicSelectDialog = MusicSelectDialog.newInstance(Gson().toJson(viewModel.musicSource))
-        musicSelectDialog.show(supportFragmentManager, MUSIC_SELECT_DIALOG_TAG)
+        musicSelectDialog = MusicSelectDialog.newInstance(Gson().toJson(viewModel.musicSource))
+        musicSelectDialog?.show(supportFragmentManager, MUSIC_SELECT_DIALOG_TAG)
     }
 
     private fun editMusic(view: View) {
@@ -370,11 +355,11 @@ class MovieEditActivity : AppCompatActivity(),
                 onSave = View.OnClickListener { it ->
                     if (storyName == "") {
                         showEmptyProjectNameMsg()
-                    /** TODO: 目前不支援 rename **/
-                    /**
-                    } else if (storyName != oldName && viewModel.isProjectNameExist(storyName)) {
+                        /** TODO: 目前不支援 rename **/
+                        /**
+                        } else if (storyName != oldName && viewModel.isProjectNameExist(storyName)) {
                         showDuplicatedProjectNameMsg()
-                    **/
+                         **/
                     } else {
                         if (coverFile == null) {
                             project.coverFile = null
@@ -393,7 +378,7 @@ class MovieEditActivity : AppCompatActivity(),
                                 .doOnSubscribe { pd.show() }
                                 .doFinally { pd.dismiss() }
                                 .subscribe {
-//                                    projectManager.reloadProjects()
+                                    //                                    projectManager.reloadProjects()
                                     dismiss()
                                 }
                     }
@@ -590,16 +575,22 @@ class MovieEditActivity : AppCompatActivity(),
 
     override fun onPause() {
         super.onPause()
+
+        musicSelectDialog?.dismiss()
+        musicEditDialog?.dismiss()
+
         moviePlayer.pause()
     }
 
     override fun onStop() {
         super.onStop()
+
         moviePlayer.init()
     }
 
     override fun onDestroy() {
         super.onDestroy()
+
         viewModel.onDestroy()
     }
 }

+ 42 - 0
src/main/java/com/bomostory/sceneeditmodule/screen/movie/MovieEditViewModel.kt

@@ -8,6 +8,7 @@ import android.media.MediaMetadataRetriever
 import com.bomostory.sceneeditmodule.Config
 import com.bomostory.sceneeditmodule.basicdata.*
 import com.bomostory.sceneeditmodule.utils.FileUtils
+import com.bomostory.sceneeditmodule.utils.MusicPlayerV2
 import com.bomostory.sceneeditmodule.utils.TimeUtils
 import com.example.bomocloud.BoMoCloud
 import com.example.bomocloud.video.UploadVideoData
@@ -38,6 +39,8 @@ class MovieEditViewModel : ViewModel() {
 
     val musicLiveData = MutableLiveData<Music>()
 
+    val musicPlayPosition = MutableLiveData<Int>()
+
     val showProgressingLiveData = MutableLiveData<Boolean>()
 
     val musicListLiveData = MutableLiveData<List<Music>>().apply {
@@ -62,6 +65,8 @@ class MovieEditViewModel : ViewModel() {
 
     var musicSource = MusicSource()
 
+    private val musicPlayer = MusicPlayerV2()
+
 
     fun parseDeviceMusic(contentResolver: ContentResolver) {
         val libMusicPaths = ArrayList<String?>()
@@ -140,6 +145,41 @@ class MovieEditViewModel : ViewModel() {
         }
     }
 
+    fun precastMusic(music: Music) {
+        musicPlayer.apply {
+            this.music = music
+            stop()
+            init()
+            start()
+        }
+    }
+
+    fun playMusic(music: Music, startPosition: Int) {
+        musicPlayer.apply {
+            this.music = music
+            playChangedListener = object : MusicPlayerV2.OnPlayChangedListener {
+                override fun onPlayChanged(position: Int) {
+                    musicPlayPosition.postValue(position)
+                }
+            }
+            init()
+            seekTo(startPosition)
+            start()
+        }
+    }
+
+    fun pauseMusic(){
+        musicPlayer.pause()
+    }
+
+    fun stopMusic(){
+        musicPlayer.stop()
+    }
+
+    fun setMusicVolume(volume: Float) {
+        musicPlayer.setVolume(volume)
+    }
+
     fun uploadVideo(context: Context, file: File, project: Project): Observable<UploadVideoData> {
         val id = context.getString(R.string.bomo_cloud_client_id)
         val secret = context.getString(R.string.bomo_cloud_client_secret)
@@ -214,6 +254,8 @@ class MovieEditViewModel : ViewModel() {
     }
 
     fun onDestroy() {
+        musicPlayer.release()
+
         project?.let {
             val musicPath = "${FileUtils.getProjectPath(it)}/${Config.MUSIC_FOLDER_NAME}"
             val musicFolder = File(musicPath)

+ 2 - 2
src/main/java/com/bomostory/sceneeditmodule/utils/MusicPlayerV2.kt

@@ -6,7 +6,7 @@ import java.util.*
 
 class MusicPlayerV2 {
     interface OnPlayChangedListener {
-        fun OnPlayChanged(position: Int)
+        fun onPlayChanged(position: Int)
     }
 
     lateinit var music: Music
@@ -69,7 +69,7 @@ class MusicPlayerV2 {
         timer?.scheduleAtFixedRate(object : TimerTask() {
             override fun run() {
                 if (!isPause) {
-                    playChangedListener?.OnPlayChanged(mediaPlayer.currentPosition)
+                    playChangedListener?.onPlayChanged(mediaPlayer.currentPosition)
                 }
             }
         }, 0, 1)