From 37c618cb28bcbef77f06378ce808ca8f6744f860 Mon Sep 17 00:00:00 2001 From: aayush262 Date: Tue, 12 Mar 2024 10:22:25 +0530 Subject: [PATCH] feat: blur function --- app/src/main/java/ani/dantotsu/Functions.kt | 16 +++++++++++++++ .../java/ani/dantotsu/home/HomeFragment.kt | 3 ++- .../java/ani/dantotsu/media/MediaAdaptor.kt | 2 +- .../dantotsu/media/MediaDetailsActivity.kt | 4 +++- .../java/ani/dantotsu/profile/FollowerItem.kt | 14 ++----------- .../ani/dantotsu/profile/ProfileActivity.kt | 3 ++- .../dantotsu/profile/activity/ActivityItem.kt | 20 ++++++------------- .../profile/activity/NotificationItem.kt | 18 +++++------------ 8 files changed, 37 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/Functions.kt b/app/src/main/java/ani/dantotsu/Functions.kt index 1e5c163d..4449ff2a 100644 --- a/app/src/main/java/ani/dantotsu/Functions.kt +++ b/app/src/main/java/ani/dantotsu/Functions.kt @@ -64,11 +64,13 @@ import com.bumptech.glide.Glide import com.bumptech.glide.RequestBuilder import com.bumptech.glide.RequestManager import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade import com.bumptech.glide.load.resource.gif.GifDrawable import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.Target import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import com.google.android.material.bottomnavigation.BottomNavigationView @@ -88,6 +90,7 @@ import io.noties.markwon.html.HtmlPlugin import io.noties.markwon.html.TagHandlerNoOp import io.noties.markwon.image.AsyncDrawable import io.noties.markwon.image.glide.GlideImagesPlugin +import jp.wasabeef.glide.transformations.BlurTransformation import kotlinx.coroutines.* import nl.joery.animatedbottombar.AnimatedBottomBar import uy.kohesive.injekt.Injekt @@ -1099,6 +1102,19 @@ suspend fun View.pop() { delay(100) } +fun blurImage(imageView: ImageView, banner: String?){ + if (banner != null) { + val context = imageView.context + if (!(context as Activity).isDestroyed) + Glide.with(context as Context) + .load(GlideUrl(banner)) + .diskCacheStrategy(DiskCacheStrategy.ALL).override(400) + .apply(RequestOptions.bitmapTransform(BlurTransformation(2, 2))) + .into(imageView) + } else { + imageView.setImageResource(R.drawable.linear_gradient_bg) + } +} fun logToFile(context: Context, message: String) { val externalFilesDir = context.getExternalFilesDir(null) diff --git a/app/src/main/java/ani/dantotsu/home/HomeFragment.kt b/app/src/main/java/ani/dantotsu/home/HomeFragment.kt index e0839e90..1f802793 100644 --- a/app/src/main/java/ani/dantotsu/home/HomeFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/HomeFragment.kt @@ -21,6 +21,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import ani.dantotsu.R import ani.dantotsu.Refresh +import ani.dantotsu.blurImage import ani.dantotsu.bottomBar import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.AnilistHomeViewModel @@ -78,7 +79,7 @@ class HomeFragment : Fragment() { binding.homeUserChaptersRead.text = Anilist.chapterRead.toString() binding.homeUserAvatar.loadImage(Anilist.avatar) if (!(PrefManager.getVal(PrefName.BannerAnimations) as Boolean)) binding.homeUserBg.pause() - binding.homeUserBg.loadImage(Anilist.bg) + blurImage(binding.homeUserBg, Anilist.bg) binding.homeUserDataProgressBar.visibility = View.GONE binding.homeNotificationCount.visibility = if (Anilist.unreadNotificationCount > 0) View.VISIBLE else View.GONE binding.homeNotificationCount.text = Anilist.unreadNotificationCount.toString() diff --git a/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt b/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt index 7d96e95b..126b897c 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt @@ -139,7 +139,7 @@ class MediaAdaptor( val media = mediaList?.get(position) if (media != null) { b.itemCompactImage.loadImage(media.cover) - b.itemCompactBanner.loadImage(media.banner ?: media.cover) + blurImage(b.itemCompactBanner, media.banner ?: media.cover) b.itemCompactOngoing.visibility = if (media.status == currActivity()!!.getString(R.string.status_releasing)) View.VISIBLE else View.GONE b.itemCompactTitle.text = media.userPreferredName diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt index fe424202..f9f7d7e1 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt @@ -34,6 +34,7 @@ import ani.dantotsu.GesturesListener import ani.dantotsu.R import ani.dantotsu.Refresh import ani.dantotsu.ZoomOutPageTransformer +import ani.dantotsu.blurImage import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.copyToClipboard import ani.dantotsu.databinding.ActivityMediaBinding @@ -162,7 +163,8 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi media.cover ) } - banner.loadImage(media.banner ?: media.cover, 400) + + blurImage(banner, media.banner ?: media.cover) val gestureDetector = GestureDetector(this, object : GesturesListener() { override fun onDoubleClick(event: MotionEvent) { if (!(PrefManager.getVal(PrefName.BannerAnimations) as Boolean)) diff --git a/app/src/main/java/ani/dantotsu/profile/FollowerItem.kt b/app/src/main/java/ani/dantotsu/profile/FollowerItem.kt index f09c2435..58e746af 100644 --- a/app/src/main/java/ani/dantotsu/profile/FollowerItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/FollowerItem.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.content.Context import android.view.View import ani.dantotsu.R +import ani.dantotsu.blurImage import ani.dantotsu.databinding.ItemFollowerBinding import ani.dantotsu.loadImage import com.bumptech.glide.Glide @@ -25,19 +26,8 @@ class FollowerItem( override fun bind(viewBinding: ItemFollowerBinding, position: Int) { binding = viewBinding binding.profileUserName.text = name - val context = binding.profileBannerImage.context avatar?.let { binding.profileUserAvatar.loadImage(it) } - if (banner != null) { - binding.profileBannerImage.loadImage(banner) - if (!(context as Activity).isDestroyed) - Glide.with(context as Context) - .load(GlideUrl(banner)) - .diskCacheStrategy(DiskCacheStrategy.ALL).override(400) - .apply(RequestOptions.bitmapTransform(BlurTransformation(2, 2))) - .into(binding.profileBannerImage) - } else { - binding.profileBannerImage.setImageResource(R.drawable.linear_gradient_bg) - } + blurImage(binding.profileBannerImage, banner ?: avatar) binding.root.setOnClickListener { clickCallback(id) } } diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt index ac3c64a9..e04717c3 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt @@ -17,6 +17,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.viewpager2.adapter.FragmentStateAdapter import ani.dantotsu.R +import ani.dantotsu.blurImage import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.api.Query import ani.dantotsu.databinding.ActivityProfileBinding @@ -158,7 +159,7 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene binding.profileUserName.text = "${user.name} $userLevel" if (!(PrefManager.getVal(PrefName.BannerAnimations) as Boolean)) binding.profileBannerImage.pause() - binding.profileBannerImage.loadImage(user.bannerImage) + blurImage(binding.profileBannerImage, user.bannerImage ?: user.avatar?.medium) binding.profileBannerImage.updateLayoutParams { height += statusBarHeight } binding.profileBannerGradient.updateLayoutParams { height += statusBarHeight } binding.profileMenuButton.updateLayoutParams { topMargin += statusBarHeight } diff --git a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt index af09efaf..acf00143 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt @@ -6,6 +6,7 @@ import android.view.View import androidx.core.content.ContextCompat import androidx.recyclerview.widget.LinearLayoutManager import ani.dantotsu.R +import ani.dantotsu.blurImage import ani.dantotsu.buildMarkwon import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.api.Activity @@ -97,25 +98,16 @@ class ActivityItem( when (activity.typename) { "ListActivity" -> { + val cover = activity.media?.coverImage?.large + val banner = activity.media?.bannerImage binding.activityContent.visibility = View.GONE binding.activityBannerContainer.visibility = View.VISIBLE - binding.activityMediaName.text = activity.media?.title?.userPreferred binding.activityText.text = """${activity.user!!.name} ${activity.status} ${activity.progress ?: ""}""" - binding.activityCover.loadImage(activity.media?.coverImage?.medium) - val banner = activity.media?.bannerImage - if (banner != null) { - if (!(context as android.app.Activity).isDestroyed) { - Glide.with(context as Context) - .load(GlideUrl(banner)) - .diskCacheStrategy(DiskCacheStrategy.ALL).override(400) - .apply(RequestOptions.bitmapTransform(BlurTransformation(2, 2))) - .into(binding.activityBannerImage) - } - } else { - binding.activityBannerImage.setImageResource(R.drawable.linear_gradient_bg) - } + binding.activityCover.loadImage(cover) + blurImage(binding.activityBannerImage, banner ?: cover) + } "TextActivity" -> { diff --git a/app/src/main/java/ani/dantotsu/profile/activity/NotificationItem.kt b/app/src/main/java/ani/dantotsu/profile/activity/NotificationItem.kt index b6a2163a..23fa8676 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/NotificationItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/NotificationItem.kt @@ -5,6 +5,7 @@ import android.content.Context import android.util.TypedValue import android.view.View import ani.dantotsu.R +import ani.dantotsu.blurImage import ani.dantotsu.connections.anilist.api.Notification import ani.dantotsu.connections.anilist.api.NotificationType import ani.dantotsu.databinding.ItemNotificationBinding @@ -37,20 +38,11 @@ class NotificationItem( } private fun image(user: Boolean = false) { - val context = binding.notificationBannerImage.context + val cover = if (user) notification.user?.bannerImage ?: notification.user?.avatar?.medium else notification.media?.bannerImage ?: notification.media?.coverImage?.large - if (cover != null) { - if (!(context as Activity).isDestroyed) - Glide.with(context as Context) - .load(GlideUrl(cover)) - .diskCacheStrategy(DiskCacheStrategy.ALL).override(400) - .apply(RequestOptions.bitmapTransform(BlurTransformation(2, 2))) - .into(binding.notificationBannerImage) - } else { - binding.notificationBannerImage.setImageResource(R.drawable.linear_gradient_bg) - } - val defaultHeight = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 170f, context.resources.displayMetrics).toInt() - val userHeight = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 90f, context.resources.displayMetrics).toInt() + blurImage(binding.notificationBannerImage, cover) + val defaultHeight = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 170f, binding.root.context.resources.displayMetrics).toInt() + val userHeight = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 90f, binding.root.context.resources.displayMetrics).toInt() if (user) { binding.notificationCover.visibility = View.GONE