From a07a323f1d8ac3b24d7b929b96c539d054797f5a Mon Sep 17 00:00:00 2001 From: Erik Everardo Date: Mon, 20 Nov 2023 22:53:14 -0600 Subject: [PATCH] WIP agregar foto --- .idea/deploymentTargetDropDown.xml | 17 --- app/src/main/AndroidManifest.xml | 8 ++ .../main/java/com/isolaatti/MyFileProvider.kt | 7 ++ .../java/com/isolaatti/home/FeedFragment.kt | 2 +- .../main/java/com/isolaatti/images/Module.kt | 7 ++ .../images/image_list/data/remote/ImageDto.kt | 1 + .../image_list/data/remote/ImagesApi.kt | 4 +- .../image_list/data/remote/ImagesDto.kt | 5 + .../data/repository/ImagesRepositoryImpl.kt | 2 +- .../images/image_list/domain/entity/Image.kt | 8 +- .../presentation/ImageListViewModel.kt | 17 +++ .../image_list/presentation/ImagesAdapter.kt | 42 ++++++- .../images/image_list/ui/ImagesFragment.kt | 109 +++++++++++++++++- .../PictureViewerViewPagerAdapter.kt | 3 +- .../ui/PictureViewerActivity.kt | 13 ++- .../ui/PictureViewerImageWrapperFragment.kt | 15 +-- .../ui/PictureViewerMainFragment.kt | 30 ++++- .../profile/ui/ProfileMainFragment.kt | 13 ++- .../main/res/drawable/baseline_delete_24.xml | 2 +- .../res/layout/activity_picture_viewer.xml | 1 + app/src/main/res/layout/fragment_images.xml | 9 ++ .../layout/fragment_main_picture_viewer.xml | 26 +++++ app/src/main/res/layout/image_item.xml | 10 ++ app/src/main/res/menu/add_picture_menu.xml | 14 +++ app/src/main/res/menu/images_menu.xml | 12 ++ .../res/navigation/profile_navigation.xml | 9 +- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/provider_paths.xml | 6 + 29 files changed, 347 insertions(+), 48 deletions(-) delete mode 100644 .idea/deploymentTargetDropDown.xml create mode 100644 app/src/main/java/com/isolaatti/MyFileProvider.kt create mode 100644 app/src/main/java/com/isolaatti/images/image_list/data/remote/ImagesDto.kt create mode 100644 app/src/main/res/layout/image_item.xml create mode 100644 app/src/main/res/menu/add_picture_menu.xml create mode 100644 app/src/main/res/menu/images_menu.xml create mode 100644 app/src/main/res/xml/provider_paths.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 60feae8..0000000 --- a/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a86231d..6bfce58 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -36,6 +36,14 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/MyFileProvider.kt b/app/src/main/java/com/isolaatti/MyFileProvider.kt new file mode 100644 index 0000000..91bfc0c --- /dev/null +++ b/app/src/main/java/com/isolaatti/MyFileProvider.kt @@ -0,0 +1,7 @@ +package com.isolaatti + +import androidx.core.content.FileProvider + +class MyFileProvider : FileProvider() { + +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/home/FeedFragment.kt b/app/src/main/java/com/isolaatti/home/FeedFragment.kt index fef7654..c06bea4 100644 --- a/app/src/main/java/com/isolaatti/home/FeedFragment.kt +++ b/app/src/main/java/com/isolaatti/home/FeedFragment.kt @@ -197,7 +197,7 @@ class FeedFragment : Fragment(), OnUserInteractedWithPostCallback { image?.load(UrlGen.userProfileImage(it.userId), imageLoader) image?.setOnClickListener {_ -> - PictureViewerActivity.startActivityWithUrls(requireContext(), arrayOf(UrlGen.userProfileImageFullQuality(it.userId))) + //PictureViewerActivity.startActivityWithImages(requireContext(), arrayOf(UrlGen.userProfileImageFullQuality(it.userId))) } textViewName?.text = it.name diff --git a/app/src/main/java/com/isolaatti/images/Module.kt b/app/src/main/java/com/isolaatti/images/Module.kt index 62fbc6c..04c6759 100644 --- a/app/src/main/java/com/isolaatti/images/Module.kt +++ b/app/src/main/java/com/isolaatti/images/Module.kt @@ -2,6 +2,8 @@ package com.isolaatti.images import com.isolaatti.connectivity.RetrofitClient import com.isolaatti.images.image_list.data.remote.ImagesApi +import com.isolaatti.images.image_list.data.repository.ImagesRepositoryImpl +import com.isolaatti.images.image_list.domain.repository.ImagesRepository import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -14,4 +16,9 @@ class Module { fun provideImagesApi(retrofitClient: RetrofitClient): ImagesApi { return retrofitClient.client.create(ImagesApi::class.java) } + + @Provides + fun provideImagesRepository(imagesApi: ImagesApi): ImagesRepository { + return ImagesRepositoryImpl(imagesApi) + } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/image_list/data/remote/ImageDto.kt b/app/src/main/java/com/isolaatti/images/image_list/data/remote/ImageDto.kt index 08f3420..020082d 100644 --- a/app/src/main/java/com/isolaatti/images/image_list/data/remote/ImageDto.kt +++ b/app/src/main/java/com/isolaatti/images/image_list/data/remote/ImageDto.kt @@ -5,5 +5,6 @@ data class ImageDto( val userId: Int, val name: String, val squadId: String?, + val username: String, val idOnFirebase: String ) \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/image_list/data/remote/ImagesApi.kt b/app/src/main/java/com/isolaatti/images/image_list/data/remote/ImagesApi.kt index b385415..e3d0430 100644 --- a/app/src/main/java/com/isolaatti/images/image_list/data/remote/ImagesApi.kt +++ b/app/src/main/java/com/isolaatti/images/image_list/data/remote/ImagesApi.kt @@ -13,9 +13,9 @@ import retrofit2.http.Path import retrofit2.http.Query interface ImagesApi { - @POST("images/of_user/{userId}") + @GET("images/of_user/{userId}") fun getImagesOfUser(@Path("userId") userId: Int, - @Query("lastId") lastId: String?): Call> + @Query("lastId") lastId: String?): Call @POST("images/create") @Multipart diff --git a/app/src/main/java/com/isolaatti/images/image_list/data/remote/ImagesDto.kt b/app/src/main/java/com/isolaatti/images/image_list/data/remote/ImagesDto.kt new file mode 100644 index 0000000..dd77315 --- /dev/null +++ b/app/src/main/java/com/isolaatti/images/image_list/data/remote/ImagesDto.kt @@ -0,0 +1,5 @@ +package com.isolaatti.images.image_list.data.remote + +data class ImagesDto( + val data: List +) \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/image_list/data/repository/ImagesRepositoryImpl.kt b/app/src/main/java/com/isolaatti/images/image_list/data/repository/ImagesRepositoryImpl.kt index 945cf6d..a53228c 100644 --- a/app/src/main/java/com/isolaatti/images/image_list/data/repository/ImagesRepositoryImpl.kt +++ b/app/src/main/java/com/isolaatti/images/image_list/data/repository/ImagesRepositoryImpl.kt @@ -15,7 +15,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?.map { Image.fromDto(it) } + val images = imagesDto?.data?.map { Image.fromDto(it) } emit(Resource.Success(images)) diff --git a/app/src/main/java/com/isolaatti/images/image_list/domain/entity/Image.kt b/app/src/main/java/com/isolaatti/images/image_list/domain/entity/Image.kt index 8b88dc9..748701e 100644 --- a/app/src/main/java/com/isolaatti/images/image_list/domain/entity/Image.kt +++ b/app/src/main/java/com/isolaatti/images/image_list/domain/entity/Image.kt @@ -2,17 +2,19 @@ package com.isolaatti.images.image_list.domain.entity import com.isolaatti.images.image_list.data.remote.ImageDto import com.isolaatti.utils.UrlGen +import java.io.Serializable data class Image( val id: String, val userId: Int, - val name: String -) { + val name: String, + val username: String +): Serializable { 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) companion object { - fun fromDto(imageDto: ImageDto) = Image(imageDto.id, imageDto.userId, imageDto.name) + fun fromDto(imageDto: ImageDto) = Image(imageDto.id, imageDto.userId, imageDto.name, imageDto.username) } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/image_list/presentation/ImageListViewModel.kt b/app/src/main/java/com/isolaatti/images/image_list/presentation/ImageListViewModel.kt index e6f204e..921ae6c 100644 --- a/app/src/main/java/com/isolaatti/images/image_list/presentation/ImageListViewModel.kt +++ b/app/src/main/java/com/isolaatti/images/image_list/presentation/ImageListViewModel.kt @@ -1,12 +1,29 @@ package com.isolaatti.images.image_list.presentation +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.isolaatti.images.image_list.domain.entity.Image import com.isolaatti.images.image_list.domain.repository.ImagesRepository +import com.isolaatti.utils.Resource import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class ImageListViewModel @Inject constructor(private val imagesRepository: ImagesRepository) : ViewModel() { + val list: MutableLiveData>> = MutableLiveData() + fun loadNext(userId: Int) { + viewModelScope.launch { + imagesRepository.getImagesOfUser(userId, null).onEach { + list.postValue(it) + }.flowOn(Dispatchers.IO).launchIn(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/image_list/presentation/ImagesAdapter.kt b/app/src/main/java/com/isolaatti/images/image_list/presentation/ImagesAdapter.kt index de712a7..deed3d4 100644 --- a/app/src/main/java/com/isolaatti/images/image_list/presentation/ImagesAdapter.kt +++ b/app/src/main/java/com/isolaatti/images/image_list/presentation/ImagesAdapter.kt @@ -1,4 +1,44 @@ package com.isolaatti.images.image_list.presentation -class ImagesAdapter { +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.Adapter +import coil.load +import com.isolaatti.common.CoilImageLoader.imageLoader +import com.isolaatti.databinding.ImageItemBinding +import com.isolaatti.images.image_list.domain.entity.Image + +class ImagesAdapter(private val imageOnClick: ((images: List, position: Int) -> Unit), private val itemWidth: Int) : Adapter(){ + + private var data: List = listOf() + + inner class ImageViewHolder(val imageItemBinding: ImageItemBinding) : RecyclerView.ViewHolder(imageItemBinding.root) + + fun setData(data: List) { + this.data = data + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder { + val inflater = LayoutInflater.from(parent.context) + val binding = ImageItemBinding.inflate(inflater) + + binding.root.layoutParams = LinearLayout.LayoutParams(itemWidth, itemWidth) + return ImageViewHolder(binding) + } + + override fun getItemCount(): Int { + return data.size + } + + override fun onBindViewHolder(holder: ImageViewHolder, position: Int) { + val image = data[position] + + holder.imageItemBinding.image.load(image.smallImageUrl, imageLoader) + holder.imageItemBinding.root.setOnClickListener { + imageOnClick(data, position) + } + } } \ No newline at end of file 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 931fb9c..eaf1bac 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 @@ -1,17 +1,57 @@ package com.isolaatti.images.image_list.ui +import android.content.res.Resources +import android.net.Uri import android.os.Bundle 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.widget.PopupMenu +import androidx.core.content.FileProvider import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import androidx.recyclerview.widget.GridLayoutManager +import com.isolaatti.MyApplication +import com.isolaatti.R import com.isolaatti.databinding.FragmentImagesBinding +import com.isolaatti.images.image_list.domain.entity.Image +import com.isolaatti.images.image_list.presentation.ImageListViewModel +import com.isolaatti.images.image_list.presentation.ImagesAdapter +import com.isolaatti.images.picture_viewer.ui.PictureViewerActivity +import com.isolaatti.utils.Resource import dagger.hilt.android.AndroidEntryPoint -import dagger.hilt.android.lifecycle.HiltViewModel +import java.io.File +import java.util.Calendar @AndroidEntryPoint class ImagesFragment : Fragment() { lateinit var viewBinding: FragmentImagesBinding + lateinit var adapter: ImagesAdapter + private val viewModel: ImageListViewModel by viewModels() + private val arguments: ImagesFragmentArgs by navArgs() + + private var cameraPhotoUri: Uri? = null + + private val imageOnClick: (images: List, position: Int) -> Unit = { images, position -> + PictureViewerActivity.startActivityWithImages(requireContext(), images.toTypedArray(), position) + } + + private val choosePictureLauncher = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { + // use uri + } + + private val takePhotoLauncher = registerForActivityResult(ActivityResultContracts.TakePicture()) { + // use cameraPhotoUri if success + } + + private fun makePhotoUri(): Uri { + val cacheFile = File(requireContext().filesDir, "temp_picture_${Calendar.getInstance().timeInMillis}") + return FileProvider.getUriForFile(requireContext(), "${MyApplication.myApp.packageName}.provider", cacheFile) + } override fun onCreateView( inflater: LayoutInflater, @@ -25,5 +65,72 @@ class ImagesFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + + when(arguments.source) { + SOURCE_SQUAD -> {} + SOURCE_PROFILE -> { + viewModel.loadNext(arguments.sourceId.toInt()) + } + } + + setupAdapter() + setupObservers() + setupListeners() + + viewBinding.topAppBar.inflateMenu(R.menu.images_menu) + } + + private fun setupListeners() { + viewBinding.topAppBar.setNavigationOnClickListener { + findNavController().popBackStack() + } + viewBinding.newPictureButton.setOnClickListener { + val popup = PopupMenu(requireContext(), it) + popup.menuInflater.inflate(R.menu.add_picture_menu, popup.menu) + + popup.setOnMenuItemClickListener { + when(it.itemId) { + R.id.take_a_photo_menu_item -> { + cameraPhotoUri = makePhotoUri() + takePhotoLauncher.launch(cameraPhotoUri) + true + } + R.id.upload_a_picture_item -> { + choosePictureLauncher.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + true + } + else -> false + } + } + + popup.show() + } + } + + private fun setupAdapter() { + adapter = ImagesAdapter(imageOnClick, Resources.getSystem().displayMetrics.widthPixels/3) + viewBinding.recyclerView.layoutManager = + GridLayoutManager(requireContext(), 3, GridLayoutManager.VERTICAL, false) + viewBinding.recyclerView.adapter = adapter + } + + private fun setupObservers() { + + viewModel.list.observe(viewLifecycleOwner) { resource -> + when(resource) { + is Resource.Error -> {} + is Resource.Loading -> {} + is Resource.Success -> { + resource.data?.let { + adapter.setData(it) + } + } + } + } + } + + companion object { + const val SOURCE_PROFILE = "source_profile" + const val SOURCE_SQUAD = "source_squads" } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/picture_viewer/presentation/PictureViewerViewPagerAdapter.kt b/app/src/main/java/com/isolaatti/images/picture_viewer/presentation/PictureViewerViewPagerAdapter.kt index 14d4d78..4ef8d5e 100644 --- a/app/src/main/java/com/isolaatti/images/picture_viewer/presentation/PictureViewerViewPagerAdapter.kt +++ b/app/src/main/java/com/isolaatti/images/picture_viewer/presentation/PictureViewerViewPagerAdapter.kt @@ -2,9 +2,10 @@ package com.isolaatti.images.picture_viewer.presentation import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter +import com.isolaatti.images.image_list.domain.entity.Image import com.isolaatti.images.picture_viewer.ui.PictureViewerImageWrapperFragment -class PictureViewerViewPagerAdapter(fragment: Fragment, private val images: Array) : FragmentStateAdapter(fragment) { +class PictureViewerViewPagerAdapter(fragment: Fragment, private val images: Array) : FragmentStateAdapter(fragment) { override fun getItemCount(): Int { return images.size } diff --git a/app/src/main/java/com/isolaatti/images/picture_viewer/ui/PictureViewerActivity.kt b/app/src/main/java/com/isolaatti/images/picture_viewer/ui/PictureViewerActivity.kt index 832468b..dcc05c1 100644 --- a/app/src/main/java/com/isolaatti/images/picture_viewer/ui/PictureViewerActivity.kt +++ b/app/src/main/java/com/isolaatti/images/picture_viewer/ui/PictureViewerActivity.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.isolaatti.databinding.ActivityPictureViewerBinding +import com.isolaatti.images.image_list.domain.entity.Image import com.isolaatti.images.picture_viewer.presentation.PictureViewerViewPagerAdapter class PictureViewerActivity : AppCompatActivity() { @@ -21,12 +22,16 @@ class PictureViewerActivity : AppCompatActivity() { companion object { - const val EXTRA_URLS = "urls" - const val EXTRA_PROFILE_ID = "profileId" + const val EXTRA_IMAGES = "images" + const val EXTRA_IMAGE_POSITiON = "position" - fun startActivityWithUrls(context: Context, urls: Array) { + fun startActivityWithImages(context: Context, images: Array, position: Int = 0) { + if(images.isEmpty()) { + return + } val intent = Intent(context, PictureViewerActivity::class.java) - intent.putExtra(EXTRA_URLS, urls) + intent.putExtra(EXTRA_IMAGES, images) + intent.putExtra(EXTRA_IMAGE_POSITiON, position) context.startActivity(intent) } } 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 abd311e..b0d31d5 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 @@ -8,13 +8,14 @@ import androidx.fragment.app.Fragment import coil.load import com.isolaatti.common.CoilImageLoader.imageLoader import com.isolaatti.databinding.FragmentTouchImageViewWrapperBinding +import com.isolaatti.images.image_list.domain.entity.Image import com.ortiz.touchview.OnTouchImageViewListener class PictureViewerImageWrapperFragment : Fragment() { private lateinit var binding: FragmentTouchImageViewWrapperBinding - private var url: String? = null + private var image: Image? = null override fun onCreateView( inflater: LayoutInflater, @@ -23,7 +24,7 @@ class PictureViewerImageWrapperFragment : Fragment() { ): View { binding = FragmentTouchImageViewWrapperBinding.inflate(inflater) - url = arguments?.getString(ARGUMENT_URL) + image = arguments?.getSerializable(ARGUMENT_IMAGE) as Image return binding.root } @@ -42,17 +43,17 @@ class PictureViewerImageWrapperFragment : Fragment() { - url?.let { - binding.touchImageView.load(it, imageLoader) + image?.let { + binding.touchImageView.load(it.imageUrl, imageLoader) } } companion object { - const val ARGUMENT_URL = "url" - fun getInstance(url: String): PictureViewerImageWrapperFragment { + const val ARGUMENT_IMAGE = "image" + fun getInstance(image: Image): PictureViewerImageWrapperFragment { val fragment = PictureViewerImageWrapperFragment() fragment.arguments = Bundle().apply { - putString(ARGUMENT_URL, url) + putSerializable(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 6a952fe..26024cd 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 @@ -5,12 +5,25 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.viewpager2.widget.ViewPager2 import com.isolaatti.databinding.FragmentMainPictureViewerBinding +import com.isolaatti.images.image_list.domain.entity.Image import com.isolaatti.images.picture_viewer.presentation.PictureViewerViewPagerAdapter class PictureViewerMainFragment : Fragment() { private lateinit var binding: FragmentMainPictureViewerBinding + + lateinit var images: Array + + private val onPageChangeCallback = object: ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + super.onPageSelected(position) + binding.imageAuthor.text = images[position].username + binding.imageDescription.text = images[position].name + } + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -24,12 +37,19 @@ class PictureViewerMainFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val url = requireActivity().intent.extras?.getStringArray(PictureViewerActivity.EXTRA_URLS) + images = requireActivity().intent.extras?.getSerializable(PictureViewerActivity.EXTRA_IMAGES) as Array + val position = requireActivity().intent.extras?.getInt(PictureViewerActivity.EXTRA_IMAGE_POSITiON) ?: 0 + val adapter = PictureViewerViewPagerAdapter(this, images) + binding.viewpager.adapter = adapter + binding.viewpager.setCurrentItem(position, false) + binding.viewpager.registerOnPageChangeCallback(onPageChangeCallback) + binding.imageDescription.text = images[position].name + binding.imageAuthor.text = images[position].username + } - url?.let { - val adapter = PictureViewerViewPagerAdapter(this, it) - binding.viewpager.adapter = adapter - } + override fun onDestroyView() { + super.onDestroyView() + binding.viewpager.unregisterOnPageChangeCallback(onPageChangeCallback) } fun enableViewPagerUserInput(enabled: Boolean) { 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 6a47125..96edd49 100644 --- a/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt +++ b/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt @@ -31,6 +31,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.presentation.BottomSheetPostOptionsViewModel import com.isolaatti.common.options_bottom_sheet.ui.BottomSheetPostOptionsFragment +import com.isolaatti.images.image_list.ui.ImagesFragment import com.isolaatti.images.picture_viewer.ui.PictureViewerActivity import com.isolaatti.posting.posts.domain.entity.Post import com.isolaatti.posting.posts.presentation.CreatePostContract @@ -149,7 +150,7 @@ class ProfileMainFragment : Fragment() { Options.Option.OPTION_PROFILE_PHOTO_VIEW_PHOTO -> { val profilePictureUrl = profile?.profilePictureUrl if(profilePictureUrl != null) { - PictureViewerActivity.startActivityWithUrls(requireContext(), arrayOf(profilePictureUrl)) + //PictureViewerActivity.startActivityWithUrls(requireContext(), arrayOf(profilePictureUrl)) } } } @@ -217,8 +218,14 @@ class ProfileMainFragment : Fragment() { true } R.id.images_menu_item -> { - findNavController().navigate(ProfileMainFragmentDirections.actionDiscussionsFragmentToImagesFragment()) - true + if(userId != null) { + findNavController().navigate( + ProfileMainFragmentDirections.actionDiscussionsFragmentToImagesFragment(ImagesFragment.SOURCE_PROFILE, userId.toString()) + ) + true + } else { + false + } } else -> { false } } diff --git a/app/src/main/res/drawable/baseline_delete_24.xml b/app/src/main/res/drawable/baseline_delete_24.xml index de011dd..fd1fea8 100644 --- a/app/src/main/res/drawable/baseline_delete_24.xml +++ b/app/src/main/res/drawable/baseline_delete_24.xml @@ -1,4 +1,4 @@ - diff --git a/app/src/main/res/layout/activity_picture_viewer.xml b/app/src/main/res/layout/activity_picture_viewer.xml index 35d12f5..4337600 100644 --- a/app/src/main/res/layout/activity_picture_viewer.xml +++ b/app/src/main/res/layout/activity_picture_viewer.xml @@ -2,6 +2,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_main_picture_viewer.xml b/app/src/main/res/layout/fragment_main_picture_viewer.xml index af3c6c2..7eef447 100644 --- a/app/src/main/res/layout/fragment_main_picture_viewer.xml +++ b/app/src/main/res/layout/fragment_main_picture_viewer.xml @@ -1,5 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/image_item.xml b/app/src/main/res/layout/image_item.xml new file mode 100644 index 0000000..7df31c7 --- /dev/null +++ b/app/src/main/res/layout/image_item.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/add_picture_menu.xml b/app/src/main/res/menu/add_picture_menu.xml new file mode 100644 index 0000000..814c597 --- /dev/null +++ b/app/src/main/res/menu/add_picture_menu.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/images_menu.xml b/app/src/main/res/menu/images_menu.xml new file mode 100644 index 0000000..a875604 --- /dev/null +++ b/app/src/main/res/menu/images_menu.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/profile_navigation.xml b/app/src/main/res/navigation/profile_navigation.xml index fdf9b06..bbe70d7 100644 --- a/app/src/main/res/navigation/profile_navigation.xml +++ b/app/src/main/res/navigation/profile_navigation.xml @@ -36,7 +36,14 @@ + android:label="ImagesFragment" > + + + #000000 #BA0606 #000000 + #9A000000 \ 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 2073788..537be7a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -115,4 +115,6 @@ Please provide a name. This does not have to be unique and can be your real name or not. Validation error Email is in use already + Upload a picture + Take a photo \ No newline at end of file diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml new file mode 100644 index 0000000..1e00e77 --- /dev/null +++ b/app/src/main/res/xml/provider_paths.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file