From a32757c5185229024167c5f96fca684cdea81255 Mon Sep 17 00:00:00 2001 From: erik-everardo Date: Sun, 10 Nov 2024 23:48:00 -0600 Subject: [PATCH] WIP --- app/build.gradle | 23 ++++ .../com/isolaatti/common/IsolaattiTheme.kt | 27 ++++ .../main/java/com/isolaatti/images/Module.kt | 13 +- .../images/common/components/ImagesRow.kt | 122 ++++++++++++++++++ .../common/data/entity/ImageDraftEntity.kt | 3 +- .../images/common/data/remote/ImageDto.kt | 1 - .../data/repository/ImagesRepositoryImpl.kt | 12 +- .../images/common/domain/entity/Image.kt | 5 +- .../domain/repository/ImagesRepository.kt | 3 + .../image_chooser/ui/ImageChooserContract.kt | 14 +- .../image_chooser/ui/ImageChooserPreview.kt | 1 - .../ui/PictureViewerMainFragment.kt | 2 - .../comments/ui/BottomSheetPostComments.kt | 4 +- .../posts/presentation/CreatePostViewModel.kt | 14 ++ .../posting/posts/ui/CreatePostActivity.kt | 10 +- .../ui/CreatePostFragmentStateAdapter.kt | 8 +- .../posting/posts/ui/PostEditingFragment.kt | 71 ++++++++-- .../posts/viewer/ui/PostViewerActivity.kt | 2 +- .../profile/ui/ProfileMainFragment.kt | 3 +- .../res/drawable/baseline_add_a_photo_24.xml | 5 + .../main/res/layout/activity_create_post.xml | 14 +- .../res/layout/fragment_markdown_editing.xml | 20 +-- app/src/main/res/values/strings.xml | 2 +- 23 files changed, 303 insertions(+), 76 deletions(-) create mode 100644 app/src/main/java/com/isolaatti/common/IsolaattiTheme.kt create mode 100644 app/src/main/java/com/isolaatti/images/common/components/ImagesRow.kt create mode 100644 app/src/main/res/drawable/baseline_add_a_photo_24.xml diff --git a/app/build.gradle b/app/build.gradle index 08f4f88..bd0a9c1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,6 +19,14 @@ android { enabled = true } + buildFeatures { + compose true + } + + composeOptions { + kotlinCompilerExtensionVersion = "1.5.2" + } + defaultConfig { applicationId "com.isolaatti" minSdk 24 @@ -137,4 +145,19 @@ dependencies { // OSS screen implementation 'com.google.android.gms:play-services-oss-licenses:17.1.0' + + def composeBom = platform('androidx.compose:compose-bom:2024.10.01') + implementation composeBom + androidTestImplementation composeBom + implementation 'androidx.compose.material3:material3' + implementation 'androidx.compose.ui:ui-tooling-preview' + debugImplementation 'androidx.compose.ui:ui-tooling' + androidTestImplementation 'androidx.compose.ui:ui-test-junit4' + debugImplementation 'androidx.compose.ui:ui-test-manifest' + + implementation 'androidx.activity:activity-compose:1.9.2' + implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.5' + implementation 'androidx.compose.runtime:runtime-livedata' + + implementation "io.coil-kt.coil3:coil-compose:3.0.1" } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/common/IsolaattiTheme.kt b/app/src/main/java/com/isolaatti/common/IsolaattiTheme.kt new file mode 100644 index 0000000..a382951 --- /dev/null +++ b/app/src/main/java/com/isolaatti/common/IsolaattiTheme.kt @@ -0,0 +1,27 @@ +package com.isolaatti.common + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.colorResource +import com.isolaatti.R + +@Composable +fun IsolaattiTheme(content: @Composable () -> Unit) { + val colorScheme = if(isSystemInDarkTheme()) { + darkColorScheme( + primary = colorResource(R.color.purple), + onSurface = colorResource(R.color.on_surface) + ) + } else { + lightColorScheme( + primary = colorResource(R.color.purple), + onSurface = colorResource(R.color.on_surface) + ) + } + MaterialTheme(colorScheme = colorScheme) { + content() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/Module.kt b/app/src/main/java/com/isolaatti/images/Module.kt index 9208426..01de9fc 100644 --- a/app/src/main/java/com/isolaatti/images/Module.kt +++ b/app/src/main/java/com/isolaatti/images/Module.kt @@ -1,10 +1,10 @@ package com.isolaatti.images -import android.app.Application import android.content.ContentResolver import android.content.Context -import com.isolaatti.MyApplication import com.isolaatti.connectivity.RetrofitClient +import com.isolaatti.database.AppDatabase +import com.isolaatti.images.common.data.dao.ImagesDraftsDao import com.isolaatti.images.common.data.remote.ImagesApi import com.isolaatti.images.common.data.repository.ImagesRepositoryImpl import com.isolaatti.images.common.domain.repository.ImagesRepository @@ -28,7 +28,12 @@ class Module { } @Provides - fun provideImagesRepository(imagesApi: ImagesApi, contentResolver: ContentResolver): ImagesRepository { - return ImagesRepositoryImpl(imagesApi, contentResolver) + fun provideImagesDraftDao(database: AppDatabase): ImagesDraftsDao { + return database.imagesDraftsDao() + } + + @Provides + fun provideImagesRepository(imagesApi: ImagesApi, imagesDraftsDao: ImagesDraftsDao, contentResolver: ContentResolver): ImagesRepository { + return ImagesRepositoryImpl(imagesApi, imagesDraftsDao, contentResolver) } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/common/components/ImagesRow.kt b/app/src/main/java/com/isolaatti/images/common/components/ImagesRow.kt new file mode 100644 index 0000000..df4239c --- /dev/null +++ b/app/src/main/java/com/isolaatti/images/common/components/ImagesRow.kt @@ -0,0 +1,122 @@ +package com.isolaatti.images.common.components + +import android.net.Uri +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.Card +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.FilledIconButton +import androidx.compose.material3.FilledTonalIconButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Devices +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Popup +import androidx.compose.ui.zIndex +import coil3.compose.AsyncImage +import com.isolaatti.R +import com.isolaatti.images.common.domain.entity.Image + +@Composable +fun ImagesRow( + modifier: Modifier = Modifier, + images: List, + deletable: Boolean, + addable: Boolean, + onClick: (index: Int) -> Unit, + onDeleteClick: (index: Int) -> Unit = {}, + onTakePicture: () -> Unit = {}, + onUploadPicture: () -> Unit = {} +) { + var showAddPhotoPopUp by remember { mutableStateOf(false) } + LazyRow(modifier, contentPadding = PaddingValues(horizontal = 8.dp)) { + if(addable) { + item { + Card(modifier = Modifier + .padding(horizontal = 4.dp) + .size(120.dp), onClick = { + showAddPhotoPopUp = true + }) { + + + DropdownMenu(expanded = showAddPhotoPopUp, onDismissRequest = { showAddPhotoPopUp = false }) { + DropdownMenuItem( + text = { Text(stringResource(R.string.take_a_photo )) }, + onClick = { + showAddPhotoPopUp = false + onTakePicture() + } + ) + DropdownMenuItem( + text = { Text(stringResource(R.string.upload_a_picture )) }, + onClick = { + showAddPhotoPopUp = false + onUploadPicture() + } + ) + } + + Image(modifier = Modifier + .fillMaxSize() + .padding(16.dp), + painter = painterResource(id = R.drawable.baseline_add_a_photo_24), + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSurface), + contentDescription = null) + } + } + } + items(count = images.size) { index -> + + Card(modifier = Modifier + .padding(horizontal = 4.dp) + .size(120.dp)) { + Box( + modifier = Modifier.fillMaxSize(), + + ) { + FilledTonalIconButton( + onClick = { onDeleteClick(index) }, + modifier = Modifier.zIndex(2f) + ) { + Icon(imageVector = Icons.Default.Close, contentDescription = null) + } + + AsyncImage( + model = images[index], + contentDescription = null, + modifier = Modifier.fillMaxSize().zIndex(1f), + contentScale = ContentScale.Crop + ) + } + } + } + } +} + +@Preview(device = Devices.PIXEL_5) +@Composable +fun ImagesRowPreview() { + ImagesRow(images = emptyList(), deletable = false, addable = true, onClick = {}) +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/common/data/entity/ImageDraftEntity.kt b/app/src/main/java/com/isolaatti/images/common/data/entity/ImageDraftEntity.kt index 23c82fe..5ead054 100644 --- a/app/src/main/java/com/isolaatti/images/common/data/entity/ImageDraftEntity.kt +++ b/app/src/main/java/com/isolaatti/images/common/data/entity/ImageDraftEntity.kt @@ -2,6 +2,7 @@ package com.isolaatti.images.common.data.entity import androidx.room.Entity import androidx.room.PrimaryKey +import java.io.Serializable @Entity(tableName = "image_drafts") data class ImageDraftEntity( @@ -9,4 +10,4 @@ data class ImageDraftEntity( val id: Long, val uri: String, val postId: Long? = null -) +) : Serializable diff --git a/app/src/main/java/com/isolaatti/images/common/data/remote/ImageDto.kt b/app/src/main/java/com/isolaatti/images/common/data/remote/ImageDto.kt index 2e8864f..910c38c 100644 --- a/app/src/main/java/com/isolaatti/images/common/data/remote/ImageDto.kt +++ b/app/src/main/java/com/isolaatti/images/common/data/remote/ImageDto.kt @@ -3,7 +3,6 @@ package com.isolaatti.images.common.data.remote data class ImageDto( val id: String, val userId: Int, - val name: String, val squadId: String?, val username: String, val idOnFirebase: String diff --git a/app/src/main/java/com/isolaatti/images/common/data/repository/ImagesRepositoryImpl.kt b/app/src/main/java/com/isolaatti/images/common/data/repository/ImagesRepositoryImpl.kt index b48e3c1..c232ff9 100644 --- a/app/src/main/java/com/isolaatti/images/common/data/repository/ImagesRepositoryImpl.kt +++ b/app/src/main/java/com/isolaatti/images/common/data/repository/ImagesRepositoryImpl.kt @@ -6,6 +6,8 @@ import android.graphics.BitmapFactory import android.net.Uri import android.os.Build import android.util.Log +import com.isolaatti.images.common.data.dao.ImagesDraftsDao +import com.isolaatti.images.common.data.entity.ImageDraftEntity import com.isolaatti.images.common.data.remote.DeleteImagesDto import com.isolaatti.images.common.data.remote.ImagesApi import com.isolaatti.images.common.domain.entity.Image @@ -20,7 +22,7 @@ import java.io.ByteArrayOutputStream import java.io.InputStream import javax.inject.Inject -class ImagesRepositoryImpl @Inject constructor(private val imagesApi: ImagesApi, private val contentResolver: ContentResolver) : +class ImagesRepositoryImpl @Inject constructor(private val imagesApi: ImagesApi, private val imagesDraftsDao: ImagesDraftsDao, private val contentResolver: ContentResolver) : ImagesRepository { companion object { @@ -104,4 +106,12 @@ class ImagesRepositoryImpl @Inject constructor(private val imagesApi: ImagesApi, imageInputStream?.close() } } + + override fun getDetachedDraftImages(): Flow>> { + TODO("Not yet implemented") + } + + override fun getDraftImagesOfPost(postId: Long): Flow>> { + TODO("Not yet implemented") + } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/common/domain/entity/Image.kt b/app/src/main/java/com/isolaatti/images/common/domain/entity/Image.kt index 9a49ceb..eab8e7f 100644 --- a/app/src/main/java/com/isolaatti/images/common/domain/entity/Image.kt +++ b/app/src/main/java/com/isolaatti/images/common/domain/entity/Image.kt @@ -9,7 +9,6 @@ import java.io.Serializable data class Image( val id: String, val userId: Int, - val name: String, val username: String ): Deletable(), Serializable { val imageUrl: String get() = UrlGen.imageUrl(id) @@ -19,7 +18,7 @@ data class Image( val markdown: String get() = Generators.generateImage(imageUrl) companion object { - fun fromDto(imageDto: ImageDto) = Image(imageDto.id, imageDto.userId, imageDto.name, imageDto.username) + fun fromDto(imageDto: ImageDto) = Image(imageDto.id, imageDto.userId, imageDto.username) } override fun equals(other: Any?): Boolean { @@ -30,7 +29,6 @@ data class Image( if (id != other.id) return false if (userId != other.userId) return false - if (name != other.name) return false if (username != other.username) return false return true @@ -39,7 +37,6 @@ data class Image( override fun hashCode(): Int { var result = id.hashCode() result = 31 * result + userId - result = 31 * result + name.hashCode() result = 31 * result + username.hashCode() return result } diff --git a/app/src/main/java/com/isolaatti/images/common/domain/repository/ImagesRepository.kt b/app/src/main/java/com/isolaatti/images/common/domain/repository/ImagesRepository.kt index 59f29b5..9cfeb07 100644 --- a/app/src/main/java/com/isolaatti/images/common/domain/repository/ImagesRepository.kt +++ b/app/src/main/java/com/isolaatti/images/common/domain/repository/ImagesRepository.kt @@ -1,6 +1,7 @@ package com.isolaatti.images.common.domain.repository import android.net.Uri +import com.isolaatti.images.common.data.entity.ImageDraftEntity import com.isolaatti.images.common.domain.entity.Image import com.isolaatti.utils.Resource import kotlinx.coroutines.flow.Flow @@ -9,4 +10,6 @@ interface ImagesRepository { fun getImagesOfUser(userId: Int, lastId: String? = null): Flow>> fun deleteImages(images: List): Flow> fun uploadImage(name: String, imageUri: Uri, squadId: String?): Flow> + fun getDetachedDraftImages(): Flow>> + fun getDraftImagesOfPost(postId: Long): Flow>> } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/image_chooser/ui/ImageChooserContract.kt b/app/src/main/java/com/isolaatti/images/image_chooser/ui/ImageChooserContract.kt index 47640b1..0965dc6 100644 --- a/app/src/main/java/com/isolaatti/images/image_chooser/ui/ImageChooserContract.kt +++ b/app/src/main/java/com/isolaatti/images/image_chooser/ui/ImageChooserContract.kt @@ -5,9 +5,11 @@ import android.content.Context import android.content.Intent import android.os.Build import androidx.activity.result.contract.ActivityResultContract +import androidx.core.content.IntentCompat +import com.isolaatti.images.common.data.entity.ImageDraftEntity import com.isolaatti.images.common.domain.entity.Image -class ImageChooserContract : ActivityResultContract() { +class ImageChooserContract : ActivityResultContract() { enum class Requester { UserPost, SquadPost @@ -18,13 +20,13 @@ class ImageChooserContract : ActivityResultContract - Log.d("BottomSheetPostComment", "${image?.markdown}") + if(image != null) { - viewBinding.newCommentTextField.editText?.setText("${viewBinding.newCommentTextField.editText?.text}\n\n${image.markdown}") + } } 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 9383b3c..722d919 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 @@ -1,5 +1,6 @@ package com.isolaatti.posting.posts.presentation +import android.net.Uri import android.util.Log import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -21,6 +22,8 @@ import com.isolaatti.utils.Resource import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -48,6 +51,8 @@ class CreatePostViewModel @Inject constructor( val liveContent: MutableLiveData = MutableLiveData() var content: String = "" set(value) {field = value; liveContent.value = value} // TODO remove this and use only liveContent + private val _photos: MutableStateFlow> = MutableStateFlow(emptyList()) + val photos: StateFlow> get() = _photos val audioAttachment: MutableLiveData = MutableLiveData() @@ -188,4 +193,13 @@ class CreatePostViewModel @Inject constructor( audioAttachment.value = null } + fun addPicture(uri: Uri) { + _photos.value = listOf(uri) + _photos.value + } + + fun removePicture(index: Int) { + _photos.value = _photos.value.toMutableList().apply { + removeAt(index) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/posting/posts/ui/CreatePostActivity.kt b/app/src/main/java/com/isolaatti/posting/posts/ui/CreatePostActivity.kt index cca1526..bcbc2cb 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/ui/CreatePostActivity.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/ui/CreatePostActivity.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.content.Intent import android.os.Bundle import android.view.View +import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.MediatorLiveData @@ -41,6 +42,7 @@ class CreatePostActivity : IsolaattiBaseActivity() { var postId: Long = 0L override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) intent.extras?.let { @@ -85,14 +87,6 @@ class CreatePostActivity : IsolaattiBaseActivity() { binding.pager.adapter = CreatePostFragmentStateAdapter(this) - - TabLayoutMediator(binding.tabs, binding.pager) { tab, position -> - when(position) { - 0 -> tab.setText(R.string.create_a_new_discussion) - 1 -> tab.setText(R.string.preview) - } - }.attach() - } private fun setListeners() { diff --git a/app/src/main/java/com/isolaatti/posting/posts/ui/CreatePostFragmentStateAdapter.kt b/app/src/main/java/com/isolaatti/posting/posts/ui/CreatePostFragmentStateAdapter.kt index 7e909b6..62e44d8 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/ui/CreatePostFragmentStateAdapter.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/ui/CreatePostFragmentStateAdapter.kt @@ -6,14 +6,10 @@ import androidx.viewpager2.adapter.FragmentStateAdapter class CreatePostFragmentStateAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) { override fun getItemCount(): Int { - return 2 + return 1 } override fun createFragment(position: Int): Fragment { - return if(position == 0) { - PostEditingFragment() - } else { - MarkdownPreviewFragment() - } + return PostEditingFragment() } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/posting/posts/ui/PostEditingFragment.kt b/app/src/main/java/com/isolaatti/posting/posts/ui/PostEditingFragment.kt index c88c3bb..6ad54b1 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/ui/PostEditingFragment.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/ui/PostEditingFragment.kt @@ -1,12 +1,22 @@ package com.isolaatti.posting.posts.ui +import android.net.Uri import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.widget.PopupMenu +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ViewCompositionStrategy +import androidx.compose.ui.unit.dp +import androidx.core.content.FileProvider import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -14,6 +24,7 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner +import com.isolaatti.MyApplication import com.isolaatti.R import com.isolaatti.audio.audio_selector.ui.AudioSelectorContract import com.isolaatti.audio.common.domain.Audio @@ -21,11 +32,15 @@ import com.isolaatti.audio.common.domain.Playable import com.isolaatti.audio.drafts.domain.AudioDraft import com.isolaatti.audio.player.AudioPlayerConnector import com.isolaatti.audio.recorder.ui.AudioRecorderContract +import com.isolaatti.common.IsolaattiTheme import com.isolaatti.databinding.FragmentMarkdownEditingBinding +import com.isolaatti.images.common.components.ImagesRow import com.isolaatti.images.image_chooser.ui.ImageChooserContract import com.isolaatti.posting.link_creator.presentation.LinkCreatorViewModel import com.isolaatti.posting.link_creator.ui.LinkCreatorFragment import com.isolaatti.posting.posts.presentation.CreatePostViewModel +import java.io.File +import java.util.Calendar class PostEditingFragment : Fragment(){ companion object { @@ -47,11 +62,10 @@ class PostEditingFragment : Fragment(){ } private val imageChooserLauncher = registerForActivityResult(ImageChooserContract()) { image -> - Log.d(LOG_TAG, "${image?.markdown}") + if(image != null) { - viewModel.content += "\n\n ${image.markdown}" - binding.filledTextField.editText?.setText(viewModel.content) + } @@ -61,6 +75,25 @@ class PostEditingFragment : Fragment(){ } + private val choosePictureLauncher = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { + if(it != null) { + viewModel.addPicture(it) + } + } + + private fun makePhotoUri(): Uri { + val cacheFile = File(requireContext().filesDir, "temp_picture_${Calendar.getInstance().timeInMillis}") + return FileProvider.getUriForFile(requireContext(), "${MyApplication.myApp.packageName}.provider", cacheFile) + } + + private var cameraPhotoUri: Uri? = null + + private val takePhotoLauncher = registerForActivityResult(ActivityResultContracts.TakePicture()) { + if(it && cameraPhotoUri != null) { + viewModel.addPicture(cameraPhotoUri!!) + } + + } private val audioListener = object: AudioPlayerConnector.Listener { override fun durationChanged(duration: Int, audio: Playable) { binding.audioItem.audioProgress.max = duration @@ -112,6 +145,32 @@ class PostEditingFragment : Fragment(){ setupListeners() setupObservers() + + binding.imagesRowCompose.apply { + setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + setContent { + val pictures by viewModel.photos.collectAsState() + IsolaattiTheme { + ImagesRow( + modifier = Modifier.padding(16.dp), + images = pictures, + deletable = true, + addable = true, + onClick = {}, + onDeleteClick = { + viewModel.removePicture(it) + }, + onTakePicture = { + cameraPhotoUri = makePhotoUri() + takePhotoLauncher.launch(cameraPhotoUri) + }, + onUploadPicture = { + choosePictureLauncher.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + ) + } + } + } } override fun onDestroyView() { @@ -127,12 +186,6 @@ class PostEditingFragment : Fragment(){ viewModel.validation.postValue(!text.isNullOrEmpty()) viewModel.content = text.toString() } - binding.addImageButton.setOnClickListener { - insertImage() - } - binding.addLinkButton.setOnClickListener { - insertLink() - } binding.addAudioButton.setOnClickListener { diff --git a/app/src/main/java/com/isolaatti/posting/posts/viewer/ui/PostViewerActivity.kt b/app/src/main/java/com/isolaatti/posting/posts/viewer/ui/PostViewerActivity.kt index 46de946..17deebb 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/viewer/ui/PostViewerActivity.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/viewer/ui/PostViewerActivity.kt @@ -128,7 +128,7 @@ class PostViewerActivity : IsolaattiBaseActivity() { } - override fun onNewIntent(intent: Intent?) { + override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) intent?.getLongExtra(POST_ID, 0)?.let { 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 a3ed5e0..ffb5569 100644 --- a/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt +++ b/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt @@ -97,7 +97,7 @@ class ProfileMainFragment : Fragment() { private val chooseImageLauncher = registerForActivityResult(ImageChooserContract()) { image -> // here change profile picture if(image != null) { - viewModel.setProfileImage(image) + } } @@ -255,7 +255,6 @@ class ProfileMainFragment : Fragment() { Image( profile.profileImageId ?: "", profile.userId, - getString(R.string.user_profile_picture, profile.name), profile.uniqueUsername) )) } diff --git a/app/src/main/res/drawable/baseline_add_a_photo_24.xml b/app/src/main/res/drawable/baseline_add_a_photo_24.xml new file mode 100644 index 0000000..e5d01a2 --- /dev/null +++ b/app/src/main/res/drawable/baseline_add_a_photo_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_create_post.xml b/app/src/main/res/layout/activity_create_post.xml index 68dcc89..11fa4d2 100644 --- a/app/src/main/res/layout/activity_create_post.xml +++ b/app/src/main/res/layout/activity_create_post.xml @@ -14,7 +14,8 @@ android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent"> + app:layout_constraintEnd_toEndOf="parent" + android:fitsSystemWindows="true"> - - - + app:layout_constraintTop_toBottomOf="@+id/appBarLayout" /> - - - - + There is no more content to show Post Add image - What do you want to talk about? You can record an audio if you want. + What do you want to talk about? Posted! Drafts Report profile