Skip to content

Commit

Permalink
Reference app supports verification logs (#28)
Browse files Browse the repository at this point in the history
This configures the app to store data using SQLite and adds a view to display and export it.
This won't be used yet, but we are letting it ready for further development.
  • Loading branch information
Juliano1612 committed Sep 23, 2024
1 parent 236f0a0 commit ba478c8
Show file tree
Hide file tree
Showing 23 changed files with 604 additions and 8 deletions.
5 changes: 3 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id("com.android.application") version "8.2.0" apply false
id("com.android.application") version "8.5.1" apply false
id("org.jetbrains.kotlin.android") version "1.9.23" apply false
id("com.android.library") version "8.2.0" apply false
id("com.android.library") version "8.5.1" apply false
id("com.gradleup.nmcp") version "0.0.4" apply true
id("com.google.devtools.ksp") version "1.9.23-1.0.20" apply false
}
7 changes: 7 additions & 0 deletions example/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("com.google.devtools.ksp")
}

android {
Expand Down Expand Up @@ -50,6 +51,12 @@ android {
}

dependencies {
val roomVersion = "2.4.0"

implementation("androidx.room:room-runtime:$roomVersion")
ksp("androidx.room:room-compiler:$roomVersion")
implementation("androidx.room:room-ktx:$roomVersion")
annotationProcessor("androidx.room:room-compiler:$roomVersion")
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
implementation("androidx.activity:activity-compose:1.8.2")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
package com.spruceid.mobilesdkexample

import android.app.Application
import android.net.Uri
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import com.spruceid.mobile.sdk.CredentialsViewModel
import com.spruceid.mobilesdkexample.db.AppDatabase
import com.spruceid.mobilesdkexample.db.VerificationActivityLogsRepository
import com.spruceid.mobilesdkexample.navigation.SetupNavGraph
import com.spruceid.mobilesdkexample.ui.theme.Bg
import com.spruceid.mobilesdkexample.ui.theme.MobileSdkTheme
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.spruceid.mobilesdkexample.db

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters

@Database(entities = [VerificationActivityLogs::class], version = 1)
@TypeConverters(*[DateConverter::class])
abstract class AppDatabase : RoomDatabase() {
abstract fun verificationActivityLogsDao(): VerificationActivityLogsDao

companion object {
@Volatile
private var dbInstance: AppDatabase? = null

fun getDatabase(context: Context): AppDatabase {
return dbInstance ?: synchronized(this) {
val instance =
Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"verification_activity_logs",
)
.allowMainThreadQueries()
.build()
dbInstance = instance
instance
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.spruceid.mobilesdkexample.db

import androidx.room.TypeConverter
import java.sql.Date

object DateConverter {
@TypeConverter
fun toDate(dateLong: Long?): Date? {
return if (dateLong == null) null else Date(dateLong)
}

@TypeConverter
fun fromDate(date: Date?): Long? {
return date?.time
}
}
14 changes: 14 additions & 0 deletions example/src/main/java/com/spruceid/mobilesdkexample/db/Daos.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.spruceid.mobilesdkexample.db

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query

@Dao
interface VerificationActivityLogsDao {
@Insert
suspend fun insertVerificationActivity(verificationActivityLogs: VerificationActivityLogs)

@Query("SELECT * FROM verification_activity_logs")
fun getAllVerificationActivityLogs(): List<VerificationActivityLogs>
}
15 changes: 15 additions & 0 deletions example/src/main/java/com/spruceid/mobilesdkexample/db/Entities.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.spruceid.mobilesdkexample.db

import androidx.room.Entity
import androidx.room.PrimaryKey
import java.sql.Date

@Entity(tableName = "verification_activity_logs")
data class VerificationActivityLogs(
@PrimaryKey(autoGenerate = true) val id: Long = 0,
val name: String,
val credentialTitle: String,
val date: Date,
val expirationDate: Date,
val status: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.spruceid.mobilesdkexample.db

import androidx.annotation.WorkerThread

class VerificationActivityLogsRepository(private val verificationActivityLogsDao: VerificationActivityLogsDao) {
val verificationActivityLogs: List<VerificationActivityLogs> = verificationActivityLogsDao.getAllVerificationActivityLogs()

@WorkerThread
suspend fun insertVerificationActivityLog(verificationActivityLogs: VerificationActivityLogs) {
verificationActivityLogsDao.insertVerificationActivity(verificationActivityLogs)
}

@WorkerThread
suspend fun getVerificationActivityLogs(): List<VerificationActivityLogs> {
return verificationActivityLogsDao.getAllVerificationActivityLogs()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ const val HOME_SCREEN_PATH = "home"
const val VERIFY_DL_PATH = "verify_dl"
const val VERIFY_EA_PATH = "verify_ea"
const val VERIFY_VC_PATH = "verify_vc"
const val VERIFIER_SETTINGS_HOME_PATH = "verifier_settings_home"


sealed class Screen(val route: String) {
object HomeScreen : Screen(HOME_SCREEN_PATH)
object VerifyDLScreen : Screen(VERIFY_DL_PATH)
object VerifyEAScreen : Screen(VERIFY_EA_PATH)
object VerifyVCScreen : Screen(VERIFY_VC_PATH)
object VerifierSettingsHomeScreen : Screen(VERIFIER_SETTINGS_HOME_PATH)
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@ import com.spruceid.mobilesdkexample.HomeView
import com.spruceid.mobilesdkexample.verifier.VerifyDLView
import com.spruceid.mobilesdkexample.verifier.VerifyEAView
import com.spruceid.mobilesdkexample.verifier.VerifyVCView
import com.spruceid.mobilesdkexample.verifiersettings.VerifierSettingsHomeView

@Composable
fun SetupNavGraph(
navController: NavHostController
) {
NavHost(
navController = navController,
startDestination = Screen.HomeScreen.route,
startDestination = Screen.HomeScreen.route
) {
composable(
route = Screen.HomeScreen.route,
Expand All @@ -37,6 +38,11 @@ fun SetupNavGraph(
) {
VerifyVCView(navController)
}
composable(
route = Screen.VerifierSettingsHomeScreen.route,
) {
VerifierSettingsHomeView(navController)
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ val SpruceBlue = Color(0xFF2F6AE1)
val Primary = Color(0xFFF7F7F5)
val Bg = Color(0xFFFDFDFC)
val CredentialBorder = Color(0xFFE6E1D6)
val CodeBorder = Color(0xff949494)
val GreenValid = Color(0xFF059669)
val TextBody = Color(0xFF57534E)
val TextHeader = Color(0xFF0C0A09)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
Expand All @@ -28,6 +30,7 @@ import androidx.navigation.NavController
import com.spruceid.mobilesdkexample.R
import com.spruceid.mobilesdkexample.navigation.Screen
import com.spruceid.mobilesdkexample.ui.theme.Inter
import com.spruceid.mobilesdkexample.ui.theme.Primary
import com.spruceid.mobilesdkexample.ui.theme.TextBody
import com.spruceid.mobilesdkexample.ui.theme.TextHeader
import com.spruceid.mobilesdkexample.ui.theme.TextOnPrimary
Expand All @@ -47,13 +50,15 @@ fun VerifierHomeView(
.padding(all = 20.dp)
.padding(top = 20.dp)
) {
VerifierHomeHeader()
VerifierHomeHeader(navController = navController)
VerifierHomeBody(navController = navController)
}
}

@Composable
fun VerifierHomeHeader() {
fun VerifierHomeHeader(
navController: NavController
) {
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
text = "Spruce Verifier",
Expand All @@ -63,6 +68,26 @@ fun VerifierHomeHeader() {
color = TextHeader
)
Spacer(Modifier.weight(1f))
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.width(36.dp)
.height(36.dp)
.padding(start = 4.dp)
.clip(shape = RoundedCornerShape(8.dp))
.background(Primary)
.clickable {
navController.navigate(Screen.VerifierSettingsHomeScreen.route)
}
) {
Image(
painter = painterResource(id = R.drawable.user),
contentDescription = stringResource(id = R.string.user),
modifier = Modifier
.width(20.dp)
.height(20.dp)
)
}
}
}
@Composable
Expand Down
Loading

0 comments on commit ba478c8

Please sign in to comment.