diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index 69e8615..fdf8d99 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 273ba68..3cb5cfd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,6 +41,7 @@ + () { + + companion object { + const val TYPE_TITLE = 1 + const val TYPE_DIVIDER = 2 + const val TYPE_AUDIO = 3 + const val TYPE_AUDIO_DRAFT = 4 + const val TYPE_UNKNOWN = -1 + } + + + // viewholders + inner class AudioViewHolder(val audioListItemBinding: AudioListItemBinding) : RecyclerView.ViewHolder(audioListItemBinding.root) + inner class TitleViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView) + inner class DividerViewHolder(val divider: MaterialDivider) : RecyclerView.ViewHolder(divider) + + data object Divider + data class TitleItem(val text: String) + + private var list: List = listOf() + + fun setList(item: List) { + + } + + override fun getItemViewType(position: Int): Int { + return when(list[position]) { + is Divider -> TYPE_DIVIDER + is TitleItem -> TYPE_TITLE + is Audio -> TYPE_AUDIO + is AudioDraft -> TYPE_AUDIO_DRAFT + else -> TYPE_UNKNOWN + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when(viewType) { + TYPE_TITLE -> { + val textView = TextView(parent.context) + TitleViewHolder(textView) + } + TYPE_DIVIDER -> { + DividerViewHolder(MaterialDivider(parent.context)) + } + TYPE_AUDIO, TYPE_AUDIO_DRAFT -> { + AudioViewHolder(AudioListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)) + } + // this should not enter + else -> { + object: RecyclerView.ViewHolder(LinearLayout(parent.context)){} + } + } + } + + override fun getItemCount(): Int { + return list.size + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when(holder) { + is TitleViewHolder -> { + holder.textView.text = (list[position] as TitleItem).text + } + + is AudioViewHolder -> { + + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudioSelectorActivity.kt b/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudioSelectorActivity.kt new file mode 100644 index 0000000..d9be211 --- /dev/null +++ b/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudioSelectorActivity.kt @@ -0,0 +1,25 @@ +package com.isolaatti.audio.audio_selector.ui + +import android.os.Bundle +import com.isolaatti.common.IsolaattiBaseActivity +import com.isolaatti.databinding.ActivityAudioSelectorBinding + +class AudioSelectorActivity : IsolaattiBaseActivity() { + companion object { + const val EXTRA_ID = "id" + const val EXTRA_FOR_SQUAD = "forSquad" + const val OUT_EXTRA_PLAYABLE = "playable" + } + + private lateinit var binding: ActivityAudioSelectorBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = ActivityAudioSelectorBinding.inflate(layoutInflater) + + setContentView(binding.root) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudioSelectorContract.kt b/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudioSelectorContract.kt new file mode 100644 index 0000000..0da2fda --- /dev/null +++ b/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudioSelectorContract.kt @@ -0,0 +1,39 @@ +package com.isolaatti.audio.audio_selector.ui + +import android.app.Activity +import android.content.Context +import android.content.Intent +import androidx.activity.result.contract.ActivityResultContract +import com.isolaatti.audio.common.domain.Audio +import com.isolaatti.audio.common.domain.Playable +import java.io.Serializable + +/** + * Contract to select audio. Use SelectorConfig class to specify the context to use to select audio. + * Output: if user selected an audio or draft, it will be returned as result. Check type as convenient. Null if user cancelled + */ +class AudioSelectorContract : ActivityResultContract() { + + data class SelectorConfig(val forSquad: Boolean, val id: String?): Serializable + + override fun createIntent(context: Context, input: SelectorConfig): Intent { + val intent = Intent(context, AudioSelectorActivity::class.java) + intent.apply { + putExtra(AudioSelectorActivity.EXTRA_FOR_SQUAD, input.forSquad) + if(input.forSquad) { + putExtra(AudioSelectorActivity.EXTRA_ID, input.id as String) + } + + } + + return intent + } + + override fun parseResult(resultCode: Int, intent: Intent?): Playable? { + if(resultCode == Activity.RESULT_OK) { + return intent?.extras?.getSerializable(AudioSelectorActivity.OUT_EXTRA_PLAYABLE) as? Playable + } + + return null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownEditingFragment.kt b/app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownEditingFragment.kt index d62d093..c688a66 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownEditingFragment.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownEditingFragment.kt @@ -15,6 +15,8 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner import com.isolaatti.R +import com.isolaatti.audio.audio_selector.ui.AudioSelectorActivity +import com.isolaatti.audio.audio_selector.ui.AudioSelectorContract import com.isolaatti.audio.common.domain.Audio import com.isolaatti.audio.common.domain.Playable import com.isolaatti.audio.drafts.domain.AudioDraft @@ -54,6 +56,10 @@ class MarkdownEditingFragment : Fragment(){ } + } + + private val audioSelectorLauncher = registerForActivityResult(AudioSelectorContract()) { + } private val audioListener = object: AudioPlayerConnector.Listener { @@ -142,6 +148,7 @@ class MarkdownEditingFragment : Fragment(){ true } R.id.select_from_audios -> { + audioSelectorLauncher.launch(AudioSelectorContract.SelectorConfig(false, null)) true } else -> false diff --git a/app/src/main/res/layout/activity_audio_selector.xml b/app/src/main/res/layout/activity_audio_selector.xml new file mode 100644 index 0000000..c16d327 --- /dev/null +++ b/app/src/main/res/layout/activity_audio_selector.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4b61099..355f5a1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -183,4 +183,5 @@ Select from existing Audio attachment Remove + Select audio \ No newline at end of file diff --git a/build.gradle b/build.gradle index 584f1f2..99271d1 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ buildscript { plugins { id 'com.android.application' version '8.2.2' apply false id 'com.android.library' version '8.2.2' apply false - id 'org.jetbrains.kotlin.android' version '1.8.0' apply false + id 'org.jetbrains.kotlin.android' version '1.9.0' apply false id 'com.google.dagger.hilt.android' version '2.47' apply false id 'com.google.gms.google-services' version '4.4.0' apply false id 'com.google.firebase.crashlytics' version '2.9.9' apply false