Skip to content

Instantly share code, notes, and snippets.

@rt4914
Created August 5, 2020 03:08
Show Gist options
  • Save rt4914/ea26d973a9a62b682bc93e61c06e71ef to your computer and use it in GitHub Desktop.
Save rt4914/ea26d973a9a62b682bc93e61c06e71ef to your computer and use it in GitHub Desktop.
This `LessonThumbnailImageView` is similar to `ImageRegionSelectionInteractionView`
package org.oppia.app.customview
import android.content.Context
import android.util.AttributeSet
import android.widget.ImageView
import androidx.appcompat.widget.AppCompatImageView
import androidx.fragment.app.FragmentManager
import org.oppia.app.fragment.InjectableFragment
import org.oppia.app.model.LessonThumbnail
import org.oppia.util.gcsresource.DefaultResourceBucketName
import org.oppia.util.parser.DefaultGcsPrefix
import org.oppia.util.parser.ImageLoader
import org.oppia.util.parser.ImageViewTarget
import org.oppia.util.parser.RevisionCardHtmlParserEntityType
import org.oppia.util.parser.ThumbnailDownloadUrlTemplate
import javax.inject.Inject
/** A custom [AppCompatImageView] used to show lesson thumbnails. */
class LessonThumbnailImageView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : AppCompatImageView(context, attrs, defStyleAttr) {
val imageView: ImageView = this
private lateinit var lessonThumbnail: LessonThumbnail
@Inject
lateinit var imageLoader: ImageLoader
@Inject
@field:RevisionCardHtmlParserEntityType
lateinit var entityType: String
@Inject
@field:DefaultResourceBucketName
lateinit var resourceBucketName: String
@Inject
@field:ThumbnailDownloadUrlTemplate
lateinit var thumbnailDownloadUrlTemplate: String
@Inject
@field:DefaultGcsPrefix
lateinit var gcsPrefix: String
private lateinit var entityId: String
/**
* Sets the URL for the image & initiates loading it. This is intended to be called via data-binding.
*/
fun setLessonThumbnail(lessonThumbnail: LessonThumbnail) {
this.lessonThumbnail = lessonThumbnail
if (lessonThumbnail.thumbnailFilename.isNotEmpty()) {
loadImage(lessonThumbnail.thumbnailFilename)
}
}
/** Loads an image using Glide from [filename]. */
private fun loadImage(filename: String) {
val imageName = String.format(
thumbnailDownloadUrlTemplate,
entityType,
entityId,
filename
)
val imageUrl = "$gcsPrefix/$resourceBucketName/$imageName"
if (imageUrl.endsWith("svg", ignoreCase = true)) {
imageLoader.loadSvg(imageUrl, ImageViewTarget(this))
} else {
imageLoader.loadBitmap(imageUrl, ImageViewTarget(this))
}
}
fun setEntityId(entityId: String) {
this.entityId = entityId
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
FragmentManager.findFragment<InjectableFragment>(this)
.createViewComponent(this)
.inject(this)
}
}
@rt4914
Copy link
Author

rt4914 commented Aug 5, 2020

package org.oppia.app.customview

import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatImageView
import androidx.fragment.app.FragmentManager
import org.oppia.app.R
import org.oppia.app.fragment.InjectableFragment
import org.oppia.app.model.LessonThumbnail
import org.oppia.app.model.LessonThumbnailGraphic
import org.oppia.util.gcsresource.DefaultResourceBucketName
import org.oppia.util.parser.DefaultGcsPrefix
import org.oppia.util.parser.ImageLoader
import org.oppia.util.parser.ImageViewTarget
import org.oppia.util.parser.ThumbnailDownloadUrlTemplate
import javax.inject.Inject

/** A custom [AppCompatImageView] used to show lesson thumbnails. */
class LessonThumbnailImageView @JvmOverloads constructor(
  context: Context,
  attrs: AttributeSet? = null,
  defStyleAttr: Int = 0
) : AppCompatImageView(context, attrs, defStyleAttr) {

  private var imageView = this
  private lateinit var lessonThumbnail: LessonThumbnail
  private lateinit var entityId: String
  private lateinit var entityType: String

  @Inject
  lateinit var imageLoader: ImageLoader

  @Inject
  @field:DefaultResourceBucketName
  lateinit var resourceBucketName: String

  @Inject
  @field:ThumbnailDownloadUrlTemplate
  lateinit var thumbnailDownloadUrlTemplate: String

  @Inject
  @field:DefaultGcsPrefix
  lateinit var gcsPrefix: String

  fun setLessonThumbnail(lessonThumbnail: LessonThumbnail){
    this.lessonThumbnail = lessonThumbnail
    check1()
  }

  fun setEntityId(entityId: String){
    this.entityId = entityId
    check1()
  }

  fun setEntityType(entityType: String){
    this.entityType = entityType
    check1()
  }

  fun check1(){
    if(::lessonThumbnail.isInitialized && ::entityId.isInitialized && ::entityType.isInitialized){
      loadLessonThumbnail()
    }
  }

  /**
   * Sets the URL for the image & initiates loading it. This is intended to be called via data-binding.
   */
  private fun loadLessonThumbnail() {
    if (lessonThumbnail.thumbnailFilename.isNotEmpty()) {
      loadImage(lessonThumbnail.thumbnailFilename)
    } else {
      imageView.setImageResource(getLessonDrawableResource(lessonThumbnail))
    }
    imageView.setBackgroundColor(lessonThumbnail.backgroundColorRgb)
  }

  /** Loads an image using Glide from [filename]. */
  private fun loadImage(filename: String) {
    val imageName = String.format(
      thumbnailDownloadUrlTemplate,
      entityType,
      entityId,
      filename
    )
    val imageUrl = "$gcsPrefix/$resourceBucketName/$imageName"
    if (imageUrl.endsWith("svg", ignoreCase = true)) {
      imageLoader.loadSvg(imageUrl, ImageViewTarget(this))
    } else {
      imageLoader.loadBitmap(imageUrl, ImageViewTarget(this))
    }
  }

  override fun onAttachedToWindow() {
    super.onAttachedToWindow()
    FragmentManager.findFragment<InjectableFragment>(this)
      .createViewComponent(this)
      .inject(this)
  }

  private fun getLessonDrawableResource(lessonThumbnail: LessonThumbnail): Int {
    return when (lessonThumbnail.thumbnailGraphic) {
      LessonThumbnailGraphic.BAKER ->
        R.drawable.lesson_thumbnail_graphic_baker
      LessonThumbnailGraphic.CHILD_WITH_BOOK ->
        R.drawable.lesson_thumbnail_graphic_child_with_book
      LessonThumbnailGraphic.CHILD_WITH_CUPCAKES ->
        R.drawable.lesson_thumbnail_graphic_child_with_cupcakes
      LessonThumbnailGraphic.CHILD_WITH_FRACTIONS_HOMEWORK ->
        R.drawable.lesson_thumbnail_graphic_child_with_fractions_homework
      LessonThumbnailGraphic.DUCK_AND_CHICKEN ->
        R.drawable.lesson_thumbnail_graphic_duck_and_chicken
      LessonThumbnailGraphic.PERSON_WITH_PIE_CHART ->
        R.drawable.lesson_thumbnail_graphic_person_with_pie_chart
      LessonThumbnailGraphic.IDENTIFYING_THE_PARTS_OF_A_FRACTION ->
        R.drawable.topic_fractions_01
      LessonThumbnailGraphic.WRITING_FRACTIONS ->
        R.drawable.topic_fractions_02
      LessonThumbnailGraphic.EQUIVALENT_FRACTIONS ->
        R.drawable.topic_fractions_03
      LessonThumbnailGraphic.MIXED_NUMBERS_AND_IMPROPER_FRACTIONS ->
        R.drawable.topic_fractions_04
      LessonThumbnailGraphic.COMPARING_FRACTIONS ->
        R.drawable.topic_fractions_05
      LessonThumbnailGraphic.ADDING_AND_SUBTRACTING_FRACTIONS ->
        R.drawable.topic_fractions_06
      LessonThumbnailGraphic.MULTIPLYING_FRACTIONS ->
        R.drawable.topic_fractions_07
      LessonThumbnailGraphic.DIVIDING_FRACTIONS ->
        R.drawable.topic_fractions_08
      LessonThumbnailGraphic.DERIVE_A_RATIO ->
        R.drawable.topic_ratios_01
      LessonThumbnailGraphic.WHAT_IS_A_FRACTION ->
        R.drawable.topic_fractions_01
      LessonThumbnailGraphic.FRACTION_OF_A_GROUP ->
        R.drawable.topic_fractions_02
      LessonThumbnailGraphic.ADDING_FRACTIONS ->
        R.drawable.topic_fractions_03
      LessonThumbnailGraphic.MIXED_NUMBERS ->
        R.drawable.topic_fractions_04
      else ->
        R.drawable.topic_fractions_01
    }
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment