Skip to content

feature/Select PDF and save and select Certificate #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
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
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
1 change: 1 addition & 0 deletions app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
78 changes: 78 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
id 'androidx.navigation.safeargs.kotlin'

}

android {
namespace 'com.demo.electronicsignature'
compileSdk 33

buildFeatures {
dataBinding true
viewBinding true
}

defaultConfig {
applicationId "com.demo.electronicsignature"
minSdk 29
targetSdk 33
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}

dependencies {
def room_version = "2.5.1"
def nav_version = "2.5.3"
def lifecycle_version = "2.5.1"
def lifecycle_extension_version = "2.2.0"



implementation 'androidx.core:core-ktx:1.7.0'
implementation 'com.itextpdf:itext7-core:7.2.5'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'

implementation "androidx.room:room-runtime:$room_version"
implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version"

implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"


implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_extension_version"

implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'

implementation 'com.squareup.picasso:picasso:2.8'


testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
21 changes: 21 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.demo.electronicsignature

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

import org.junit.Test
import org.junit.runner.RunWith

import org.junit.Assert.*

/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.demo.electronicsignature", appContext.packageName)
}
}
29 changes: 29 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.ElectronicSignature"
android:name=".App"
tools:targetApi="31">

<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
34 changes: 34 additions & 0 deletions app/src/main/java/com/demo/electronicsignature/App.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.demo.electronicsignature

import android.app.Application
import androidx.room.Room
import com.demo.electronicsignature.data.database.MyDatabase
import com.demo.electronicsignature.data.database.migration.migration_1_2
import com.demo.electronicsignature.data.repository.SignatureFileRepositoryImpl

class App: Application() {

override fun onCreate() {
super.onCreate()
context = this
}

companion object {
lateinit var context: App

private val roomDatabase by lazy {
Room.databaseBuilder(
context,
MyDatabase::class.java,
"database-signatures"
)
.addMigrations(migration_1_2)
.build()
}

private val signatureFileDao by lazy { roomDatabase.signatureFileDao() }

val signatureFileRepository by lazy { SignatureFileRepositoryImpl(signatureFileDao) }

}
}
13 changes: 13 additions & 0 deletions app/src/main/java/com/demo/electronicsignature/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.demo.electronicsignature

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.demo.electronicsignature.data.database

import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverter
import androidx.room.TypeConverters
import com.demo.electronicsignature.data.database.converter.DateConverter
import com.demo.electronicsignature.data.database.dao.SignatureFileDao
import com.demo.electronicsignature.data.database.model.SignatureFile

@Database(entities = [SignatureFile::class], version = 2, exportSchema = false)
@TypeConverters(DateConverter::class)
abstract class MyDatabase :RoomDatabase() {
abstract fun signatureFileDao(): SignatureFileDao
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.demo.electronicsignature.data.database.converter

import androidx.room.TypeConverter
import java.util.*

class DateConverter {

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

@TypeConverter
fun toTimestamp(date: Date?): Long? {
return date?.time
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.demo.electronicsignature.data.database.dao

import androidx.room.*
import com.demo.electronicsignature.data.database.model.SignatureFile

@Dao
interface SignatureFileDao {

@Query("SELECT * FROM signature_file")
suspend fun getAll(): List<SignatureFile>

@Query("SELECT * FROM signature_file WHERE id = :id")
suspend fun getById(id: Int): SignatureFile

@Insert(onConflict = OnConflictStrategy.ABORT)
suspend fun insert(signatureFile: SignatureFile)

@Delete
suspend fun delete(signatureFile: SignatureFile)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.demo.electronicsignature.data.database.migration

import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase

val migration_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE signature_file ADD COLUMN registrationDate INTEGER NOT NULL DEFAULT 0")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.demo.electronicsignature.data.database.model

import androidx.room.Entity
import androidx.room.PrimaryKey
import androidx.room.TypeConverter
import com.demo.electronicsignature.data.database.converter.DateConverter
import java.util.Date


@Entity(tableName = "signature_file")
data class SignatureFile(
@PrimaryKey(autoGenerate = true)
var id: Int = 0,
var path: String,
var registrationDate: Date = Date()
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.demo.electronicsignature.data.repository

import com.demo.electronicsignature.data.database.model.SignatureFile
import java.io.File

interface SignatureFileRepository {
suspend fun saveFile(path: String)
suspend fun listAll(): List<SignatureFile>
suspend fun deleteFile(it: SignatureFile)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.demo.electronicsignature.data.repository

import com.demo.electronicsignature.data.database.dao.SignatureFileDao
import com.demo.electronicsignature.data.database.model.SignatureFile
import java.io.File

class SignatureFileRepositoryImpl(
private val signatureFileDao: SignatureFileDao
) : SignatureFileRepository {
override suspend fun saveFile(path: String) {
signatureFileDao.insert(SignatureFile(path = path))
}

override suspend fun listAll(): List<SignatureFile> {
return signatureFileDao.getAll()
}

override suspend fun deleteFile(it: SignatureFile) {
signatureFileDao.delete(it)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.demo.electronicsignature.domain

import android.net.Uri
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MainScreenViewModel : ViewModel() {


private val _pdfFile : MutableLiveData<Uri> = MutableLiveData()
val pdfFile : LiveData<Uri> = _pdfFile

private val _appStatus : MutableLiveData<AppStatus> = MutableLiveData(AppStatus.EMPTY)
val appStatus : LiveData<AppStatus> = _appStatus

private val _signatureFile : MutableLiveData<Uri> = MutableLiveData()
val signatureFile : LiveData<Uri> = _signatureFile

private var imagePosition : Pair<Float, Float> = Pair(0f, 0f)

fun registerPdf(uri : Uri) {
_pdfFile.value = uri
_appStatus.value = AppStatus.PDF_LOADED
}

fun selectSignatureFile(uri:Uri) {
_appStatus.value = AppStatus.SIGNATURE_SELECTED
_signatureFile.value = uri
}

fun registerImagePosition(x: Float, y: Float) {
imagePosition = Pair(x, y)
}

fun signDocument(currentPage: Int) {

}

enum class AppStatus {
EMPTY, PDF_LOADED, SIGNATURE_SELECTED, SIGNATURE_CREATED
}
}
Loading