This guide details the different features of the Car App Library
that you can use to implement the functionality of your point of interest (POI)
app.

## Declare category support in your manifest

Your app needs to declare the `androidx.car.app.category.POI`
[car app category](https://developer.android.com/training/cars/apps#supported-app-categories) in the intent filter of its
[`CarAppService`](https://developer.android.com/reference/androidx/car/app/CarAppService).
| **Important:** As of Car App Library version 1.3, the `androidx.car.app.category.PARKING` and `androidx.car.app.category.CHARGING` [car app categories](https://developer.android.com/training/cars/apps#supported-app-categories) are deprecated. Use the `androidx.car.app.category.POI` category instead.

The following example shows how to declare the app category:  

    <application>
        ...
       <service
           ...
            android:name=".MyCarAppService"
            android:exported="true">
          <intent-filter>
            <action android:name="androidx.car.app.CarAppService" />
            <category android:name="androidx.car.app.category.POI"/>
          </intent-filter>
        </service>
        ...
    <application>

## Access the map templates

POI apps can access the [`PlaceListMapTemplate`](https://developer.android.com/reference/androidx/car/app/model/PlaceListMapTemplate)
and [`MapWithContentTemplate`](https://developer.android.com/reference/androidx/car/app/navigation/model/MapWithContentTemplate).

The `PlaceListMapTemplate` is specifically designed for showing a list of the
POIs alongside a map that is rendered by the host.

The `MapWithContentTemplate` can be used to display lists and other types of
content alongside a map that is rendered by your app. See
[Draw maps](https://developer.android.com/training/cars/apps#draw-maps) for more details on using this
template.

To access these templates, your app needs to declare the
`androidx.car.app.MAP_TEMPLATES` permission in its `AndroidManifest.xml` file:  

    <manifest ...>
      ...
      <uses-permission android:name="androidx.car.app.MAP_TEMPLATES"/>
      ...
    </manifest>

| **Note:** The `PlaceListMapTemplate` is available for use only by apps declaring the `androidx.car.app.category.POI` category or the deprecated `androidx.car.app.category.PARKING` or `androidx.car.app.category.CHARGING` categories. For navigation apps, see [Access the navigation templates](https://developer.android.com/training/cars/apps/navigation#access-navigation-templates).

## Refresh PlaceListMapTemplate content

You can let drivers refresh content with the tap of a button while browsing
lists of places built with
[`PlaceListMapTemplate`](https://developer.android.com/reference/androidx/car/app/model/PlaceListMapTemplate).
Implement the
[`OnContentRefreshListener`](https://developer.android.com/reference/androidx/car/app/model/OnContentRefreshListener)
interface's [`onContentRefreshRequested`](https://developer.android.com/reference/androidx/car/app/model/OnContentRefreshListener#onContentRefreshRequested())
method, and use
[`PlaceListMapTemplate.Builder.setOnContentRefreshListener`](https://developer.android.com/reference/kotlin/androidx/car/app/model/PlaceListMapTemplate.Builder#setoncontentrefreshlistener)
to set the listener on the template to enable list refresh.

The following snippet shows how to set the listener on the template:  

### Kotlin

```kotlin
PlaceListMapTemplate.Builder()
    ...
    .setOnContentRefreshListener {
        // Execute any desired logic
        ...
        // Then call invalidate() so onGetTemplate() is called again
        invalidate()
    }
    .build()
```

### Java

```java
new PlaceListMapTemplate.Builder()
        ...
        .setOnContentRefreshListener(() -> {
            // Execute any desired logic
            ...
            // Then call invalidate() so onGetTemplate() is called again
            invalidate();
        })
        .build();
```

The refresh button is only shown in the header of the
`PlaceListMapTemplate` if the listener has a value.

When the user clicks the refresh button, the `onContentRefreshRequested`
method of your `OnContentRefreshListener` implementation is called. Within
`onContentRefreshRequested`, call the
[`Screen.invalidate`](https://developer.android.com/reference/androidx/car/app/Screen#invalidate())
method. The host then calls back into your app's
[`Screen.onGetTemplate`](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate())
method to retrieve the template with the refreshed content. See [Refresh the
contents of a template](https://developer.android.com/training/cars/apps#refresh-template) for more information about
refreshing templates. As long as the next template returned by `onGetTemplate`
is of the same type, it is counted as a refresh and does not count toward the
template quota.

## Integrate with Google Assistant using App Actions

Voice-enable your POI app using Assistant to allow users to search for points of
interest by asking things like, *"Hey Google, find nearby charging stations on
ExampleApp"* . For detailed instructions, see [App Actions for Cars](https://developer.android.com/guide/app-actions/cars).

*** ** * ** ***