Erste Schritte

Dieser Abschnitt soll dem Engineering-Team einen 5-minütigen Überblick darüber geben, profilübergreifende Aufrufe funktionieren mit dem SDK und wie sie getestet werden können. Versuchen Sie noch nicht, etwas zu erstellen. Dieser Artikel dient nicht als Referenz oder Leitfaden, sondern nur als Einführung.

Benutzerdefinierte profilsensitive Klassen und Methoden

Mit dem verbundenen Apps SDK können Sie Ihre eigenen Klassen und Methoden als profilübergreifend. Dadurch werden Klassen und Methoden generiert, mit denen Sie die kommentierte Methode für jedes Profil ausführen können.

Sehen wir uns zum Beispiel die folgende Klasse mit der SDK-Annotation an:

public class CalendarDatabase {

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

Dadurch wird eine Klasse mit dem Präfix Profile generiert, mit der Sie diese API auf Profil Ihrer Wahl. Beispiel: java profileCalendarDatabase.work().deleteEvent(event, account);

Komplexere Beispiele

Realistisch gesehen werden Ihre Klassen und Methoden komplexer sein. Beispiel: Ihre vorhandene API könnte ListenableFuture-Rückgabetypen verwenden. Möglicherweise benötigen Sie um Ergebnisse aus beiden Profilen zu kombinieren. Betrachten Sie dieses Beispiel:

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());

Diese generierten Klassen und Methoden funktionieren wie erwartet mit vollständiger Typsicherheit und IDE-Codevervollständigung.

Jeder Rückgabe- und Parametertyp Ihrer annotierten APIs muss vom SDK, unterstützt aber vollständig Verschachtelungen und generische Elemente von Listen, Sets, Arrays, Primitive, alle parierbaren Typen und alle serialisierbaren Typen sowie ListenableFuture, Optional und Protos. Sie können auch weitere Unterstützung für Typen, die vom SDK nicht nativ unterstützt werden. Als extremes Beispiel würde ListenableFuture<List<Map<CustomProto, CustomParcelableType[]>>> nahtlos unterstützen.

Test

Das SDK vereinfacht das Testen von Einheiten. Für jede generierte Profilklasse gibt es eine entsprechende FakeProfile-Klasse, in der Sie Arbeit und persönlichen Instanzen zu entwickeln. Beispiel:

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