From 9a00f07362d8a619714eba42a206ce09f8042960 Mon Sep 17 00:00:00 2001 From: Ole-Morten Duesund Date: Tue, 10 Mar 2026 20:48:22 +0100 Subject: [PATCH 01/19] Fiks F-Droid-metadata: fjern punktum i kort beskrivelse, legg til ikon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit F-Droid krever at short_description.txt ikke slutter med punktum. Erstatt to setninger med én sammenhengende frase med tankestrek. Legg til 512x512 icon.png generert fra appens adaptive ikon-vektorer. Co-Authored-By: Claude Opus 4.6 --- fastlane/metadata/android/en-US/images/icon.png | Bin 0 -> 5451 bytes .../metadata/android/en-US/short_description.txt | 2 +- fastlane/metadata/android/nb-NO/images/icon.png | Bin 0 -> 5451 bytes .../metadata/android/nb-NO/short_description.txt | 2 +- fastlane/metadata/android/nn-NO/images/icon.png | Bin 0 -> 5451 bytes .../metadata/android/nn-NO/short_description.txt | 2 +- 6 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 fastlane/metadata/android/en-US/images/icon.png create mode 100644 fastlane/metadata/android/nb-NO/images/icon.png create mode 100644 fastlane/metadata/android/nn-NO/images/icon.png diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f156be8527ecaabe24ea721b4ab5ca9d8829bde6 GIT binary patch literal 5451 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%0D_s);U8jb6&0PHIclmp-$0 ze$WK(I5_sL|49NjF!5r%TEz;vhp3|1rlnjZsL7>;q~QXw5p(4-=jYQJ476I zP1i!VcQZ+UR7J`=KquyC!!#~)cywy8yRiRUA5F-8qO57L%byJ>6uVWAsoK}h@bPyC zjNA%Y&YM{h+PHNV%6f-Y?U`{&brjh68>=_k+u>_3H9Gd%V}aaF>?uiM4f9$TGpwTy zB5w%Y8)~goM{ir~ihYl4_ZXwof=2IAxQkBaj`UbleXp%4muZ)YfcD_1LrJ{&3^3%!(s1nK1- z#h)*j*Sg%zrRWisyL3{O1T~w9>=TK zZem8pYW8fs9H6ifLgiHu#P{Z8$h`get9ze5W|VE~I=L|8l5L7S!h&hd!gYIgDn+zJzIeiS~bp3=R<$~#01?|@Zzfc)<9fbLnxfRhyVQE}Ay-s3r zQ=tw)Jbc9DP0`QW!d~R$bm6VMdR?<{m#~$beA`g;&bzz7^vP=@PGK~D+{(T(%V+Ky zH}+pI7NsX@YXY`0H`+4u6#tO6wP&1s^s`E4e)HG2TGxjy^*>8ig@tgFW6OHN=Vp!& z=RNr(@gsv?$xo6qhH^JJJ5(O~PrYDTNu}aAMwfF!;24|RNp8bVK5d=f_*@k;sWd5 zd*~jsF-$vo6C3M!@?4R_P;Ef+QaCjpbkjrl=bm)U?>^>b&IG;ehC(EjLBUtkGG)#} z@7@f(t&RtpLp8yU zG;~vp?#i@Mi;aH0!|YsL6QI*F(QJUv&f7MmO^j~iFc`X$vKFQVr5-!ImEXvoOAQI+ za9=UtT$B?ZzI!)AySjRV(X|+CyF9i>X%QK(EBZC^^jqh6;mUJOSe8~sxNS&7S;%Cd z+p_(bZ267cn)h|TR+)p5(N80kEp~lV?E0v)IHDOuR0XCu2k-dLo4@wS0eFk;@*QY8Thd73r zb@_E_nXy&ICQc69jaBB;TWhcYjzK4<4Fokl&@8IXTFHArcV)ay?A0~XQoO2FTvy|Y z4ZTNGi`E6m`Phl|RrV0`E0d#+vB5S1rw^)LjNoZ?pdj+!8rc6?32;~T%`bQHkdltO RP<0eszGR|X_@~p|e*^aV?wtSt literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt index 1c45bf5..ae7bd40 100644 --- a/fastlane/metadata/android/en-US/short_description.txt +++ b/fastlane/metadata/android/en-US/short_description.txt @@ -1 +1 @@ -Find the nearest public emergency shelter in Norway. Works offline. +Find the nearest public emergency shelter in Norway — works offline diff --git a/fastlane/metadata/android/nb-NO/images/icon.png b/fastlane/metadata/android/nb-NO/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f156be8527ecaabe24ea721b4ab5ca9d8829bde6 GIT binary patch literal 5451 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%0D_s);U8jb6&0PHIclmp-$0 ze$WK(I5_sL|49NjF!5r%TEz;vhp3|1rlnjZsL7>;q~QXw5p(4-=jYQJ476I zP1i!VcQZ+UR7J`=KquyC!!#~)cywy8yRiRUA5F-8qO57L%byJ>6uVWAsoK}h@bPyC zjNA%Y&YM{h+PHNV%6f-Y?U`{&brjh68>=_k+u>_3H9Gd%V}aaF>?uiM4f9$TGpwTy zB5w%Y8)~goM{ir~ihYl4_ZXwof=2IAxQkBaj`UbleXp%4muZ)YfcD_1LrJ{&3^3%!(s1nK1- z#h)*j*Sg%zrRWisyL3{O1T~w9>=TK zZem8pYW8fs9H6ifLgiHu#P{Z8$h`get9ze5W|VE~I=L|8l5L7S!h&hd!gYIgDn+zJzIeiS~bp3=R<$~#01?|@Zzfc)<9fbLnxfRhyVQE}Ay-s3r zQ=tw)Jbc9DP0`QW!d~R$bm6VMdR?<{m#~$beA`g;&bzz7^vP=@PGK~D+{(T(%V+Ky zH}+pI7NsX@YXY`0H`+4u6#tO6wP&1s^s`E4e)HG2TGxjy^*>8ig@tgFW6OHN=Vp!& z=RNr(@gsv?$xo6qhH^JJJ5(O~PrYDTNu}aAMwfF!;24|RNp8bVK5d=f_*@k;sWd5 zd*~jsF-$vo6C3M!@?4R_P;Ef+QaCjpbkjrl=bm)U?>^>b&IG;ehC(EjLBUtkGG)#} z@7@f(t&RtpLp8yU zG;~vp?#i@Mi;aH0!|YsL6QI*F(QJUv&f7MmO^j~iFc`X$vKFQVr5-!ImEXvoOAQI+ za9=UtT$B?ZzI!)AySjRV(X|+CyF9i>X%QK(EBZC^^jqh6;mUJOSe8~sxNS&7S;%Cd z+p_(bZ267cn)h|TR+)p5(N80kEp~lV?E0v)IHDOuR0XCu2k-dLo4@wS0eFk;@*QY8Thd73r zb@_E_nXy&ICQc69jaBB;TWhcYjzK4<4Fokl&@8IXTFHArcV)ay?A0~XQoO2FTvy|Y z4ZTNGi`E6m`Phl|RrV0`E0d#+vB5S1rw^)LjNoZ?pdj+!8rc6?32;~T%`bQHkdltO RP<0eszGR|X_@~p|e*^aV?wtSt literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/nb-NO/short_description.txt b/fastlane/metadata/android/nb-NO/short_description.txt index d376c35..09ec3b6 100644 --- a/fastlane/metadata/android/nb-NO/short_description.txt +++ b/fastlane/metadata/android/nb-NO/short_description.txt @@ -1 +1 @@ -Finn nærmeste offentlige tilfluktsrom i Norge. Fungerer uten nett. +Finn nærmeste offentlige tilfluktsrom i Norge — fungerer uten nett diff --git a/fastlane/metadata/android/nn-NO/images/icon.png b/fastlane/metadata/android/nn-NO/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f156be8527ecaabe24ea721b4ab5ca9d8829bde6 GIT binary patch literal 5451 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%0D_s);U8jb6&0PHIclmp-$0 ze$WK(I5_sL|49NjF!5r%TEz;vhp3|1rlnjZsL7>;q~QXw5p(4-=jYQJ476I zP1i!VcQZ+UR7J`=KquyC!!#~)cywy8yRiRUA5F-8qO57L%byJ>6uVWAsoK}h@bPyC zjNA%Y&YM{h+PHNV%6f-Y?U`{&brjh68>=_k+u>_3H9Gd%V}aaF>?uiM4f9$TGpwTy zB5w%Y8)~goM{ir~ihYl4_ZXwof=2IAxQkBaj`UbleXp%4muZ)YfcD_1LrJ{&3^3%!(s1nK1- z#h)*j*Sg%zrRWisyL3{O1T~w9>=TK zZem8pYW8fs9H6ifLgiHu#P{Z8$h`get9ze5W|VE~I=L|8l5L7S!h&hd!gYIgDn+zJzIeiS~bp3=R<$~#01?|@Zzfc)<9fbLnxfRhyVQE}Ay-s3r zQ=tw)Jbc9DP0`QW!d~R$bm6VMdR?<{m#~$beA`g;&bzz7^vP=@PGK~D+{(T(%V+Ky zH}+pI7NsX@YXY`0H`+4u6#tO6wP&1s^s`E4e)HG2TGxjy^*>8ig@tgFW6OHN=Vp!& z=RNr(@gsv?$xo6qhH^JJJ5(O~PrYDTNu}aAMwfF!;24|RNp8bVK5d=f_*@k;sWd5 zd*~jsF-$vo6C3M!@?4R_P;Ef+QaCjpbkjrl=bm)U?>^>b&IG;ehC(EjLBUtkGG)#} z@7@f(t&RtpLp8yU zG;~vp?#i@Mi;aH0!|YsL6QI*F(QJUv&f7MmO^j~iFc`X$vKFQVr5-!ImEXvoOAQI+ za9=UtT$B?ZzI!)AySjRV(X|+CyF9i>X%QK(EBZC^^jqh6;mUJOSe8~sxNS&7S;%Cd z+p_(bZ267cn)h|TR+)p5(N80kEp~lV?E0v)IHDOuR0XCu2k-dLo4@wS0eFk;@*QY8Thd73r zb@_E_nXy&ICQc69jaBB;TWhcYjzK4<4Fokl&@8IXTFHArcV)ay?A0~XQoO2FTvy|Y z4ZTNGi`E6m`Phl|RrV0`E0d#+vB5S1rw^)LjNoZ?pdj+!8rc6?32;~T%`bQHkdltO RP<0eszGR|X_@~p|e*^aV?wtSt literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/nn-NO/short_description.txt b/fastlane/metadata/android/nn-NO/short_description.txt index 462d4b2..e567414 100644 --- a/fastlane/metadata/android/nn-NO/short_description.txt +++ b/fastlane/metadata/android/nn-NO/short_description.txt @@ -1 +1 @@ -Finn næraste offentlege tilfluktsrom i Noreg. Fungerer utan nett. +Finn næraste offentlege tilfluktsrom i Noreg — fungerer utan nett From 8e684f868e93671d7254218c28d467461762512a Mon Sep 17 00:00:00 2001 From: Ole-Morten Duesund Date: Tue, 10 Mar 2026 21:16:05 +0100 Subject: [PATCH 02/19] Flytt versjon direkte inn i build.gradle.kts for F-Droid-kompatibilitet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fdroidserver parser build.gradle.kts med regex for å finne versionCode og versionName. Den dynamiske Properties-lastingen fra version.properties ga "Couldn't find any version information". Erstatt med literale verdier som fdroidserver kan lese. Co-Authored-By: Claude Opus 4.6 --- app/build.gradle.kts | 14 ++------------ version.properties | 4 ---- 2 files changed, 2 insertions(+), 16 deletions(-) delete mode 100644 version.properties diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9ae75bc..3b0c67c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -6,11 +6,6 @@ plugins { id("com.google.devtools.ksp") } -// Read version from shared version.properties -val versionProps = Properties().apply { - rootProject.file("version.properties").inputStream().use { load(it) } -} - android { namespace = "no.naiv.tilfluktsrom" compileSdk = 35 @@ -19,13 +14,8 @@ android { applicationId = "no.naiv.tilfluktsrom" minSdk = 26 targetSdk = 35 - versionCode = versionProps.getProperty("versionCode").toInt() - versionName = "${versionProps.getProperty("versionMajor")}." + - "${versionProps.getProperty("versionMinor")}." + - versionProps.getProperty("versionPatch") - - // Make version available in BuildConfig - buildConfigField("String", "VERSION_DISPLAY", "\"$versionName\"") + versionCode = 9 + versionName = "1.6.0" } signingConfigs { diff --git a/version.properties b/version.properties deleted file mode 100644 index ff0fb89..0000000 --- a/version.properties +++ /dev/null @@ -1,4 +0,0 @@ -versionMajor=1 -versionMinor=6 -versionPatch=0 -versionCode=9 From f5c064ab92cdd694607df4c4afd96928e6da3780 Mon Sep 17 00:00:00 2001 From: Ole-Morten Duesund Date: Sat, 14 Mar 2026 13:15:14 +0100 Subject: [PATCH 03/19] Bump versjon til v1.6.1 (versionCode 10) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fjern dependency metadata frå APK-signeringsblokka (dependenciesInfo) for F-Droid-kompatibilitet Co-Authored-By: Claude Opus 4.6 (1M context) --- app/build.gradle.kts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3b0c67c..c04a5f9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,8 +14,13 @@ android { applicationId = "no.naiv.tilfluktsrom" minSdk = 26 targetSdk = 35 - versionCode = 9 - versionName = "1.6.0" + versionCode = 10 + versionName = "1.6.1" + } + + dependenciesInfo { + includeInApk = false + includeInBundle = false } signingConfigs { From f9f8ac3d60e361bed9f2d560adcce72235206580 Mon Sep 17 00:00:00 2001 From: Ole-Morten Duesund Date: Sat, 14 Mar 2026 18:30:36 +0100 Subject: [PATCH 04/19] Dokumenter byggvariantar og distribusjon i CLAUDE.md Co-Authored-By: Claude Opus 4.6 (1M context) --- CLAUDE.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 261261a..ec7e9a5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -53,6 +53,15 @@ no.naiv.tilfluktsrom/ ./gradlew assembleDebug ``` +## Build Variants +- **standard**: Includes Google Play Services for better GPS accuracy +- **fdroid**: AOSP-only, no Google dependencies + +## Distribution +- **Forgejo** (primary): `kode.naiv.no/olemd/tilfluktsrom` — releases with both APK variants +- **GitHub** (mirror): `github.com/olemd/tilfluktsrom` — automatically mirrored from Forgejo, do not push manually +- **F-Droid**: Metadata maintained in a separate fdroiddata repo (GitLab fork). F-Droid builds from source using the `fdroid` variant and signs with the F-Droid key. + ## i18n - Default (English): `res/values/strings.xml` - Norwegian Bokmål: `res/values-nb/strings.xml` From 6ba35add2f2352fd148bfe23a2a5ef2a9bb7bdec Mon Sep 17 00:00:00 2001 From: Ole-Morten Duesund Date: Mon, 23 Mar 2026 14:02:32 +0100 Subject: [PATCH 05/19] =?UTF-8?q?Legg=20til=20TalkBack-st=C3=B8tte=20og=20?= =?UTF-8?q?nordindikator=20p=C3=A5=20kompasset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tilgjengelegheit (Android + PWA): - Semantiske landemerke (header, main, aside, role=dialog) - aria-live-regionar for statusoppdateringar og lasteoverlegg - Fokusindikatorar (:focus-visible) og prefers-reduced-motion - Auka trykkmål til 48dp (infoknapp, oppdater, del, widget) - contentDescription på kart, kompass og framdriftsindikator - aria-current og role=listitem på tilfluktsromliste - Fokusfangst og fokusgjenoppretting i lasteoverlegg - Ikkje-farge-indikator (▶) for valt tilfluktsrom - Dynamisk lang-attributt basert på oppdaga språk - Lokaliserte aria-label (en/nb/nn) Nordindikator: - DirectionArrowView teiknar diskret «N»-markør på omkrinsen - Roterer uavhengig av hovudpila for kompasskalibrering - Berre på stor kompassvisning, ikkje minipila Co-Authored-By: Claude Opus 4.6 (1M context) --- .../java/no/naiv/tilfluktsrom/MainActivity.kt | 4 +- .../tilfluktsrom/ui/DirectionArrowView.kt | 58 +++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 18 ++++-- .../res/layout/widget_nearest_shelter.xml | 5 +- app/src/main/res/values-nb/strings.xml | 2 + app/src/main/res/values-nn/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + pwa/index.html | 34 +++++------ pwa/src/app.ts | 13 +++++ pwa/src/i18n/en.ts | 4 ++ pwa/src/i18n/i18n.ts | 7 ++- pwa/src/i18n/nb.ts | 4 ++ pwa/src/i18n/nn.ts | 4 ++ pwa/src/styles/main.css | 27 +++++++++ pwa/src/ui/compass-view.ts | 56 ++++++++++++++++++ pwa/src/ui/loading-overlay.ts | 17 +++++- pwa/src/ui/shelter-list.ts | 19 ++++-- 17 files changed, 240 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/no/naiv/tilfluktsrom/MainActivity.kt b/app/src/main/java/no/naiv/tilfluktsrom/MainActivity.kt index 2f11f27..e1fd8e0 100644 --- a/app/src/main/java/no/naiv/tilfluktsrom/MainActivity.kt +++ b/app/src/main/java/no/naiv/tilfluktsrom/MainActivity.kt @@ -522,10 +522,11 @@ class MainActivity : AppCompatActivity(), SensorEventListener { R.string.direction_arrow_description, distanceText ) - // Update compass view + // Update compass view (large arrow gets a north indicator) binding.compassDistanceText.text = distanceText binding.compassAddressText.text = selected.shelter.adresse binding.directionArrow.setDirection(arrowAngle) + binding.directionArrow.setNorthAngle(-deviceHeading) binding.directionArrow.contentDescription = getString( R.string.direction_arrow_description, distanceText ) @@ -840,6 +841,7 @@ class MainActivity : AppCompatActivity(), SensorEventListener { val arrowAngle = bearing - deviceHeading binding.directionArrow.setDirection(arrowAngle) + binding.directionArrow.setNorthAngle(-deviceHeading) binding.miniArrow.setDirection(arrowAngle) } diff --git a/app/src/main/java/no/naiv/tilfluktsrom/ui/DirectionArrowView.kt b/app/src/main/java/no/naiv/tilfluktsrom/ui/DirectionArrowView.kt index edd3154..aa50e8f 100644 --- a/app/src/main/java/no/naiv/tilfluktsrom/ui/DirectionArrowView.kt +++ b/app/src/main/java/no/naiv/tilfluktsrom/ui/DirectionArrowView.kt @@ -17,6 +17,9 @@ import no.naiv.tilfluktsrom.R * rotationAngle = shelterBearing - deviceHeading * This gives the direction the user needs to walk, adjusted for which * way they're currently facing. + * + * Optionally draws a discrete north indicator on the perimeter so users + * can validate compass calibration against a known direction. */ class DirectionArrowView @JvmOverloads constructor( context: Context, @@ -25,6 +28,7 @@ class DirectionArrowView @JvmOverloads constructor( ) : View(context, attrs, defStyleAttr) { private var rotationAngle = 0f + private var northAngle = Float.NaN private val arrowPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { color = context.getColor(R.color.shelter_primary) @@ -37,7 +41,18 @@ class DirectionArrowView @JvmOverloads constructor( strokeWidth = 4f } + private val northPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { + color = 0x99CFD8DC.toInt() // text_secondary at ~60% opacity + style = Paint.Style.FILL + } + + private val northTextPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { + color = 0x99CFD8DC.toInt() + textAlign = Paint.Align.CENTER + } + private val arrowPath = Path() + private val northPath = Path() /** * Set the rotation angle in degrees. @@ -48,6 +63,16 @@ class DirectionArrowView @JvmOverloads constructor( invalidate() } + /** + * Set the angle to north in the view's coordinate space. + * This is typically -deviceHeading (where north is on screen). + * Set to Float.NaN to hide the north indicator. + */ + fun setNorthAngle(degrees: Float) { + northAngle = degrees + invalidate() + } + override fun onDraw(canvas: Canvas) { super.onDraw(canvas) @@ -55,6 +80,11 @@ class DirectionArrowView @JvmOverloads constructor( val cy = height / 2f val size = minOf(width, height) * 0.4f + // Draw north indicator first (behind the main arrow) + if (!northAngle.isNaN()) { + drawNorthIndicator(canvas, cx, cy, size) + } + canvas.save() canvas.rotate(rotationAngle, cx, cy) @@ -74,4 +104,32 @@ class DirectionArrowView @JvmOverloads constructor( canvas.restore() } + + /** + * Draw a small north indicator: a tiny triangle and "N" label + * placed on the perimeter of the view, pointing inward toward center. + */ + private fun drawNorthIndicator(canvas: Canvas, cx: Float, cy: Float, arrowSize: Float) { + val radius = arrowSize * 1.35f + val tickSize = arrowSize * 0.1f + + // Scale "N" text relative to the view + northTextPaint.textSize = arrowSize * 0.18f + + canvas.save() + canvas.rotate(northAngle, cx, cy) + + // Small triangle at the top of the perimeter circle + northPath.reset() + northPath.moveTo(cx, cy - radius) + northPath.lineTo(cx - tickSize, cy - radius - tickSize * 1.8f) + northPath.lineTo(cx + tickSize, cy - radius - tickSize * 1.8f) + northPath.close() + canvas.drawPath(northPath, northPaint) + + // "N" label just outside the triangle + canvas.drawText("N", cx, cy - radius - tickSize * 2.2f, northTextPaint) + + canvas.restore() + } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d5c3c30..4c8701e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -31,14 +31,15 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" + android:accessibilityLiveRegion="polite" android:textColor="@color/status_text" android:textSize="12sp" tools:text="@string/status_ready" /> @@ -80,6 +82,7 @@ android:layout_width="match_parent" android:layout_height="0dp" android:background="@color/compass_bg" + android:contentDescription="@string/a11y_compass" android:visibility="gone" app:layout_constraintTop_toBottomOf="@id/statusBar" app:layout_constraintBottom_toTopOf="@id/bottomSheet"> @@ -223,8 +226,8 @@ diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index bab61b6..3dc77cf 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -67,6 +67,8 @@ Retning til tilfluktsrom, %s unna %1$s, %2$s, %3$d plasser Upresist kompass - %s + Tilfluktsromkart + Kompassnavigasjon Sivilforsvarsinformasjon diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index a4de381..129289d 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -67,6 +67,8 @@ Retning til tilfluktsrom, %s unna %1$s, %2$s, %3$d plassar Upresis kompass - %s + Tilfluktsromkart + Kompassnavigasjon Sivilforsvarsinformasjon diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 43b3945..c742ab4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -67,6 +67,8 @@ Direction to shelter, %s away %1$s, %2$s, %3$d places Low accuracy - %s + Shelter map + Compass navigation Civil defense information diff --git a/pwa/index.html b/pwa/index.html index bfbd7e6..c6088c1 100644 --- a/pwa/index.html +++ b/pwa/index.html @@ -1,5 +1,5 @@ - + @@ -16,47 +16,47 @@
-
- +
+ -
-
-
+
+
+ -
+ -
+ -
-
+
+
+
-
-
-
+