Skip to content

Commit 38ee1a9

Browse files
committed
Improve sample app's image libraries
1 parent e71690e commit 38ee1a9

22 files changed

Lines changed: 236 additions & 185 deletions

sample/kotlin/src/main/kotlin/com/datadog/android/sample/Preferences.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import android.content.Context
1010
import androidx.preference.PreferenceManager
1111
import com.datadog.android.privacy.TrackingConsent
1212
import com.datadog.android.sample.datalist.DataSourceType
13-
import com.datadog.android.sample.picture.ImageLoaderType
13+
import com.datadog.android.sample.image.ImageLoaderType
1414
import timber.log.Timber
1515

1616
internal object Preferences {

sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ import com.datadog.android.rum.tracking.NavigationViewTrackingStrategy
4343
import com.datadog.android.sample.account.AccountFragment
4444
import com.datadog.android.sample.data.db.LocalDataSource
4545
import com.datadog.android.sample.data.remote.RemoteDataSource
46-
import com.datadog.android.sample.picture.Coil3ImageLoader
47-
import com.datadog.android.sample.picture.CoilImageLoader
48-
import com.datadog.android.sample.picture.FrescoImageLoader
49-
import com.datadog.android.sample.picture.PicassoImageLoader
46+
import com.datadog.android.sample.image.Coil3ImageLoader
47+
import com.datadog.android.sample.image.CoilImageLoader
48+
import com.datadog.android.sample.image.FrescoImageLoader
49+
import com.datadog.android.sample.image.PicassoImageLoader
5050
import com.datadog.android.sample.user.UserFragment
5151
import com.datadog.android.sessionreplay.ImagePrivacy
5252
import com.datadog.android.sessionreplay.SessionReplay

sample/kotlin/src/main/kotlin/com/datadog/android/sample/home/HomeFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ internal class HomeFragment :
6363
R.id.navigation_webview -> R.id.fragment_webview
6464
R.id.navigation_data_list -> R.id.fragment_data_list
6565
R.id.navigation_view_pager -> R.id.fragment_view_pager
66-
R.id.navigation_picture -> R.id.fragment_picture
66+
R.id.navigation_image -> R.id.fragment_image
6767
R.id.navigation_cronet_image -> R.id.fragment_cronet_image
6868
R.id.navigation_compose -> R.id.activity_jetpack_compose
6969
R.id.navigation_session_replay -> R.id.fragment_session_replay

sample/kotlin/src/main/kotlin/com/datadog/android/sample/picture/AspectRatioImageView.kt renamed to sample/kotlin/src/main/kotlin/com/datadog/android/sample/image/AspectRatioImageView.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Copyright 2016-Present Datadog, Inc.
55
*/
66

7-
package com.datadog.android.sample.picture
7+
package com.datadog.android.sample.image
88

99
import android.content.Context
1010
import android.util.AttributeSet

sample/kotlin/src/main/kotlin/com/datadog/android/sample/picture/Coil3ImageLoader.kt renamed to sample/kotlin/src/main/kotlin/com/datadog/android/sample/image/Coil3ImageLoader.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,18 @@
44
* Copyright 2016-Present Datadog, Inc.
55
*/
66

7-
package com.datadog.android.sample.picture
7+
package com.datadog.android.sample.image
88

99
import android.content.Context
1010
import android.widget.ImageView
1111
import coil3.SingletonImageLoader
1212
import coil3.load
1313
import coil3.network.okhttp.OkHttpNetworkFetcherFactory
14+
import coil3.request.error
15+
import coil3.request.placeholder
1416
import com.datadog.android.Datadog
1517
import com.datadog.android.coil3.DatadogCoilRequestListener
18+
import com.datadog.android.sample.R
1619
import okhttp3.OkHttpClient
1720

1821
internal class Coil3ImageLoader : ImageLoader {
@@ -22,7 +25,11 @@ internal class Coil3ImageLoader : ImageLoader {
2225
override val type: ImageLoaderType = ImageLoaderType.COIL3
2326

2427
override fun load(url: String, imageView: ImageView) {
25-
imageView.load(url) { listener(listener) }
28+
imageView.load(url) {
29+
listener(listener)
30+
placeholder(R.drawable.ph_default)
31+
error(R.drawable.ph_error)
32+
}
2633
}
2734

2835
companion object {

sample/kotlin/src/main/kotlin/com/datadog/android/sample/picture/CoilImageLoader.kt renamed to sample/kotlin/src/main/kotlin/com/datadog/android/sample/image/CoilImageLoader.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,24 @@
44
* Copyright 2016-Present Datadog, Inc.
55
*/
66

7-
package com.datadog.android.sample.picture
7+
package com.datadog.android.sample.image
88

99
import android.content.Context
1010
import android.widget.ImageView
1111
import coil.Coil
1212
import coil.load
13-
import com.datadog.android.Datadog
14-
import com.datadog.android.coil.DatadogCoilRequestListener
13+
import com.datadog.android.sample.R
1514
import okhttp3.OkHttpClient
1615

1716
internal class CoilImageLoader : ImageLoader {
1817

19-
private val listener = DatadogCoilRequestListener(Datadog.getInstance())
20-
2118
override val type: ImageLoaderType = ImageLoaderType.COIL
2219

2320
override fun load(url: String, imageView: ImageView) {
24-
imageView.load(url) { listener(listener) }
21+
imageView.load(url) {
22+
placeholder(R.drawable.ph_default)
23+
error(R.drawable.ph_error)
24+
}
2525
}
2626

2727
companion object {

sample/kotlin/src/main/kotlin/com/datadog/android/sample/picture/FailingTransformation.kt renamed to sample/kotlin/src/main/kotlin/com/datadog/android/sample/image/FailingTransformation.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Copyright 2016-Present Datadog, Inc.
55
*/
66

7-
package com.datadog.android.sample.picture
7+
package com.datadog.android.sample.image
88

99
import android.graphics.Bitmap
1010
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool

sample/kotlin/src/main/kotlin/com/datadog/android/sample/picture/FrescoImageLoader.kt renamed to sample/kotlin/src/main/kotlin/com/datadog/android/sample/image/FrescoImageLoader.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@
44
* Copyright 2016-Present Datadog, Inc.
55
*/
66

7-
package com.datadog.android.sample.picture
7+
package com.datadog.android.sample.image
88

99
import android.content.Context
10-
import android.net.Uri
1110
import android.widget.ImageView
11+
import androidx.core.net.toUri
1212
import com.datadog.android.Datadog
1313
import com.datadog.android.fresco.DatadogFrescoCacheListener
1414
import com.datadog.android.rum.GlobalRumMonitor
1515
import com.datadog.android.rum.RumErrorSource
16+
import com.datadog.android.sample.BuildConfig
1617
import com.facebook.cache.disk.DiskCacheConfig
1718
import com.facebook.common.util.ByteConstants
19+
import com.facebook.drawee.backends.pipeline.DraweeConfig
1820
import com.facebook.drawee.backends.pipeline.Fresco
1921
import com.facebook.drawee.view.SimpleDraweeView
2022
import com.facebook.imagepipeline.backends.okhttp3.OkHttpImagePipelineConfigFactory
@@ -27,7 +29,7 @@ internal class FrescoImageLoader : ImageLoader {
2729

2830
override fun load(url: String, imageView: ImageView) {
2931
if (imageView is SimpleDraweeView) {
30-
imageView.setImageURI(Uri.parse(url))
32+
imageView.setImageURI(url.toUri())
3133
} else {
3234
GlobalRumMonitor.get(Datadog.getInstance()).addError(
3335
"Unable to load Fresco image in non Drawee View",
@@ -60,7 +62,10 @@ internal class FrescoImageLoader : ImageLoader {
6062
}
6163
.setMainDiskCacheConfig(diskConfigBuilder.build())
6264
.build()
63-
Fresco.initialize(context, config)
65+
val draweeConfig = DraweeConfig.newBuilder()
66+
.setDrawDebugOverlay(BuildConfig.DEBUG)
67+
.build()
68+
Fresco.initialize(context, config, draweeConfig)
6469
}
6570
}
6671
}

sample/kotlin/src/main/kotlin/com/datadog/android/sample/picture/GlideImageLoader.kt renamed to sample/kotlin/src/main/kotlin/com/datadog/android/sample/image/GlideImageLoader.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44
* Copyright 2016-Present Datadog, Inc.
55
*/
66

7-
package com.datadog.android.sample.picture
7+
package com.datadog.android.sample.image
88

99
import android.widget.ImageView
10-
import com.bumptech.glide.load.engine.DiskCacheStrategy
1110
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
1211
import com.bumptech.glide.request.transition.DrawableCrossFadeFactory
1312
import com.datadog.android.sample.R
@@ -25,7 +24,6 @@ internal class GlideImageLoader : ImageLoader {
2524
.transition(DrawableTransitionOptions.withCrossFade(factory))
2625
.transform(FailingTransformation())
2726
.error(R.drawable.ph_error)
28-
.diskCacheStrategy(DiskCacheStrategy.NONE)
2927
.into(imageView)
3028
}
3129
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/*
2+
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
3+
* This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
* Copyright 2016-Present Datadog, Inc.
5+
*/
6+
package com.datadog.android.sample.image
7+
8+
import android.os.Bundle
9+
import android.view.LayoutInflater
10+
import android.view.Menu
11+
import android.view.MenuInflater
12+
import android.view.MenuItem
13+
import android.view.View
14+
import android.view.ViewGroup
15+
import android.widget.ImageView
16+
import androidx.core.view.MenuProvider
17+
import androidx.fragment.app.Fragment
18+
import androidx.lifecycle.Lifecycle
19+
import androidx.lifecycle.ViewModelProvider
20+
import com.datadog.android.sample.Preferences
21+
import com.datadog.android.sample.R
22+
23+
internal class ImageFragment :
24+
Fragment(), View.OnClickListener {
25+
26+
private lateinit var image: ImageView
27+
private lateinit var frescoImage: ImageView
28+
private lateinit var rootView: View
29+
private lateinit var viewModel: ImageViewModel
30+
31+
// region Fragment
32+
33+
override fun onCreateView(
34+
inflater: LayoutInflater,
35+
container: ViewGroup?,
36+
savedInstanceState: Bundle?
37+
): View {
38+
rootView = inflater.inflate(R.layout.fragment_image, container, false)
39+
image = rootView.findViewById(R.id.image)
40+
frescoImage = rootView.findViewById(R.id.image_fresco)
41+
rootView.findViewById<View>(R.id.load_image).setOnClickListener(this)
42+
return rootView
43+
}
44+
45+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
46+
super.onViewCreated(view, savedInstanceState)
47+
viewModel = ViewModelProvider(this)[ImageViewModel::class.java]
48+
context?.let {
49+
val loaderType = Preferences.defaultPreferences(it).getImageLoader()
50+
viewModel.selectImageLoader(loaderType)
51+
updateImageViewVisibility(loaderType == ImageLoaderType.FRESCO)
52+
}
53+
requireActivity().addMenuProvider(imageLoaderMenuProvider, viewLifecycleOwner, Lifecycle.State.RESUMED)
54+
}
55+
56+
// endregion
57+
58+
// region View.OnClickListener
59+
60+
override fun onClick(v: View) {
61+
if (v.id == R.id.load_image) {
62+
val isFresco = viewModel.getImageLoader() == ImageLoaderType.FRESCO
63+
updateImageViewVisibility(isFresco)
64+
val activeImage = if (isFresco) frescoImage else image
65+
viewModel.loadImageInto(activeImage)
66+
}
67+
}
68+
69+
// endregion
70+
71+
// region Internal
72+
73+
private val imageLoaderMenuProvider = object : MenuProvider {
74+
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
75+
val currentType = viewModel.getImageLoader()
76+
menuInflater.inflate(R.menu.image_loader, menu)
77+
val disabled = when (currentType) {
78+
ImageLoaderType.COIL -> R.id.image_loader_coil
79+
ImageLoaderType.COIL3 -> R.id.image_loader_coil3
80+
ImageLoaderType.FRESCO -> R.id.image_loader_fresco
81+
ImageLoaderType.GLIDE -> R.id.image_loader_glide
82+
ImageLoaderType.PICASSO -> R.id.image_loader_picasso
83+
}
84+
menu.findItem(disabled).isEnabled = false
85+
}
86+
87+
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
88+
val type = when (menuItem.itemId) {
89+
R.id.image_loader_coil -> ImageLoaderType.COIL
90+
R.id.image_loader_coil3 -> ImageLoaderType.COIL3
91+
R.id.image_loader_fresco -> ImageLoaderType.FRESCO
92+
R.id.image_loader_glide -> ImageLoaderType.GLIDE
93+
R.id.image_loader_picasso -> ImageLoaderType.PICASSO
94+
else -> null
95+
}
96+
return if (type != null) {
97+
viewModel.selectImageLoader(type)
98+
activity?.invalidateOptionsMenu()
99+
context?.let {
100+
Preferences.defaultPreferences(it).setImageLoader(type)
101+
}
102+
true
103+
} else {
104+
false
105+
}
106+
}
107+
}
108+
109+
private fun updateImageViewVisibility(isFresco: Boolean) {
110+
image.visibility = if (isFresco) View.GONE else View.VISIBLE
111+
frescoImage.visibility = if (isFresco) View.VISIBLE else View.GONE
112+
}
113+
114+
// endregion
115+
}

0 commit comments

Comments
 (0)