ref: 3877e1e462c33778518e8c48dbf9e53076c00a53
app/src/main/java/xyz/apiote/bimba/czwek/repo/Stop.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
// SPDX-FileCopyrightText: Adam Evyčędo // // SPDX-License-Identifier: GPL-3.0-or-later package xyz.apiote.bimba.czwek.repo import android.content.Context import android.graphics.Bitmap import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable import androidx.appcompat.content.res.AppCompatResources import androidx.core.graphics.ColorUtils import androidx.core.graphics.drawable.toBitmap import xyz.apiote.bimba.czwek.R import xyz.apiote.bimba.czwek.api.StopV1 import xyz.apiote.bimba.czwek.api.StopV2 import xyz.apiote.bimba.czwek.dpToPixelI import java.util.zip.Adler32 data class Stop( val code: String, val name: String, val nodeName: String, val zone: String, val feedID: String?, val position: Position, val changeOptions: List<ChangeOption> ) : Queryable, Locatable { override fun icon(context: Context, scale: Float): Drawable { val saturationArray = arrayOf(0.5f, 0.65f, 0.8f) val sal = saturationArray.size val lightnessArray = arrayOf(.5f) val lal = lightnessArray.size val md = Adler32().let { it.update(nodeName.toByteArray()) it.value } val h = md % 359f val s = saturationArray[(md / 360 % sal).toInt()] val l = lightnessArray[(md / 360 / sal % lal).toInt()] val fg = AppCompatResources.getDrawable(context, R.drawable.stop) val bg = AppCompatResources.getDrawable(context, R.drawable.stop_bg)!!.mutate().apply { setTint(ColorUtils.HSLToColor(arrayOf(h, s, l).toFloatArray())) } return BitmapDrawable( context.resources, LayerDrawable(arrayOf(bg, fg)).mutate() .toBitmap(dpToPixelI(24f / scale), dpToPixelI(24f / scale), Bitmap.Config.ARGB_8888) ) } override fun id(): String = code override fun location(): Position = position constructor(s: StopV1) : this( s.code, s.name, s.name, s.zone, null, Position(s.position), s.changeOptions.map { ChangeOption(it) }) constructor(s: StopV2) : this( s.code, s.name, s.nodeName, s.zone, s.feedID, Position(s.position), s.changeOptions.map { ChangeOption(it) }) fun changeOptions(context: Context): Pair<String, String> = Pair(changeOptions.groupBy { it.line } .map { Pair(it.key, it.value.joinToString { co -> co.headsign }) }.joinToString { context.getString( R.string.vehicle_headsign, it.first, it.second ) }, changeOptions.groupBy { it.line } .map { Pair(it.key, it.value.joinToString { co -> co.headsign }) }.joinToString { context.getString( R.string.vehicle_headsign_content_description, it.first, it.second ) }) override fun toString(): String { var result = "$name ($code) [$zone] $position\n" for (chOpt in changeOptions) result += "${chOpt.line} → ${chOpt.headsign}\n" return result } } |