diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml
index 45ecbc4..2364733 100644
--- a/.idea/assetWizardSettings.xml
+++ b/.idea/assetWizardSettings.xml
@@ -79,7 +79,7 @@
+
+
+
@@ -308,7 +328,7 @@
@@ -318,8 +338,8 @@
diff --git a/.idea/navEditor.xml b/.idea/navEditor.xml
index cb6a743..6283eaa 100644
--- a/.idea/navEditor.xml
+++ b/.idea/navEditor.xml
@@ -25,6 +25,37 @@
+
+
+
+
+
+
+
+
+
@@ -206,6 +237,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -217,11 +260,6 @@
-
-
-
-
-
@@ -363,6 +401,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/build.gradle b/app/build.gradle
index 266366b..e44269a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -22,8 +22,8 @@ android {
applicationId "com.isolaatti"
minSdk 24
targetSdk 34
- versionCode 6
- versionName "0.6-vc6"
+ versionCode 7
+ versionName "0.7-vc7"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
diff --git a/app/src/main/java/com/isolaatti/audio/audio_selector/presentation/AudioSelectorAdapter.kt b/app/src/main/java/com/isolaatti/audio/audio_selector/presentation/AudioSelectorAdapter.kt
deleted file mode 100644
index 5f12056..0000000
--- a/app/src/main/java/com/isolaatti/audio/audio_selector/presentation/AudioSelectorAdapter.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.isolaatti.audio.audio_selector.presentation
-
-import android.view.LayoutInflater
-import android.view.ViewGroup
-import android.widget.LinearLayout
-import android.widget.TextView
-import androidx.core.view.marginStart
-import androidx.recyclerview.widget.RecyclerView
-import com.google.android.material.divider.MaterialDivider
-import com.isolaatti.audio.common.domain.Audio
-import com.isolaatti.audio.common.domain.Playable
-import com.isolaatti.audio.drafts.domain.AudioDraft
-import com.isolaatti.audio.drafts.presentation.AudioDraftsAdapter
-import com.isolaatti.databinding.AudioListItemBinding
-
-class AudioSelectorAdapter : RecyclerView.Adapter() {
-
- 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/presentation/AudioSelectorFragmentAdapter.kt b/app/src/main/java/com/isolaatti/audio/audio_selector/presentation/AudioSelectorFragmentAdapter.kt
new file mode 100644
index 0000000..3b02adc
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/audio/audio_selector/presentation/AudioSelectorFragmentAdapter.kt
@@ -0,0 +1,18 @@
+package com.isolaatti.audio.audio_selector.presentation
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentActivity
+import androidx.viewpager2.adapter.FragmentStateAdapter
+import com.isolaatti.audio.audio_selector.ui.AudiosListSelectorFragment
+
+class AudioSelectorFragmentAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {
+ override fun getItemCount(): Int = 2
+
+ override fun createFragment(position: Int): Fragment {
+ return when(position) {
+ 0 -> AudiosListSelectorFragment.getInstance()
+ 1 -> AudiosListSelectorFragment.getInstanceForDrafts()
+ else -> Fragment()
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/audio/audio_selector/presentation/AudioSelectorViewModel.kt b/app/src/main/java/com/isolaatti/audio/audio_selector/presentation/AudioSelectorViewModel.kt
new file mode 100644
index 0000000..653b393
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/audio/audio_selector/presentation/AudioSelectorViewModel.kt
@@ -0,0 +1,43 @@
+package com.isolaatti.audio.audio_selector.presentation
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.isolaatti.audio.common.domain.Audio
+import com.isolaatti.audio.common.domain.AudiosRepository
+import com.isolaatti.audio.common.domain.Playable
+import com.isolaatti.audio.drafts.domain.AudioDraft
+import com.isolaatti.audio.drafts.domain.repository.AudioDraftsRepository
+import com.isolaatti.common.SortingEnum
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class AudioSelectorViewModel @Inject constructor(
+ private val audiosRepository: AudiosRepository,
+ private val audioDraftsRepository: AudioDraftsRepository
+) : ViewModel() {
+ val audios: MutableLiveData> = MutableLiveData()
+ val drafts: MutableLiveData> = MutableLiveData()
+ val sorting: MutableLiveData = MutableLiveData()
+
+ fun setSorting(sort: SortingEnum) {
+ sorting.value = sort
+ }
+
+ fun getAudioDrafts() {
+ viewModelScope.launch {
+ audioDraftsRepository.getAudioDrafts().onEach {
+ drafts.postValue(it)
+ }
+ }
+ }
+
+ fun getAudios() {
+ viewModelScope.launch {
+
+ }
+ }
+}
\ 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
index d9be211..14ae1ea 100644
--- 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
@@ -1,7 +1,17 @@
package com.isolaatti.audio.audio_selector.ui
import android.os.Bundle
+import androidx.activity.viewModels
+import androidx.appcompat.widget.PopupMenu
+import androidx.navigation.findNavController
+import androidx.viewpager2.widget.ViewPager2
+import com.google.android.material.tabs.TabLayoutMediator
+import com.isolaatti.R
+import com.isolaatti.audio.audio_selector.presentation.AudioSelectorFragmentAdapter
+import com.isolaatti.audio.audio_selector.presentation.AudioSelectorViewModel
+import com.isolaatti.audio.recorder.ui.AudioRecorderContract
import com.isolaatti.common.IsolaattiBaseActivity
+import com.isolaatti.common.SortingEnum
import com.isolaatti.databinding.ActivityAudioSelectorBinding
class AudioSelectorActivity : IsolaattiBaseActivity() {
@@ -12,13 +22,69 @@ class AudioSelectorActivity : IsolaattiBaseActivity() {
}
private lateinit var binding: ActivityAudioSelectorBinding
+ private val viewModel: AudioSelectorViewModel by viewModels()
+ private val audioRecorderLauncher = registerForActivityResult(AudioRecorderContract()) {
+
+ }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityAudioSelectorBinding.inflate(layoutInflater)
setContentView(binding.root)
+
+ binding.viewpager.adapter = AudioSelectorFragmentAdapter(this)
+
+ TabLayoutMediator(binding.tabLayout, binding.viewpager) {tab, position ->
+ when(position) {
+ 0 -> tab.text = getString(R.string.audios)
+ 1 -> tab.text = getString(R.string.drafts)
+ }
+ }.attach()
+
+ binding.sort.setText(R.string.descending_by_name)
+
+ setupListeners()
+
+ }
+
+ private fun setupListeners() {
+ binding.toolbar.setNavigationOnClickListener {
+ finish()
+ }
+ binding.newAudio.setOnClickListener {
+ audioRecorderLauncher.launch(null)
+ }
+
+ binding.sort.setOnClickListener {
+ val popupMenu = PopupMenu(this, it)
+ popupMenu.inflate(R.menu.audios_sort_menu)
+
+ popupMenu.setOnMenuItemClickListener { menuItem ->
+ binding.sort.text = menuItem.title
+ when(menuItem.itemId) {
+ R.id.desc_by_name -> {
+ viewModel.setSorting(SortingEnum.DescendingByName)
+ true
+ }
+ R.id.asc_by_name -> {
+ viewModel.setSorting(SortingEnum.AscendingByName)
+ true
+ }
+ R.id.asc_by_creation_date -> {
+ viewModel.setSorting(SortingEnum.AscendingByCreationDate)
+ true
+ }
+ R.id.desc_by_creation_date -> {
+ viewModel.setSorting(SortingEnum.DescendingByCreationDate)
+ true
+ }
+ else -> false
+ }
+ }
+ popupMenu.show()
+ }
}
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
index 0da2fda..66bdbb4 100644
--- 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
@@ -14,6 +14,10 @@ import java.io.Serializable
*/
class AudioSelectorContract : ActivityResultContract() {
+ /**
+ * @param forSquad audios source will be a specified squad in the id param
+ * @param id squad id, should be non null if forSquad is true
+ */
data class SelectorConfig(val forSquad: Boolean, val id: String?): Serializable
override fun createIntent(context: Context, input: SelectorConfig): Intent {
diff --git a/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudiosListSelectorFragment.kt b/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudiosListSelectorFragment.kt
new file mode 100644
index 0000000..9765ba8
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudiosListSelectorFragment.kt
@@ -0,0 +1,103 @@
+package com.isolaatti.audio.audio_selector.ui
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.activityViewModels
+import com.isolaatti.audio.audio_selector.presentation.AudioSelectorViewModel
+import com.isolaatti.audio.audios_list.presentation.AudiosAdapter
+import com.isolaatti.databinding.FragmentAudiosListSelectorBinding
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class AudiosListSelectorFragment : Fragment() {
+ private lateinit var binding: FragmentAudiosListSelectorBinding
+ private val viewModel: AudioSelectorViewModel by activityViewModels()
+
+ private var mode: Int = ARG_VAL_MODE_AUDIOS
+ private var squadId: String? = null
+
+ private lateinit var adapter: AudiosAdapter
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ arguments?.getInt(ARG_MODE)?.let { mode = it }
+ arguments?.getString(ARG_SQUAD_ID)?.let { squadId = it }
+
+
+ when(mode) {
+ ARG_VAL_MODE_AUDIOS -> {}
+ ARG_VAL_MODE_DRAFTS -> {
+ viewModel.getAudioDrafts()
+ }
+ }
+
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ binding = FragmentAudiosListSelectorBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ adapter = AudiosAdapter(
+ onPlayClick = {
+
+ },
+ onOptionsClick = {audio, button ->
+ false
+ }
+ )
+ binding.recycler.adapter = adapter
+
+ when(mode) {
+ ARG_VAL_MODE_AUDIOS -> {
+ viewModel.audios.observe(viewLifecycleOwner) {
+
+ }
+ }
+ ARG_VAL_MODE_DRAFTS -> {
+ viewModel.drafts.observe(viewLifecycleOwner) {
+
+ }
+ }
+ }
+ }
+
+ companion object {
+ private const val ARG_MODE = "mode"
+ private const val ARG_SQUAD_ID = "squadId"
+ private const val ARG_VAL_MODE_DRAFTS = 0
+ private const val ARG_VAL_MODE_AUDIOS = 1
+ fun getInstance(): AudiosListSelectorFragment {
+ return AudiosListSelectorFragment().apply {
+ arguments = Bundle().apply {
+ putInt(ARG_MODE, ARG_VAL_MODE_AUDIOS)
+ }
+ }
+ }
+
+ fun getInstanceForDrafts(): AudiosListSelectorFragment {
+ return AudiosListSelectorFragment().apply {
+ arguments = Bundle().apply {
+ putInt(ARG_MODE, ARG_VAL_MODE_DRAFTS)
+ }
+ }
+ }
+ fun getInstanceForSquad(squadId: String): AudiosListSelectorFragment {
+ return AudiosListSelectorFragment().apply {
+ arguments = Bundle().apply {
+ putString(ARG_SQUAD_ID, squadId)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/audio/common/data/AudiosRepositoryImpl.kt b/app/src/main/java/com/isolaatti/audio/common/data/AudiosRepositoryImpl.kt
index 8b8a4a1..8ff7979 100644
--- a/app/src/main/java/com/isolaatti/audio/common/data/AudiosRepositoryImpl.kt
+++ b/app/src/main/java/com/isolaatti/audio/common/data/AudiosRepositoryImpl.kt
@@ -70,6 +70,7 @@ class AudiosRepositoryImpl @Inject constructor(private val audiosApi: AudiosApi,
val audioDto = response.body()
if(audioDto != null) {
Log.d(LOG_TAG, "emit audio dto")
+ audiosDraftsDao.deleteDrafts(arrayOf(audioDraftEntity))
emit(Resource.Success(Audio.fromDto(audioDto)))
}
diff --git a/app/src/main/java/com/isolaatti/audio/drafts/domain/AudioDraft.kt b/app/src/main/java/com/isolaatti/audio/drafts/domain/AudioDraft.kt
index 05afa2a..5f91200 100644
--- a/app/src/main/java/com/isolaatti/audio/drafts/domain/AudioDraft.kt
+++ b/app/src/main/java/com/isolaatti/audio/drafts/domain/AudioDraft.kt
@@ -6,8 +6,9 @@ import com.isolaatti.MyApplication
import com.isolaatti.audio.common.domain.Playable
import com.isolaatti.audio.drafts.data.AudioDraftEntity
import java.io.File
+import java.io.Serializable
-data class AudioDraft(val id: Long, val name: String, val localStorageRelativePath: String, val size: Long) : Playable() {
+data class AudioDraft(val id: Long, val name: String, val localStorageRelativePath: String, val size: Long) : Playable(), Serializable {
override val thumbnail: String?
get() = null
diff --git a/app/src/main/java/com/isolaatti/audio/recorder/ui/AudioRecorderActivity.kt b/app/src/main/java/com/isolaatti/audio/recorder/ui/AudioRecorderActivity.kt
index 04bc530..2592bc8 100644
--- a/app/src/main/java/com/isolaatti/audio/recorder/ui/AudioRecorderActivity.kt
+++ b/app/src/main/java/com/isolaatti/audio/recorder/ui/AudioRecorderActivity.kt
@@ -49,7 +49,7 @@ class AudioRecorderActivity : AppCompatActivity() {
const val LOG_TAG = "AudioRecorderActivity"
const val IN_EXTRA_DRAFT_ID = "in_draft_id"
- const val OUT_EXTRA_DRAFT_ID = "out_draft_id"
+ const val OUT_EXTRA_DRAFT = "out_draft"
}
private lateinit var binding: ActivityAudioRecorderBinding
@@ -204,6 +204,10 @@ class AudioRecorderActivity : AppCompatActivity() {
else -> false
}
}
+
+ binding.toolbar.setNavigationOnClickListener {
+ finish()
+ }
}
private fun setupObservers() {
@@ -214,7 +218,7 @@ class AudioRecorderActivity : AppCompatActivity() {
// audio draft is saved!
viewModel.audioDraft.observe(this) {
val result = Intent().apply {
- putExtra(OUT_EXTRA_DRAFT_ID, it.id)
+ putExtra(OUT_EXTRA_DRAFT, it)
}
setResult(RESULT_OK, result)
finish()
diff --git a/app/src/main/java/com/isolaatti/audio/recorder/ui/AudioRecorderContract.kt b/app/src/main/java/com/isolaatti/audio/recorder/ui/AudioRecorderContract.kt
index f828b5d..9b2796d 100644
--- a/app/src/main/java/com/isolaatti/audio/recorder/ui/AudioRecorderContract.kt
+++ b/app/src/main/java/com/isolaatti/audio/recorder/ui/AudioRecorderContract.kt
@@ -4,8 +4,9 @@ import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.activity.result.contract.ActivityResultContract
+import com.isolaatti.audio.drafts.domain.AudioDraft
-class AudioRecorderContract : ActivityResultContract() {
+class AudioRecorderContract : ActivityResultContract() {
override fun createIntent(context: Context, input: Long?): Intent {
val intent = Intent(context, AudioRecorderActivity::class.java).apply {
@@ -17,10 +18,10 @@ class AudioRecorderContract : ActivityResultContract() {
return intent
}
- override fun parseResult(resultCode: Int, intent: Intent?): Long? {
+ override fun parseResult(resultCode: Int, intent: Intent?): AudioDraft? {
return when(resultCode){
Activity.RESULT_OK -> {
- intent?.getLongExtra(AudioRecorderActivity.OUT_EXTRA_DRAFT_ID, 0)?.takeUnless { it == 0L }
+ intent?.getSerializableExtra(AudioRecorderActivity.OUT_EXTRA_DRAFT) as? AudioDraft
}
else -> null
}
diff --git a/app/src/main/java/com/isolaatti/common/SortingEnum.kt b/app/src/main/java/com/isolaatti/common/SortingEnum.kt
new file mode 100644
index 0000000..f84883e
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/common/SortingEnum.kt
@@ -0,0 +1,8 @@
+package com.isolaatti.common
+
+enum class SortingEnum {
+ AscendingByName,
+ DescendingByName,
+ AscendingByCreationDate,
+ DescendingByCreationDate
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/common/options_bottom_sheet/domain/Options.kt b/app/src/main/java/com/isolaatti/common/options_bottom_sheet/domain/Options.kt
index 4880f23..f457420 100644
--- a/app/src/main/java/com/isolaatti/common/options_bottom_sheet/domain/Options.kt
+++ b/app/src/main/java/com/isolaatti/common/options_bottom_sheet/domain/Options.kt
@@ -23,6 +23,7 @@ data class Options(
const val OPTION_PROFILE_PHOTO_VIEW_PHOTO = 6
const val OPTION_PROFILE_PHOTO_CHANGE_PHOTO = 7
const val OPTION_PROFILE_PHOTO_REMOVE_PHOTO = 8
+ const val OPTION_PROFILE_DESCRIPTION_SET_AUDIO = 9
}
}
@@ -30,6 +31,7 @@ data class Options(
const val POST_OPTIONS = 1
const val COMMENT_OPTIONS = 2
const val PROFILE_PHOTO_OPTIONS = 3
+ const val PROFILE_DESCRIPTION_OPTIONS = 4
val noOptions = Options(0, 0, listOf())
@@ -93,5 +95,10 @@ data class Options(
return Options(R.string.profile_photo,PROFILE_PHOTO_OPTIONS, list)
}
+
+ fun getProfileDescriptionOptions(): Options {
+ val list = listOf(Option(R.string.set_audio_description, R.drawable.baseline_audio_file_24, Option.OPTION_PROFILE_DESCRIPTION_SET_AUDIO))
+ return Options(R.string.description, PROFILE_DESCRIPTION_OPTIONS, list)
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/common/options_bottom_sheet/presentation/BottomSheetPostOptionsViewModel.kt b/app/src/main/java/com/isolaatti/common/options_bottom_sheet/presentation/BottomSheetPostOptionsViewModel.kt
index b60a61a..29750e1 100644
--- a/app/src/main/java/com/isolaatti/common/options_bottom_sheet/presentation/BottomSheetPostOptionsViewModel.kt
+++ b/app/src/main/java/com/isolaatti/common/options_bottom_sheet/presentation/BottomSheetPostOptionsViewModel.kt
@@ -9,6 +9,7 @@ import com.isolaatti.common.options_bottom_sheet.domain.OptionClicked
import com.isolaatti.common.options_bottom_sheet.domain.Options
import com.isolaatti.common.options_bottom_sheet.domain.Options.Companion.COMMENT_OPTIONS
import com.isolaatti.common.options_bottom_sheet.domain.Options.Companion.POST_OPTIONS
+import com.isolaatti.common.options_bottom_sheet.domain.Options.Companion.PROFILE_DESCRIPTION_OPTIONS
import com.isolaatti.common.options_bottom_sheet.domain.Options.Companion.PROFILE_PHOTO_OPTIONS
import com.isolaatti.settings.domain.UserIdSetting
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -40,6 +41,8 @@ class BottomSheetPostOptionsViewModel @Inject constructor(private val userIdSett
fun setOptions(options: Int, callerId: Int, payload: Ownable? = null) {
viewModelScope.launch {
CoroutineScope(Dispatchers.IO).launch {
+ _payload = payload
+ _callerId = callerId
when(options) {
POST_OPTIONS -> {
userIdSetting.getUserId().onEach { userId ->
@@ -49,8 +52,6 @@ class BottomSheetPostOptionsViewModel @Inject constructor(private val userIdSett
savable = false,
snapshotAble = false)
)
- _callerId = callerId
- _payload = payload
}.flowOn(Dispatchers.IO).launchIn(this)
}
COMMENT_OPTIONS -> {
@@ -61,17 +62,16 @@ class BottomSheetPostOptionsViewModel @Inject constructor(private val userIdSett
savable = false,
snapshotAble = false)
)
- _callerId = callerId
- _payload = payload
}.flowOn(Dispatchers.IO).launchIn(this)
}
PROFILE_PHOTO_OPTIONS -> {
userIdSetting.getUserId().onEach { userId ->
_options.postValue(Options.getProfilePhotoOptions(userOwned = userId == payload?.userId,))
- _callerId = callerId
- _payload = payload
}.flowOn(Dispatchers.IO).launchIn(this)
}
+ PROFILE_DESCRIPTION_OPTIONS -> {
+ _options.postValue(Options.getProfileDescriptionOptions())
+ }
}
}
diff --git a/app/src/main/java/com/isolaatti/posting/comments/presentation/CommentsRecyclerViewAdapter.kt b/app/src/main/java/com/isolaatti/posting/comments/presentation/CommentsRecyclerViewAdapter.kt
index 4a95d47..dab8146 100644
--- a/app/src/main/java/com/isolaatti/posting/comments/presentation/CommentsRecyclerViewAdapter.kt
+++ b/app/src/main/java/com/isolaatti/posting/comments/presentation/CommentsRecyclerViewAdapter.kt
@@ -12,7 +12,12 @@ import com.isolaatti.common.OnUserInteractedCallback
import com.isolaatti.utils.UrlGen
import io.noties.markwon.Markwon
-class CommentsRecyclerViewAdapter(private var list: List, private val markwon: Markwon, private val callback: OnUserInteractedCallback) : RecyclerView.Adapter() {
+class CommentsRecyclerViewAdapter(
+ private var list: List,
+ private val markwon: Markwon,
+ private val callback: OnUserInteractedCallback,
+ private val onCommentClick: (Comment) -> Unit
+) : RecyclerView.Adapter() {
private var previousSize = 0
var blockInfiniteScroll = false
diff --git a/app/src/main/java/com/isolaatti/posting/comments/ui/BottomSheetPostComments.kt b/app/src/main/java/com/isolaatti/posting/comments/ui/BottomSheetPostComments.kt
index df71073..8d656bb 100644
--- a/app/src/main/java/com/isolaatti/posting/comments/ui/BottomSheetPostComments.kt
+++ b/app/src/main/java/com/isolaatti/posting/comments/ui/BottomSheetPostComments.kt
@@ -230,7 +230,9 @@ class BottomSheetPostComments() : BottomSheetDialogFragment(), OnUserInteractedC
.usePlugin(LinkifyPlugin.create())
.build()
- adapter = CommentsRecyclerViewAdapter(listOf(), markwon, this)
+ adapter = CommentsRecyclerViewAdapter(listOf(), markwon, this, onCommentClick = {
+
+ })
viewBinding.recyclerComments.adapter = adapter
viewBinding.recyclerComments.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
diff --git a/app/src/main/java/com/isolaatti/posting/comments/ui/CommentThreadActivity.kt b/app/src/main/java/com/isolaatti/posting/comments/ui/CommentThreadActivity.kt
new file mode 100644
index 0000000..276e6fe
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/comments/ui/CommentThreadActivity.kt
@@ -0,0 +1,44 @@
+package com.isolaatti.posting.comments.ui
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import androidx.navigation.fragment.NavHostFragment
+import com.isolaatti.R
+import com.isolaatti.databinding.ActivityCommentThreadBinding
+
+class CommentThreadActivity : AppCompatActivity() {
+ private lateinit var binding: ActivityCommentThreadBinding
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityCommentThreadBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ val commentId = intent.extras?.getLong(EXTRA_COMMENT_ID)
+
+ if(commentId == null || commentId == 0L) {
+ Toast.makeText(this, R.string.invalid_arg, Toast.LENGTH_SHORT).show()
+ finish()
+ } else {
+ (supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment)
+ .navController.setGraph(R.navigation.comment_thread_navigation,
+ Bundle().apply {
+ putLong(CommentThreadFragment.ARG_COMMENT_ID, commentId)
+ })
+ }
+ }
+
+ companion object {
+ private const val EXTRA_COMMENT_ID = "commentId"
+ fun startActivity(context: Context, commentId: Long) {
+ val intent = Intent(context, CommentThreadActivity::class.java).apply {
+ putExtra(EXTRA_COMMENT_ID, commentId)
+ }
+
+ context.startActivity(intent)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/comments/ui/CommentThreadFragment.kt b/app/src/main/java/com/isolaatti/posting/comments/ui/CommentThreadFragment.kt
new file mode 100644
index 0000000..223e5db
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/comments/ui/CommentThreadFragment.kt
@@ -0,0 +1,9 @@
+package com.isolaatti.posting.comments.ui
+
+import androidx.fragment.app.Fragment
+
+class CommentThreadFragment : Fragment() {
+ companion object {
+ const val ARG_COMMENT_ID = "commentId"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/presentation/CreatePostViewModel.kt b/app/src/main/java/com/isolaatti/posting/posts/presentation/CreatePostViewModel.kt
index 05b3f77..9383b3c 100644
--- a/app/src/main/java/com/isolaatti/posting/posts/presentation/CreatePostViewModel.kt
+++ b/app/src/main/java/com/isolaatti/posting/posts/presentation/CreatePostViewModel.kt
@@ -7,6 +7,7 @@ import androidx.lifecycle.viewModelScope
import com.isolaatti.audio.common.domain.Audio
import com.isolaatti.audio.common.domain.Playable
import com.isolaatti.audio.common.domain.UploadAudioUC
+import com.isolaatti.audio.drafts.domain.AudioDraft
import com.isolaatti.audio.drafts.domain.repository.AudioDraftsRepository
import com.isolaatti.posting.posts.data.remote.CreatePostDto
import com.isolaatti.posting.posts.data.remote.EditPostDto
@@ -161,15 +162,15 @@ class CreatePostViewModel @Inject constructor(
}
// call this when user has recorded or selected a draft
- fun putAudioDraft(draftId: Long) {
+ fun putAudioDraft(draft: AudioDraft) {
viewModelScope.launch {
- audioDraftsRepository.getAudioDraftById(draftId).onEach { draft ->
+ audioDraftsRepository.getAudioDraftById(draft.id).onEach { draft ->
when(draft) {
is Resource.Error -> {}
is Resource.Loading -> {}
is Resource.Success -> {
audioAttachment.postValue(draft.data)
- this@CreatePostViewModel.audioDraft = draftId
+ this@CreatePostViewModel.audioDraft = draft.data!!.id
}
}
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 c688a66..74ea448 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
@@ -40,9 +40,9 @@ class MarkdownEditingFragment : Fragment(){
private var audioPlayerConnector: AudioPlayerConnector? = null
- private val audioRecorderLauncher = registerForActivityResult(AudioRecorderContract()) { draftId ->
- if(draftId != null) {
- viewModel.putAudioDraft(draftId)
+ private val audioRecorderLauncher = registerForActivityResult(AudioRecorderContract()) { audioDraft ->
+ if(audioDraft != null) {
+ viewModel.putAudioDraft(audioDraft)
binding.viewAnimator.displayedChild = 1
}
}
diff --git a/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt b/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt
index 86a1a0d..407d425 100644
--- a/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt
+++ b/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt
@@ -22,6 +22,7 @@ import coil.load
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.isolaatti.BuildConfig
import com.isolaatti.R
+import com.isolaatti.audio.audio_selector.ui.AudioSelectorContract
import com.isolaatti.audio.audios_list.ui.AudiosFragment
import com.isolaatti.audio.common.domain.Audio
import com.isolaatti.audio.common.domain.Playable
@@ -111,6 +112,10 @@ class ProfileMainFragment : Fragment() {
}
}
+ private val audioSelectorLauncher = registerForActivityResult(AudioSelectorContract()) {
+
+ }
+
private val audioPlayerConnectorListener = object: AudioPlayerConnector.Listener {
override fun onPlaying(isPlaying: Boolean, audio: Playable) {
@@ -280,6 +285,10 @@ class ProfileMainFragment : Fragment() {
}
}
}
+ Options.PROFILE_DESCRIPTION_OPTIONS -> {
+ optionsViewModel.handle()
+ audioSelectorLauncher.launch(AudioSelectorContract.SelectorConfig(false, null))
+ }
}
@@ -458,6 +467,11 @@ class ProfileMainFragment : Fragment() {
removeItem(R.id.block_profile_menu_item)
removeItem(R.id.report_profile_menu_item)
}
+ viewBinding.descriptionCard.setOnClickListener {
+ optionsViewModel.setOptions(Options.PROFILE_DESCRIPTION_OPTIONS, CALLER_ID, null)
+ val fragment = BottomSheetPostOptionsFragment()
+ fragment.show(parentFragmentManager, BottomSheetPostOptionsFragment.TAG)
+ }
} else {
viewBinding.createPostButton.visibility = View.GONE
viewBinding.topAppBar.menu.removeItem(R.id.edit_profile)
diff --git a/app/src/main/res/layout/activity_audio_selector.xml b/app/src/main/res/layout/activity_audio_selector.xml
index c16d327..10e4c6a 100644
--- a/app/src/main/res/layout/activity_audio_selector.xml
+++ b/app/src/main/res/layout/activity_audio_selector.xml
@@ -4,65 +4,64 @@
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
-
-
-
-
+ app:layout_constraintTop_toTopOf="parent">
-
-
-
-
-
-
-
-
-
+ android:layout_height="wrap_content"
+ app:title="@string/select_audio"
+ app:navigationIcon="@drawable/baseline_close_24"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_comment_thread.xml b/app/src/main/res/layout/activity_comment_thread.xml
new file mode 100644
index 0000000..8703412
--- /dev/null
+++ b/app/src/main/res/layout/activity_comment_thread.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_audios_list_selector.xml b/app/src/main/res/layout/fragment_audios_list_selector.xml
new file mode 100644
index 0000000..872d991
--- /dev/null
+++ b/app/src/main/res/layout/fragment_audios_list_selector.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_comment_thread.xml b/app/src/main/res/layout/fragment_comment_thread.xml
new file mode 100644
index 0000000..a908191
--- /dev/null
+++ b/app/src/main/res/layout/fragment_comment_thread.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/audios_sort_menu.xml b/app/src/main/res/menu/audios_sort_menu.xml
new file mode 100644
index 0000000..a665aae
--- /dev/null
+++ b/app/src/main/res/menu/audios_sort_menu.xml
@@ -0,0 +1,14 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/navigation/comment_thread_navigation.xml b/app/src/main/res/navigation/comment_thread_navigation.xml
new file mode 100644
index 0000000..5078535
--- /dev/null
+++ b/app/src/main/res/navigation/comment_thread_navigation.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
\ 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 d0a3cc7..6864525 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -212,6 +212,12 @@
Edited at %s
Do you really want to block %s?
%s\'s profile picture
+ Set audio description
+ Z-A
+ A-Z
+ older-newer
+ newer-older
+ Invalid value passed
- Spam
- Explicit content