Android para carros - Guia de migração do Jetpack

A biblioteca Android for Cars App agora faz parte do Jetpack. A migração para o Jetpack oferece muitos benefícios, incluindo maior visibilidade do nosso desenvolvimento de recursos e a consistência da API com outras bibliotecas do Jetpack.

Como parte dessa migração para o Jetpack, fizemos várias mudanças na API para que ficasse consistente com o restante do ecossistema Android. Para ajudar a migrar qualquer app que você já tenha criado com a versão de código-fonte fechado da biblioteca Car App, compilamos este guia, que descreve as mudanças em detalhes e fornece instruções para migrar seu app para a nova biblioteca.

Mudanças no AndroidManifest

No AndroidManifest.xml do seu app, substitua as seguintes instâncias da biblioteca de código-fonte fechado pelos equivalentes da biblioteca do Jetpack, sempre que aplicável:

Categorias de apps

Código-fonte fechado Equivalente da biblioteca do Jetpack
com.google.android.car.category.NAVIGATION androidx.car.app.category.NAVIGATION
com.google.android.car.category.PARKING androidx.car.app.category.PARKING
com.google.android.car.category.CHARGING androidx.car.app.category.CHARGING

Permissões

Código-fonte fechado Equivalente da biblioteca do Jetpack
com.google.android.libraries.car.app.ACCESS_SURFACE androidx.car.app.ACCESS_SURFACE
com.google.android.libraries.car.app.NAVIGATION_TEMPLATES androidx.car.app.NAVIGATION_TEMPLATES
Indisponível. Novidade na biblioteca do Jetpack androidx.car.app.MAP_TEMPLATES

CarAppService

Código-fonte fechado Equivalente da biblioteca do Jetpack
com.google.android.car.action.CAR_APP androidx.car.app.CarAppService

Temas

Código-fonte fechado Equivalente da biblioteca do Jetpack
com.google.android.libraries.car.app.theme androidx.car.app.theme

Mudanças na API

Mudança de namespace

O namespace da biblioteca foi alterado de com.google.android.libraries.car.app para androidx.car.app.

Substitua todas as importações de biblioteca de com.google.android.libraries.car.app.* para androidx.car.app.*.

CarAppService e Session

Separamos o ciclo de vida da conexão do host com o app de CarAppService para uma nova classe Session. A lógica de criação de CarContext e Screen foi movida para Session.

Um dos pontos de entrada principais do seu app, CarAppService#onCreateScreen(Intent) foi substituído por CarAppService.onCreateSession. Em essência, vários métodos que estavam anteriormente em CarAppService agora estão na classe Session. Consulte as tabelas a seguir para ver um resumo e a documentação no nível da classe de Session para mais detalhes.

CarAppService
Código-fonte fechado Equivalente da biblioteca do Jetpack
finish() Removido

Invoque CarContext.finishCarApp diretamente.

getCarContext() Movido para Session
getLifecycle() Movido para Session
onCarAppFinished() Removido

Use Session.getLifecycle e ouça o evento Lifecycle.Event#ON_DESTROY.

onCarConfigurationChanged(Configuration) Movido para Session
onCreateScreen(Intent) Movido para Session
onDestroy() Removido

Esse método agora é irrelevante, e a lógica é processada em CarAppService.onUnbind.

onNewIntent(Intent) Movido para Session
Indisponível. Novidade na biblioteca do Jetpack getCurrentSession()
Indisponível. Novidade na biblioteca do Jetpack onCreateSession()
Indisponível. Novidade na biblioteca do Jetpack createHostValidator() Consulte Validação do host.
Session
Código-fonte fechado Equivalente da biblioteca do Jetpack
Movido de CarAppService getCarContext()
Movido de CarAppService getLifeCycle()
Movido de CarAppService onCarConfigurationChanged(Configuration)
Movido de CarAppService onCreateScreen(Intent)
Movido de CarAppService onNewIntent(Intent)

Na forma mais simples, seu app pode retornar uma instância de Session como esta, caso seu app não tenha nenhuma lógica que processe o ciclo de vida da conexão:

  @Override
  @NonNull
  public Session onCreateSession() {
    return new Session() {
      @Override
      @NonNull
      public Screen onCreateScreen(@Nullable Intent intent) {
        return new HelloWorldScreen(getCarContext());
      }
    };
  }

Construtores de builder

Estamos abandonando o modelo em que fornecemos builders estáticos para a criação de vários objetos de dados. Em vez disso, os construtores de builder são expostos diretamente como métodos públicos. Exemplo:

    Pane.Builder paneBuilder = Pane.builder();

se tornou:

    Pane.Builder paneBuilder = new Pane.Builder();

Reutilização de builder

Estamos abandonando o modelo em que damos suporte explicitamente à reutilização de builders. Métodos de builder que permitem que seu app limpe alguns dados previamente definidos não estão mais disponíveis. Por exemplo, os métodos a seguir (e outros métodos de limpeza*) foram removidos:

    ActionStrip.Builder.clearActions()

Novo GridItem e GridTemplate

A biblioteca do Jetpack vem com um novo GridTemplate que apresenta uma lista de GridItem em um formato de grade. Para detalhes e uso, consulte a documentação de GridTemplate.

Validação do host

Adicionamos mecanismos para permitir que seu app confirme se uma conexão de host vem de uma fonte confiável (por exemplo, Android Auto e Android Automotive OS). Um exemplo de implementação do método abstrato CarAppService.createHostValidator é o seguinte:

    @Override
    public HostValidator createHostValidator() {
        if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
            return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
        } else {
            return new HostValidator.Builder(getApplicationContext())
                    .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
                    .build();
        }
    }

Consulte a documentação de CarAppService.createHostValidator para saber mais.

Mudanças diversas

As tabelas a seguir destacam o restante das mudanças que fizemos em toda a biblioteca (como renomear APIs atuais ou adicionar outras). Observe que esta lista não é completa, mas fornece insights sobre as categorias de mudanças feitas à biblioteca.

AppManager

Código-fonte fechado Equivalente da biblioteca do Jetpack
setSurfaceListener(SurfaceListener) setSurfaceCallback(SurfaceCallback)

CarContext

Código-fonte fechado Equivalente da biblioteca do Jetpack
Indisponível. Novidade na biblioteca do Jetpack getCarAppApiLevel()

OnScreenResultCallback -> OnScreenResultListener

Screen

Código-fonte fechado Equivalente da biblioteca do Jetpack
static final String ROOT Removido

Substituído por ScreenManager.poptoRoot

getTemplate() onGetTemplate()

ScreenManager

Código-fonte fechado Equivalente da biblioteca do Jetpack
Indisponível. Novidade na biblioteca do Jetpack popToRoot()

SurfaceListener -> SurfaceCallback

ItemList.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
setOnItemsVisibilityChangeListener(OnItemsVisibilityChangedListener) setOnItemsVisibilityChangedListener(OnItemsVisibilityChangedListener)
setSelectable(OnSelectedListener) setOnSelectedListener(OnSelectedListener)

ListTemplate.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
setIsLoading(boolean) setLoading(boolean)

Pane.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
setIsLoading(boolean) setLoading(boolean)

PlaceListMapTemplate.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
setIsLoading(boolean) setLoading(boolean)

Row.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
setIsBrowsable(boolean) setBrowsable(boolean)

SearchTemplate.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
setIsLoading(boolean) setLoading(boolean)

com.google.android.libraries.car.app.SearchListener -> androidx.car.app.model.SearchTemplate.SearchCallback

Toggle.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
setCheckedChangeListener(OnCheckedChangeListener) setOnCheckedChangeListener(OnCheckedChangeListener)

NavigationManagerListener -> NavigationManagerCallback

Código-fonte fechado Equivalente da biblioteca do Jetpack
stopNavigation() onStopNavigation()

NavigationManager

Código-fonte fechado Equivalente da biblioteca do Jetpack
setListener(NavigationManagerListener) setNavigationManagerCallback(NavigationManagerCallback)
Indisponível. Novidade na biblioteca do Jetpack setNavigationManagerCallback(Executor, NavigationManagerCallback)
Indisponível. Novidade na biblioteca do Jetpack clearNavigationManagerCallback()

Maneuver

Código-fonte fechado Equivalente da biblioteca do Jetpack
Indisponível. Novidade na biblioteca do Jetpack static int TYPE_ROUNDABOUT_ENTER_CW
static int TYPE_ROUNDABOUT_EXIT_CW
static int TYPE_ROUNDABOUT_ENTER_CCW
static int TYPE_ROUNDABOUT_EXIT_CCW
static int TYPE_FERRY_BOAT_LEFT
static int TYPE_FERRY_BOAT_RIGHT
static int TYPE_FERRY_TRAIN_LEFT
static int TYPE_FERRY_TRAIN_RIGHT
Removido static int TYPE_ROUNDABOUT_ENTER
static int TYPE_ROUNDABOUT_EXIT

PlaceListNavigationTemplate.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
setIsLoading(boolean) setLoading(boolean)

RoutePreviewNavigationTemplate.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
setIsLoading(boolean) setLoading(boolean)

RoutingInfo.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
setIsLoading(boolean) setLoading(boolean)

TravelEstimate

Código-fonte fechado Equivalente da biblioteca do Jetpack
Indisponível. Novidade na biblioteca do Jetpack static long REMAINING_TIME_UNKNOWN
static Builder builder(Distance, Duration, DateTimeWithZone) static Builder builder(Distance, DateTimeWithZone)
static Builder builder(Distance, Duration, ZonedDateTime) static Builder builder(Distance, ZonedDateTime)

TravelEstimate.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
Indisponível. Novidade na biblioteca do Jetpack setRemainingTimeSeconds(long)
Indisponível. Novidade na biblioteca do Jetpack setRemainingTime(Duration)

Trip.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
setIsLoading(boolean) setLoading(boolean)

CarAppExtender

Código-fonte fechado Equivalente da biblioteca do Jetpack
getLargeIconBitmap() getLargeIcon()
getSmallIconResId() getSmallIcon()

CarAppExtender.Builder

Código-fonte fechado Equivalente da biblioteca do Jetpack
Indisponível. Novidade na biblioteca do Jetpack setColor(CarColor)

Biblioteca de testes

A biblioteca de testes ainda não está disponível na primeira versão Beta. Parte da funcionalidade oferecida pela biblioteca de testes para acessar campos definidos em modelos pelas classes de builder agora está disponível nos getters dos modelos. O restante da funcionalidade de teste estará disponível quando a biblioteca de testes for lançada como parte do Jetpack em breve.