Android auto integration for React native apps
npm install react-native-android-autoA react native module (+ a react renderer) to control android auto app UI from JavaScript and with React code. (and of cource independently of MainActivity!)
$ npm install react-native-android-auto --save
In order to display the app launcher in the car display:
You need to add the following lines to your app's AndroidManifest.xml under :
``xml
android:resource="@xml/automotive_app_desc" />
android:exported="true">
`
And create a new file: android/app/src/main/res/xml/automotive_app_desc.xml with the following contents:
`xml
`
`javascript`
import { Screen, ScreenManager } from "react-native-android-auto";
In order to start your app's android auto screen, you need to register a root component it via AppRegistery:
`ts
import React from "react";
import { AppRegistry } from "react-native";
import { render } from "./src/car/android-auto/module/AndroidAutoReconciler";
// RootApp -> The component
AppRegistry.registerRunnable("androidAuto", () => {
render(React.createElement(RootApp));
});
`
The root component must eventually render a ScreenManager with at least one Screen. Just note that the ScreenManager doesn't need to be an immediate child of root component.
`tsx`
export function RootApp() {
return (
);
}
A Screen with name="root" is required to start the app, otherwise the app will be stuck in an infinite loading state.
The react renderer comes with a bunch of native elements specific to Android Auto.
`tsx
import {useCarNavigation} from 'react-native-android-auto';
export function Main() {
const shop = useShop();
const navigation = useCarNavigation();
const { loading, data } = useQuery(deliveryListsQuery);
return (
isLoading={loading || !data}
>
{data.deliveryListEdges.slice(0, 5).map(({ node }) => (
title={node.description}
texts={[node.name]}
onPress={() => {
navigation.push("deliveryList", {
deliveryList: node,
});
}}
/>
))}
);
}
`
A Screen's given render component's immediate child must be a template element. Currently, pane-template, list-template, and place-list-map-template are supported.
#### pane-template
| Prop | Type | Description |
| ------------ | -------------- | ------------------------------------------------------------- |
| title | string | The title of the screen shown at the top left |HeaderAction
| headerAction | | |ActionStrip
| actionStrip | | |ReactNode[]
| children | | only accepts instances of and as child |
#### list-template
| Prop | Type | Description |
| ------------ | -------------- | ---------------------------------------------------------------- |
| title | string | The title of the screen shown at the top left |HeaderAction
| headerAction | | |ActionStrip
| actionStrip | | |boolean
| isLoading | | Whether to ignore displaying children and show a spinner instead |ReactNode[]
| children | | only accepts instances of as child |
#### place-list-map-template
| Prop | Type | Description |
| ------------ | -------------- | ---------------------------------------------------------------- |
| title | string | The title of the screen shown at the top left |HeaderAction
| headerAction | | |ActionStrip
| actionStrip | | |boolean
| isLoading | | Whether to ignore displaying children and show a spinner instead |ReactNode[]
| children | | only accepts instances of as child |
#### row
| Prop | Type | Description |
| --------- | ------------------ | --------------------------------------------------------------------------- |
| title | string | Title of the row |
| texts? | string[] | You can specify multiple lines of texts to be displayed under the row title |
| onPress? | (event: {}) => any | A callback function invoked when user touches the row on the car display |
| metadata? | Metadata | |
#### action
| Prop | Type | Description |
| ---------------- | ------------------ | --------------------------------------------------------------------------- |
| title | string | Title of the row |
| texts? | string[] | You can specify multiple lines of texts to be displayed under the row title |
| onPress? | (event: {}) => any | A callback function invoked when user touches the row on the car display |
| backgroundColor? | CarColor | |
#### item-list
| Prop | Type | Description |
| -------- | ------------- | -------------------------------------------- |
| header | string | Title of the row |
| children | ReactNode[] | only accepts instances of
Check out our Contributing Guide
MIT © Shopify, see LICENSE.md for details.