Начало работы

Целью этого раздела является предоставление инженерам пятиминутного обзора того, как межпрофильные вызовы работают с SDK и как их можно протестировать. Пока не пытайтесь что-либо построить — эта книга предназначена не для использования в качестве справочника или руководства, а просто для введения.

Пользовательские классы и методы с учетом профиля

SDK подключенных приложений позволяет аннотировать ваши собственные классы и методы как межпрофильные. При этом создаются классы и методы, которые позволяют выполнять аннотированный метод в любом профиле.

Например, рассмотрим следующий класс с добавленной аннотацией SDK:

public class CalendarDatabase {

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

При этом создается класс с префиксом Profile, позволяющий вызывать этот API в выбранном вами профиле. Например: java profileCalendarDatabase.work().deleteEvent(event, account);

Более сложные примеры

Если быть более реалистичным, ваши классы и методы будут более сложными. Например, ваш существующий API может использовать возвращаемые типы ListenableFuture , и вам может потребоваться объединить результаты из обоих профилей. Рассмотрим этот пример:

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

Эти сгенерированные классы и методы работают должным образом с полной безопасностью типов и завершением кода IDE.

Каждый тип возвращаемого значения и параметра ваших аннотированных API должен поддерживаться SDK, но он полностью поддерживает вложенность и обобщения списков, наборов, массивов, примитивов, любого типа, который можно разделить, и любого сериализуемого типа, в дополнение к ListenableFuture , Optional и protos. . Вы также можете добавить поддержку типов, которые изначально не поддерживаются SDK. В качестве крайнего примера, он будет легко поддерживать ListenableFuture<List<Map<CustomProto, CustomParcelableType[]>>> .

Тестирование

SDK предназначен для упрощения модульного тестирования. Для каждого сгенерированного класса профиля существует соответствующий класс FakeProfile , которому вы можете предоставить рабочие и личные экземпляры. Например:

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