it-dgc-verificac19-sdk-android icon indicating copy to clipboard operation
it-dgc-verificac19-sdk-android copied to clipboard

Integrazione Flutter

Open vixper opened this issue 3 years ago • 38 comments

E' prevista l'integrazione con flutter?

vixper avatar Oct 15 '21 11:10 vixper

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.

loreberti89 avatar Oct 15 '21 15:10 loreberti89

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

vixper avatar Oct 15 '21 18:10 vixper

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..

asterd avatar Oct 16 '21 10:10 asterd

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

rox85 avatar Oct 16 '21 16:10 rox85

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

loreberti89 avatar Oct 16 '21 16:10 loreberti89

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...

vixper avatar Oct 16 '21 23:10 vixper

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ì..

asterd avatar Oct 17 '21 07:10 asterd

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

vixper avatar Oct 17 '21 07:10 vixper

@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

rox85 avatar Oct 17 '21 09:10 rox85

@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.

vixper avatar Oct 17 '21 09:10 vixper

@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

asterd avatar Oct 18 '21 08:10 asterd

@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!

vixper avatar Oct 18 '21 08:10 vixper

@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

loreberti89 avatar Oct 18 '21 09:10 loreberti89

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.

rox85 avatar Oct 18 '21 10:10 rox85

@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...

asterd avatar Oct 18 '21 10:10 asterd

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

rox85 avatar Oct 18 '21 14:10 rox85

@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?

asterd avatar Oct 18 '21 14:10 asterd

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!

manueltag avatar Oct 18 '21 20:10 manueltag

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

rox85 avatar Oct 19 '21 08:10 rox85

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

sirol81 avatar Oct 19 '21 09:10 sirol81

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

manueltag avatar Oct 25 '21 21:10 manueltag

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

loreberti89 avatar Oct 26 '21 10:10 loreberti89

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

ferrerogg avatar Oct 26 '21 18:10 ferrerogg

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

FrancescoPenasa avatar Oct 27 '21 09:10 FrancescoPenasa

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'

ferrerogg avatar Oct 27 '21 10:10 ferrerogg

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?

loreberti89 avatar Oct 27 '21 12:10 loreberti89

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 👍 😄

manueltag avatar Oct 28 '21 06:10 manueltag

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 avatar Oct 28 '21 07:10 loreberti89

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
      }
  }

loreberti89 avatar Nov 05 '21 08:11 loreberti89

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" />

ferrerogg avatar Nov 05 '21 09:11 ferrerogg