ministero-salute / it-dgc-verificac19-sdk-android

Digital Covid Certificate SDK
Apache License 2.0
57 stars 30 forks source link

Integrazione Flutter #33

Closed vixper closed 1 year ago

vixper commented 2 years ago

E' prevista l'integrazione con flutter?

loreberti89 commented 2 years ago

Ciao, sto provando anche io a integrarlo. Ieri ho fatto qualche test, ma nulla, non capisco come poi dal mio plugin flutter posso richiamare i metodi e le classi, nel mio file plugin.kt MAgari è solo questione di capire come importare le classi.

vixper commented 2 years ago

Sinceramente non ci ho ancora provato, magari nel weekend se riesco a fare qualche prova ti aggiorno.

asterd commented 2 years ago

Ciao, sto provando anche io a integrarlo. Ieri ho fatto qualche test, ma nulla, non capisco come poi dal mio plugin flutter posso richiamare i metodi e le classi, nel mio file plugin.kt MAgari è solo questione di capire come importare le classi.

puoi condividere il repo? magari ti aiuto a capire cosa non va..

rox85 commented 2 years ago

Ciao, sto provando anche io a integrarlo. Ieri ho fatto qualche test, ma nulla, non capisco come poi dal mio plugin flutter posso richiamare i metodi e le classi, nel mio file plugin.kt MAgari è solo questione di capire come importare le classi.

puoi condividere il repo? magari ti aiuto a capire cosa non va..

Ho generato ora un plugin flutter pulito da zero ed incluso le librerie come descritto nel README di questo github. Il codice si trova qui: https://github.com/rox85/verifica_c19_plugin

L'importazione delle librerie dovrebbe avvenire nel file VerificaC19plugin.java, ma personalmente non riesco a capire come

loreberti89 commented 2 years ago

Ciao, sto provando anche io a integrarlo. Ieri ho fatto qualche test, ma nulla, non capisco come poi dal mio plugin flutter posso richiamare i metodi e le classi, nel mio file plugin.kt MAgari è solo questione di capire come importare le classi.

puoi condividere il repo? magari ti aiuto a capire cosa non va..

Ho generato ora un plugin flutter pulito da zero ed incluso le librerie come descritto nel README di questo github. Il codice si trova qui: https://github.com/rox85/verifica_c19_plugin

L'importazione delle librerie dovrebbe avvenire nel file VerificaC19plugin.java, ma personalmente non riesco a capire come

Sono al tuo stesso punto, ovviamente quando provo ad importare le classi mi dà un errore di classi non trovate. Una volta che capiamo come importare le classi poi credo che il grosso è fatto

vixper commented 2 years ago

Niente da fare...ci ho provato in mille modi diversi. Credo però che sia legato ad un problema di import, nel senso che i 3 repository del ministero, si aspettano una struttura di directory che su flutter è differente rispetto ad android nativo, bisognerebbe modificare i puntamenti all'interno dei 3 repository, ma non mi piace come soluzione...

asterd commented 2 years ago

Avete provato ad aggiungere nel build.gradle questo?

dependencies { implementation fileTree(include: '*', dir: 'libs') // Some other dependencies should be here as well. }

O qualcosa del genere.. in una issue GitHub di flutter indicavano la necessità di questa dichiarazione per includere le deps aar altrimenti le ignorava.. di fatto il concetto potrebbe essere il medesimo.. farei una prova io ma sono senza PC fino a lunedì.. se non riuscite prima ci provo io lunedì..

vixper commented 2 years ago

@asterd si, ci ho provato, ma senza risultati. Credo che quell'istruzione sia utile quando si aggiungono librerie compilate, non per i sorgenti.

rox85 commented 2 years ago

@asterd è corretto.. in un altro plugin che avevamo sviluppato con flutter eravamo andati ad aggiungere una cosa di questo tipo

dependencies { implementation files('libs\\library.jar') }

..è un tentativo che avevo già fatto senza successo..

Io ho comunque l'impressione che non venga preso in considerazione il codice dei 3 progetti aggiunti e neppure compilato, anche considerando la velocità in cui il mio pc riesce a fare il rebuild.

Un'altra prova che forse farei è quella di spostare i packages "sdk" e "decoder" dentro ad android/src/main/java ...più tardi provo

vixper commented 2 years ago

@rox85 ho già provato a spostare i 3 packages del ministero sotto "java" (e anche su diversi percorsi) per cercare di mantenere l'alberatura richiesta, senza successo anche questo... Comunque sono d'accordo con te, per come stiamo procedendo, il codice dei 3 progetto del ministero non viene proprio compilato.

asterd commented 2 years ago

@rox85 @vixper forse ho trovato la soluzione! provate a modificare il build.gradle aggiungendo:

rootProject.allprojects {
    repositories {
        google()
        mavenCentral()
        // added `libs` as dependency location
        flatDir {
            dirs 'libs'
        }
    }
}

e poi il settings.gradle cosi:

include ':app'
include ':dgc-sdk'
include ':decoder'
include ':engine'
rootProject.name = 'verifica_c19_plugin'
project(':dgc-sdk').projectDir = new File("./libs/it-dgc-verificac19-sdk-android/sdk")
project(':decoder').projectDir = new File("./libs/dgca-app-core-android/decoder")
project(':engine').projectDir = new File("./libs/dgc-certlogic-android-main/engine")

in questo modo compila e legge correttamente! Se mi verificate che è ok, poi magari lo completiamo insieme

vixper commented 2 years ago

@rox85 @vixper forse ho trovato la soluzione! provate a modificare il build.gradle aggiungendo:

rootProject.allprojects {
    repositories {
        google()
        mavenCentral()
        // added `libs` as dependency location
        flatDir {
            dirs 'libs'
        }
    }
}

e poi il settings.gradle cosi:

include ':app'
include ':dgc-sdk'
include ':decoder'
include ':engine'
rootProject.name = 'verifica_c19_plugin'
project(':dgc-sdk').projectDir = new File("./libs/it-dgc-verificac19-sdk-android/sdk")
project(':decoder').projectDir = new File("./libs/dgca-app-core-android/decoder")
project(':engine').projectDir = new File("./libs/dgc-certlogic-android-main/engine")

in questo modo compila e legge correttamente! Se mi verificate che è ok, poi magari lo completiamo insieme

Grande @asterd! Stasera ci provo e ti faccio sapere!

loreberti89 commented 2 years ago

@rox85 @vixper forse ho trovato la soluzione! provate a modificare il build.gradle aggiungendo:

rootProject.allprojects {
    repositories {
        google()
        mavenCentral()
        // added `libs` as dependency location
        flatDir {
            dirs 'libs'
        }
    }
}

e poi il settings.gradle cosi:

include ':app'
include ':dgc-sdk'
include ':decoder'
include ':engine'
rootProject.name = 'verifica_c19_plugin'
project(':dgc-sdk').projectDir = new File("./libs/it-dgc-verificac19-sdk-android/sdk")
project(':decoder').projectDir = new File("./libs/dgca-app-core-android/decoder")
project(':engine').projectDir = new File("./libs/dgc-certlogic-android-main/engine")

in questo modo compila e legge correttamente! Se mi verificate che è ok, poi magari lo completiamo insieme

Ma una domanda, ma facendo cosi a te importa anche la classe nel file Plugin.kt e riesci a richiamare l'istanza e i metodi? Io continuo ad avere errori di reference unresolved quando provo ad importare il model VerificationViewModel

rox85 commented 2 years ago

Ciao, anche io non riesco ancora a richiamare i metodi.

@asterd per lo sviluppo volentieri lo implementiamo insieme, basta che chi vuol collaborare alzi la mano e lo si aggiunge ad un repo.

asterd commented 2 years ago

@rox85 @loreberti89 scusate.. va aggiunto anche:

android {
   ....
    sourceSets {
        main.java.srcDirs += [
                './libs/dgca-app-core-android/decoder/src/main',
                './libs/dgc-certlogic-android-main/engine/src/main',
                './libs/it-dgc-verificac19-sdk-android-develop/sdk/src/main',
        ]
    }
}

in questo modo le reference le vede.. ora sono bloccato perché (a parte il poco tempo) non ho ben capito come istanziare le classi del ViewVerificationModel...

rox85 commented 2 years ago

Piccolo passo avanti, grazie @asterd ..includendo il codice come indicato e aprendo con Android Studio il progetto "android", vede le reference. Se invece viene aperto come plugin l'errore di compilazione persiste

Cattura

asterd commented 2 years ago

@rox85 Si, in realtà, con estremo dispiacere, ho notato che la configurazione effettivamente include i sorgenti e quindi fa funzionare i riferimenti ma purtroppo non funziona l'inclusione anche dei build.gradle dei sottoprogetti e la relativa inclusione delle dependencies. Di conseguenza, compilando, i sorgenti aggiunti non trovano le dipendenze e vanno in errore. Ho provato a guardare in giro su vari forum e sembra sia qualcosa di legato a flutter.. temo che per far funzionare le cose, occorra mettere a mano tutte le dependencies sul build.gradle master copiandosele da quelle dei due progetti linkati.. in questo modo potrebbe funzionare.. ho provato anche un apply from nel build.gradle del plugin puntando i build.gradle dei due progetti terzi, ma sono fatti con delle dichiarazioni Deps prese da file locali e quindi non va.. insomma.. il solito arrosto.. certo che anche i cari amici del ministero una bella api no eh?

manueltag commented 2 years ago

Ciao, se volete dare un'occhiata alla mia repo: https://github.com/manueltag/my_green_pass Sono riuscito a compilare il progetto con successo. Ho iniziato a istanziare i vari oggetti richiesti per la verifica del qr code: https://github.com/manueltag/my_green_pass/blob/master/android/app/src/main/kotlin/com/example/my_green_pass/MainActivity.kt Fatemi sapere se riuscite a fare qualcosa o se ci sono problemi!

rox85 commented 2 years ago

Grande @manueltag!! A quanto vedo non si tratta di un plugin ma sei riuscito a inserirlo direttamente in un nuovo progetto Flutter

sirol81 commented 2 years ago

Ciao, se volete dare un'occhiata alla mia repo: https://github.com/manueltag/my_green_pass Sono riuscito a compilare il progetto con successo. Ho iniziato a istanziare i vari oggetti richiesti per la verifica del qr code: https://github.com/manueltag/my_green_pass/blob/master/android/app/src/main/kotlin/com/example/my_green_pass/MainActivity.kt Fatemi sapere se riuscite a fare qualcosa o se ci sono problemi!

ho provato a sfruttare come inserito da te val viewModel: VerificationViewModel = ViewModelProvider(this).get(VerificationViewModel::class.java) ma mi da eccezione "cannot create an instance of class [...]VerificationViewModel", purtroppo come anche tu stesso hai commentato nel tuo codice, ci sono molti più cose da dover fare prima di poter avere il verificationViewModel, anche io sto combattendo su questo punto

manueltag commented 2 years ago

Screenshot_1635196794 Finalmente sono riuscito a far funzionare la libreria!! Nei prossimi giorni aggiorno la repo 😄

loreberti89 commented 2 years ago

Ciao, se volete dare un'occhiata alla mia repo: https://github.com/manueltag/my_green_pass Sono riuscito a compilare il progetto con successo. Ho iniziato a istanziare i vari oggetti richiesti per la verifica del qr code: https://github.com/manueltag/my_green_pass/blob/master/android/app/src/main/kotlin/com/example/my_green_pass/MainActivity.kt Fatemi sapere se riuscite a fare qualcosa o se ci sono problemi!

ho provato a sfruttare come inserito da te val viewModel: VerificationViewModel = ViewModelProvider(this).get(VerificationViewModel::class.java) ma mi da eccezione "cannot create an instance of class [...]VerificationViewModel", purtroppo come anche tu stesso hai commentato nel tuo codice, ci sono molti più cose da dover fare prima di poter avere il verificationViewModel, anche io sto combattendo su questo punto

Ciao, avevi poi risolto? io sono allo stesso punto. La differenza è che sto provando a creare un Plugin e non una "app" nuova. Comunque dopo tutte le implementazioni sono riuscito ad arrivare al punto in cui non posso creare un nuovo VerificationModel

ferrerogg commented 2 years ago

Se a qualcuno può interessare, ho provato a creare una patch git da applicare ad un progetto Flutter (ho usato la versione 2.5.3, ma penso funzioni anche con inferiori) per inizializzare la struttura di base per l'sdk. La patch prende spunto a piene mani dal lavoro di @manueltag , ho rivisto leggermente la struttura del progetto portando fuori le "librerie" dall'alberatura principale in una cartella "lib" parallela a quella del progetto Flutter:

|---my_green_pass   (questo è il progetto Flutter)
|---lib
     |---dgca-app-core-android
     |---dgc-certlogic-android
     |---it-dgc-verificac19-sdk-android   (clonare repo con tag 1.0.1)

Nel build.gradle ho aggiunto l'applicazione dei plugin 'kotlin-kapt' e 'dagger.hilt.android.plugin', in questo modo tutta la dependency injection avviene, come per il progetto it-dgc-verificaC19-android, tramite Hilt, e non è quindi necessario istanziare manualmente la VerificationViewModel, che viene quindi iniettata nella classe MainActivity.kt (il risultante CertificateSimple, in questa versione, viene solamente loggato). Il file Application.kt riprende il contenuto del file omonimo di it-dgc-verificaC19-android ed inizializza il LoadKeysWorker, l'unica differenza è che la classe estende una FlutterApplication .

Allego il file di patch che può essere applicato ad un progetto Flutter appena creato (il nome del package della application può essere facilmente adattato modificando la patch)

flutter create my_green_pass
cd my_green_pass
git init
git apply basic_sdk_patch.txt

basic_sdk_patch.txt

FrancescoPenasa commented 2 years ago

Ottimoo, però la patch git @ferrerogg mi da degli errori nell'esecuzione del progetto con flutter run, dopo che ho fatto i passi che hai indicato tu mi dice

Launching lib\main.dart on sdk gphone x86 in debug mode...

FAILURE: Build failed with an exception.

* What went wrong:
Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'.
> Could not resolve all task dependencies for configuration ':app:debugCompileClasspath'.
   > Could not resolve project :dgc-sdk.
     Required by:
         project :app
      > No matching configuration of project :dgc-sdk was found. The consumer was configured to find an API of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm' but:
          - None of the consumable configurations have attributes.
   > Could not resolve project :decoder.
     Required by:
         project :app
      > No matching configuration of project :decoder was found. The consumer was configured to find an API of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm' but:
          - None of the consumable configurations have attributes.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 2s
Running Gradle task 'assembleDebug'...                              3,4s
Exception: Gradle task assembleDebug failed with exit code 1
ferrerogg commented 2 years ago

Controlla nel file android/settings.gradle, dovresti avere i riferimenti ai progetti sotto la cartella 'lib' da cui il progetto Flutter dipende (vanno scaricati separatamente tramite git clone)

project(':dgc-sdk').projectDir = new File("../../lib/it-dgc-verificac19-sdk-android/sdk")
project(':decoder').projectDir = new File("../../lib/dgca-app-core-android/decoder")

Oltre ai 2 progetti sopra indicati serve anche il progetto 'dgc-certlogic-android', sempre da clonare nella medesima cartella sotto 'lib'

loreberti89 commented 2 years ago

Ciao a tutti, per quanto riguarda una app da 0 credo che possa funzionare, vedo che il worker scarica i certificato ed il mio "example" viene compilato correttamente, non ho portato in fondo la app perché il mio obiettivo è un altro. Il mio obiettivo sarebbe quello di crearmi un plugin da "appendere" ad una mia app già esistente, ma ho diversi problemi.

Il principale pare essere che, il ViewModel by, se non ho capito male è utlizzabile solo all'interno di una AppCompatActivity, quindi all'interno della classe del Plugin non è possibile avere il riferimento al VerificationViewModel. Poiché la classe activityAware è una interfaccia di una semplice Activity. Non pare esserci nessuna interfaccia, al momento, che possa dire che quel plugin utilizza una Fragment Activity. A questo proposito ho provato a utilizzare il metodo tramite il ViewmodelProvider:

val model: VerificationViewModel = ViewModelProvider(this).get(VerificationViewModel::class.java)

Il problema è che questo impone che come argomento del ViewModelProvider venga fornito un tipo ViewModelStoreOwner.

Allora ho provato a implementare l'interfaccia import androidx.lifecycle.ViewModelStoreOwner e il che funziona, ovvero compila. Il problema è che quando poi vado effettivamente a richimare quella funzione, continuo a ricevere l'errore:

java.lang.RuntimeException: Cannot create an instance of class it.ministerodellasalute.verificaC19sdk.model.VerificationViewModel

Qualcuno ha qualche suggerimento?

manueltag commented 2 years ago

Screenshot_1635196794 Finalmente sono riuscito a far funzionare la libreria!! Nei prossimi giorni aggiorno la repo 😄

Ho aggiornato la repo! Devo ancora sistemare bene i file ma è un buon punto di partenza. Fatemi sapere se riuscite a compilare e utilizzare l'app 👍 😄

loreberti89 commented 2 years ago

Ciao ragazzi, ho creato una repo per cercare di capire, se qualcuno ha voglia, di come implementare la sdk in un plugin flutter e non una app diretta nuda e cruda. Sono partito dalle basi che avete tirato su, ora sono bloccato nel momento in cui io dovrei lanciare la funzione di validazione. Perché come dicevo nel commento sopra, la problematica starebbe nel fatto che non è possibile (o almeno io non sto trovando uno workaround) "instanziare" (anche se non lo istanzi perché usato hilt) l'oggetto verificationModel per efettuare la verifica:

https://github.com/loreberti89/flutter_greenpass_sdk

Qua ho la repo, l'unica cosa, che dovete fare è portarvi le 3 librerire dcg-certlogic-android, dcga-app-core-android, it-dgc-verificac19-sdk-android nella folder libs nella root del progetto. Se qualcuno può dare una mano è ben accetto.

loreberti89 commented 2 years ago

Screenshot_1635196794 Finalmente sono riuscito a far funzionare la libreria!! Nei prossimi giorni aggiorno la repo 😄

Ho aggiornato la repo! Devo ancora sistemare bene i file ma è un buon punto di partenza. Fatemi sapere se riuscite a compilare e utilizzare l'app 👍 😄

Ciao, in debug tutto ok, ma voi siete riusciti a generare una apk o un bundle? A me da un errore: Remove androidx.work.impl.WorkManagerInitializer from your AndroidMa nifest.xml when using on-demand initialization. [RemoveWorkManagerInitializer] Che nonostante abbia commentato tutti i manifest continua darmelo. Oltre ad un altro errore che non riesco a trovare:

Lint found fatal errors while assembling a release target.

  To proceed, either fix the issues identified by lint, or modify your build script as follows:
  ...
  android {
      lintOptions {
          checkReleaseBuilds false
          // Or, if you prefer, you can continue to check for errors in release builds,
          // but continue the build even when errors are found:
          abortOnError false
      }
  }
ferrerogg commented 2 years ago

Prova ad aggiungere il seguente frammento nel tuo AndroidManifest.xml dentro al tag application, a fianco dei meta-data per capirci

        <provider
            android:name="androidx.work.impl.WorkManagerInitializer"
            android:authorities="${applicationId}.workmanager-init"
            android:exported="false"
            tools:node="remove" />
loreberti89 commented 2 years ago

Prova ad aggiungere il seguente frammento nel tuo AndroidManifest.xml dentro al tag application, a fianco dei meta-data per capirci

        <provider
            android:name="androidx.work.impl.WorkManagerInitializer"
            android:authorities="${applicationId}.workmanager-init"
            android:exported="false"
            tools:node="remove" />

Grazie questo mi ha tolto il primo errore. Ne ho in realtà un altro ora:

* What went wrong:
Execution failed for task ':dgc-sdk:verifyReleaseResources'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > 1 exception was raised by workers:
     com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource linking failed
     C:\Users\Lorenzo\StudioProjects\myapp\libs\it-dgc-verificac19-sdk-android\sdk\src\main\AndroidManifest.xml:26:5-40:19: AAPT: error: resource mipmap/ic_launcher (aka it.ministerodellasalute.verificaC19sdk:mipmap/ic_launcher) not found.

     C:\Users\Lorenzo\StudioProjects\myapp\libs\it-dgc-verificac19-sdk-android\sdk\src\main\AndroidManifest.xml:26:5-40:19: AAPT: error: resource string/app_name (aka it.ministerodellasalute.verificaC19sdk:string/app_name) not found.

     C:\Users\Lorenzo\StudioProjects\myapp\libs\it-dgc-verificac19-sdk-android\sdk\src\main\AndroidManifest.xml:26:5-40:19: AAPT: error: resource mipmap/ic_launcher_round (aka it.ministerodellasalute.verificaC19sdk:mipmap/ic_launcher_round) not found.

     C:\Users\Lorenzo\StudioProjects\myapp\libs\it-dgc-verificac19-sdk-android\sdk\src\main\AndroidManifest.xml:26:5-40:19: AAPT: error: resource style/AppTheme (aka it.ministerodellasalute.verificaC19sdk:style/AppTheme) not found.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

Ovviamente nel mio Manifest ho aggiunto il tools:replace e infatti nel manifest che viene buildato è corretto:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.myappit.myapp">
    ...
    <application
       tools:replace="android:name, android:label, android:icon, android:roundIcon, android:theme"
       android:label="myapp"
       android:allowBackup="false"
       android:name=".MyApp"
       android:roundIcon="@mipmap/launcher_icon"
       android:theme="@style/LaunchTheme"
       android:usesCleartextTraffic="true"
       android:icon="@mipmap/launcher_icon"
       >

E' come se ignorasse il replace, ma non ne comprendo il motivo dato che ad esempio il appBundle viene buildato, ma una semplice APK no.

loreberti89 commented 2 years ago

Niente io continuo ad avere problemi una volta buildata la app. Tralasciando il problema sopracitato, per test ho brutalmente levato le launcher icon nella sdk. Compilo la mia apk, la installo, ma al momento che provo a fare un check, la app crasha e ricevo questo errore:

java.lang.ExceptionInInitializerError
    at e.c.a.b.g.g.a.b(Unknown Source:0)
    at e.c.a.b.g.g.b.<clinit>(Unknown Source:4)
    at e.c.a.b.g.g.b.b(Unknown Source:0)
    at e.c.a.b.g.a.<clinit>(Unknown Source:10)
    at e.c.a.b.g.a.a(Unknown Source:0)
    at e.c.a.b.b.b.<clinit>(Unknown Source:15)
    at e.c.a.b.b.a.h(Unknown Source:0)
    at e.c.a.b.b.a.a(Unknown Source:0)
    at e.c.a.b.h.c.<init>(Unknown Source:20)
    at e.c.a.b.h.b.d(Unknown Source:2)
    at e.c.a.b.h.b.b(Unknown Source:0)
    at i.a.a.a.j.a.a(Unknown Source:63)
    at it.ministerodellasalute.verificaC19sdk.model.VerificationViewModel$a$a.n(Unknown Source:163)
    at kotlin.f0.j.a.a.g(Unknown Source:9)
    at kotlinx.coroutines.m0.run(Unknown Source:116)
    at kotlinx.coroutines.e2.b.m0(Unknown Source:0)
    at kotlinx.coroutines.e2.b$a.c(Unknown Source:14)
    at kotlinx.coroutines.e2.b$a.m(Unknown Source:28)
    at kotlinx.coroutines.e2.b$a.run(Unknown Source:0)
Caused by: java.lang.IllegalArgumentException: class "e.c.a.b.f.b.e.a" has no appropriate constructor (keyword "additionalItems"; expected a constructor with a JsonNode as an argument)
    at e.c.a.b.f.b.d.<init>(Unknown Source:39)
    at e.c.a.b.g.g.a.a(Unknown Source:2)
    at e.c.a.b.g.g.a.<clinit>(Unknown Source:8)
    ... 19 more

In debug tutto funziona. Sono confuso.

ferrerogg commented 2 years ago

E' come se ignorasse il replace, ma non ne comprendo il motivo dato che ad esempio il appBundle viene buildato, ma una semplice APK no.

Avevo lo stesso problema lanciando da VSCode il comando flutter build apk, però aprendo il progetto android da Android Studio e lanciando da lì Build->Build bundle(s) / APK(s) funziona. Per il secondo errore non saprei dirti.

loreberti89 commented 2 years ago

E' come se ignorasse il replace, ma non ne comprendo il motivo dato che ad esempio il appBundle viene buildato, ma una semplice APK no.

Avevo lo stesso problema lanciando da VSCode il comando flutter build apk, però aprendo il progetto android da Android Studio e lanciando da lì Build->Build bundle(s) / APK(s) funziona. Per il secondo errore non saprei dirti.

Dopo una Giornata a cristonare, forse sono riuscito a risolvere. E' una cosa bella? no. Funziona? si. Credo che alla base di tutto ci sia la minificazione che fa flutter con il flag --release

In debug la app non presentava problemi. Sia con test "in prod" che in "locale". Quindi ho cercato una soluzione e l'unica che ho trovato è la seguente:

nel gradle a livello di app /android/app/build.gradle Sotto i buildTypes nella voce release ho fatto cosi:

{
           signingConfig signingConfigs.release
            minifyEnabled false
            shrinkResources false
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}
 }

allo stesso livello ho aggiunto il file proguard-rules.pro Fatto cosi:

#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }

Si, purtroppo il non minificare è un grosso problema, ma non ho trovato soluzioni alternative. se qualcuno ha soluzioni o consigli sono ben accetti.

pgiacomo69 commented 2 years ago

@manueltag, bel lavoro grazie! Provata oggi, ho anche importato i nuovi sdk del ministero, e con qualche piccola modifica a build.gradle, AndroidManifest, e MainActivity.kt, funziona perfettamente. In MainActivity.kt in particolare ho visto che alla chiamata :

decode(qrCode.toString(), true,

è necessario aggiungere il parametro "scanMode" di tipo stringa

Controllando in VericationViewModel.kt dell'sdk, ho visto che dovrebbe trattarsi della verifica del "super Green Pass" in quanto:

else if (scanMode == "2G" && certificateModel.tests != null) { certificateSimple.certificateStatus = CertificateStatus.NOT_VALID

quindi se il parametro è valorizzato come "2G" , il metodo restituisce il risultato non valido quando il green pass è stato emesso dopo un tampone, correggetemi se sbaglio.

loreberti89 commented 2 years ago

Ciao Ragazzi, con i nuovi aggiornamenti come vi siete comportati? Ho un problema relativo allo scaricamento dei certificati revocati. Perché di fatto non vengono scaricati. Ora la natura del problema dovrebbe essere la seguente: Nella classe VerifierRepository.impl viene lanciato il SyncData. C'è questo controllo:

if (preferences.isDrlSyncActive) {
                getCRLStatus()
            }

Fin qua tutto bene perché la preferences isDrlSyncActive è di default True. Entrando dentro la funzione però, l'sdk va a scaricare i certificati solo se:

if (isSizeOverThreshold(crlStatus) && !preferences.shouldInitDownload) {
                                        sizeOverLiveData.postValue(true)
                                    } else {
                                        sizeOverLiveData.postValue(false)
                                        downloadChunks() //qua va a scaricare revocati.
                                    }

Il problema è che preferences.shouldInitDownload è di default false, e quindi la dentro non ci passa mai. Quindi non va mai a scaricare i chunks. Mi chiedo, come è possibile andare a settare questa preferences a true? Provando a modificare la sdk e mettendo questa preferences a default true, i certificati revocati vengono scaricati.

Come avete risolto voi?

loreberti89 commented 2 years ago

Ciao Ragazzi, con i nuovi aggiornamenti come vi siete comportati? Ho un problema relativo allo scaricamento dei certificati revocati. Perché di fatto non vengono scaricati. Ora la natura del problema dovrebbe essere la seguente: Nella classe VerifierRepository.impl viene lanciato il SyncData. C'è questo controllo:

if (preferences.isDrlSyncActive) {
                getCRLStatus()
            }

Fin qua tutto bene perché la preferences isDrlSyncActive è di default True. Entrando dentro la funzione però, l'sdk va a scaricare i certificati solo se:

if (isSizeOverThreshold(crlStatus) && !preferences.shouldInitDownload) {
                                        sizeOverLiveData.postValue(true)
                                    } else {
                                        sizeOverLiveData.postValue(false)
                                        downloadChunks() //qua va a scaricare revocati.
                                    }

Il problema è che preferences.shouldInitDownload è di default false, e quindi la dentro non ci passa mai. Quindi non va mai a scaricare i chunks. Mi chiedo, come è possibile andare a settare questa preferences a true? Provando a modificare la sdk e mettendo questa preferences a default true, i certificati revocati vengono scaricati.

Come avete risolto voi?

ok dopo un po' di prove dovrei aver risolto: Nel MainActivity ho aggiunto una funzione presa da VerificaC19:

private fun prepareForDownload() {
        var viewModel = ViewModelProvider(this).get(FirstViewModel::class.java)
        viewModel.resetCurrentRetry()
        viewModel.setShouldInitDownload(true)
        viewModel.setDownloadAsAvailable()
    }

poi nella funzione configureFlutterEngine Ho aggunto il richiamo a questa funzione, mi pare che ora i certificati vengano scaricati. Spero possa essere utile a qualcuno. Ciao.

rawmain commented 2 years ago

Approvata oggi (7 Marzo 2022) la PR per l'inserimento in SDK/Lib terze parti (autorizzate dal Ministero della Salute) di VerificaC19-Flutter (by @mastro993).

https://github.com/ministero-salute/it-dgc-verificac19-sdk-onboarding

A partire da oggi è quindi conforme/autorizzato l'uso di tale libreria anche in ambiti/scenari di produzione per validazioni DGC in Italia.

Pertanto, può essere legittimamente integrato - in alternativa a DGC-SDK Android/Kotlin ufficiale - in progetti Flutter per validazioni DGC in Italia.

stale[bot] commented 1 year ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.