ref: dc7187a5a02ad5a295abe79ddfe34054eff1f342
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 95 96 97 98 99 |
// 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.content.res.Configuration import android.content.res.TypedArray import android.graphics.Bitmap import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable 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 md = Adler32().let { it.update(nodeName.toByteArray()) it.value } val h = md % 359f val s = 1.0f val a: TypedArray = context.theme.obtainStyledAttributes( R.style.Theme_Bimba, intArrayOf(R.attr.randomColourLightness) ) val l = a.getFloat(0, when (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { Configuration.UI_MODE_NIGHT_YES -> 1f Configuration.UI_MODE_NIGHT_NO -> 0f Configuration.UI_MODE_NIGHT_UNDEFINED -> 0f else -> 0f }) a.recycle() val bg = AppCompatResources.getDrawable(context, R.drawable.stop)!!.mutate().apply { setTint(ColorUtils.HSLToColor(floatArrayOf(h, s, l))) } return BitmapDrawable( context.resources, bg.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 } } |