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 910c38c..abd2286 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 @@ -1,9 +1,8 @@ package com.isolaatti.images.common.data.remote + data class ImageDto( val id: String, val userId: Int, - val squadId: String?, - val username: String, - val idOnFirebase: String + val squadId: String? ) \ No newline at end of file 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 0460563..91346dc 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 @@ -34,7 +34,7 @@ class ImagesRepositoryImpl @Inject constructor(private val imagesApi: ImagesApi, val response = imagesApi.getImagesOfUser(userId, lastId).awaitResponse() if(response.isSuccessful) { val imagesDto = response.body() - val images = imagesDto?.data?.map { Image.fromDto(it) } + val images = imagesDto?.data?.map { Image(it.id) } emit(Resource.Success(images)) @@ -93,7 +93,7 @@ class ImagesRepositoryImpl @Inject constructor(private val imagesApi: ImagesApi, emit(Resource.Error(Resource.Error.ErrorType.ServerError)) return@flow } - val image = Image.fromDto(imageDto) + val image = Image(imageDto.id) emit(Resource.Success(image)) } else { emit(Resource.Error(Resource.Error.mapErrorCode(response.code()))) 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 eab8e7f..2ca6e2e 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 @@ -1,5 +1,7 @@ package com.isolaatti.images.common.domain.entity +import android.os.Parcel +import android.os.Parcelable import com.isolaatti.common.Deletable import com.isolaatti.images.common.data.remote.ImageDto import com.isolaatti.markdown.Generators @@ -7,19 +9,16 @@ import com.isolaatti.utils.UrlGen import java.io.Serializable data class Image( - val id: String, - val userId: Int, - val username: String -): Deletable(), Serializable { + val id: String +): Deletable(), Parcelable { val imageUrl: String get() = UrlGen.imageUrl(id) val smallImageUrl : String get() = UrlGen.imageUrl(id, UrlGen.IMAGE_MODE_SMALL) val reducedImageUrl: String get() = UrlGen.imageUrl(id, UrlGen.IMAGE_MODE_REDUCED) val markdown: String get() = Generators.generateImage(imageUrl) - companion object { - fun fromDto(imageDto: ImageDto) = Image(imageDto.id, imageDto.userId, imageDto.username) - } + constructor(parcel: Parcel) : this(parcel.readString()!!) + override fun equals(other: Any?): Boolean { if (this === other) return true @@ -28,16 +27,30 @@ data class Image( other as Image if (id != other.id) return false - if (userId != other.userId) return false - if (username != other.username) return false return true } override fun hashCode(): Int { var result = id.hashCode() - result = 31 * result + userId - result = 31 * result + username.hashCode() return result } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(id) + } + + override fun describeContents(): Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): Image { + return Image(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/picture_viewer/ui/PictureViewerImageWrapperFragment.kt b/app/src/main/java/com/isolaatti/images/picture_viewer/ui/PictureViewerImageWrapperFragment.kt index c96bd98..e304c1d 100644 --- a/app/src/main/java/com/isolaatti/images/picture_viewer/ui/PictureViewerImageWrapperFragment.kt +++ b/app/src/main/java/com/isolaatti/images/picture_viewer/ui/PictureViewerImageWrapperFragment.kt @@ -53,7 +53,7 @@ class PictureViewerImageWrapperFragment : Fragment() { fun getInstance(image: Image): PictureViewerImageWrapperFragment { val fragment = PictureViewerImageWrapperFragment() fragment.arguments = Bundle().apply { - putSerializable(ARGUMENT_IMAGE, image) + putParcelable(ARGUMENT_IMAGE, image) } return fragment diff --git a/app/src/main/java/com/isolaatti/images/picture_viewer/ui/PictureViewerMainFragment.kt b/app/src/main/java/com/isolaatti/images/picture_viewer/ui/PictureViewerMainFragment.kt index 56eeb67..1f96fe1 100644 --- a/app/src/main/java/com/isolaatti/images/picture_viewer/ui/PictureViewerMainFragment.kt +++ b/app/src/main/java/com/isolaatti/images/picture_viewer/ui/PictureViewerMainFragment.kt @@ -19,7 +19,7 @@ class PictureViewerMainFragment : Fragment() { private val onPageChangeCallback = object: ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { super.onPageSelected(position) - binding.imageAuthor.text = images[position].username + //binding.imageAuthor.text = images[position].username } } @@ -42,7 +42,7 @@ class PictureViewerMainFragment : Fragment() { binding.viewpager.adapter = adapter binding.viewpager.setCurrentItem(position, false) binding.viewpager.registerOnPageChangeCallback(onPageChangeCallback) - binding.imageAuthor.text = images[position].username + //binding.imageAuthor.text = images[position].username } override fun onDestroyView() { diff --git a/app/src/main/java/com/isolaatti/posting/posts/data/remote/FeedDto.kt b/app/src/main/java/com/isolaatti/posting/posts/data/remote/FeedDto.kt index 629bcc6..54d097d 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/data/remote/FeedDto.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/data/remote/FeedDto.kt @@ -1,9 +1,7 @@ package com.isolaatti.posting.posts.data.remote -import android.os.Parcel -import android.os.Parcelable import com.isolaatti.audio.common.data.AudioDto -import java.io.Serializable +import com.isolaatti.images.common.data.remote.ImageDto data class FeedDto( val data: MutableList, @@ -18,6 +16,7 @@ data class FeedDto( return this } + data class PostDto( val post: Post, var numberOfLikes: Int, @@ -26,17 +25,9 @@ data class FeedDto( val squadName: String?, var liked: Boolean, var audio: AudioDto? - ): Parcelable { + ){ - constructor(parcel: Parcel) : this( - parcel.readParcelable(Post::class.java.classLoader)!!, - parcel.readInt(), - parcel.readInt(), - parcel.readString()!!, - parcel.readString(), - parcel.readByte() != 0.toByte(), - parcel.readParcelable(AudioDto::class.java.classLoader) - ) + val list: MutableList = mutableListOf() data class Post( val id: Long, @@ -47,70 +38,9 @@ data class FeedDto( var audioId: String?, val squadId: String?, val linkedDiscussionId: Long, - val linkedCommentId: Long - ) : Parcelable { - constructor(parcel: Parcel) : this( - parcel.readLong(), - parcel.readString() ?: "", - parcel.readInt(), - parcel.readInt(), - parcel.readString() ?: "", - parcel.readString(), - parcel.readString(), - parcel.readLong(), - parcel.readLong() - ) { - } + val linkedCommentId: Long, + var images: List + ) - override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeLong(id) - parcel.writeString(textContent) - parcel.writeInt(userId) - parcel.writeInt(privacy) - parcel.writeString(date) - parcel.writeString(audioId) - parcel.writeString(squadId) - parcel.writeLong(linkedDiscussionId) - parcel.writeLong(linkedCommentId) - } - - override fun describeContents(): Int { - return 0 - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): Post { - return Post(parcel) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } - } - } - - override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeParcelable(post, flags) - parcel.writeInt(numberOfLikes) - parcel.writeInt(numberOfComments) - parcel.writeString(userName) - parcel.writeString(squadName) - parcel.writeByte(if (liked) 1 else 0) - parcel.writeSerializable(audio) - } - - override fun describeContents(): Int { - return 0 - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): PostDto { - return PostDto(parcel) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } - } } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/posting/posts/data/repository/PostsRepositoryImpl.kt b/app/src/main/java/com/isolaatti/posting/posts/data/repository/PostsRepositoryImpl.kt index 90d8ae6..38c4cde 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/data/repository/PostsRepositoryImpl.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/data/repository/PostsRepositoryImpl.kt @@ -7,10 +7,8 @@ import android.net.Uri import android.os.Build import android.util.Log import com.google.gson.Gson -import com.isolaatti.images.common.data.remote.DeleteImagesDto import com.isolaatti.images.common.data.remote.ImageDto import com.isolaatti.images.common.data.remote.ImagesApi -import com.isolaatti.images.common.domain.entity.Image import com.isolaatti.posting.posts.data.remote.CreatePostDto import com.isolaatti.posting.posts.data.remote.DeletePostDto import com.isolaatti.posting.posts.data.remote.EditPostDto @@ -20,6 +18,7 @@ import com.isolaatti.posting.posts.data.remote.FeedsApi import com.isolaatti.posting.posts.data.remote.PostApi import com.isolaatti.posting.posts.data.remote.PostDeletedDto import com.isolaatti.posting.posts.data.remote.VersionDto +import com.isolaatti.posting.posts.domain.PostingSteps import com.isolaatti.posting.posts.domain.PostsRepository import com.isolaatti.posting.posts.domain.entity.Post import com.isolaatti.profile.domain.entity.ProfileListItem @@ -82,7 +81,7 @@ class PostsRepositoryImpl @Inject constructor( } } - override fun makePost(createPostDto: CreatePostDto, images: List): Flow> = flow { + override fun makePost(createPostDto: CreatePostDto, images: List): Flow> = flow { emit(Resource.Loading()) try { val hasImages = images.isNotEmpty() @@ -103,6 +102,7 @@ class PostsRepositoryImpl @Inject constructor( emit(Resource.Error()) return@flow } + emit(Resource.Success(PostingSteps.UploadingPhotos)) images.forEach { imageUri -> var imageInputStream: InputStream? = null try { @@ -146,20 +146,19 @@ class PostsRepositoryImpl @Inject constructor( postApi.deletePost(DeletePostDto(postId)).awaitResponse() emit(Resource.Error(Resource.Error.ErrorType.ServerError, "Some images were not processed correctly")) } else { - postApi.setIsDraft(postId, false) - val response = postApi.getPost(postId).awaitResponse() + val setIsDraftCall = postApi.setIsDraft(postId, false).awaitResponse() - if(response.isSuccessful) { - emit(Resource.Success(response.body())) + if(setIsDraftCall.isSuccessful) { + emit(Resource.Success(PostingSteps.Finished)) } else { - val msg = "Post posted but could not retrieve updated post data from server" - Log.e(LOG_TAG, msg) - emit(Resource.Error(Resource.Error.mapErrorCode(response.code()), msg)) + val code = setIsDraftCall.code() + Log.e(LOG_TAG, "Could not set as \"not draft\"") + emit(Resource.Error(Resource.Error.mapErrorCode(code), "Could not set as \"not draft\"")) } } } else { - emit(Resource.Success(result.body())) + emit(Resource.Success(PostingSteps.Finished)) return@flow } diff --git a/app/src/main/java/com/isolaatti/posting/posts/domain/PostingSteps.kt b/app/src/main/java/com/isolaatti/posting/posts/domain/PostingSteps.kt new file mode 100644 index 0000000..7359307 --- /dev/null +++ b/app/src/main/java/com/isolaatti/posting/posts/domain/PostingSteps.kt @@ -0,0 +1,5 @@ +package com.isolaatti.posting.posts.domain + +enum class PostingSteps { + PostContent, UploadingPhotos, Finished, Unspecified +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/posting/posts/domain/PostsRepository.kt b/app/src/main/java/com/isolaatti/posting/posts/domain/PostsRepository.kt index ff8f4d2..e42058a 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/domain/PostsRepository.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/domain/PostsRepository.kt @@ -18,7 +18,7 @@ interface PostsRepository { fun getProfilePosts(userId: Int, lastId: Long, olderFirst: Boolean, filter: FeedFilterDto?): Flow>> - fun makePost(createPostDto: CreatePostDto, images: List): Flow> + fun makePost(createPostDto: CreatePostDto, images: List): Flow> fun editPost(editPostDto: EditPostDto): Flow> fun deletePost(postId: Long): Flow> fun loadPost(postId: Long): Flow> diff --git a/app/src/main/java/com/isolaatti/posting/posts/domain/entity/Post.kt b/app/src/main/java/com/isolaatti/posting/posts/domain/entity/Post.kt index da8c6e3..428fb8c 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/domain/entity/Post.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/domain/entity/Post.kt @@ -5,6 +5,7 @@ import android.os.Parcelable import com.isolaatti.audio.common.domain.Audio import com.isolaatti.common.Ownable import com.isolaatti.common.hashtagRegex +import com.isolaatti.images.common.domain.entity.Image import com.isolaatti.posting.posts.data.remote.FeedDto data class Post( @@ -20,7 +21,8 @@ data class Post( val userName: String, val squadName: String?, var liked: Boolean, - val audio: Audio? = null + val audio: Audio? = null, + val images: List ) : Ownable, Parcelable { constructor(parcel: Parcel) : this( parcel.readLong(), @@ -35,7 +37,8 @@ data class Post( parcel.readString()!!, parcel.readString(), parcel.readByte() != 0.toByte(), - parcel.readSerializable() as? Audio + parcel.readSerializable() as? Audio, + parcel.readParcelableArray(Image::class.java.classLoader)?.toList() as? List ?: emptyList() ) { } @@ -55,7 +58,8 @@ data class Post( userName = it.userName, squadName = it.squadName, liked = it.liked, - audio = it.audio?.let { audioDto -> Audio.fromDto(audioDto) } + audio = it.audio?.let { audioDto -> Audio.fromDto(audioDto) }, + images = it.post.images.map { imageDto -> Image(imageDto.id) } ) }.toMutableList() } @@ -73,7 +77,8 @@ data class Post( numberOfLikes = postDto.numberOfLikes, userName = postDto.userName, squadName = postDto.squadName, - liked = postDto.liked + liked = postDto.liked, + images = postDto.post.images.map { imageDto -> Image(imageDto.id) } ) } @@ -103,6 +108,7 @@ data class Post( parcel.writeString(squadName) parcel.writeByte(if (liked) 1 else 0) parcel.writeSerializable(audio) + parcel.writeParcelableArray(images.toTypedArray(), 0) } override fun describeContents(): Int { diff --git a/app/src/main/java/com/isolaatti/posting/posts/domain/use_case/MakePost.kt b/app/src/main/java/com/isolaatti/posting/posts/domain/use_case/MakePost.kt index 487b5ce..d88b7ca 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/domain/use_case/MakePost.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/domain/use_case/MakePost.kt @@ -2,7 +2,7 @@ package com.isolaatti.posting.posts.domain.use_case import android.net.Uri import com.isolaatti.posting.posts.data.remote.CreatePostDto -import com.isolaatti.posting.posts.data.remote.FeedDto +import com.isolaatti.posting.posts.domain.PostingSteps import com.isolaatti.posting.posts.domain.PostsRepository import com.isolaatti.utils.Resource import kotlinx.coroutines.flow.Flow @@ -15,7 +15,7 @@ class MakePost @Inject constructor(private val postsRepository: PostsRepository) images: List, audioId: String?, squadId: String? - ): Flow> { + ): Flow> { return postsRepository.makePost(CreatePostDto(privacy, content, audioId, squadId), images) } } \ 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 fd78a89..e9b2b7c 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 @@ -11,6 +11,7 @@ import com.isolaatti.posting.posts.data.remote.CreatePostDto import com.isolaatti.posting.posts.data.remote.EditPostDto import com.isolaatti.posting.posts.data.remote.EditPostDto.Companion.PRIVACY_ISOLAATTI import com.isolaatti.posting.posts.data.remote.FeedDto +import com.isolaatti.posting.posts.domain.PostingSteps import com.isolaatti.posting.posts.domain.entity.Post import com.isolaatti.posting.posts.domain.use_case.EditPost import com.isolaatti.posting.posts.domain.use_case.LoadSinglePost @@ -39,7 +40,6 @@ class CreatePostViewModel @Inject constructor( } val validation: MutableLiveData = MutableLiveData(false) - val posted: MutableLiveData = MutableLiveData() val error: MutableLiveData = MutableLiveData() val sendingPost: MutableLiveData = MutableLiveData(false) val postToEdit: MutableLiveData = MutableLiveData() @@ -49,6 +49,9 @@ class CreatePostViewModel @Inject constructor( private val _photos: MutableStateFlow> = MutableStateFlow(emptyList()) val photos: StateFlow> get() = _photos + private val _postingStep = MutableStateFlow(PostingSteps.Unspecified) + val postingStep: StateFlow get() = _postingStep + val audioAttachment: MutableLiveData = MutableLiveData() private var audioDraft: Long? = null @@ -71,8 +74,12 @@ class CreatePostViewModel @Inject constructor( ).onEach { when(it) { is Resource.Success -> { - sendingPost.postValue(false) - posted.postValue(Post.fromPostDto(it.data!!)) + if(it.data == PostingSteps.Finished) { + sendingPost.postValue(false) + } + + _postingStep.value = it.data!! + } is Resource.Error -> { sendingPost.postValue(false) @@ -103,7 +110,6 @@ class CreatePostViewModel @Inject constructor( when(it) { is Resource.Success -> { sendingPost.postValue(false) - posted.postValue(Post.fromPostDto(it.data!!)) } is Resource.Error -> { sendingPost.postValue(false) diff --git a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostImagesViewPagerAdapter.kt b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostImagesViewPagerAdapter.kt new file mode 100644 index 0000000..763f04d --- /dev/null +++ b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostImagesViewPagerAdapter.kt @@ -0,0 +1,35 @@ +package com.isolaatti.posting.posts.presentation + +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.RelativeLayout +import androidx.core.view.updateLayoutParams +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import coil.load +import com.isolaatti.images.common.domain.entity.Image + +class PostImagesViewPagerAdapter(private val images: List) : + RecyclerView.Adapter() { + class PostImagesViewPagerAdapterItemViewHolder(val imageView: ImageView) : ViewHolder(imageView) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): PostImagesViewPagerAdapterItemViewHolder { + return PostImagesViewPagerAdapterItemViewHolder( + imageView = ImageView(parent.context).apply { + layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) + } + ) + } + + override fun getItemCount(): Int = images.size + + override fun onBindViewHolder(holder: PostImagesViewPagerAdapterItemViewHolder, position: Int) { + val image = images[position] + + holder.imageView.load(image.reducedImageUrl) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostsRecyclerViewAdapter.kt b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostsRecyclerViewAdapter.kt index c814e26..9f72a06 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostsRecyclerViewAdapter.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostsRecyclerViewAdapter.kt @@ -12,6 +12,7 @@ import android.widget.ImageView import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources import androidx.core.text.set +import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ViewHolder import coil.load @@ -162,6 +163,14 @@ class PostsRecyclerViewAdapter ( itemBinding.audio.root.visibility = View.GONE itemBinding.audio.playButton.setOnClickListener(null) } + + if(post.images.isNotEmpty()) { + itemBinding.photosViewPager.isVisible = true + itemBinding.photosViewPager.adapter = PostImagesViewPagerAdapter(post.images) + } else { + itemBinding.photosViewPager.isVisible = false + itemBinding.photosViewPager.adapter = null + } itemBinding.shareButton.setOnClickListener { callback.onShare(post.id) } 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 bc71fab..16d4a77 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 @@ -13,14 +13,18 @@ import androidx.compose.foundation.gestures.ScrollableState import androidx.compose.foundation.gestures.rememberScrollableState import androidx.compose.foundation.gestures.scrollable import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.BasicAlertDialog import androidx.compose.material3.Button import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -29,7 +33,9 @@ import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -40,6 +46,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.DialogProperties import androidx.core.content.FileProvider import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.isolaatti.MyApplication @@ -48,8 +55,10 @@ import com.isolaatti.audio.common.components.AudioRecorder import com.isolaatti.common.IsolaattiBaseActivity import com.isolaatti.common.IsolaattiTheme import com.isolaatti.posting.posts.components.PostAttachments +import com.isolaatti.posting.posts.domain.PostingSteps import com.isolaatti.posting.posts.presentation.CreatePostViewModel import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.collectLatest import java.io.File import java.util.Calendar @@ -146,6 +155,33 @@ class CreatePostActivity : IsolaattiBaseActivity() { } ) { val scrollState = rememberScrollState() + + val posting by viewModel.sendingPost.observeAsState() + + if(posting == true) { + val postingStep by viewModel.postingStep.collectAsState() + AlertDialog( + onDismissRequest = {}, + text = { + Row { + CircularProgressIndicator() + Text( + when(postingStep) { + PostingSteps.PostContent -> getString(R.string.posting) + PostingSteps.UploadingPhotos -> getString(R.string.uploading_photos) + PostingSteps.Finished -> "" + PostingSteps.Unspecified -> "" + } + ) + } + }, + dismissButton = null, + title = { + Text(getString(R.string.posting)) + }, + confirmButton = {} + ) + } Column(modifier = Modifier.padding(it).verticalScroll(scrollState)) { OutlinedTextField( value = text, 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 787e751..5a97052 100644 --- a/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt +++ b/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt @@ -182,10 +182,7 @@ class ProfileMainFragment : Fragment() { val profilePictureUrl = profile?.profilePictureUrl if(profilePictureUrl != null) { PictureViewerActivity.startActivityWithImages(requireContext(), arrayOf( - Image( - profile.profileImageId ?: "", - profile.userId, - profile.uniqueUsername) + Image(profile.profileImageId ?: "") )) } } diff --git a/app/src/main/res/layout/post_layout.xml b/app/src/main/res/layout/post_layout.xml index 62fe2f7..3bbdaae 100644 --- a/app/src/main/res/layout/post_layout.xml +++ b/app/src/main/res/layout/post_layout.xml @@ -15,15 +15,20 @@ android:layout_margin="8dp" > - - + android:orientation="horizontal" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent"> + android:layout_height="wrap_content" + app:layout_constraintTop_toBottomOf="@id/post_header_container"/> + + + android:fontFamily="sans-serif" + app:layout_constraintTop_toBottomOf="@id/photos_view_pager"/> + android:gravity="start" + app:layout_constraintTop_toBottomOf="@id/post_content"> - + \ 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 d2ce917..a47280b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -218,6 +218,8 @@ older-newer newer-older Invalid value passed + Posting + Uploading photos Spam Explicit content