Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: CI

on:
pull_request:
branches: [main]
push:
branches: [main]

# Cancel previous runs on the same PR/branch when a new commit lands.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
# ----------------------------------------------------------------------
# Unit tests for all KMP modules (run on macOS — needed for iosSimulator).
# ----------------------------------------------------------------------
tests:
name: Tests (iosSimulatorArm64)
runs-on: macos-15
timeout-minutes: 30
steps:
- uses: actions/checkout@v4

- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'

- uses: gradle/actions/setup-gradle@v4

- name: Run all unit tests
run: ./gradlew allTests --stacktrace

- name: Upload test reports on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: test-reports
path: |
**/build/reports/tests/**
**/build/test-results/**
retention-days: 7

# ----------------------------------------------------------------------
# Android build smoke check (Linux is faster and cheaper than macOS).
# Catches androidApp + composeApp Android compile regressions without
# the cost of a full release pipeline.
# ----------------------------------------------------------------------
android-build:
name: Android assembleDebug
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4

- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'

- uses: gradle/actions/setup-gradle@v4

- name: Assemble debug
run: ./gradlew :androidApp:assembleDebug --stacktrace
1 change: 1 addition & 0 deletions composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ kotlin {
api(projects.core.common)
implementation(projects.core.domain)
implementation(projects.core.data)
implementation(projects.core.telemetry)

api(projects.feature.root)
implementation(projects.feature.home)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import ge.yet.blockblast.feature.settings.di.SettingsBindings
import ge.yet.blokblast.data.di.AndroidDataBindings
import ge.yet.blokblast.data.di.DataBindings
import ge.yet.blokblast.domain.di.DomainBindings
import ge.yet.blokblast.telemetry.di.TelemetryBindings

@DependencyGraph(
scope = AppScope::class,
Expand All @@ -21,6 +22,7 @@ import ge.yet.blokblast.domain.di.DomainBindings
DomainBindings::class,
DataBindings::class,
AndroidDataBindings::class,
TelemetryBindings::class,
ComposeAppBindings::class,
RootBindings::class,
HomeBindings::class,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ import ge.yet3.blokblast.component.button.PrimaryTerracottaButton
import ge.yet3.blokblast.component.modifier.ringShadow
import ge.yet3.blokblast.component.modifier.whisperShadow
import ge.yet3.blokblast.component.score.AnimatedCounter
import ge.yet3.blokblast.utils.formatScore
import com.app.common.utils.formatScore

/**
* The end-of-round overlay. Animates in with a custom dialog motion (spring
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import ge.yet3.blokblast.utils.formatScore
import com.app.common.utils.formatScore

/**
* Animated number readout — each digit slides vertically when it changes,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import ge.yet.blockblast.feature.settings.di.SettingsBindings
import ge.yet.blokblast.data.di.DataBindings
import ge.yet.blokblast.data.di.NativeDataBindings
import ge.yet.blokblast.domain.di.DomainBindings
import ge.yet.blokblast.telemetry.di.TelemetryBindings


@DependencyGraph(
Expand All @@ -21,6 +22,7 @@ import ge.yet.blokblast.domain.di.DomainBindings
DomainBindings::class,
DataBindings::class,
NativeDataBindings::class,
TelemetryBindings::class,
ComposeAppBindings::class,
RootBindings::class,
HomeBindings::class,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ge.yet3.blokblast.utils
package com.app.common.utils

import kotlin.math.abs

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.app.common.utils

import kotlin.test.Test
import kotlin.test.assertEquals

class FormatScoreTest {

@Test
fun zero() {
assertEquals("0", 0L.formatScore())
assertEquals("0", 0.formatScore())
}

@Test
fun under_thousand_no_separator() {
assertEquals("1", 1L.formatScore())
assertEquals("42", 42L.formatScore())
assertEquals("999", 999L.formatScore())
}

@Test
fun thousands() {
assertEquals("1,000", 1_000L.formatScore())
assertEquals("12,345", 12_345L.formatScore())
assertEquals("999,999", 999_999L.formatScore())
}

@Test
fun millions_and_above() {
assertEquals("1,000,000", 1_000_000L.formatScore())
assertEquals("123,456,789", 123_456_789L.formatScore())
}

@Test
fun negatives_have_leading_minus() {
assertEquals("-1", (-1L).formatScore())
assertEquals("-1,234", (-1_234L).formatScore())
assertEquals("-1,000,000", (-1_000_000L).formatScore())
}

@Test
fun int_overload_matches_long() {
assertEquals(1_234L.formatScore(), 1_234.formatScore())
assertEquals((-1).toLong().formatScore(), (-1).formatScore())
}

@Test
fun max_long_is_grouped() {
assertEquals("9,223,372,036,854,775,807", Long.MAX_VALUE.formatScore())
}
}
5 changes: 0 additions & 5 deletions core/data/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,6 @@ kotlin {

sourceSets {
androidMain.dependencies {
// Pins the unversioned Firebase Android artifacts pulled in
// transitively by dev.gitlive:firebase-crashlytics.
implementation(project.dependencies.platform(libs.firebase.android.bom))
implementation(libs.android.play.review)
implementation(libs.android.play.review.ktx)
}
Expand All @@ -19,8 +16,6 @@ kotlin {

implementation(libs.bundles.multiplatform.settings)

implementation(libs.gitlive.firebase.kotlin.crashlytics)
implementation(libs.gitlive.firebase.kotlin.analytics)
}
commonTest.dependencies {
implementation(libs.bundles.testing)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,11 @@ import dev.zacsweers.metro.BindingContainer
import dev.zacsweers.metro.ContributesTo
import dev.zacsweers.metro.Provides
import dev.zacsweers.metro.SingleIn
import ge.yet.blokblast.data.repository.AnalyticRepositoryImpl
import ge.yet.blokblast.data.repository.CrashlyticsRepositoryImpl
import ge.yet.blokblast.data.repository.DefaultAudioRepository
import ge.yet.blokblast.data.repository.DefaultVibrationRepository
import ge.yet.blokblast.data.repository.SettingsBackedGameSaveRepository
import ge.yet.blokblast.data.repository.SettingsBackedSettingsRepository
import ge.yet.blokblast.domain.repository.AnalyticRepository
import ge.yet.blokblast.domain.repository.AudioRepository
import ge.yet.blokblast.domain.repository.CrashlyticsRepository
import ge.yet.blokblast.domain.repository.GameSaveRepository
import ge.yet.blokblast.domain.repository.SettingsRepository
import ge.yet.blokblast.domain.repository.VibrationRepository
Expand Down Expand Up @@ -50,12 +46,6 @@ abstract class DataBindings {
@Binds
internal abstract val DefaultVibrationRepository.bindVibrationRepository: VibrationRepository

@Binds
internal abstract val CrashlyticsRepositoryImpl.bindCrashlyticsRepository: CrashlyticsRepository

@Binds
internal abstract val AnalyticRepositoryImpl.bindAnalyticRepository: AnalyticRepository

/**
* Widening binding so consumers that only need the base [Settings] API share
* the same singleton instance as [SettingsBackedSettingsRepository] — no
Expand Down
Loading
Loading