diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c149bde..84bf187 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,6 +39,7 @@ + () - val isUserItself: MutableLiveData = MutableLiveData() + val isUserItself: MutableLiveData = MutableLiveData(false) private val list: List get() { return liveList.value ?: listOf() diff --git a/app/src/main/java/com/isolaatti/images/image_list/ui/ImagesFragment.kt b/app/src/main/java/com/isolaatti/images/image_list/ui/ImagesFragment.kt index be57c1d..60bf214 100644 --- a/app/src/main/java/com/isolaatti/images/image_list/ui/ImagesFragment.kt +++ b/app/src/main/java/com/isolaatti/images/image_list/ui/ImagesFragment.kt @@ -191,6 +191,7 @@ class ImagesFragment : Fragment() { actionMode?.menu?.findItem(R.id.delete_item)?.isEnabled = it > 0 }, onDeleteMode = { + if(viewModel.isUserItself.value == false) return@ImagesAdapter adapter.deleteMode = it actionMode = requireActivity().startActionMode(contextBarCallback) }, diff --git a/app/src/main/java/com/isolaatti/profile/domain/entity/UserProfile.kt b/app/src/main/java/com/isolaatti/profile/domain/entity/UserProfile.kt index c04242a..f6ecc52 100644 --- a/app/src/main/java/com/isolaatti/profile/domain/entity/UserProfile.kt +++ b/app/src/main/java/com/isolaatti/profile/domain/entity/UserProfile.kt @@ -4,6 +4,7 @@ import com.isolaatti.audio.common.domain.Audio import com.isolaatti.common.Ownable import com.isolaatti.profile.data.remote.UserProfileDto import com.isolaatti.utils.UrlGen +import java.io.Serializable data class UserProfile( override val userId: Int, @@ -20,7 +21,7 @@ data class UserProfile( val descriptionText: String?, val descriptionAudioId: String?, val descriptionAudio: Audio? -) : Ownable { +) : Ownable, Serializable { val profileAvatarPictureUrl: String get() = UrlGen.userProfileImage(userId) val profilePictureUrl: String get() = UrlGen.userProfileImageFullQuality(userId) diff --git a/app/src/main/java/com/isolaatti/profile/presentation/EditProfileContract.kt b/app/src/main/java/com/isolaatti/profile/presentation/EditProfileContract.kt index 3bd5027..268c03e 100644 --- a/app/src/main/java/com/isolaatti/profile/presentation/EditProfileContract.kt +++ b/app/src/main/java/com/isolaatti/profile/presentation/EditProfileContract.kt @@ -1,4 +1,23 @@ package com.isolaatti.profile.presentation -class EditProfileContract { +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.os.Build +import androidx.activity.result.contract.ActivityResultContract +import com.isolaatti.profile.domain.entity.UserProfile +import com.isolaatti.profile.ui.EditProfileActivity + +class EditProfileContract : ActivityResultContract() { + override fun createIntent(context: Context, input: Void?): Intent { + return Intent(context, EditProfileActivity::class.java) + } + + override fun parseResult(resultCode: Int, intent: Intent?): UserProfile? { + if(intent == null || resultCode != Activity.RESULT_OK) return null + return if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) + intent.extras?.getSerializable(EditProfileActivity.EXTRA_OUT_USER_PROFILE, UserProfile::class.java) + else + intent.extras?.getSerializable(EditProfileActivity.EXTRA_OUT_USER_PROFILE) as UserProfile + } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/profile/ui/EditProfileActivity.kt b/app/src/main/java/com/isolaatti/profile/ui/EditProfileActivity.kt index c1ef67c..072b2c5 100644 --- a/app/src/main/java/com/isolaatti/profile/ui/EditProfileActivity.kt +++ b/app/src/main/java/com/isolaatti/profile/ui/EditProfileActivity.kt @@ -16,4 +16,8 @@ class EditProfileActivity : IsolaattiBaseActivity() { setContentView(binding.root) } + + companion object { + const val EXTRA_OUT_USER_PROFILE = "user_profile" + } } \ No newline at end of file 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 724b686..58c4fd4 100644 --- a/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt +++ b/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt @@ -18,6 +18,7 @@ import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import coil.load +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.isolaatti.BuildConfig import com.isolaatti.R import com.isolaatti.audio.audios_list.ui.AudiosFragment @@ -35,6 +36,7 @@ import com.isolaatti.databinding.FragmentDiscussionsBinding import com.isolaatti.followers.domain.FollowingState import com.isolaatti.images.image_chooser.ui.ImageChooserContract import com.isolaatti.images.image_list.ui.ImagesFragment +import com.isolaatti.images.picture_viewer.ui.PictureViewerActivity import com.isolaatti.posting.comments.ui.BottomSheetPostComments import com.isolaatti.posting.posts.domain.entity.Post import com.isolaatti.posting.posts.presentation.CreatePostContract @@ -44,6 +46,7 @@ import com.isolaatti.posting.posts.presentation.PostsRecyclerViewAdapter import com.isolaatti.posting.posts.presentation.UpdateEvent import com.isolaatti.posting.posts.viewer.ui.PostViewerActivity import com.isolaatti.profile.domain.entity.UserProfile +import com.isolaatti.profile.presentation.EditProfileContract import com.isolaatti.profile.presentation.ProfileViewModel import com.isolaatti.utils.UrlGen import dagger.hilt.android.AndroidEntryPoint @@ -96,6 +99,10 @@ class ProfileMainFragment : Fragment() { } } + private val editProfile = registerForActivityResult(EditProfileContract()) { + + } + private val audioPlayerConnectorListener = object: AudioPlayerConnector.Listener { override fun onPlaying(isPlaying: Boolean, audio: Audio) { viewBinding.playButton.icon = AppCompatResources.getDrawable(requireContext(), if(isPlaying) R.drawable.baseline_pause_circle_24 else R.drawable.baseline_play_circle_24) @@ -190,11 +197,13 @@ class ProfileMainFragment : Fragment() { Options.Option.OPTION_PROFILE_PHOTO_CHANGE_PHOTO -> { chooseImageLauncher.launch(ImageChooserContract.Requester.UserPost) } - Options.Option.OPTION_PROFILE_PHOTO_REMOVE_PHOTO -> {} + Options.Option.OPTION_PROFILE_PHOTO_REMOVE_PHOTO -> { + showRemoveProfileImageDialog() + } Options.Option.OPTION_PROFILE_PHOTO_VIEW_PHOTO -> { val profilePictureUrl = profile?.profilePictureUrl if(profilePictureUrl != null) { - //PictureViewerActivity.startActivityWithUrls(requireContext(), arrayOf(profilePictureUrl)) + // TODO show image } } } @@ -228,6 +237,17 @@ class ProfileMainFragment : Fragment() { } } + private fun showRemoveProfileImageDialog() { + MaterialAlertDialogBuilder(requireContext()) + .setMessage(R.string.remove_image_message_confirmation) + .setTitle(R.string.remove_photo) + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.yes_continue) { _, _ -> + // remove image here + } + .show() + } + private lateinit var postListingRecyclerViewAdapterWiring: PostListingRecyclerViewAdapterWiring @@ -255,6 +275,25 @@ class ProfileMainFragment : Fragment() { requireActivity().finish() } + viewBinding.topAppBar.setOnMenuItemClickListener { + when(it.itemId) { + R.id.edit_profile -> { + editProfile.launch(null) + true + } + R.id.user_link_menu_item -> { + true + } + R.id.report_profile_menu_item -> { + true + } + R.id.block_profile_menu_item -> { + true + } + else -> false + } + } + viewBinding.audiosButton.setOnClickListener { findNavController().navigate(ProfileMainFragmentDirections.actionDiscussionsFragmentToAudiosFragment(AudiosFragment.SOURCE_PROFILE, userId.toString())) } @@ -340,8 +379,13 @@ class ProfileMainFragment : Fragment() { private fun setupUiForUserType(isOwnProfile: Boolean) { if(isOwnProfile) { viewBinding.followButton.visibility = View.GONE + viewBinding.topAppBar.menu?.run { + removeItem(R.id.block_profile_menu_item) + removeItem(R.id.report_profile_menu_item) + } } else { viewBinding.createPostButton.visibility = View.GONE + viewBinding.topAppBar.menu.removeItem(R.id.edit_profile) } } diff --git a/app/src/main/res/drawable/baseline_qr_code_24.xml b/app/src/main/res/drawable/baseline_qr_code_24.xml new file mode 100644 index 0000000..5461a42 --- /dev/null +++ b/app/src/main/res/drawable/baseline_qr_code_24.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/profile_menu.xml b/app/src/main/res/menu/profile_menu.xml index 3bf41ac..099fdef 100644 --- a/app/src/main/res/menu/profile_menu.xml +++ b/app/src/main/res/menu/profile_menu.xml @@ -2,10 +2,16 @@ + + android:icon="@drawable/baseline_qr_code_24" + app:showAsAction="ifRoom" /> Comments Claps: %d Comments: %d - View photo - Change profile photo - Profile photo - Remove photo + View image + Change profile image + Profile image + Remove image The first step to create an account is to provide your email address. We will send a code that you will need to enter in the next step. Send Already have a code? @@ -134,4 +134,6 @@ Insert url Enlarge text box Create a new discussion + Edit profile + Remove image? This will not delete your image, but only unset it as profile image \ No newline at end of file