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
30 changes: 24 additions & 6 deletions .github/workflows/quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,33 @@ jobs:
detekt:
name: Static Analysis (Detekt)
runs-on: ubuntu-latest
env:
DETEKT_VERSION: 1.23.8
steps:
- uses: actions/checkout@v6
- name: Run Detekt
uses: detekt/detekt-action@v2

- name: Set up JDK 21
uses: actions/setup-java@v5
with:
config: detekt.yml
report-sarif: true

java-version: '21'
distribution: 'temurin'

- name: Download Detekt
run: |
BASE="https://github.com/detekt/detekt/releases/download/v${DETEKT_VERSION}"
curl -sSfL -o detekt-cli.jar "$BASE/detekt-cli-${DETEKT_VERSION}-all.jar"
curl -sSfL -o detekt-formatting.jar "$BASE/detekt-formatting-${DETEKT_VERSION}.jar"

- name: Run Detekt
run: |
java -jar detekt-cli.jar \
--config detekt.yml \
--build-upon-default-config \
--plugins detekt-formatting.jar \
--baseline detekt-baseline.xml \
--input app/src/main/java \
--report sarif:results.sarif

- name: Upload SARIF to GitHub Security
uses: github/codeql-action/upload-sarif@v3
if: always()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package com.skeler.scanely

import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4

import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Assert.*
import org.junit.Test
import org.junit.runner.RunWith

import org.junit.Assert.*

@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@ class PaddleFixesTest {
repeat(lineCount) { i ->
canvas.drawText(
"Line ${i + 1}: the quick brown fox jumps over the lazy dog",
100f, 160f + i * 64f, paint
100f,
160f + i * 64f,
paint
)
}
return bmp
Expand Down Expand Up @@ -98,11 +100,13 @@ class PaddleFixesTest {
)
assertEquals(
"deferred close must run once inference drains",
0, engine.openSessionCount()
0,
engine.openSessionCount()
)
assertEquals(
"engine must recover by recreating sessions",
quads.size, engine.detect(page, 960).size
quads.size,
engine.detect(page, 960).size
)
crops.forEach { it.recycle() }
page.recycle()
Expand All @@ -125,7 +129,8 @@ class PaddleFixesTest {

assertEquals(
"correction did not restore upright: $results",
0, residual
0,
residual
)
val quads = engine.detect(corrected, 960)
assertTrue(
Expand All @@ -145,8 +150,14 @@ class PaddleFixesTest {
val charset = listOf("", "a", "b", " ")

val soft = floatArrayOf(
0.05f, 0.80f, 0.10f, 0.05f,
0.90f, 0.04f, 0.03f, 0.03f
0.05f,
0.80f,
0.10f,
0.05f,
0.90f,
0.04f,
0.03f,
0.03f
)
assertTrue(CtcDecoder.isSoftmaxed(soft, 4))
val softLine = CtcDecoder.decodeBatch(soft, 1, 2, 4, charset).single()
Expand All @@ -156,8 +167,14 @@ class PaddleFixesTest {
// Raw logits whose max lands in [0,1] — the old range heuristic
// would have reported 0.9 as a probability.
val raw = floatArrayOf(
0.5f, 0.9f, -3.0f, -2.0f,
5.0f, 1.0f, 0.0f, 0.0f
0.5f,
0.9f,
-3.0f,
-2.0f,
5.0f,
1.0f,
0.0f,
0.0f
)
assertFalse(CtcDecoder.isSoftmaxed(raw, 4))
val rawLine = CtcDecoder.decodeBatch(raw, 1, 2, 4, charset).single()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ class PaddleOcrBenchmarkTest {
repeat(35) { i ->
canvas.drawText(
"Line ${i + 1}: the quick brown fox jumps over the lazy dog 0123456789",
120f, 200f + i * 58f, paint
120f,
200f + i * 58f,
paint
)
}
return bmp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,8 @@ class PdfOcrResolutionTest {
val doc = PdfDocument()
val page = doc.startPage(PdfDocument.PageInfo.Builder(595, 842, 1).create())
page.canvas.drawBitmap(
photo, null,
photo,
null,
android.graphics.Rect(0, 0, 595, 842),
Paint(Paint.FILTER_BITMAP_FLAG)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
import okhttp3.OkHttpClient
import org.json.JSONObject
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.json.JSONObject
import org.junit.Before
import org.junit.Test

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,9 @@ class PaddleStructureTest {
repeat(8) { i ->
canvas.drawText(
"Revenue grew steadily across all regions during the quarter, with strong",
80f, 220f + i * 30f, text
80f,
220f + i * 30f,
text
)
}

Expand All @@ -87,7 +89,9 @@ class PaddleStructureTest {
repeat(6) { i ->
canvas.drawText(
"Costs remained flat while margins improved year over year.",
80f, 900f + i * 30f, text
80f,
900f + i * 30f,
text
)
}
return bitmap
Expand Down Expand Up @@ -137,7 +141,11 @@ class PaddleStructureTest {

val page = document()
val crop = Bitmap.createBitmap(
page, tableLeft, tableTop, columns * columnWidth, rows * rowHeight
page,
tableLeft,
tableTop,
columns * columnWidth,
rows * rowHeight
)
val structure = engine.recognizeTable(crop)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import android.graphics.pdf.PdfRenderer
import android.os.ParcelFileDescriptor
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import java.io.File
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
import java.io.File

@RunWith(AndroidJUnit4::class)
class MarkdownPdfTest {
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/skeler/scanely/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import com.skeler.scanely.core.common.CompositionLocals
import com.skeler.scanely.navigation.ScanelyNavigation
import com.skeler.scanely.settings.presentation.viewmodel.SettingsViewModel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import androidx.core.net.toUri
import android.net.wifi.WifiManager
import android.net.wifi.WifiNetworkSuggestion
import android.os.Build
import android.provider.CalendarContract
import android.provider.ContactsContract
import android.provider.Settings
import android.widget.Toast
import androidx.core.net.toUri
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.TimeZone
Expand Down Expand Up @@ -108,7 +108,7 @@ object ActionExecutor {

val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
wifiManager.addNetworkSuggestions(listOf(suggestion))

val intent = Intent(Settings.ACTION_WIFI_SETTINGS)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
Expand Down
22 changes: 11 additions & 11 deletions app/src/main/java/com/skeler/scanely/core/actions/ScanAction.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.skeler.scanely.core.actions

import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.TextSnippet
import androidx.compose.material.icons.rounded.Call
import androidx.compose.material.icons.rounded.ContentCopy
import androidx.compose.material.icons.rounded.Email
Expand All @@ -9,7 +10,6 @@ import androidx.compose.material.icons.rounded.Link
import androidx.compose.material.icons.rounded.Person
import androidx.compose.material.icons.rounded.RestaurantMenu
import androidx.compose.material.icons.rounded.Sms
import androidx.compose.material.icons.automirrored.rounded.TextSnippet
import androidx.compose.material.icons.rounded.Wifi
import androidx.compose.ui.graphics.vector.ImageVector

Expand All @@ -20,25 +20,25 @@ enum class WifiType {
}

sealed class ScanAction {

abstract val label: String
abstract val icon: ImageVector

data class OpenUrl(val url: String) : ScanAction() {
override val label: String = "Open Link"
override val icon: ImageVector = Icons.Rounded.Link
}

data class CopyText(val text: String, val displayLabel: String = "Copy") : ScanAction() {
override val label: String = displayLabel
override val icon: ImageVector = Icons.Rounded.ContentCopy
}

data class CallPhone(val number: String) : ScanAction() {
override val label: String = "Call"
override val icon: ImageVector = Icons.Rounded.Call
}

data class SendEmail(
val email: String,
val subject: String? = null,
Expand All @@ -47,7 +47,7 @@ sealed class ScanAction {
override val label: String = "Send Email"
override val icon: ImageVector = Icons.Rounded.Email
}

data class ConnectWifi(
val ssid: String,
val password: String?,
Expand All @@ -56,15 +56,15 @@ sealed class ScanAction {
override val label: String = "Connect to WiFi"
override val icon: ImageVector = Icons.Rounded.Wifi
}

data class SendSms(
val number: String,
val message: String? = null
) : ScanAction() {
override val label: String = "Send SMS"
override val icon: ImageVector = Icons.Rounded.Sms
}

data class AddContact(
val name: String?,
val phone: String?,
Expand All @@ -74,12 +74,12 @@ sealed class ScanAction {
override val label: String = "Add Contact"
override val icon: ImageVector = Icons.Rounded.Person
}

data class ShowRaw(val text: String) : ScanAction() {
override val label: String = "View Text"
override val icon: ImageVector = Icons.AutoMirrored.Rounded.TextSnippet
}

/** startRaw/endRaw: ML Kit CalendarDateTime, e.g. "20240604T090000Z". */
data class AddEvent(
val title: String?,
Expand Down
Loading
Loading