Aggiungere funzionalità relative alla chat a un'app Android con le API Messaging e People

1. Prima di iniziare

Creare un'app di messaggistica è una sfida. Sebbene l'esperienza utente complessiva sia soggettiva, Android fornisce le API Messaging e People, che migliorano e semplificano l'esperienza di chat.

In questo codelab imparerai a utilizzare queste API per creare un ecosistema interessante per le app di chat su Android. Estenderai l'app JetChat, un'app di chat essenziale e non funzionale che utilizza Jetpack Compose.

Prerequisiti

  • Conoscenze di base dello sviluppo Android
  • Conoscenze di base delle notifiche

Che cosa creerai

Un'app JetChat estesa che esegue le seguenti operazioni:

  • Mostra le notifiche che rappresentano le conversazioni nella sezione delle conversazioni riservata del riquadro delle notifiche.
  • Fa riferimento ai target di condivisione in queste notifiche che ti consentono di condividere nelle conversazioni dell'app.
  • Applica le best practice per la creazione di questi oggetti per sfruttare le esperienze predefinite fornite dal sistema che migliorano l'app.

Che cosa imparerai a fare

  • Come mostrare le notifiche relative alle conversazioni nella sezione delle conversazioni riservata del riquadro delle notifiche.
  • Come comprendere le varie esperienze abilitate dalle API Messaging e People.

Che cosa ti serve

  • Git
  • Android Studio
  • Un account GitHub

2. Configurazione

Il punto di partenza è l'app JetChat. Il codice di avvio estende l'app JetChat per mostrare meglio le API Messaging e People.

Recuperare il codice di avvio

Per recuperare il codice di avvio per questo codelab:

  1. Dalla riga di comando, clona il seguente repository GitHub:
git clone –branch starter-code \
https://github.com/android/people-messaging-codelab.git
  1. Apri il progetto in Android Studio e fai clic su a1bbb9d97659a043.png Esegui app. Viene visualizzato il riquadro Emulatore con l'app.

Esplorare l'app JetChat estesa

  1. Nella casella di testo Message #composers dell'app, inserisci un messaggio e tocca Invia.
  2. Esci dall'app. Dopo alcuni secondi, riceverai una notifica push contenente una risposta da qualcuno nella chat.

3. Creare notifiche delle conversazioni

Android 11 ha introdotto API che consentono alle notifiche relative alla chat di essere visualizzate in una sezione designata del riquadro delle notifiche, riservata esclusivamente alle conversazioni.

Il riquadro delle notifiche che viene visualizzato quando scorri verso il basso dalla barra di stato

La notifica deve essere della classe Notification.MessagingStyle e fare riferimento a una scorciatoia per la condivisione di lunga durata. In questa sezione imparerai a soddisfare questi requisiti dell'API per mostrare queste notifiche che rappresentano le conversazioni nella sezione delle conversazioni.

Per creare notifiche della classe NotificationCompat.MessagingStyle:

  1. Nella scheda Progetto di Android Studio, fai clic su app > java > com.example.compose.jetchat > conversation e poi fai doppio clic su ConversationFragment.
  2. Nel file ConversationFragment.kt, trova la classe ConversationFragment e poi il blocco di codice Notification della funzione createNotification in cui viene creata la notifica.
  3. Sostituisci il metodo setContentText con un metodo setStyle che imposta lo stile della notifica sulla classe NotificationCompat.MessagingStyle. Questa classe helper aggiunge il messaggio impostato con il metodo setContextText con un contesto aggiuntivo pertinente al messaggio, ad esempio l'ora di invio e la persona che lo ha inviato.

ConversationFragment.kt

private fun createNotification(
   notificationId: Int,
   message: Message,
   person: Person,
   shortcut: ShortcutInfoCompat,
   time: Long
): Notification? {
    ...
    .setStyle(NotificationCompat.MessagingStyle(person).addMessage(
                      NotificationCompat.MessagingStyle.Message(
                          message.content,
                          time,
                          person
                      )
    )
    )
    ...
    .build()
}

Eseguire l'app

  1. Esegui l'app.
  2. Nella casella di testo Message #composers dell'app, inserisci un messaggio e tocca Invia.
  3. Esci dall'app. Riceverai di nuovo una notifica push, ma con uno stile diverso. Include un avatar e uno stile distinto per il messaggio. Tuttavia, devi fare altro prima che le notifiche vengano visualizzate dove dovrebbero.

4. Creare target di condivisione per le conversazioni

Devi fare riferimento a una scorciatoia per la condivisione o a un target di condivisione nella notifica. I target di condivisione sono definiti nel file shortcuts.xml e sono i punti di ingresso per la gestione delle scorciatoie definite a livello di programmazione. Le scorciatoie che crei rappresentano le conversazioni nell'app e ti consentono di condividere contenuti nelle conversazioni.

Definire i target di condivisione

  1. Nella scheda Progetto, fai clic con il tasto destro del mouse sulla directory res e seleziona Nuovo > Directory.
  2. Nella casella di testo, inserisci xml e premi Enter (o return su macOS).
  3. Fai clic con il tasto destro del mouse sulla directory xml e seleziona File.
  4. Nella casella di testo, inserisci shortcuts.xml e premi Enter (o return su macOS).
  5. Nel file shortcuts.xml, dichiara il target di condivisione che gestisce la condivisione dei dati di tipo text/plain:

shortcuts.xml

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
  <share-target android:targetClass="com.example.compose.jetchat.NavActivity">
   <data android:mimeType="text/plain" />
   <category android:name="com.example.compose.jetchat.share.TEXT_SHARE_TARGET" />
 </share-target>
</shortcuts>
  1. Nella scheda Progetto, fai clic su manifests e poi fai doppio clic su AndroidManifest.xml.
  2. Nel file AndroidManifest.xml, definisci il file shortcuts.xml:

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.compose.jetchat">

   <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.Jetchat.NoActionBar">
...
 <meta-data android:name="android.app.shortcuts"
            android:resource="@xml/shortcuts" />

    </application>
</manifest>
  1. Nel componente activity del file AndroidManifest.xml, definisci il filtro per intent che contiene la logica di condivisione:

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.compose.jetchat">

   ...
       <activity
           ...
           <intent-filter>
               <action android:name="android.intent.action.SEND" />
               <category android:name="android.intent.category.DEFAULT" />
               <data android:mimeType="text/plain" />
           </intent-filter>
...

Definire le scorciatoie

Per ogni notifica, devi associare la scorciatoia pertinente. Definisci una sola scorciatoia univoca per conversazione, perché la scorciatoia univoca rappresenta l'unico contatto con cui condividere.

Per generare una scorciatoia:

  1. Nella scheda Progetto, fai clic su app > java > com.example.compose.jetchat > conversation > util e poi fai doppio clic su ConversationUtil.
  2. Nel file ConversationUtil.kt, aggiungi una funzione generateShortcut:

ConversationUtil.kt

import android.content.Intent
import androidx.core.content.pm.ShortcutInfoCompat
import com.example.compose.jetchat.NavActivity

class ConversationUtil {

   companion object {
...
fun generateShortcut(context: Context, shortcutId: String): ShortcutInfoCompat {
   return ShortcutInfoCompat.Builder(context, shortcutId)
   .setCategories(setOf(CATEGORY_SHARE))
   .setLongLived(true)
   .setShortLabel(shortcutId)
   .setLongLabel(shortcutId)
   .setIntent(
       Intent(context, NavActivity::class.java)
           .setAction(Intent.ACTION_VIEW)
   )
   .build()
}

Questa funzione contiene i metodi setPerson e setLongLived necessari per la conversazione. La persona è il contatto associato alla scorciatoia e l'impostazione di lunga durata su un valore true garantisce che questa scorciatoia venga memorizzata nella cache dal sistema e visualizzata in varie piattaforme dell'UI.

Fare riferimento alla scorciatoia nella notifica

Devi fare riferimento alla scorciatoia per la condivisione nella notifica. Tuttavia, devi creare la scorciatoia prima di inviare la notifica.

Per farlo, segui questi passaggi:

  1. Nel file ConversationFragment.kt, trova la classe ConversationFragment.
  2. Prima della chiamata alla variabile notification, crea una variabile shortcut che faccia riferimento alla scorciatoia generata da ConversationUtil.generateShortcut.
  3. Nel metodo createNotification della variabile notification, sostituisci null con la variabile shortcut come parametro.

ConversationFragment.kt

private fun simulateResponseAsANotification() {
   ...
   if (message.author != "me") {
       ...
       val shortcut = ConversationUtil.generateShortcut(context!!, message.author)
       val notification = createNotification(notificationId, message, person, shortcut, time)
       ...
   }
}
  1. Nel metodo createNotification, aggiungi il NotificationCompat.Builder#setShortcutInfo metodo e poi passa la variabile shortcut come parametro.

ConversationFragment.kt

private fun createNotification(
  notificatoinIf: Int,
  messagin: Message,
  person: Person,
  shortcut: ShortcutInfoCompat?,
  time: Long
): Notification {
...
return NotificationCompat.Builder(context!!,  ConversationUtil.CHANNEL_MESSAGES)
   ...
   .setShortcutInfo(shortcut)
   .build()
}

Pubblicare la scorciatoia

  • Per pubblicare la scorciatoia, nella funzione simulateResponseAsANotification prima del metodo notificationManager.notify, chiama il metodo pushDynamicShortcut:

ConversationFragment.kt

import androidx.core.content.pm.ShortcutManagerCompat

...private fun simulateResponseAsANotification() {
   ...
   if (message.author != "me") {
       ...
       ShortcutManagerCompat.pushDynamicShortcut(context!!, shortcut)
       ...
   }
}

Eseguire l'app

  1. Esegui l'app.
  2. Nella casella di testo Message #composers dell'app, inserisci un messaggio e tocca Invia.
  3. Esci dall'app. Riceverai di nuovo una notifica push, ma con uno stile più distinto come notifica relativa alla conversazione. L'icona dell'avatar è più pronunciata e integra l'icona dell'app. Anche il mittente, l'ora e il testo sono più semplificati.

5. (Facoltativo) Attivare le bolle

Le bolle sono state introdotte in Android 9, migliorate e riproposte per l'utilizzo nel contesto delle conversazioni in Android 11. Le bolle sono overlay circolari che sono avatar delle tue conversazioni. Vengono visualizzate nel launcher delle app e ti consentono di rispondere facilmente alle conversazioni in una bolla espansa. Anche se implementate, le bolle sono facoltative a seconda delle preferenze dell'utente.

Per attivare le bolle:

  1. Nel file AndroidManifest.xml, aggiungi gli attributi allowEmbedded e resizeableActivity, quindi imposta ciascuno su un valore true:

AndroidManifest.xml

<activity
  ...
  android:allowEmbedded="true"
  android:resizeableActivity="true"
  ...
</activity>
  1. Nel file ConversationUtil.kt della classe ConversationUtil, aggiungi i metadati delle bolle:

ConversationUtil.kt

import androidx.core.app.NotificationCompat
import androidx.core.graphics.drawable.IconCompat


fun createBubbleMetadata(context: Context, icon: IconCompat): NotificationCompat.BubbleMetadata {
        // Create bubble intent
        val target = Intent(context, NavActivity::class.java)
        val bubbleIntent = PendingIntent.getActivity(context, REQUEST_BUBBLE, target, flagUpdateCurrent(mutable = true))

        // Create bubble metadata
        return NotificationCompat.BubbleMetadata.Builder(bubbleIntent, icon)
            .setDesiredHeight(400)
            .setSuppressNotification(true)
            .build()
    }
  1. Nel file ConversationFragment.kt, crea e fai riferimento ai metadati delle bolle nella notifica:

ConversationFragment.kt

private fun createNotification(
  notificatoinIf: Int,
  messagin: Message,
  person: Person,
  shortcut: ShortcutInfoCompat?,
  time: Long
): Notification {
...
// Reference the bubble metadata in the notification.
  return NotificationCompat.Builder(context!!,     ConversationUtil.CHANNEL_MESSAGES)
    ...
     .setBubbleMetadata(ConversationUtil.createBubbleMetadata(context!!, person.icon!!))
...
    .build()
}

Eseguire l'app

  1. Esegui l'app.
  2. Nella casella di testo Message #composers dell'app, inserisci un messaggio e tocca Invia.
  3. Esci dall'app. Dopo alcuni secondi, riceverai una notifica dalla chat sotto forma di bolla.
  4. Tocca la bolla. La conversazione si apre dalla bolla.

Una bolla di conversazione

6. (Facoltativo) Condividere un link

Hai dichiarato i target di condivisione e hai fatto riferimento a questi nelle notifiche, il che ha anche consentito la visualizzazione del tuo contatto in Sharesheet, un componente dal basso verso l'alto che viene visualizzato quando viene inviato un intent ACTION. I target di condivisione vengono visualizzati nella parte superiore di Sharesheet e ti consentono di condividere contenuti avanzati nelle conversazioni.

Per richiamare Sharesheet:

  1. Sul dispositivo, apri Google Chrome e vai a una pagina web a tua scelta, ad esempio developer.android.com.
  2. Se necessario, fai clic su 2fdbaccda71bc5f0.png Altro verticale.
  3. Fai clic su 771b0be21764f6b6.png Condividi. Sharesheet viene visualizzato nella parte inferiore dello schermo.

Sharesheet

  1. Se possibile, fai clic su 468248e6b8a84bb3.png JetChat. L'URL viene condiviso nella chat.
  2. Se non vedi 468248e6b8a84bb3.png JetChat, fai clic su 145399af71577431.png Altro per richiamare Sharesheet di sistema, quindi scorri verso l'alto su Sharesheet e fai clic su 468248e6b8a84bb3.png JetChat. L'URL viene condiviso nella chat.

Questo è un semplice esempio. Esistono tipi di contenuti più avanzati da condividere. Per ulteriori informazioni, consulta Recuperare dati semplici da altre app.

7. Complimenti

Complimenti! Ora sai come aggiungere funzionalità relative alla chat a un'app per Android con le API Messaging e People. Buona conversazione!

Scopri di più