* correccion de errores al iniciar sesion
* cambio a Coil
This commit is contained in:
erik 2023-11-19 19:24:45 -06:00
parent e1235896bb
commit 401c7aadf1
20 changed files with 94 additions and 76 deletions

View File

@ -7,11 +7,11 @@
<deviceKey> <deviceKey>
<Key> <Key>
<type value="VIRTUAL_DEVICE_PATH" /> <type value="VIRTUAL_DEVICE_PATH" />
<value value="C:\Users\erike\.android\avd\Pixel_5_API_33.avd" /> <value value="$USER_HOME$/.android/avd/Pixel_3a_API_34_extension_level_7_x86_64.avd" />
</Key> </Key>
</deviceKey> </deviceKey>
</Target> </Target>
</targetSelectedWithDropDown> </targetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2023-08-21T02:45:21.143691700Z" /> <timeTargetWasSelectedWithDropDown value="2023-11-19T23:31:08.478703551Z" />
</component> </component>
</project> </project>

View File

@ -11,7 +11,7 @@ plugins {
android { android {
namespace 'com.isolaatti' namespace 'com.isolaatti'
compileSdk 33 compileSdk 34
viewBinding { viewBinding {
enabled = true enabled = true
} }
@ -90,10 +90,14 @@ dependencies {
// Customtabs // Customtabs
implementation 'androidx.browser:browser:1.5.0' implementation 'androidx.browser:browser:1.5.0'
implementation 'io.coil-kt:coil:2.5.0'
implementation 'io.coil-kt:coil-svg:2.5.0'
implementation "io.noties.markwon:core:$markwon_version" implementation "io.noties.markwon:core:$markwon_version"
implementation "io.noties.markwon:editor:$markwon_version" implementation "io.noties.markwon:editor:$markwon_version"
implementation "io.noties.markwon:image-picasso:$markwon_version"
implementation "io.noties.markwon:linkify:$markwon_version" implementation "io.noties.markwon:linkify:$markwon_version"
implementation "io.noties.markwon:image-coil:$markwon_version"
@ -112,4 +116,5 @@ dependencies {
implementation "androidx.preference:preference-ktx:1.2.1" implementation "androidx.preference:preference-ktx:1.2.1"
implementation 'com.github.MikeOrtiz:TouchImageView:3.5' implementation 'com.github.MikeOrtiz:TouchImageView:3.5'
} }

View File

@ -36,7 +36,6 @@ class MainActivity : ComponentActivity() {
if(currentToken == null) { if(currentToken == null) {
val loginIntent = Intent(this@MainActivity, LogInActivity::class.java) val loginIntent = Intent(this@MainActivity, LogInActivity::class.java)
loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
signInActivityResult.launch(loginIntent) signInActivityResult.launch(loginIntent)
} else { } else {
val homeActivityIntent = Intent(this@MainActivity, HomeActivity::class.java) val homeActivityIntent = Intent(this@MainActivity, HomeActivity::class.java)

View File

@ -3,14 +3,10 @@ package com.isolaatti
import com.isolaatti.auth.domain.AuthRepository import com.isolaatti.auth.domain.AuthRepository
import com.isolaatti.connectivity.AuthenticationInterceptor import com.isolaatti.connectivity.AuthenticationInterceptor
import com.isolaatti.connectivity.RetrofitClient import com.isolaatti.connectivity.RetrofitClient
import com.squareup.picasso.Picasso
import com.squareup.picasso.RequestCreator
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import io.noties.markwon.image.AsyncDrawable
import io.noties.markwon.image.picasso.PicassoImagesPlugin
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@ -8,11 +8,16 @@ import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp @HiltAndroidApp
class MyApplication : Application() { class MyApplication : Application() {
companion object {
lateinit var myApp: MyApplication
}
private val activityLifecycleCallbacks = ActivityLifecycleCallbacks() private val activityLifecycleCallbacks = ActivityLifecycleCallbacks()
lateinit var connectivityCallbackImpl: ConnectivityCallbackImpl lateinit var connectivityCallbackImpl: ConnectivityCallbackImpl
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
myApp = this
registerActivityLifecycleCallbacks(activityLifecycleCallbacks) registerActivityLifecycleCallbacks(activityLifecycleCallbacks)
connectivityCallbackImpl = ConnectivityCallbackImpl() connectivityCallbackImpl = ConnectivityCallbackImpl()
getSystemService(ConnectivityManager::class.java).registerDefaultNetworkCallback(connectivityCallbackImpl) getSystemService(ConnectivityManager::class.java).registerDefaultNetworkCallback(connectivityCallbackImpl)

View File

@ -0,0 +1,16 @@
package com.isolaatti.common
import android.content.Context
import coil.ImageLoader
import coil.decode.SvgDecoder
import com.isolaatti.MyApplication
object CoilImageLoader {
val imageLoader by lazy {
ImageLoader
.Builder(MyApplication.myApp)
.components {
add(SvgDecoder.Factory())
}.build()
}
}

View File

@ -6,11 +6,12 @@ import androidx.core.content.res.ResourcesCompat
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView.ViewHolder import androidx.recyclerview.widget.RecyclerView.ViewHolder
import coil.load
import com.isolaatti.R import com.isolaatti.R
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.databinding.ItemUserListBinding import com.isolaatti.databinding.ItemUserListBinding
import com.isolaatti.profile.domain.entity.ProfileListItem import com.isolaatti.profile.domain.entity.ProfileListItem
import com.isolaatti.utils.UrlGen import com.isolaatti.utils.UrlGen
import com.squareup.picasso.Picasso
class UserListRecyclerViewAdapter(private val callback: UserItemCallback) : ListAdapter<ProfileListItem, UserListRecyclerViewAdapter.UserListViewHolder>(diffCallback) { class UserListRecyclerViewAdapter(private val callback: UserItemCallback) : ListAdapter<ProfileListItem, UserListRecyclerViewAdapter.UserListViewHolder>(diffCallback) {
@ -28,7 +29,7 @@ class UserListRecyclerViewAdapter(private val callback: UserItemCallback) : List
callback.itemClick(user.id) callback.itemClick(user.id)
} }
holder.item.name.text = user.name holder.item.name.text = user.name
Picasso.get().load(UrlGen.userProfileImage(user.id)).into(holder.item.image) holder.item.image.load(UrlGen.userProfileImage(user.id), imageLoader)
if(user.following == true) { if(user.following == true) {
holder.item.followButton.text = context.getText(R.string.unfollow) holder.item.followButton.text = context.getText(R.string.unfollow)
holder.item.followButton.setTextColor(ResourcesCompat.getColor(context.resources, R.color.danger, null)) holder.item.followButton.setTextColor(ResourcesCompat.getColor(context.resources, R.color.danger, null))

View File

@ -6,8 +6,8 @@ import okhttp3.Response
class AuthenticationInterceptor(private val authRepository: dagger.Lazy<AuthRepository>) : Interceptor { class AuthenticationInterceptor(private val authRepository: dagger.Lazy<AuthRepository>) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response { override fun intercept(chain: Interceptor.Chain): Response {
val url = chain.request().url() val url = chain.request().url
val path = url.url().path val path = url.toUrl().path
if(RetrofitClient.excludedUrlsFromAuthentication.contains(path)){ if(RetrofitClient.excludedUrlsFromAuthentication.contains(path)){
return chain.proceed(chain.request()) return chain.proceed(chain.request())
} }

View File

@ -16,9 +16,11 @@ import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import coil.load
import com.isolaatti.BuildConfig import com.isolaatti.BuildConfig
import com.isolaatti.R import com.isolaatti.R
import com.isolaatti.about.AboutActivity import com.isolaatti.about.AboutActivity
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.common.Dialogs import com.isolaatti.common.Dialogs
import com.isolaatti.common.ErrorMessageViewModel import com.isolaatti.common.ErrorMessageViewModel
import com.isolaatti.databinding.FragmentFeedBinding import com.isolaatti.databinding.FragmentFeedBinding
@ -39,13 +41,12 @@ import com.isolaatti.posting.posts.presentation.EditPostContract
import com.isolaatti.posting.posts.presentation.PostsRecyclerViewAdapter import com.isolaatti.posting.posts.presentation.PostsRecyclerViewAdapter
import com.isolaatti.profile.ui.ProfileActivity import com.isolaatti.profile.ui.ProfileActivity
import com.isolaatti.settings.ui.SettingsActivity import com.isolaatti.settings.ui.SettingsActivity
import com.isolaatti.utils.PicassoImagesPluginDef
import com.isolaatti.utils.UrlGen import com.isolaatti.utils.UrlGen
import com.squareup.picasso.Picasso
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import io.noties.markwon.AbstractMarkwonPlugin import io.noties.markwon.AbstractMarkwonPlugin
import io.noties.markwon.Markwon import io.noties.markwon.Markwon
import io.noties.markwon.MarkwonConfiguration import io.noties.markwon.MarkwonConfiguration
import io.noties.markwon.image.coil.CoilImagesPlugin
import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute
import io.noties.markwon.linkify.LinkifyPlugin import io.noties.markwon.linkify.LinkifyPlugin
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -162,7 +163,7 @@ class FeedFragment : Fragment(), OnUserInteractedWithPostCallback {
.create(BuildConfig.backend)) .create(BuildConfig.backend))
} }
}) })
.usePlugin(PicassoImagesPluginDef.picassoImagePlugin) .usePlugin(CoilImagesPlugin.create(requireContext(), imageLoader))
.usePlugin(LinkifyPlugin.create()) .usePlugin(LinkifyPlugin.create())
.build() .build()
adapter = PostsRecyclerViewAdapter(markwon, this) adapter = PostsRecyclerViewAdapter(markwon, this)
@ -194,7 +195,7 @@ class FeedFragment : Fragment(), OnUserInteractedWithPostCallback {
val textViewName: TextView? = header?.findViewById(R.id.textViewName) val textViewName: TextView? = header?.findViewById(R.id.textViewName)
val textViewEmail: TextView? = header?.findViewById(R.id.textViewEmail) val textViewEmail: TextView? = header?.findViewById(R.id.textViewEmail)
Picasso.get().load(UrlGen.userProfileImage(it.userId)).into(image) image?.load(UrlGen.userProfileImage(it.userId), imageLoader)
image?.setOnClickListener {_ -> image?.setOnClickListener {_ ->
PictureViewerActivity.startActivityWithUrls(requireContext(), arrayOf(UrlGen.userProfileImageFullQuality(it.userId))) PictureViewerActivity.startActivityWithUrls(requireContext(), arrayOf(UrlGen.userProfileImageFullQuality(it.userId)))
} }

View File

@ -1,15 +1,15 @@
package com.isolaatti.images.picture_viewer.ui package com.isolaatti.images.picture_viewer.ui
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import coil.load
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.databinding.FragmentTouchImageViewWrapperBinding import com.isolaatti.databinding.FragmentTouchImageViewWrapperBinding
import com.ortiz.touchview.OnTouchImageViewListener import com.ortiz.touchview.OnTouchImageViewListener
import com.squareup.picasso.Picasso
import java.lang.NullPointerException
class PictureViewerImageWrapperFragment : Fragment() { class PictureViewerImageWrapperFragment : Fragment() {
@ -43,7 +43,7 @@ class PictureViewerImageWrapperFragment : Fragment() {
url?.let { url?.let {
Picasso.get().load(it).into(binding.touchImageView) binding.touchImageView.load(it, imageLoader)
} }
} }

View File

@ -4,11 +4,12 @@ import android.annotation.SuppressLint
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import coil.load
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.databinding.CommentLayoutBinding import com.isolaatti.databinding.CommentLayoutBinding
import com.isolaatti.posting.comments.domain.model.Comment import com.isolaatti.posting.comments.domain.model.Comment
import com.isolaatti.common.OnUserInteractedCallback import com.isolaatti.common.OnUserInteractedCallback
import com.isolaatti.utils.UrlGen import com.isolaatti.utils.UrlGen
import com.squareup.picasso.Picasso
import io.noties.markwon.Markwon import io.noties.markwon.Markwon
class CommentsRecyclerViewAdapter(private var list: List<Comment>, private val markwon: Markwon, private val callback: OnUserInteractedCallback) : RecyclerView.Adapter<CommentsRecyclerViewAdapter.CommentViewHolder>() { class CommentsRecyclerViewAdapter(private var list: List<Comment>, private val markwon: Markwon, private val callback: OnUserInteractedCallback) : RecyclerView.Adapter<CommentsRecyclerViewAdapter.CommentViewHolder>() {
@ -45,9 +46,8 @@ class CommentsRecyclerViewAdapter(private var list: List<Comment>, private val m
holder.viewBinding.moreButton.setOnClickListener { holder.viewBinding.moreButton.setOnClickListener {
callback.onOptions(comment) callback.onOptions(comment)
} }
Picasso.get()
.load(UrlGen.userProfileImage(comment.userId)) holder.viewBinding.avatarPicture.load(UrlGen.userProfileImage(comment.userId), imageLoader)
.into(holder.viewBinding.avatarPicture)
val totalItems = list.size val totalItems = list.size
if(totalItems > 0 && !requestedNewContent) { if(totalItems > 0 && !requestedNewContent) {

View File

@ -17,6 +17,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDE
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.isolaatti.R import com.isolaatti.R
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.common.Dialogs import com.isolaatti.common.Dialogs
import com.isolaatti.common.ErrorMessageViewModel import com.isolaatti.common.ErrorMessageViewModel
import com.isolaatti.databinding.BottomSheetPostCommentsBinding import com.isolaatti.databinding.BottomSheetPostCommentsBinding
@ -31,11 +32,11 @@ 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.presentation.BottomSheetPostOptionsViewModel
import com.isolaatti.common.options_bottom_sheet.ui.BottomSheetPostOptionsFragment import com.isolaatti.common.options_bottom_sheet.ui.BottomSheetPostOptionsFragment
import com.isolaatti.profile.ui.ProfileActivity import com.isolaatti.profile.ui.ProfileActivity
import com.isolaatti.utils.PicassoImagesPluginDef
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import io.noties.markwon.AbstractMarkwonPlugin import io.noties.markwon.AbstractMarkwonPlugin
import io.noties.markwon.Markwon import io.noties.markwon.Markwon
import io.noties.markwon.MarkwonConfiguration import io.noties.markwon.MarkwonConfiguration
import io.noties.markwon.image.coil.CoilImagesPlugin
import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute
import io.noties.markwon.linkify.LinkifyPlugin import io.noties.markwon.linkify.LinkifyPlugin
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -186,7 +187,7 @@ class BottomSheetPostComments() : BottomSheetDialogFragment(), OnUserInteractedC
.create("https://isolaatti.com/")) .create("https://isolaatti.com/"))
} }
}) })
.usePlugin(PicassoImagesPluginDef.picassoImagePlugin) .usePlugin(CoilImagesPlugin.create(requireContext(), imageLoader))
.usePlugin(LinkifyPlugin.create()) .usePlugin(LinkifyPlugin.create())
.build() .build()

View File

@ -1,24 +1,22 @@
package com.isolaatti.posting.comments.ui package com.isolaatti.posting.comments.ui
import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast
import androidx.core.widget.doOnTextChanged import androidx.core.widget.doOnTextChanged
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import coil.load
import com.isolaatti.R import com.isolaatti.R
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.databinding.FragmentEditCommentBinding import com.isolaatti.databinding.FragmentEditCommentBinding
import com.isolaatti.posting.comments.presentation.CommentsViewModel import com.isolaatti.posting.comments.presentation.CommentsViewModel
import com.isolaatti.utils.PicassoImagesPluginDef
import com.isolaatti.utils.UrlGen import com.isolaatti.utils.UrlGen
import com.squareup.picasso.Picasso
import io.noties.markwon.AbstractMarkwonPlugin import io.noties.markwon.AbstractMarkwonPlugin
import io.noties.markwon.Markwon import io.noties.markwon.Markwon
import io.noties.markwon.MarkwonConfiguration import io.noties.markwon.MarkwonConfiguration
import io.noties.markwon.image.coil.CoilImagesPlugin
import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute
import io.noties.markwon.linkify.LinkifyPlugin import io.noties.markwon.linkify.LinkifyPlugin
@ -53,7 +51,7 @@ class EditCommentDialogFragment : DialogFragment() {
.create("https://isolaatti.com/")) .create("https://isolaatti.com/"))
} }
}) })
.usePlugin(PicassoImagesPluginDef.picassoImagePlugin) .usePlugin(CoilImagesPlugin.create(requireContext(), imageLoader))
.usePlugin(LinkifyPlugin.create()) .usePlugin(LinkifyPlugin.create())
.build() .build()
@ -77,7 +75,7 @@ class EditCommentDialogFragment : DialogFragment() {
binding.comment.also { binding.comment.also {
it.textViewUsername.text = comment.username it.textViewUsername.text = comment.username
markwon.setMarkdown(it.postContent, comment.textContent) markwon.setMarkdown(it.postContent, comment.textContent)
Picasso.get().load(UrlGen.userProfileImage(comment.userId)).into(it.avatarPicture) it.avatarPicture.load(UrlGen.userProfileImage(comment.userId), imageLoader)
} }
binding.newCommentTextField.editText?.setText(comment.textContent) binding.newCommentTextField.editText?.setText(comment.textContent)
} }

View File

@ -9,13 +9,14 @@ import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder import androidx.recyclerview.widget.RecyclerView.ViewHolder
import coil.load
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
import com.isolaatti.R import com.isolaatti.R
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.common.OnUserInteractedWithPostCallback import com.isolaatti.common.OnUserInteractedWithPostCallback
import com.isolaatti.posting.posts.domain.entity.Post import com.isolaatti.posting.posts.domain.entity.Post
import com.isolaatti.utils.UrlGen.userProfileImage import com.isolaatti.utils.UrlGen.userProfileImage
import com.squareup.picasso.Picasso
import io.noties.markwon.Markwon import io.noties.markwon.Markwon
class PostsRecyclerViewAdapter (private val markwon: Markwon, private val callback: OnUserInteractedWithPostCallback) : RecyclerView.Adapter<PostsRecyclerViewAdapter.FeedViewHolder>(){ class PostsRecyclerViewAdapter (private val markwon: Markwon, private val callback: OnUserInteractedWithPostCallback) : RecyclerView.Adapter<PostsRecyclerViewAdapter.FeedViewHolder>(){
@ -64,7 +65,7 @@ class PostsRecyclerViewAdapter (private val markwon: Markwon, private val callba
} }
val profileImageView: ImageView = itemView.findViewById(R.id.avatar_picture) val profileImageView: ImageView = itemView.findViewById(R.id.avatar_picture)
Picasso.get().load(userProfileImage(postDto.userId)).into(profileImageView) profileImageView.load(userProfileImage(postDto.userId), imageLoader)
val dateTextView: TextView = itemView.findViewById(R.id.text_view_date) val dateTextView: TextView = itemView.findViewById(R.id.text_view_date)
dateTextView.text = postDto.date dateTextView.text = postDto.date

View File

@ -2,25 +2,23 @@ package com.isolaatti.posting.posts.viewer.ui
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.ColorStateList
import android.os.Bundle import android.os.Bundle
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.core.content.ContentProviderCompat.requireContext
import androidx.core.content.res.ResourcesCompat import androidx.core.content.res.ResourcesCompat
import coil.imageLoader
import coil.load
import com.isolaatti.BuildConfig import com.isolaatti.BuildConfig
import com.isolaatti.R import com.isolaatti.R
import com.isolaatti.common.ErrorMessageViewModel
import com.isolaatti.common.IsolaattiBaseActivity import com.isolaatti.common.IsolaattiBaseActivity
import com.isolaatti.databinding.ActivityPostViewerBinding import com.isolaatti.databinding.ActivityPostViewerBinding
import com.isolaatti.posting.comments.ui.BottomSheetPostComments import com.isolaatti.posting.comments.ui.BottomSheetPostComments
import com.isolaatti.posting.posts.viewer.presentation.PostViewerViewModel import com.isolaatti.posting.posts.viewer.presentation.PostViewerViewModel
import com.isolaatti.profile.ui.ProfileActivity import com.isolaatti.profile.ui.ProfileActivity
import com.isolaatti.utils.PicassoImagesPluginDef
import com.isolaatti.utils.UrlGen import com.isolaatti.utils.UrlGen
import com.squareup.picasso.Picasso
import io.noties.markwon.AbstractMarkwonPlugin import io.noties.markwon.AbstractMarkwonPlugin
import io.noties.markwon.Markwon import io.noties.markwon.Markwon
import io.noties.markwon.MarkwonConfiguration import io.noties.markwon.MarkwonConfiguration
import io.noties.markwon.image.coil.CoilImagesPlugin
import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute
import io.noties.markwon.linkify.LinkifyPlugin import io.noties.markwon.linkify.LinkifyPlugin
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@ -62,7 +60,7 @@ class PostViewerActivity : IsolaattiBaseActivity() {
viewModel.post.observe(this) { viewModel.post.observe(this) {
markwon.setMarkdown(binding.markwonContainer, it.textContent) markwon.setMarkdown(binding.markwonContainer, it.textContent)
binding.author.text = it.userName binding.author.text = it.userName
Picasso.get().load(UrlGen.userProfileImage(it.userId)).into(binding.profileImageView) binding.profileImageView.load(UrlGen.userProfileImage(it.userId), imageLoader)
binding.commentsInfo.text = getString(R.string.comments_info, it.numberOfComments) binding.commentsInfo.text = getString(R.string.comments_info, it.numberOfComments)
binding.likesInfo.text = getString(R.string.likes_info, it.numberOfLikes) binding.likesInfo.text = getString(R.string.likes_info, it.numberOfLikes)
binding.author.setOnClickListener {_ -> binding.author.setOnClickListener {_ ->
@ -122,7 +120,7 @@ class PostViewerActivity : IsolaattiBaseActivity() {
.create(BuildConfig.backend)) .create(BuildConfig.backend))
} }
}) })
.usePlugin(PicassoImagesPluginDef.picassoImagePlugin) .usePlugin(CoilImagesPlugin.create(this, imageLoader))
.usePlugin(LinkifyPlugin.create()) .usePlugin(LinkifyPlugin.create())
.build() .build()

View File

@ -16,13 +16,14 @@ import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import coil.load
import com.isolaatti.BuildConfig import com.isolaatti.BuildConfig
import com.isolaatti.R import com.isolaatti.R
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.common.Dialogs import com.isolaatti.common.Dialogs
import com.isolaatti.common.ErrorMessageViewModel import com.isolaatti.common.ErrorMessageViewModel
import com.isolaatti.databinding.FragmentDiscussionsBinding import com.isolaatti.databinding.FragmentDiscussionsBinding
import com.isolaatti.followers.domain.FollowingState import com.isolaatti.followers.domain.FollowingState
import com.isolaatti.home.FeedFragment
import com.isolaatti.posting.posts.viewer.ui.PostViewerActivity import com.isolaatti.posting.posts.viewer.ui.PostViewerActivity
import com.isolaatti.posting.comments.ui.BottomSheetPostComments import com.isolaatti.posting.comments.ui.BottomSheetPostComments
import com.isolaatti.common.Ownable import com.isolaatti.common.Ownable
@ -37,16 +38,14 @@ import com.isolaatti.posting.posts.presentation.EditPostContract
import com.isolaatti.posting.posts.presentation.PostListingRecyclerViewAdapterWiring import com.isolaatti.posting.posts.presentation.PostListingRecyclerViewAdapterWiring
import com.isolaatti.posting.posts.presentation.PostsRecyclerViewAdapter import com.isolaatti.posting.posts.presentation.PostsRecyclerViewAdapter
import com.isolaatti.posting.posts.presentation.UpdateEvent import com.isolaatti.posting.posts.presentation.UpdateEvent
import com.isolaatti.profile.data.remote.UserProfileDto
import com.isolaatti.profile.domain.entity.UserProfile import com.isolaatti.profile.domain.entity.UserProfile
import com.isolaatti.profile.presentation.ProfileViewModel import com.isolaatti.profile.presentation.ProfileViewModel
import com.isolaatti.utils.PicassoImagesPluginDef
import com.isolaatti.utils.UrlGen import com.isolaatti.utils.UrlGen
import com.squareup.picasso.Picasso
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import io.noties.markwon.AbstractMarkwonPlugin import io.noties.markwon.AbstractMarkwonPlugin
import io.noties.markwon.Markwon import io.noties.markwon.Markwon
import io.noties.markwon.MarkwonConfiguration import io.noties.markwon.MarkwonConfiguration
import io.noties.markwon.image.coil.CoilImagesPlugin
import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute
import io.noties.markwon.linkify.LinkifyPlugin import io.noties.markwon.linkify.LinkifyPlugin
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -79,9 +78,7 @@ class ProfileMainFragment : Fragment() {
} }
private val profileObserver = Observer<UserProfile> { profile -> private val profileObserver = Observer<UserProfile> { profile ->
Picasso.get() viewBinding.profileImageView.load(UrlGen.userProfileImage(profile.userId), imageLoader)
.load(UrlGen.userProfileImage(profile.userId))
.into(viewBinding.profileImageView)
title = profile.name title = profile.name
viewBinding.textViewUsername.text = profile.name viewBinding.textViewUsername.text = profile.name
@ -274,7 +271,7 @@ class ProfileMainFragment : Fragment() {
.create(BuildConfig.backend)) .create(BuildConfig.backend))
} }
}) })
.usePlugin(PicassoImagesPluginDef.picassoImagePlugin) .usePlugin(CoilImagesPlugin.create(requireContext(), imageLoader))
.usePlugin(LinkifyPlugin.create()) .usePlugin(LinkifyPlugin.create())
.build() .build()

View File

@ -13,6 +13,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.isolaatti.BuildConfig import com.isolaatti.BuildConfig
import com.isolaatti.R import com.isolaatti.R
import com.isolaatti.databinding.FragmentMakeAccountBinding import com.isolaatti.databinding.FragmentMakeAccountBinding
@ -145,10 +146,26 @@ class MakeAccountFragment : Fragment() {
} }
} }
private fun showNotAvailableEmailMessage() {} private fun showNotAvailableEmailMessage() {
private fun showValidationProblemsMessage() {} MaterialAlertDialogBuilder(requireContext())
private fun showErrorMessage() {} .setMessage(R.string.email_used)
private fun showUnavailableMessage() {} .show()
}
private fun showValidationProblemsMessage() {
MaterialAlertDialogBuilder(requireContext())
.setMessage(R.string.validation_error)
.show()
}
private fun showErrorMessage() {
MaterialAlertDialogBuilder(requireContext())
.setMessage(R.string.unknown_error)
.show()
}
private fun showUnavailableMessage() {
MaterialAlertDialogBuilder(requireContext())
.setMessage(R.string.username_invalid_feedback)
.show()
}
private fun goToHome() { private fun goToHome() {
val intent = Intent(requireContext(), HomeActivity::class.java) val intent = Intent(requireContext(), HomeActivity::class.java)

View File

@ -1,19 +0,0 @@
package com.isolaatti.utils
import com.squareup.picasso.Picasso
import com.squareup.picasso.RequestCreator
import io.noties.markwon.image.AsyncDrawable
import io.noties.markwon.image.picasso.PicassoImagesPlugin
object PicassoImagesPluginDef {
val picassoImagePlugin = PicassoImagesPlugin.create(object: PicassoImagesPlugin.PicassoStore {
override fun load(drawable: AsyncDrawable): RequestCreator {
return Picasso.get().load(drawable.destination).tag(drawable)
}
override fun cancel(drawable: AsyncDrawable) {
Picasso.get().cancelTag(drawable)
}
})
}

View File

@ -113,4 +113,6 @@
<string name="username_invalid_feedback">Username is not available or is invalid</string> <string name="username_invalid_feedback">Username is not available or is invalid</string>
<string name="password_invalid_feedback">Password must be at least 8 characters long</string> <string name="password_invalid_feedback">Password must be at least 8 characters long</string>
<string name="display_name_invalid_feedback">Please provide a name. This does not have to be unique and can be your real name or not.</string> <string name="display_name_invalid_feedback">Please provide a name. This does not have to be unique and can be your real name or not.</string>
<string name="validation_error">Validation error</string>
<string name="email_used">Email is in use already</string>
</resources> </resources>

View File

@ -12,8 +12,8 @@ buildscript {
} }
} }
plugins { plugins {
id 'com.android.application' version '8.1.1' apply false id 'com.android.application' version '8.1.2' apply false
id 'com.android.library' version '8.1.1' apply false id 'com.android.library' version '8.1.2' apply false
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
id 'com.google.dagger.hilt.android' version '2.47' apply false id 'com.google.dagger.hilt.android' version '2.47' apply false
} }