From 5b797facd39abd8b825d2fa5f7451b06c88bd55d Mon Sep 17 00:00:00 2001 From: cheon-eunsong Date: Wed, 25 Aug 2021 01:07:59 +0900 Subject: [PATCH 1/7] #8 commit --- presentation/src/main/AndroidManifest.xml | 13 ++++++++----- .../presentation/ui/record/RecordActivity.kt | 4 ---- .../ui/record/VoiceRecordActivity.kt | 19 +++++++++++++++++++ .../main/res/layout/activity_voice_record.xml | 10 ++++++++++ 4 files changed, 37 insertions(+), 9 deletions(-) delete mode 100644 presentation/src/main/java/com/voda/presentation/ui/record/RecordActivity.kt create mode 100644 presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt create mode 100644 presentation/src/main/res/layout/activity_voice_record.xml diff --git a/presentation/src/main/AndroidManifest.xml b/presentation/src/main/AndroidManifest.xml index ee87dc8..8e5b81e 100644 --- a/presentation/src/main/AndroidManifest.xml +++ b/presentation/src/main/AndroidManifest.xml @@ -5,7 +5,7 @@ - + - - + + + - - diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/RecordActivity.kt b/presentation/src/main/java/com/voda/presentation/ui/record/RecordActivity.kt deleted file mode 100644 index 5dc667a..0000000 --- a/presentation/src/main/java/com/voda/presentation/ui/record/RecordActivity.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.voda.presentation.ui.record - -class RecordActivity { -} \ No newline at end of file diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt new file mode 100644 index 0000000..9ec1a80 --- /dev/null +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt @@ -0,0 +1,19 @@ +package com.voda.presentation.ui.record + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.voda.presentation.R +import com.voda.presentation.ui.main.nav.BottomNavFragment + +class VoiceRecordActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_voice_record) + + if (savedInstanceState == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.container, BottomNavFragment.newInstance()) + .commitNow() + } + } +} \ No newline at end of file diff --git a/presentation/src/main/res/layout/activity_voice_record.xml b/presentation/src/main/res/layout/activity_voice_record.xml new file mode 100644 index 0000000..887bb5e --- /dev/null +++ b/presentation/src/main/res/layout/activity_voice_record.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file From eb53b862643440444c9824f31d4111ab104c3e86 Mon Sep 17 00:00:00 2001 From: cheon-eunsong Date: Wed, 25 Aug 2021 01:47:22 +0900 Subject: [PATCH 2/7] =?UTF-8?q?#8=20=EA=B5=AC=EC=A1=B0=20=EC=9E=A1?= =?UTF-8?q?=EA=B8=B0=20=EC=A7=84=ED=96=89=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../com/voda/presentation/di/AppModule.kt | 2 + .../ui/record/VoiceRecordActivity.kt | 21 ++++++- .../ui/record/VoiceRecordFragment.kt | 60 +++++++++++++++++++ .../ui/record/VoiceRecordViewModel.kt | 17 ++++++ .../ui/record/model/VoiceRecordArg.kt | 8 +++ .../main/res/layout/fragment_voice_record.xml | 23 +++++++ 7 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt create mode 100644 presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt create mode 100644 presentation/src/main/java/com/voda/presentation/ui/record/model/VoiceRecordArg.kt create mode 100644 presentation/src/main/res/layout/fragment_voice_record.xml diff --git a/build.gradle b/build.gradle index bd898dd..66b7f3b 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { } dependencies { classpath "com.android.tools.build:gradle:4.1.1" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21" classpath 'com.google.gms:google-services:4.3.8' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/presentation/src/main/java/com/voda/presentation/di/AppModule.kt b/presentation/src/main/java/com/voda/presentation/di/AppModule.kt index 75ec020..c10c9b1 100644 --- a/presentation/src/main/java/com/voda/presentation/di/AppModule.kt +++ b/presentation/src/main/java/com/voda/presentation/di/AppModule.kt @@ -2,6 +2,7 @@ package com.voda.presentation.di import com.voda.presentation.ui.main.home.HomeViewModel import com.voda.presentation.ui.main.nav.BottomNavViewModel +import com.voda.presentation.ui.record.VoiceRecordViewModel import org.koin.android.viewmodel.dsl.viewModel import org.koin.dsl.module @@ -9,5 +10,6 @@ val presentationModule = module { viewModel { BottomNavViewModel() } viewModel { HomeViewModel(get()) } + viewModel { VoiceRecordViewModel() } } \ No newline at end of file diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt index 9ec1a80..58be7b7 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt @@ -1,19 +1,38 @@ package com.voda.presentation.ui.record +import android.content.Context +import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.voda.presentation.R import com.voda.presentation.ui.main.nav.BottomNavFragment +import com.voda.presentation.ui.record.model.VoiceRecordArg class VoiceRecordActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_voice_record) + val arg = getArg(intent) + if (savedInstanceState == null) { supportFragmentManager.beginTransaction() - .replace(R.id.container, BottomNavFragment.newInstance()) + .replace(R.id.container, VoiceRecordFragment.newInstance(arg)) .commitNow() } } + + private fun getArg(intent: Intent): VoiceRecordArg? { + return intent.getSerializableExtra(ARG) as? VoiceRecordArg + } + + companion object { + private const val ARG = "voice_record_arg" + + fun starterIntent(context: Context, voiceRecordArg: VoiceRecordArg): Intent { + return Intent(context, VoiceRecordActivity::class.java).apply { + putExtra(ARG, voiceRecordArg) + } + } + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt new file mode 100644 index 0000000..37fc77c --- /dev/null +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt @@ -0,0 +1,60 @@ +package com.voda.presentation.ui.record + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.voda.presentation.R +import com.voda.presentation.databinding.FragmentVoiceRecordBinding +import com.voda.presentation.ui.record.model.VoiceRecordArg +import org.koin.android.viewmodel.ext.android.viewModel + + +private const val ARG_PARAM = "voice_record_arg" + +class VoiceRecordFragment : Fragment() { + + val viewModel: VoiceRecordViewModel by viewModel() + private lateinit var viewDataBinding: FragmentVoiceRecordBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + requireNotNull(arguments).apply { + (this.getSerializable(ARG_PARAM) as? VoiceRecordArg)?.run { + viewModel.setArg(this) + } + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + viewDataBinding = FragmentVoiceRecordBinding.inflate(inflater, container, false).apply { + viewmodel = viewModel + } + return viewDataBinding.root + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + setupLifecycleOwner() + + } + + private fun setupLifecycleOwner() { + viewDataBinding.lifecycleOwner = this.viewLifecycleOwner + } + + companion object { + + @JvmStatic + fun newInstance(arg: VoiceRecordArg) = + VoiceRecordFragment().apply { + arguments = Bundle().apply { + putSerializable(ARG_PARAM, arg) + } + } + } +} \ No newline at end of file diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt new file mode 100644 index 0000000..233db06 --- /dev/null +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt @@ -0,0 +1,17 @@ +package com.voda.presentation.ui.record + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.voda.presentation.ui.record.model.VoiceRecordArg + +class VoiceRecordViewModel: ViewModel() { + + private val _arg = MutableLiveData() + val arg: LiveData = _arg + + fun setArg(voiceRecordArg: VoiceRecordArg){ + _arg.value = voiceRecordArg + } + +} \ No newline at end of file diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/model/VoiceRecordArg.kt b/presentation/src/main/java/com/voda/presentation/ui/record/model/VoiceRecordArg.kt new file mode 100644 index 0000000..225d159 --- /dev/null +++ b/presentation/src/main/java/com/voda/presentation/ui/record/model/VoiceRecordArg.kt @@ -0,0 +1,8 @@ +package com.voda.presentation.ui.record.model + +import java.io.File +import java.io.Serializable + +data class VoiceRecordArg( + val file: File? +):Serializable diff --git a/presentation/src/main/res/layout/fragment_voice_record.xml b/presentation/src/main/res/layout/fragment_voice_record.xml new file mode 100644 index 0000000..8c79315 --- /dev/null +++ b/presentation/src/main/res/layout/fragment_voice_record.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + \ No newline at end of file From 8fa7e6e1bf64998a133b21ba9ae765aab008f3a2 Mon Sep 17 00:00:00 2001 From: cheon-eunsong Date: Thu, 26 Aug 2021 02:29:19 +0900 Subject: [PATCH 3/7] =?UTF-8?q?#8=20voice=20recording=20page=20=EB=B7=B0?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/main/home/HomeFragment.kt | 9 +- .../ui/record/VoiceRecordActivity.kt | 2 +- .../ui/record/VoiceRecordFragment.kt | 1 - .../com/voda/presentation/util/Constants.kt | 1 + .../com/voda/presentation/util/Navigation.kt | 16 +++ .../src/main/res/drawable/bg_circle.xml | 12 +++ .../res/drawable/bg_square_radius_8dp.xml | 10 ++ .../main/res/drawable/ic_arrow_backward.xml | 9 ++ .../src/main/res/drawable/ic_singing_cat.png | Bin 0 -> 21161 bytes .../src/main/res/drawable/ic_voice.xml | 12 +++ .../main/res/layout/fragment_voice_record.xml | 92 +++++++++++++++++- presentation/src/main/res/values/colors.xml | 1 + presentation/src/main/res/values/dimens.xml | 2 + presentation/src/main/res/values/strings.xml | 4 + presentation/src/main/res/values/styles.xml | 23 +++++ 15 files changed, 186 insertions(+), 8 deletions(-) create mode 100644 presentation/src/main/java/com/voda/presentation/util/Navigation.kt create mode 100644 presentation/src/main/res/drawable/bg_circle.xml create mode 100644 presentation/src/main/res/drawable/bg_square_radius_8dp.xml create mode 100644 presentation/src/main/res/drawable/ic_arrow_backward.xml create mode 100644 presentation/src/main/res/drawable/ic_singing_cat.png create mode 100644 presentation/src/main/res/drawable/ic_voice.xml diff --git a/presentation/src/main/java/com/voda/presentation/ui/main/home/HomeFragment.kt b/presentation/src/main/java/com/voda/presentation/ui/main/home/HomeFragment.kt index 4dfbb58..18616d1 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/main/home/HomeFragment.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/main/home/HomeFragment.kt @@ -11,6 +11,8 @@ import com.voda.presentation.ui.main.home.adapter.HomeAdapter import com.voda.presentation.ui.main.home.listener.HomeListener import com.voda.presentation.ui.main.home.model.DiaryByDDayItem import com.voda.presentation.ui.main.home.model.JoinedDiaryItem +import com.voda.presentation.ui.record.model.VoiceRecordArg +import com.voda.presentation.util.Navigation import org.koin.android.viewmodel.ext.android.viewModel class HomeFragment : BaseFragment(), HomeListener { @@ -70,12 +72,17 @@ class HomeFragment : BaseFragment(), HomeListener { } override fun onDiaryClicked(item: DiaryByDDayItem) { - + openVoiceRecordingPage() } override fun onDiaryClicked(item: JoinedDiaryItem) { } + //test + private fun openVoiceRecordingPage() { + activity?.run { Navigation.openVoiceRecordingPage(this, VoiceRecordArg(null)) } + } + companion object { @JvmStatic diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt index 58be7b7..f82430b 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt @@ -15,7 +15,7 @@ class VoiceRecordActivity : AppCompatActivity() { val arg = getArg(intent) - if (savedInstanceState == null) { + if (savedInstanceState == null && arg != null) { supportFragmentManager.beginTransaction() .replace(R.id.container, VoiceRecordFragment.newInstance(arg)) .commitNow() diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt index 37fc77c..040a155 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt @@ -5,7 +5,6 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import com.voda.presentation.R import com.voda.presentation.databinding.FragmentVoiceRecordBinding import com.voda.presentation.ui.record.model.VoiceRecordArg import org.koin.android.viewmodel.ext.android.viewModel diff --git a/presentation/src/main/java/com/voda/presentation/util/Constants.kt b/presentation/src/main/java/com/voda/presentation/util/Constants.kt index 3444cff..ad807ba 100644 --- a/presentation/src/main/java/com/voda/presentation/util/Constants.kt +++ b/presentation/src/main/java/com/voda/presentation/util/Constants.kt @@ -6,3 +6,4 @@ enum class BottomTab(val pos: Int) { Home(1), MyPage(2); } + diff --git a/presentation/src/main/java/com/voda/presentation/util/Navigation.kt b/presentation/src/main/java/com/voda/presentation/util/Navigation.kt new file mode 100644 index 0000000..4c4e56d --- /dev/null +++ b/presentation/src/main/java/com/voda/presentation/util/Navigation.kt @@ -0,0 +1,16 @@ +package com.voda.presentation.util + +import android.app.Activity +import com.voda.presentation.ui.record.VoiceRecordActivity +import com.voda.presentation.ui.record.model.VoiceRecordArg + +object Navigation { + + fun openVoiceRecordingPage(activity: Activity, voiceRecordArg: VoiceRecordArg) { + activity.startActivityForResult( + VoiceRecordActivity.starterIntent(activity, voiceRecordArg), + 100 + ) + } + +} \ No newline at end of file diff --git a/presentation/src/main/res/drawable/bg_circle.xml b/presentation/src/main/res/drawable/bg_circle.xml new file mode 100644 index 0000000..3b917d7 --- /dev/null +++ b/presentation/src/main/res/drawable/bg_circle.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/presentation/src/main/res/drawable/bg_square_radius_8dp.xml b/presentation/src/main/res/drawable/bg_square_radius_8dp.xml new file mode 100644 index 0000000..432990a --- /dev/null +++ b/presentation/src/main/res/drawable/bg_square_radius_8dp.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/presentation/src/main/res/drawable/ic_arrow_backward.xml b/presentation/src/main/res/drawable/ic_arrow_backward.xml new file mode 100644 index 0000000..d7aa3f9 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_arrow_backward.xml @@ -0,0 +1,9 @@ + + + diff --git a/presentation/src/main/res/drawable/ic_singing_cat.png b/presentation/src/main/res/drawable/ic_singing_cat.png new file mode 100644 index 0000000000000000000000000000000000000000..279f1ebccb2f36235cc541dc7353631852fcf2cd GIT binary patch literal 21161 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

?E+hY~k?)*edI{j0CZa#Wc9V$*DqB4(! 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 literal 0 HcmV?d00001 diff --git a/presentation/src/main/res/drawable/ic_voice.xml b/presentation/src/main/res/drawable/ic_voice.xml new file mode 100644 index 0000000..f198762 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_voice.xml @@ -0,0 +1,12 @@ + + + + diff --git a/presentation/src/main/res/layout/fragment_voice_record.xml b/presentation/src/main/res/layout/fragment_voice_record.xml index 8c79315..96a55d8 100644 --- a/presentation/src/main/res/layout/fragment_voice_record.xml +++ b/presentation/src/main/res/layout/fragment_voice_record.xml @@ -1,6 +1,7 @@ + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto"> - - + android:layout_height="wrap_content"> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/presentation/src/main/res/values/colors.xml b/presentation/src/main/res/values/colors.xml index 87d7791..9bc1411 100644 --- a/presentation/src/main/res/values/colors.xml +++ b/presentation/src/main/res/values/colors.xml @@ -17,6 +17,7 @@ #eeeeee @color/gray_text_box + #b4b4b4 \ No newline at end of file diff --git a/presentation/src/main/res/values/dimens.xml b/presentation/src/main/res/values/dimens.xml index 720d8e1..a76621d 100644 --- a/presentation/src/main/res/values/dimens.xml +++ b/presentation/src/main/res/values/dimens.xml @@ -20,4 +20,6 @@ 0dp 8dp + 32dp + \ No newline at end of file diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 7758b49..c157eac 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -7,4 +7,8 @@ 아직 가입된 다이어리가 없어요. + + 완료 + 준비되면 녹음버튼을 눌러주세요\n최대 30초까지 녹음이 가능합니다. + \ No newline at end of file diff --git a/presentation/src/main/res/values/styles.xml b/presentation/src/main/res/values/styles.xml index 97f9713..b28763b 100644 --- a/presentation/src/main/res/values/styles.xml +++ b/presentation/src/main/res/values/styles.xml @@ -19,6 +19,11 @@ @font/volte + + + @@ -80,4 +85,22 @@ bold + + + + + + \ No newline at end of file From 0827bba6a0d37ef7402b4265f1d41f8b9660e20c Mon Sep 17 00:00:00 2001 From: cheon-eunsong Date: Thu, 26 Aug 2021 02:51:59 +0900 Subject: [PATCH 4/7] =?UTF-8?q?#8=20voice=20recording=20page=20mode=20?= =?UTF-8?q?=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- presentation/build.gradle | 16 ++++++++-------- .../ui/record/VoiceRecordViewModel.kt | 7 +++++++ .../voda/presentation/ui/record/model/Mode.kt | 8 ++++++++ .../main/res/layout/fragment_voice_record.xml | 2 ++ 4 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 presentation/src/main/java/com/voda/presentation/ui/record/model/Mode.kt diff --git a/presentation/build.gradle b/presentation/build.gradle index d4d70cc..ba77e8c 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -7,14 +7,14 @@ plugins { } android { - signingConfigs { - debug { - storeFile file('/Users/slee/AndroidKeyStore/vodaKey.jks') - storePassword 'ryghksdlfrl' - keyAlias 'vodaKey' - keyPassword 'ryghksdlfrl' - } - } +// signingConfigs { +// debug { +// storeFile file('/Users/slee/AndroidKeyStore/vodaKey.jks') +// storePassword 'ryghksdlfrl' +// keyAlias 'vodaKey' +// keyPassword 'ryghksdlfrl' +// } +// } compileSdkVersion 30 buildToolsVersion "30.0.0" diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt index 233db06..c84a169 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt @@ -3,6 +3,7 @@ package com.voda.presentation.ui.record import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import com.voda.presentation.ui.record.model.PlayerState import com.voda.presentation.ui.record.model.VoiceRecordArg class VoiceRecordViewModel: ViewModel() { @@ -10,8 +11,14 @@ class VoiceRecordViewModel: ViewModel() { private val _arg = MutableLiveData() val arg: LiveData = _arg + private val _isPlayerState = MutableLiveData() + val isPlayerState: LiveData = _isPlayerState + fun setArg(voiceRecordArg: VoiceRecordArg){ _arg.value = voiceRecordArg } + fun setPlayerState(playerState: PlayerState){ + _isPlayerState.value = playerState + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/model/Mode.kt b/presentation/src/main/java/com/voda/presentation/ui/record/model/Mode.kt new file mode 100644 index 0000000..20b195f --- /dev/null +++ b/presentation/src/main/java/com/voda/presentation/ui/record/model/Mode.kt @@ -0,0 +1,8 @@ +package com.voda.presentation.ui.record.model + +enum class PlayerState { + Record, + Recording, + Play, + Playing +} \ No newline at end of file diff --git a/presentation/src/main/res/layout/fragment_voice_record.xml b/presentation/src/main/res/layout/fragment_voice_record.xml index 96a55d8..e793251 100644 --- a/presentation/src/main/res/layout/fragment_voice_record.xml +++ b/presentation/src/main/res/layout/fragment_voice_record.xml @@ -52,6 +52,7 @@ android:id="@+id/file_title" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:text="Untitle_210807" tools:text="Untitle_210807"/> Date: Sat, 28 Aug 2021 03:56:41 +0900 Subject: [PATCH 5/7] =?UTF-8?q?#8=20=EB=85=B9=EC=9D=8C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=B0=8F=20player=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/record/VoiceRecordActivity.kt | 2 + .../ui/record/VoiceRecordFragment.kt | 51 ++++++ .../ui/record/VoiceRecordViewModel.kt | 150 +++++++++++++++++- .../voda/presentation/ui/record/model/Mode.kt | 6 + .../res/drawable/bg_square_radius_4dp.xml | 10 ++ .../res/drawable/ic_after_five_seconds.xml | 17 ++ .../res/drawable/ic_before_five_seconds.xml | 17 ++ .../src/main/res/drawable/ic_pause.xml | 12 ++ .../src/main/res/drawable/ic_play.xml | 9 ++ .../src/main/res/drawable/no_effect.png | Bin 0 -> 9796 bytes .../src/main/res/drawable/no_effect_hover.png | Bin 0 -> 8492 bytes .../src/main/res/drawable/seekbar_custom.xml | 18 +++ .../main/res/drawable/seekbar_progress.xml | 10 ++ .../res/drawable/seekbar_thumb_custom.xml | 16 ++ presentation/src/main/res/drawable/thick.png | Bin 0 -> 7918 bytes .../src/main/res/drawable/thick_hover.png | Bin 0 -> 6265 bytes presentation/src/main/res/drawable/thin.png | Bin 0 -> 7411 bytes .../src/main/res/drawable/thin_hover.png | Bin 0 -> 5690 bytes .../main/res/layout/fragment_voice_record.xml | 149 ++++++++++++++++- presentation/src/main/res/values/colors.xml | 2 +- presentation/src/main/res/values/strings.xml | 1 + presentation/src/main/res/values/styles.xml | 10 ++ 22 files changed, 471 insertions(+), 9 deletions(-) create mode 100644 presentation/src/main/res/drawable/bg_square_radius_4dp.xml create mode 100644 presentation/src/main/res/drawable/ic_after_five_seconds.xml create mode 100644 presentation/src/main/res/drawable/ic_before_five_seconds.xml create mode 100644 presentation/src/main/res/drawable/ic_pause.xml create mode 100644 presentation/src/main/res/drawable/ic_play.xml create mode 100644 presentation/src/main/res/drawable/no_effect.png create mode 100644 presentation/src/main/res/drawable/no_effect_hover.png create mode 100644 presentation/src/main/res/drawable/seekbar_custom.xml create mode 100644 presentation/src/main/res/drawable/seekbar_progress.xml create mode 100644 presentation/src/main/res/drawable/seekbar_thumb_custom.xml create mode 100644 presentation/src/main/res/drawable/thick.png create mode 100644 presentation/src/main/res/drawable/thick_hover.png create mode 100644 presentation/src/main/res/drawable/thin.png create mode 100644 presentation/src/main/res/drawable/thin_hover.png diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt index f82430b..30e48d0 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordActivity.kt @@ -1,5 +1,6 @@ package com.voda.presentation.ui.record +import android.Manifest import android.content.Context import android.content.Intent import androidx.appcompat.app.AppCompatActivity @@ -9,6 +10,7 @@ import com.voda.presentation.ui.main.nav.BottomNavFragment import com.voda.presentation.ui.record.model.VoiceRecordArg class VoiceRecordActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_voice_record) diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt index 040a155..5e29e5f 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt @@ -1,13 +1,18 @@ package com.voda.presentation.ui.record +import android.Manifest +import android.content.pm.PackageManager import android.os.Bundle +import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.Observer import com.voda.presentation.databinding.FragmentVoiceRecordBinding import com.voda.presentation.ui.record.model.VoiceRecordArg import org.koin.android.viewmodel.ext.android.viewModel +import timber.log.Timber private const val ARG_PARAM = "voice_record_arg" @@ -17,6 +22,11 @@ class VoiceRecordFragment : Fragment() { val viewModel: VoiceRecordViewModel by viewModel() private lateinit var viewDataBinding: FragmentVoiceRecordBinding + private val requestPermissions = arrayOf ( + android.Manifest.permission.RECORD_AUDIO, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) requireNotNull(arguments).apply { @@ -39,6 +49,25 @@ class VoiceRecordFragment : Fragment() { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) setupLifecycleOwner() + requestAudioPermission() + + setupEvents() + } + + + private fun setupEvents() { + + viewModel.isPlayerState.observe(this.viewLifecycleOwner, Observer { + + }) + + viewDataBinding.recordingButton.setOnClickListener { + viewModel.onRecordButtonClicked() + } + + viewDataBinding.audioPlayButton.setOnClickListener { + viewModel.onPlayerButtonClicked() + } } @@ -46,8 +75,30 @@ class VoiceRecordFragment : Fragment() { viewDataBinding.lifecycleOwner = this.viewLifecycleOwner } + private fun requestAudioPermission() { + requestPermissions(requestPermissions, REQUEST_RECORD_AUDIO_PERMISSION) + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + + val audioRequestPermissionGranted = + requestCode == REQUEST_RECORD_AUDIO_PERMISSION && + grantResults.firstOrNull() == PackageManager.PERMISSION_GRANTED + + if (!audioRequestPermissionGranted) { + Timber.i("NOT GRANTED") + } + } + companion object { + private const val REQUEST_RECORD_AUDIO_PERMISSION = 100 + @JvmStatic fun newInstance(arg: VoiceRecordArg) = VoiceRecordFragment().apply { diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt index c84a169..8dcb5d4 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt @@ -1,19 +1,42 @@ package com.voda.presentation.ui.record +import android.media.AudioManager +import android.media.MediaPlayer +import android.media.MediaRecorder +import android.os.Environment import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import com.voda.presentation.ui.record.model.EffectMode import com.voda.presentation.ui.record.model.PlayerState import com.voda.presentation.ui.record.model.VoiceRecordArg +import timber.log.Timber +import java.io.File +import java.lang.Exception +import java.text.SimpleDateFormat +import java.util.* class VoiceRecordViewModel: ViewModel() { private val _arg = MutableLiveData() val arg: LiveData = _arg - private val _isPlayerState = MutableLiveData() + private val _isPlayerState = MutableLiveData().apply { value = PlayerState.Record } val isPlayerState: LiveData = _isPlayerState + private val _effect = MutableLiveData().apply { value = EffectMode.No_effect } + val effect: LiveData = _effect + + private val _currentPosition = MutableLiveData() + val currentPosition: LiveData = _currentPosition + + private val _remainingTime = MutableLiveData() + val remainingTime: LiveData = _remainingTime + + lateinit var recorder: MediaRecorder + + val filePath: String = makeFileName() + fun setArg(voiceRecordArg: VoiceRecordArg){ _arg.value = voiceRecordArg } @@ -21,4 +44,129 @@ class VoiceRecordViewModel: ViewModel() { fun setPlayerState(playerState: PlayerState){ _isPlayerState.value = playerState } + + init { +// setupRecord() + } + + fun onRecordButtonClicked() { + isPlayerState.value?.let { + when(it) { + PlayerState.Record -> startRecording() + PlayerState.Recording -> stopRecording() + else -> {}// 팝업 띄우기 + } + } + } + + fun onPlayerButtonClicked() { + isPlayerState.value?.let { + when(it) { + PlayerState.Play -> playAudio() + PlayerState.Playing -> stopPlayer() + else -> {} // nothing + } + } + } + + fun startRecording() { + setPlayerState(PlayerState.Recording) + setupRecord() + recorder.start() +// stopVisualizer() + } + + fun stopRecording() { + setPlayerState(PlayerState.Play) + recorder.stop() + recorder.release() + +// setupRecord() + } + + fun playAudio() { + setPlayerState(PlayerState.Playing) + MediaPlayer().apply { + Timber.i("$filePath") + setDataSource(filePath) + playbackParams = this.playbackParams.apply { + speed = 1f + pitch = getPitchValue() + } + this.playbackParams.pitch + prepare() + start() + } + } + + fun stopPlayer() { + setPlayerState(PlayerState.Play) + MediaPlayer().apply { + stop() + } + } + + private fun getPitchValue(): Float { + effect.value?.let { + return when(it) { + EffectMode.Thick -> 0.7f + EffectMode.Thin -> 2f + else -> 1f + } + } + return 1f + } + + //TODO 서버에서 url 로 받아올경우 + private fun playAudioForUrl(speed: Float) { + val mediaPlayer = MediaPlayer() + val audioUrl = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3" + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC) + try { + mediaPlayer.setDataSource(audioUrl) + mediaPlayer.playbackParams = mediaPlayer.playbackParams.apply { + setSpeed(speed) + pitch = 2.5f + } + mediaPlayer.playbackParams.pitch + mediaPlayer.prepare() + mediaPlayer.start() + + } catch (e: Exception) { + e.printStackTrace() + } + } + + + private fun setupRecord() { + recorder = MediaRecorder() + .apply { + setAudioSource(MediaRecorder.AudioSource.MIC) + setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) + setAudioEncoder(MediaRecorder.AudioEncoder.AAC) + setOutputFile(filePath) + } + recorder.prepare() + } + + private fun makeFileName(): String{ + Environment.getExternalStorageDirectory().run { + val childName = "Untitle_"+ getDateFormat() +".3gp" + File(this, "recorded.3gp") + }.run { + val fileName = this.absolutePath + Timber.i("저장할 파일 명 : $fileName") + return fileName + } + } + + private fun getDateFormat(): String{ + return try { + Calendar.getInstance() + SimpleDateFormat("yy/MM/dd", Locale.KOREA).format(Calendar.getInstance().time) + } catch (e: Exception) { + e.printStackTrace() + System.currentTimeMillis().toString() + } + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/model/Mode.kt b/presentation/src/main/java/com/voda/presentation/ui/record/model/Mode.kt index 20b195f..0987b3e 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/model/Mode.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/model/Mode.kt @@ -5,4 +5,10 @@ enum class PlayerState { Recording, Play, Playing +} + +enum class EffectMode { + Thick, + Thin, + No_effect } \ No newline at end of file diff --git a/presentation/src/main/res/drawable/bg_square_radius_4dp.xml b/presentation/src/main/res/drawable/bg_square_radius_4dp.xml new file mode 100644 index 0000000..882948b --- /dev/null +++ b/presentation/src/main/res/drawable/bg_square_radius_4dp.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/presentation/src/main/res/drawable/ic_after_five_seconds.xml b/presentation/src/main/res/drawable/ic_after_five_seconds.xml new file mode 100644 index 0000000..ba4b974 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_after_five_seconds.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/presentation/src/main/res/drawable/ic_before_five_seconds.xml b/presentation/src/main/res/drawable/ic_before_five_seconds.xml new file mode 100644 index 0000000..1f01e8d --- /dev/null +++ b/presentation/src/main/res/drawable/ic_before_five_seconds.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/presentation/src/main/res/drawable/ic_pause.xml b/presentation/src/main/res/drawable/ic_pause.xml new file mode 100644 index 0000000..c6d14d6 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,12 @@ + + + + diff --git a/presentation/src/main/res/drawable/ic_play.xml b/presentation/src/main/res/drawable/ic_play.xml new file mode 100644 index 0000000..5b1e126 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_play.xml @@ -0,0 +1,9 @@ + + + diff --git a/presentation/src/main/res/drawable/no_effect.png b/presentation/src/main/res/drawable/no_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2ed6a867de9b10d2d4346aaec31138b6d78091 GIT binary patch literal 9796 zcmV-KCcD{*P)Px#?NCfqMMrQ{hyR_Oot~bao}Qkaot<%&$ex~_ zo12>^hX0;qGJdpl6iuClo6Z*djO_}{gjp_3D{ZWwJY?r|9yC470 zJ9?Y1U6at7q>1ObD%Z6<-?uW)vPhM}|Bj)Sv#M-`o}>T!?#kf*|JPps#}~e>UZkgb zdb9szrvKmU|FY8m|Ml1Z@4&{eQvd0vs=e61#?k2L=w+Yp+1c6u-+YFy<^SW6uBeFH z#A`5{mxllV02_2tPE!Cx`C#v+cMjhm8;~$pF7UrX;*@~8Yt_%lr~3ZTh5!H{07*na zRCwClTW5Fbx)!9`^xmRn+yia1_GSDlC?r0pgo#BdsO0Z zydeA`rzGC_m3R#$5_nkWf-T^@A&J3buvM(n)~(0#e$5J{W~%6yMtcOKbFE1 z3pzu86$nm7kAWu#YryS>Mc`M<0RHHN1;fCC(ZANqIR6R|LQKpm)n-UbhR~m0Nh<(G$osBdd zud5HI=N(8X6{zoZ{X-JTck%rGmyHI~(f3Av-~AF&Na_%LtJSbXis0{l=DX2>B*ib5 z2lfu$H{2Y-r1&-Y#%1vy&Em=&{Z4uKbHB_#J5~D&!^7qw_{MvNn6S^+F9sd_`@DYfjJjrXpN)frMDG5D0a|Cd9UmQTv_yJ@QDqz-9?bpQcTdFu(v^kZ zfdDK2^i(A7O2hf!olul)I37-+NG217bh?nwXA>~8`9eG#&O{_s9v-N`@7TS=t>{4EF?iT5xtVV5g_?OG9C{+)=t=N z9cY&)bUy~k0-R=J3`(HX`FB!M9|7I7iF7jlFlL18SNZ)y$wo5i>?H(RzV&Xu!c`O? z#>Zo~BZ?$3T!mEp)q?5w+#{5%gN>)t(MuA5M*FA&(cxf}mDHE$!Js$kw(A5nqK~SO zpiP;uFO)1Bfz2QhH7W+M;<$;Lrig&x6d+cd8iV1aQBt8u$5}%#*gzx@4yTggaDf6W z)?P-2__4{b=_j&*OkOVvKmePKAU~LLT)(6TqOLtfM5VbZsfb0h;qw#%;Z#2AO2{=- zV4uWsw^2n!(k?!cEu@pFa3&m&81y(eN11{S0|>%yx2x4Q+O(JJdLSBxKp4aW;(k!J+IIVY^OM9M-st&;AiYBtja76!tcsQf#0sum_IvVY2#bWXBGw&#h z2ovn6KvYn^Q&KU`;y4v$ZFObSNH+tKR6(X2sJ9!P&UpL};9X%_UuCg4yoL@UoOJPI zi*vaWX+p{Z;Y>cNqOe(i6>Hnt{xolq)4n1y=j#}VmHen-00dX549ALGM3b2mt_4sk zwY#ex{%h`M3xSBxsh7{<^2>c~$(iP>we7!?aYGb=;ssN3`3Ay;gaSiV7;PaH4s$i3 zF){69)kieZQ$zVto4Xdrsa#Di^yZ!Js##H2$6*~gY(|Pz{SCXT5$%axY=7x zrwSO^OoR=@lL?g!P!(W7oLWRKN~=KG9@Ww~Vj#fv(olHO@3!SvP0QpH^I5T2g(I-i z1K2wY1B(F9e-(?fZ)p_e-bx;xE0LF~0>@3lN5dE)^wPq=-$Wyu=>X#9O7IMQ

hchq+!73$tSEVM;J=IyiJ`zf){Ee5|t&U!+Q6H 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 a0{;WAYgHXkfVXe}0000 + + + + + + + + + + + + + diff --git a/presentation/src/main/res/drawable/seekbar_progress.xml b/presentation/src/main/res/drawable/seekbar_progress.xml new file mode 100644 index 0000000..aef235c --- /dev/null +++ b/presentation/src/main/res/drawable/seekbar_progress.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/presentation/src/main/res/drawable/seekbar_thumb_custom.xml b/presentation/src/main/res/drawable/seekbar_thumb_custom.xml new file mode 100644 index 0000000..328b7c4 --- /dev/null +++ b/presentation/src/main/res/drawable/seekbar_thumb_custom.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/presentation/src/main/res/drawable/thick.png b/presentation/src/main/res/drawable/thick.png new file mode 100644 index 0000000000000000000000000000000000000000..6d752b77e5a8ec7b55aca927e85f7e62e7ed3493 GIT binary patch literal 7918 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 literal 0 HcmV?d00001 diff --git a/presentation/src/main/res/drawable/thin_hover.png b/presentation/src/main/res/drawable/thin_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..e70f944b080c480fb33cb5817be0d18600515b36 GIT binary patch literal 5690 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 literal 0 HcmV?d00001 diff --git a/presentation/src/main/res/layout/fragment_voice_record.xml b/presentation/src/main/res/layout/fragment_voice_record.xml index e793251..dac44e7 100644 --- a/presentation/src/main/res/layout/fragment_voice_record.xml +++ b/presentation/src/main/res/layout/fragment_voice_record.xml @@ -4,6 +4,12 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + + + @@ -16,7 +22,7 @@ @@ -67,36 +73,165 @@ android:text="00:00" tools:text="00:00"/> + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/recording_button" + android:layout_width="match_parent" + android:layout_height="0dp"> + + + + + + + + + + + + + + + + + + + + + + @color/gray_text_box #b4b4b4 - + #ececec \ No newline at end of file diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index c157eac..fbcbf32 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -10,5 +10,6 @@ 완료 준비되면 녹음버튼을 눌러주세요\n최대 30초까지 녹음이 가능합니다. + 원하는 효과를 선택해주세요 \ No newline at end of file diff --git a/presentation/src/main/res/values/styles.xml b/presentation/src/main/res/values/styles.xml index b28763b..c3d593f 100644 --- a/presentation/src/main/res/values/styles.xml +++ b/presentation/src/main/res/values/styles.xml @@ -103,4 +103,14 @@ @color/voice_recording_description + + + + \ No newline at end of file From 504312245d2aee5a495ae9644b5d98bd52f22c81 Mon Sep 17 00:00:00 2001 From: cheon-eunsong Date: Sat, 28 Aug 2021 06:27:47 +0900 Subject: [PATCH 6/7] =?UTF-8?q?#8=20=EB=85=B9=EC=9D=8C=EC=8B=9C=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20=EC=B9=B4=EC=9A=B4=ED=8A=B8=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/record/VoiceRecordFragment.kt | 108 +++++++++++++++++- .../ui/record/VoiceRecordViewModel.kt | 44 +++++-- .../presentation/ui/record/util/TimeUtils.kt | 75 ++++++++++++ .../main/res/layout/fragment_voice_record.xml | 14 +-- presentation/src/main/res/values/dimens.xml | 1 + 5 files changed, 224 insertions(+), 18 deletions(-) create mode 100644 presentation/src/main/java/com/voda/presentation/ui/record/util/TimeUtils.kt diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt index 5e29e5f..af48e6d 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt @@ -3,16 +3,25 @@ package com.voda.presentation.ui.record import android.Manifest import android.content.pm.PackageManager import android.os.Bundle -import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.SeekBar import androidx.lifecycle.Observer import com.voda.presentation.databinding.FragmentVoiceRecordBinding +import com.voda.presentation.ui.record.model.EffectMode +import com.voda.presentation.ui.record.model.PlayerState import com.voda.presentation.ui.record.model.VoiceRecordArg +import com.voda.presentation.ui.record.util.TimeUtils +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch import org.koin.android.viewmodel.ext.android.viewModel import timber.log.Timber +import java.util.* +import kotlin.concurrent.timer private const val ARG_PARAM = "voice_record_arg" @@ -27,6 +36,13 @@ class VoiceRecordFragment : Fragment() { Manifest.permission.WRITE_EXTERNAL_STORAGE ) + var timer: Timer? = null + + var recordTimer: Timer? = null + + private val job = SupervisorJob() + private val uiScope = CoroutineScope(Dispatchers.Main + job) + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) requireNotNull(arguments).apply { @@ -58,7 +74,15 @@ class VoiceRecordFragment : Fragment() { private fun setupEvents() { viewModel.isPlayerState.observe(this.viewLifecycleOwner, Observer { + when(it) { + PlayerState.Play -> setSeekbar() + PlayerState.Playing -> updateSeekbar() + PlayerState.Recording -> recordingDuration() + } + }) + viewModel.effect.observe(this.viewLifecycleOwner, Observer { + viewModel.player?.let { setSeekbar() } }) viewDataBinding.recordingButton.setOnClickListener { @@ -67,10 +91,92 @@ class VoiceRecordFragment : Fragment() { viewDataBinding.audioPlayButton.setOnClickListener { viewModel.onPlayerButtonClicked() + + } + + viewDataBinding.thickEffectButton.setOnClickListener { + viewModel.setEffectMode(EffectMode.Thick) + } + + viewDataBinding.thinEffectButton.setOnClickListener { + viewModel.setEffectMode(EffectMode.Thin) + } + + viewDataBinding.noEffectButton.setOnClickListener { + viewModel.setEffectMode(EffectMode.No_effect) + } + + viewDataBinding.previousButton.setOnClickListener { + + } + + viewDataBinding.afterButton.setOnClickListener { + + } + + viewDataBinding.seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{ + override fun onProgressChanged(p0: SeekBar?, progress: Int, p2: Boolean) { +// Timber.i("progress $progress / player ${viewModel.player!!.duration}") +// if(viewModel.player != null && progress >= viewModel.player!!.duration){ +// timer?.cancel() +// viewModel.setPlayerState(PlayerState.Play) +// } + } + + override fun onStopTrackingTouch(p0: SeekBar?) { + + } + + override fun onStartTrackingTouch(p0: SeekBar?) { + + } + }) + } + var time = 0 + + private fun recordingDuration() { + recordTimer = timer(period = 10) { + time++ + Timber.i("timer $time") + uiScope.launch { + viewDataBinding.fileLength.text = TimeUtils.getRecordTimerText(time).also { Timber.i("$it") } + + } } + } + + private fun stopRecordTimer() { } + private fun updateSeekbar() { + viewModel.player?.let { player -> + timer = timer(period = 100, initialDelay = 100) { + val totalDuration = player.duration + val currentDuration = player.currentPosition + + uiScope.launch { + viewDataBinding.currentDuration.text = TimeUtils.milliSecondsToTimer(currentDuration).also { Timber.i(it)} + viewDataBinding.remainingTime.text = TimeUtils.milliSecondsToTimer(totalDuration - currentDuration).also { Timber.i(it)} + + viewDataBinding.seekBar.progress = currentDuration.also { Timber.i(it.toString())} + } + } + } + } + + private fun setSeekbar(){ + recordTimer?.cancel() + timer?.cancel() + viewModel.player?.let { player-> + viewDataBinding.seekBar.apply { + progress = 0 + max = player.duration + } + } + } + + private fun setupLifecycleOwner() { viewDataBinding.lifecycleOwner = this.viewLifecycleOwner } diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt index 8dcb5d4..8fc238a 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt @@ -27,14 +27,17 @@ class VoiceRecordViewModel: ViewModel() { private val _effect = MutableLiveData().apply { value = EffectMode.No_effect } val effect: LiveData = _effect - private val _currentPosition = MutableLiveData() - val currentPosition: LiveData = _currentPosition + private val _currentDuration = MutableLiveData() + val currentDuration: LiveData = _currentDuration private val _remainingTime = MutableLiveData() val remainingTime: LiveData = _remainingTime lateinit var recorder: MediaRecorder + var player: MediaPlayer? = null + + val filePath: String = makeFileName() fun setArg(voiceRecordArg: VoiceRecordArg){ @@ -45,6 +48,11 @@ class VoiceRecordViewModel: ViewModel() { _isPlayerState.value = playerState } + fun setEffectMode(effectMode: EffectMode){ + _effect.value = effectMode + setUpAudio() + } + init { // setupRecord() } @@ -77,16 +85,16 @@ class VoiceRecordViewModel: ViewModel() { } fun stopRecording() { - setPlayerState(PlayerState.Play) recorder.stop() recorder.release() // setupRecord() + setUpAudio() + setPlayerState(PlayerState.Play) } - fun playAudio() { - setPlayerState(PlayerState.Playing) - MediaPlayer().apply { + fun setUpAudio() { + player = MediaPlayer().apply { Timber.i("$filePath") setDataSource(filePath) playbackParams = this.playbackParams.apply { @@ -95,15 +103,31 @@ class VoiceRecordViewModel: ViewModel() { } this.playbackParams.pitch prepare() - start() + setOnCompletionListener { + setPlayerState(PlayerState.Play) + } } } + fun playAudio() { + setPlayerState(PlayerState.Playing) + player?.start() +// player = MediaPlayer().apply { +// Timber.i("$filePath") +// setDataSource(filePath) +// playbackParams = this.playbackParams.apply { +// speed = 1f +// pitch = getPitchValue() +// } +// this.playbackParams.pitch +// prepare() +// start() +// } + } + fun stopPlayer() { setPlayerState(PlayerState.Play) - MediaPlayer().apply { - stop() - } + player?.stop() } private fun getPitchValue(): Float { diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/util/TimeUtils.kt b/presentation/src/main/java/com/voda/presentation/ui/record/util/TimeUtils.kt new file mode 100644 index 0000000..906603c --- /dev/null +++ b/presentation/src/main/java/com/voda/presentation/ui/record/util/TimeUtils.kt @@ -0,0 +1,75 @@ +package com.voda.presentation.ui.record.util + +object TimeUtils { + + fun getRecordTimerText(milliseconds: Int): String { + var finalTimerString = "" + var minutesString = "" + var secondsString = "" + var milliSecondsString = "" + + + // Convert total duration into time + val hours = (milliseconds / (100 * 60 * 60)).toInt() + val minutes = (milliseconds % (100 * 60 * 60)) / (100 * 60) + val seconds = (milliseconds % (100 * 60 * 60) % (100 * 60) / 100) + val milli = (milliseconds % 100) + // Add hours if there + if (hours > 0) { + finalTimerString = "$hours:" + } + + if (minutes > 0) { + minutesString = "$minutes:" + } + + minutesString = if (minutes < 10) { + "0$minutes" + } else { + "" + minutes + } + + // Prepending 0 to seconds if it is one digit + secondsString = if (seconds < 10) { + "0$seconds" + } else { + "" + seconds + } + + milliSecondsString = if (milli < 10) { + "0$milli" + } else { + "" + milli + } + + finalTimerString = "$finalTimerString$minutesString:$secondsString:$milliSecondsString" + + // return timer string + return finalTimerString + } + + fun milliSecondsToTimer(milliseconds: Int): String { + var finalTimerString = "" + var secondsString = "" + + // Convert total duration into time + val hours = (milliseconds / (1000 * 60 * 60)).toInt() + val minutes = (milliseconds % (1000 * 60 * 60)).toInt() / (1000 * 60) + val seconds = (milliseconds % (1000 * 60 * 60) % (1000 * 60) / 1000).toInt() + // Add hours if there + if (hours > 0) { + finalTimerString = "$hours:" + } + + // Prepending 0 to seconds if it is one digit + secondsString = if (seconds < 10) { + "0$seconds" + } else { + "" + seconds + } + finalTimerString = "$finalTimerString$minutes:$secondsString" + + // return timer string + return finalTimerString + } +} \ No newline at end of file diff --git a/presentation/src/main/res/layout/fragment_voice_record.xml b/presentation/src/main/res/layout/fragment_voice_record.xml index dac44e7..8e9a4b1 100644 --- a/presentation/src/main/res/layout/fragment_voice_record.xml +++ b/presentation/src/main/res/layout/fragment_voice_record.xml @@ -51,7 +51,7 @@ diff --git a/presentation/src/main/res/values/dimens.xml b/presentation/src/main/res/values/dimens.xml index a76621d..e2f2536 100644 --- a/presentation/src/main/res/values/dimens.xml +++ b/presentation/src/main/res/values/dimens.xml @@ -21,5 +21,6 @@ 8dp 32dp + 24dp \ No newline at end of file From 4d853e549d86b24bf133755672f95c582e9141bc Mon Sep 17 00:00:00 2001 From: cheon-eunsong Date: Sat, 28 Aug 2021 16:03:00 +0900 Subject: [PATCH 7/7] =?UTF-8?q?#8=20player=20Pause=20=EB=AA=A8=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voda/presentation/ui/record/VoiceRecordFragment.kt | 1 + .../presentation/ui/record/VoiceRecordViewModel.kt | 10 +++++----- .../java/com/voda/presentation/ui/record/model/Mode.kt | 3 ++- .../src/main/res/layout/fragment_voice_record.xml | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt index af48e6d..87fa930 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordFragment.kt @@ -78,6 +78,7 @@ class VoiceRecordFragment : Fragment() { PlayerState.Play -> setSeekbar() PlayerState.Playing -> updateSeekbar() PlayerState.Recording -> recordingDuration() + PlayerState.Pause -> timer?.cancel() } }) diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt index 8fc238a..5d30f2c 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/VoiceRecordViewModel.kt @@ -70,8 +70,8 @@ class VoiceRecordViewModel: ViewModel() { fun onPlayerButtonClicked() { isPlayerState.value?.let { when(it) { - PlayerState.Play -> playAudio() - PlayerState.Playing -> stopPlayer() + PlayerState.Play, PlayerState.Pause -> playAudio() + PlayerState.Playing -> pausePlayer() else -> {} // nothing } } @@ -125,9 +125,9 @@ class VoiceRecordViewModel: ViewModel() { // } } - fun stopPlayer() { - setPlayerState(PlayerState.Play) - player?.stop() + fun pausePlayer() { + setPlayerState(PlayerState.Pause) + player?.pause() } private fun getPitchValue(): Float { diff --git a/presentation/src/main/java/com/voda/presentation/ui/record/model/Mode.kt b/presentation/src/main/java/com/voda/presentation/ui/record/model/Mode.kt index 0987b3e..162616e 100644 --- a/presentation/src/main/java/com/voda/presentation/ui/record/model/Mode.kt +++ b/presentation/src/main/java/com/voda/presentation/ui/record/model/Mode.kt @@ -4,7 +4,8 @@ enum class PlayerState { Record, Recording, Play, - Playing + Playing, + Pause } enum class EffectMode { diff --git a/presentation/src/main/res/layout/fragment_voice_record.xml b/presentation/src/main/res/layout/fragment_voice_record.xml index 8e9a4b1..e9b50c4 100644 --- a/presentation/src/main/res/layout/fragment_voice_record.xml +++ b/presentation/src/main/res/layout/fragment_voice_record.xml @@ -116,7 +116,7 @@