* 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>
<Key>
<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>
</deviceKey>
</Target>
</targetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2023-08-21T02:45:21.143691700Z" />
<timeTargetWasSelectedWithDropDown value="2023-11-19T23:31:08.478703551Z" />
</component>
</project>

View File

@ -11,7 +11,7 @@ plugins {
android {
namespace 'com.isolaatti'
compileSdk 33
compileSdk 34
viewBinding {
enabled = true
}
@ -90,10 +90,14 @@ dependencies {
// Customtabs
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:editor:$markwon_version"
implementation "io.noties.markwon:image-picasso:$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 'com.github.MikeOrtiz:TouchImageView:3.5'
}

View File

@ -36,7 +36,6 @@ class MainActivity : ComponentActivity() {
if(currentToken == null) {
val loginIntent = Intent(this@MainActivity, LogInActivity::class.java)
loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
signInActivityResult.launch(loginIntent)
} else {
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.connectivity.AuthenticationInterceptor
import com.isolaatti.connectivity.RetrofitClient
import com.squareup.picasso.Picasso
import com.squareup.picasso.RequestCreator
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import io.noties.markwon.image.AsyncDrawable
import io.noties.markwon.image.picasso.PicassoImagesPlugin
@Module
@InstallIn(SingletonComponent::class)

View File

@ -8,11 +8,16 @@ import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class MyApplication : Application() {
companion object {
lateinit var myApp: MyApplication
}
private val activityLifecycleCallbacks = ActivityLifecycleCallbacks()
lateinit var connectivityCallbackImpl: ConnectivityCallbackImpl
override fun onCreate() {
super.onCreate()
myApp = this
registerActivityLifecycleCallbacks(activityLifecycleCallbacks)
connectivityCallbackImpl = 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.ListAdapter
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import coil.load
import com.isolaatti.R
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.databinding.ItemUserListBinding
import com.isolaatti.profile.domain.entity.ProfileListItem
import com.isolaatti.utils.UrlGen
import com.squareup.picasso.Picasso
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)
}
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) {
holder.item.followButton.text = context.getText(R.string.unfollow)
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 {
override fun intercept(chain: Interceptor.Chain): Response {
val url = chain.request().url()
val path = url.url().path
val url = chain.request().url
val path = url.toUrl().path
if(RetrofitClient.excludedUrlsFromAuthentication.contains(path)){
return chain.proceed(chain.request())
}

View File

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

View File

@ -1,15 +1,15 @@
package com.isolaatti.images.picture_viewer.ui
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import coil.load
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.databinding.FragmentTouchImageViewWrapperBinding
import com.ortiz.touchview.OnTouchImageViewListener
import com.squareup.picasso.Picasso
import java.lang.NullPointerException
class PictureViewerImageWrapperFragment : Fragment() {
@ -43,7 +43,7 @@ class PictureViewerImageWrapperFragment : Fragment() {
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.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import coil.load
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.databinding.CommentLayoutBinding
import com.isolaatti.posting.comments.domain.model.Comment
import com.isolaatti.common.OnUserInteractedCallback
import com.isolaatti.utils.UrlGen
import com.squareup.picasso.Picasso
import io.noties.markwon.Markwon
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 {
callback.onOptions(comment)
}
Picasso.get()
.load(UrlGen.userProfileImage(comment.userId))
.into(holder.viewBinding.avatarPicture)
holder.viewBinding.avatarPicture.load(UrlGen.userProfileImage(comment.userId), imageLoader)
val totalItems = list.size
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.BottomSheetDialogFragment
import com.isolaatti.R
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.common.Dialogs
import com.isolaatti.common.ErrorMessageViewModel
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.ui.BottomSheetPostOptionsFragment
import com.isolaatti.profile.ui.ProfileActivity
import com.isolaatti.utils.PicassoImagesPluginDef
import dagger.hilt.android.AndroidEntryPoint
import io.noties.markwon.AbstractMarkwonPlugin
import io.noties.markwon.Markwon
import io.noties.markwon.MarkwonConfiguration
import io.noties.markwon.image.coil.CoilImagesPlugin
import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute
import io.noties.markwon.linkify.LinkifyPlugin
import kotlinx.coroutines.launch
@ -186,7 +187,7 @@ class BottomSheetPostComments() : BottomSheetDialogFragment(), OnUserInteractedC
.create("https://isolaatti.com/"))
}
})
.usePlugin(PicassoImagesPluginDef.picassoImagePlugin)
.usePlugin(CoilImagesPlugin.create(requireContext(), imageLoader))
.usePlugin(LinkifyPlugin.create())
.build()

View File

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

View File

@ -9,13 +9,14 @@ import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import coil.load
import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView
import com.isolaatti.R
import com.isolaatti.common.CoilImageLoader.imageLoader
import com.isolaatti.common.OnUserInteractedWithPostCallback
import com.isolaatti.posting.posts.domain.entity.Post
import com.isolaatti.utils.UrlGen.userProfileImage
import com.squareup.picasso.Picasso
import io.noties.markwon.Markwon
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)
Picasso.get().load(userProfileImage(postDto.userId)).into(profileImageView)
profileImageView.load(userProfileImage(postDto.userId), imageLoader)
val dateTextView: TextView = itemView.findViewById(R.id.text_view_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.Intent
import android.content.res.ColorStateList
import android.os.Bundle
import androidx.activity.viewModels
import androidx.core.content.ContentProviderCompat.requireContext
import androidx.core.content.res.ResourcesCompat
import coil.imageLoader
import coil.load
import com.isolaatti.BuildConfig
import com.isolaatti.R
import com.isolaatti.common.ErrorMessageViewModel
import com.isolaatti.common.IsolaattiBaseActivity
import com.isolaatti.databinding.ActivityPostViewerBinding
import com.isolaatti.posting.comments.ui.BottomSheetPostComments
import com.isolaatti.posting.posts.viewer.presentation.PostViewerViewModel
import com.isolaatti.profile.ui.ProfileActivity
import com.isolaatti.utils.PicassoImagesPluginDef
import com.isolaatti.utils.UrlGen
import com.squareup.picasso.Picasso
import io.noties.markwon.AbstractMarkwonPlugin
import io.noties.markwon.Markwon
import io.noties.markwon.MarkwonConfiguration
import io.noties.markwon.image.coil.CoilImagesPlugin
import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute
import io.noties.markwon.linkify.LinkifyPlugin
import kotlinx.coroutines.CoroutineScope
@ -62,7 +60,7 @@ class PostViewerActivity : IsolaattiBaseActivity() {
viewModel.post.observe(this) {
markwon.setMarkdown(binding.markwonContainer, it.textContent)
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.likesInfo.text = getString(R.string.likes_info, it.numberOfLikes)
binding.author.setOnClickListener {_ ->
@ -122,7 +120,7 @@ class PostViewerActivity : IsolaattiBaseActivity() {
.create(BuildConfig.backend))
}
})
.usePlugin(PicassoImagesPluginDef.picassoImagePlugin)
.usePlugin(CoilImagesPlugin.create(this, imageLoader))
.usePlugin(LinkifyPlugin.create())
.build()

View File

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

View File

@ -13,6 +13,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.isolaatti.BuildConfig
import com.isolaatti.R
import com.isolaatti.databinding.FragmentMakeAccountBinding
@ -145,10 +146,26 @@ class MakeAccountFragment : Fragment() {
}
}
private fun showNotAvailableEmailMessage() {}
private fun showValidationProblemsMessage() {}
private fun showErrorMessage() {}
private fun showUnavailableMessage() {}
private fun showNotAvailableEmailMessage() {
MaterialAlertDialogBuilder(requireContext())
.setMessage(R.string.email_used)
.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() {
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="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="validation_error">Validation error</string>
<string name="email_used">Email is in use already</string>
</resources>

View File

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