|
| 1 | +package io.snabble.sdk.coupons |
| 2 | + |
| 3 | +import android.graphics.Color |
| 4 | +import android.os.Parcelable |
| 5 | +import android.util.DisplayMetrics |
| 6 | +import androidx.annotation.ColorInt |
| 7 | +import com.google.gson.annotations.SerializedName |
| 8 | +import io.snabble.sdk.ColorUtils.parseColor |
| 9 | +import io.snabble.sdk.Snabble |
| 10 | +import kotlinx.parcelize.IgnoredOnParcel |
| 11 | +import kotlinx.parcelize.Parcelize |
| 12 | +import java.time.ZonedDateTime |
| 13 | + |
| 14 | +@Parcelize |
| 15 | +data class Coupon ( |
| 16 | + val id: String, |
| 17 | + val name: String, |
| 18 | + val description: String?, |
| 19 | + val promotionDescription: String?, |
| 20 | + val type: CouponType, |
| 21 | + val codes: List<CouponCode>?, |
| 22 | + val code: String?, |
| 23 | + @SerializedName("validFrom") |
| 24 | + private val _validFrom: String?, |
| 25 | + @SerializedName("validUntil") |
| 26 | + private val _validUntil: String?, |
| 27 | + val image: CouponImage?, |
| 28 | + val disclaimer: String?, |
| 29 | + val colors: Map<String, String>?, |
| 30 | +) : Parcelable { |
| 31 | + val isValid: Boolean |
| 32 | + get() = when(type) { |
| 33 | + CouponType.DIGITAL -> image != null |
| 34 | + CouponType.MANUAL -> name != null |
| 35 | + CouponType.PRINTED -> true |
| 36 | + } |
| 37 | + |
| 38 | + @IgnoredOnParcel |
| 39 | + val validFrom: ZonedDateTime? |
| 40 | + get() = _validFrom?.let { ZonedDateTime.parse(_validFrom)} |
| 41 | + |
| 42 | + @IgnoredOnParcel |
| 43 | + val validUntil: ZonedDateTime? |
| 44 | + get() = _validUntil?.let { ZonedDateTime.parse(_validUntil)} |
| 45 | + |
| 46 | + @IgnoredOnParcel |
| 47 | + val backgroundColor |
| 48 | + get() = parseColor(colors?.get("background"), Color.WHITE) |
| 49 | + |
| 50 | + @IgnoredOnParcel |
| 51 | + val textColor |
| 52 | + get() = parseColor(colors?.get("foreground"), Color.BLACK) |
| 53 | +} |
| 54 | + |
| 55 | +@Parcelize |
| 56 | +data class CouponCode ( |
| 57 | + val code: String, |
| 58 | + val template: String, |
| 59 | +) : Parcelable |
| 60 | + |
| 61 | +@Parcelize |
| 62 | +data class CouponImage ( |
| 63 | + val name: String?, |
| 64 | + val formats: List<CouponImageFormats>, |
| 65 | +) : Parcelable { |
| 66 | + val bestResolutionUrl: String |
| 67 | + get() { |
| 68 | + val res = Snabble.application.resources |
| 69 | + |
| 70 | + val mdpiRange = 0..DisplayMetrics.DENSITY_MEDIUM |
| 71 | + val hdpiRange = DisplayMetrics.DENSITY_MEDIUM..DisplayMetrics.DENSITY_HIGH |
| 72 | + val xhdpiRange = DisplayMetrics.DENSITY_HIGH..DisplayMetrics.DENSITY_XHIGH |
| 73 | + val xxhdpiRange = DisplayMetrics.DENSITY_XHIGH..DisplayMetrics.DENSITY_XXHIGH |
| 74 | + val xxxhdpiRange = DisplayMetrics.DENSITY_XXXHIGH..Int.MAX_VALUE |
| 75 | + |
| 76 | + val preferredDpi = when (res.displayMetrics.densityDpi) { |
| 77 | + in mdpiRange -> "mdpi" |
| 78 | + in hdpiRange -> "hdpi" |
| 79 | + in xhdpiRange -> "xhdpi" |
| 80 | + in xxhdpiRange -> "xxhdpi" |
| 81 | + in xxxhdpiRange -> "xxxhdpi" |
| 82 | + else -> null |
| 83 | + } |
| 84 | + |
| 85 | + val image = formats |
| 86 | + .filter { it.contentType == "image/webp" } |
| 87 | + .firstOrNull { it.size == preferredDpi } |
| 88 | + ?: this.formats.last() |
| 89 | + |
| 90 | + return image.url |
| 91 | + } |
| 92 | +} |
| 93 | + |
| 94 | +@Parcelize |
| 95 | +data class CouponImageFormats ( |
| 96 | + val contentType: String, |
| 97 | + val width: Int?, |
| 98 | + val height: Int?, |
| 99 | + val size: String, |
| 100 | + val url: String, |
| 101 | +) : Parcelable |
| 102 | + |
| 103 | +enum class CouponType { |
| 104 | + @SerializedName("manual") MANUAL, |
| 105 | + @SerializedName("printed") PRINTED, |
| 106 | + @SerializedName("digital") DIGITAL, |
| 107 | +} |
0 commit comments