2.3.3 CF: Utilització des d'Android
De forma absolutament paral·lela a com quan vam veure el Realtime Database per a Android, ara toca el torn d'accedir al Cloud Firestore de Firebase des d'Android. Com veurem, per a fer la connexió ens deixarem ajudar també per l'assistent.
Com en el cas anterior, farem dues versions, per a Java i per a Kotlin. Aquestes dues versions tindran la mateixa pantalla, és a dir el activity_main.xml serà idèntic.
Els projectes s'anomenaran respectivament Tema7_1_FirebaseCF_Java i Tema7_1_FirebaseCF_Kotlin.
Nota important
Tant en el cas de JAVA com en el de KOTLIN, per a accedir a Cloud Firestore i que no ens falle el programa, haurem de posar en el build.gradle de l'aplicació, dins de android i dins de defaultConfig el següent: multiDexEnabled true
Si no ho fem així ens pot donar el següent error:
Cannot fit requested classes in a single dex file (# methods: 80444 > 65536)
El activity_main.xml serà:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Spinner
android:id="@+id/comboXats"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/usuari"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text=""
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/comboXats" />
<TextView
android:id="@+id/ultim"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text=""
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/usuari" />
<EditText
android:id="@+id/text"
android:layout_width="317dp"
android:layout_height="44dp"
android:ems="10"
android:text=""
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/boto"
android:layout_width="wrap_content"
android:layout_height="44dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/text" />
<TextView
android:id="@+id/area"
android:layout_width="0dp"
android:layout_height="0dp"
android:text=""
app:layout_constraintBottom_toTopOf="@+id/text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ultim" />
</androidx.constraintlayout.widget.ConstraintLayout>
Els components que hem col·locat són:
- Un EditText per al nom d'usuari
- Un TextView, anomenat ultim, per a visualitzar l'últim missatge, que es coordinarà amb /Xats/XatProva/ultimMissatge
- Un EditText anomenat text, on posarem els missatges que volem enviar
- Un Button, anomenat boto, que quan l'apretem és quan s'enviarà el missatge.
- Un TextView, anomenat area, on anirà tot el xat
- Un Spinner, per a poder seleccionar el xat entre uns quants xats
I aquest seria l' "esquelet" del programa:
JAVA
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.DocumentChange;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.QuerySnapshot;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Spinner comboXats = (Spinner)findViewById(R.id.comboXats);
final EditText usuari = (EditText)findViewById(R.id.usuari);
final TextView ultim = (TextView)findViewById(R.id.ultim);
final TextView area = (TextView)findViewById(R.id.area);
final EditText text = (EditText)findViewById(R.id.text);
final Button boto = (Button)findViewById(R.id.boto);
boto.setText("Enviar");
final Context pantPrincipal = this;
// Referències a la Base de Dades i als documents
// Exemple de llegir tots els documents d'una col·lecció
// Per a triar el xat
// Exemple de lectura única: AddOnSuccessListener)
// Per a posar el títol. Sobre /Xats/XatProva/nomXat
// Exemple de listener de lectura contínua addSnapshotListener() sobre un document
// Per a posar l'últim missatge registrat. Sobre /Xats/XatProva/ultimMissatge
// Exemple de listener de lectura contínua addSnapshotListener() sobre una col·lecció
// Per a posar tota la llista de missatges. Sobre /Xats/XatProva/missatges
// Per a guardar dades
// Primer sobre /Xats/XatProva/ultimUsuari i /Xats/XatProva/ultimMissatge
// Després també com a documents en la col·lecció /Xats/XatProva/missatges
}
}
KOTLIN
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.*
import com.google.firebase.firestore.*
import java.text.SimpleDateFormat
import java.util.*
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
boto.text = "Enviar"
val pantPrincipal = this
// Referències a la Base de Dades i als documents
// Exemple de llegir tots els documents d'una col·lecció
// Per a triar el xat
// Exemple de lectura única: AddOnSuccessListener()
// Per a posar el títol. Sobre /Xats/XatProva/nomXat
// Exemple de listener de lectura contínua addSnapshotListener() sobre un document
// Per a posar l'últim missatge registrat. Sobre /Xats/XatProva/ultimMissatge
// Exemple de listener de lectura contínua addSnapshotListener() sobre una col·lecció
// Per a posar tota la llista de missatges. Sobre /Xats/XatProva/missatges
// Per a guardar dades
// Primer sobre /Xats/XatProva/ultimUsuari i /Xats/XatProva/ultimMissatge
// Després també com a documents en la col·lecció /Xats/XatProva/missatges
}
}