Omet navegació

5.2.4 CS-IntelliJ: Exemple ampliat, combinant amb Cloud Firestore

Anem a fer un altre exemple, que serà el de CoffeeShops_Fragments, ja fet en el mòdul DI, i retocat en l'Annex d'Android, al qual vam incorporar una Base de Dades SQLite amb les dades (inclosa la imatge del cafè), i a la qual accedíem a través de la llibreria ROOM.

Des d'IntelliJ només ens plantegem accedir a Cloud Firestore i Cloud Storage per a agafar:

  • De Cloud Firestore els documents de la col·lecció on està entre altres coses el nom de la imatge
  • Amb aquest nom d'imatge anirem a Cloud Storage per a agafar-la

D'aquesta manera ens queda una pantalla molt senzilla, pràcticament com en l'exemple anterior, és a dir amb un JComboBox amb el nom de les imatges, que ara agafarem de Cloud Firestore, i un JButton  per a mostrar la imatge.

Li posarem ara el nom de Exemple_7_5_3_FirebaseCF-CS_CoffeeShops.kt. El codi està simplificat al màxim, llevant tractament d'errors i opcions. Observeu que estem connectant a l'usuari comú que tenim per a fer proves, ad.ieselcaminas@gmail.com

import javax.swing.JFrame
import java.awt.EventQueue
import javax.swing.JComboBox
import java.awt.BorderLayout
import javax.swing.JPanel
import java.awt.FlowLayout
import java.io.FileInputStream
import com.google.firebase.FirebaseOptions
import com.google.auth.oauth2.GoogleCredentials
import com.google.firebase.FirebaseApp
import com.google.cloud.storage.Bucket
import com.google.firebase.cloud.StorageClient
import javax.imageio.ImageIO
import java.nio.ByteBuffer
import java.io.ByteArrayInputStream
import javax.swing.ImageIcon
import javax.swing.JButton
import com.google.firebase.cloud.FirestoreClient
import com.google.cloud.firestore.Firestore

class CoffeeShops : JFrame() {
    val nomCafe = JComboBox<String>()
    val foto = JButton()

    var bucket: Bucket? = null
    var database: Firestore? = null

    init {
        defaultCloseOperation = JFrame.EXIT_ON_CLOSE
        setBounds(100, 100, 900, 600)
        setLayout(BorderLayout())

        val panell1 = JPanel(FlowLayout())
        panell1.add(nomCafe)
        getContentPane().add(panell1, BorderLayout.NORTH)

        getContentPane().add(foto, BorderLayout.CENTER)

        val serviceAccount = FileInputStream("xat-ad-9f901-firebase-adminsdk-f1vja-ee7dc206de.json")

        val options = FirebaseOptions.builder()
            .setCredentials(GoogleCredentials.fromStream(serviceAccount))
            .build()

        FirebaseApp.initializeApp(options)

        bucket = StorageClient.getInstance().bucket("xat-ad-9f901.appspot.com")

        database = FirestoreClient.getFirestore()

        // Exemple de listener de lectura contínua addSnapshotListener() sobre una col·lecció
        // Per a posar tota la llista de missatges. Sobre /Xats/XatProva/missatges

        database?.collection("CoffeeShops")?.orderBy("nom")?.addSnapshotListener { snapshots, e ->
            for (dc in snapshots!!.getDocumentChanges()) {
                nomCafe.addItem(dc.getDocument().getString("nom"))
            }
        }

        nomCafe.addActionListener { agafar() }

    }

    fun agafar() {
        //Primer agafem el nom de la imatge mirant el document que té el nom com el triat
        //Després agafem la imatge amb eixe nom
        database?.collection("CoffeeShops")?.whereEqualTo("nom", nomCafe.getSelectedItem())!!
            .addSnapshotListener { snapshots, e ->

                for (dc in snapshots!!.getDocumentChanges()) {
                    val blob = bucket?.get("CoffeeShops/" + dc.getDocument().getString("imatge"))

                    //Segona manera de llegir: muntant un reader per a carregar a un ByteBuffer
                    val im = ByteBuffer.allocate(1024 * 1024)
                    blob?.reader()?.read(im)
                    val image = ImageIO.read(ByteArrayInputStream(im.array()))
                    foto.setIcon(ImageIcon(image))
                }
            }
    }

}

fun main(args: Array<String>) {
    EventQueue.invokeLater {
        CoffeeShops().isVisible = true
    }
}