Premiers pas

Cette section est conçue pour donner aux ingénieurs un aperçu de 5 minutes de la façon dont interprofils fonctionnent avec le SDK et la façon dont ils peuvent être testés. N'essayez pas de créer quoi que ce soit pour le moment. Cet article n'est pas conçu pour servir de référence ou de guide, mais simplement d'introduction.

Classes et méthodes tenant compte des profils personnalisés

Le SDK des applications connectées vous permet d'annoter vos propres classes et méthodes comme interprofils. Cela génère des classes et des méthodes qui vous permettent d'exécuter sur n'importe quel profil.

Prenons l'exemple de la classe suivante, avec une annotation de SDK ajoutée :

public class CalendarDatabase {

  @CrossProfile // SDK annotation
  public void deleteEvent(Event event, Account account) {
    // complex logic with database calls
  }
}

Cela génère une classe avec le préfixe Profile, qui vous permet d'appeler cette API sur le profil de votre choix. Par exemple : java profileCalendarDatabase.work().deleteEvent(event, account);

Exemples plus complexes

En réalité, vos classes et méthodes seront plus complexes. Par exemple, votre API existante pourrait utiliser les types renvoyés ListenableFuture et vous pourriez avoir besoin pour combiner les résultats des deux profils. Considérez l'exemple suivant :

public class CalendarDatabase {

  @CrossProfile // SDK annotation
  public ListenableFuture<Collection<Event>> getEvents() {
    // complex logic with database calls
  }
}
// Merge results from both profiles into a set
profileCalendarDatabase.both()
  .getEvents()
  .transform((Map<Profile, Collection<Event>> events) -> {
    return events.values()
        .stream()
        .flatMap(Collection::stream)
        .collect(Collectors.toSet());
  }, directExecutor());

Ces classes et méthodes générées fonctionnent comme prévu avec une sécurité des types complète et la complétion de code de l'IDE.

Chaque type de retour et de paramètre de vos API annotées doit être compatible avec le mais il est entièrement compatible avec l'imbrication et les génériques de listes, d'ensembles, de tableaux, primitives, tous les types parcelables et sérialisables, en plus ListenableFuture, Optional et protos. Vous pouvez également ajouter la compatibilité avec les types qui ne sont pas compatibles de manière native avec le SDK. Prenons un exemple extrême : serait parfaitement compatible avec ListenableFuture<List<Map<CustomProto, CustomParcelableType[]>>>.

Tests

Le SDK est conçu pour simplifier les tests unitaires. Pour chaque classe de profil générée, il existe une classe FakeProfile correspondante à laquelle vous pouvez fournir des instances professionnelles et personnelles. Exemple :

// Create an instance of the SDK-generated fake connector class. This
// class lets you control the availability of the profiles, which
// profile you are now running on.
private final FakeCrossProfileConnector connector =
  new FakeCrossProfileConnector();

// Create an instance of your real/fake/mock class for both profiles.
private final CalendarDatabase personalCalendarDatabase =
  new FakeCalendarDatabase();
private final CalendarDatabase workCalendarDatabase =
  new FakeCalendarDatabase();

// Create an instance of the SDK-generated fake profile-aware class.
private final FakeProfileCalendarDatabase profileCalendarDatabase =
  FakeProfileCalendarDatabase.builder()
    .personal(personalCalendarDatabase)
    .work(workCalendarDatabase)
    .connector(connector)
    .build();

// Pass profileCalendarDatabase into your classes under test, or set
// Dagger up to inject the fake automatically.