<?xml version="1.0" encoding="UTF-8"?>
<!--
 Copyright 2013 The Android Open Source Project

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->



<sample>
    <name>ElizaChat</name>
    <group>Wearable</group>
    <package>com.example.android.wearable.elizachat</package>



    <!-- change minSdk if needed-->
    <minSdk>18</minSdk>


    <strings>
        <intro>
            <![CDATA[
            This sample is a phone application that provides a chat experience in which users can respond to
            messages with a quick voice response. New messages create a notification with a "Reply" action.
            The notification is bridged from phone to wearable, and selecting the "Reply" action on the
            wearable opens the voice transcription UI allowing the user to speak a response.
            ]]>
        </intro>
    </strings>

    <template src="base"/>

    <metadata>
        <status>PUBLISHED</status>
        <categories>Wearable</categories>
        <technologies>Android</technologies>
        <languages>Java</languages>
        <solutions>Mobile</solutions>
        <level>INTERMEDIATE</level>
        <icon>screenshots/wearable_eliza_notification.png</icon>
        <screenshots>
            <img>screenshots/companion_eliza_chat_response.png</img>
            <img>screenshots/companion_eliza_chat.png</img>
            <img>screenshots/wearable_eliza_notification.png</img>
            <img>screenshots/wearable_voice_reply.png</img>
        </screenshots>
        <api_refs>
            <android>android.support.v4.app.NotificationCompat.WearableExtender</android>
        </api_refs>

        <description>
<![CDATA[
A basic sample showing how to add extensions to notifications on wearable using
[NotificationCompat.WearableExtender][1] API by providing a chat experience.
]]>
        </description>

        <intro>
<![CDATA[
[NotificationCompat.WearableExtender][1] API offers you a functionality to
 add wearable extensions to notifications like [Add the Voice Input as a Notification Action][2].

This example also adds the wearable notifications as a voice input by the following code:

```java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
        .setContentTitle(getString(R.string.eliza))
        .setContentText(mLastResponse)
        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.bg_eliza))
        .setSmallIcon(R.drawable.bg_eliza)
        .setPriority(NotificationCompat.PRIORITY_MIN);

Intent intent = new Intent(ACTION_RESPONSE);
PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent,
        PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_CANCEL_CURRENT);
Notification notification = builder
        .extend(new NotificationCompat.WearableExtender()
                .addAction(new NotificationCompat.Action.Builder(
                        R.drawable.ic_full_reply, getString(R.string.reply), pendingIntent)
                        .addRemoteInput(new RemoteInput.Builder(EXTRA_REPLY)
                                .setLabel(getString(R.string.reply))
                                .build())
                        .build()))
        .build();
NotificationManagerCompat.from(this).notify(0, notification);
```

When you issue this notification, users can swipe to the left to see the "Reply" action button.

When you receive the response, you can do it by the following code:

```java
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (null == intent || null == intent.getAction()) {
        return Service.START_STICKY;
    }
    String action = intent.getAction();
    if (action.equals(ACTION_RESPONSE)) {
        Bundle remoteInputResults = RemoteInput.getResultsFromIntent(intent);
        CharSequence replyMessage = "";
        if (remoteInputResults != null) {
            replyMessage = remoteInputResults.getCharSequence(EXTRA_REPLY);
        }
        processIncoming(replyMessage.toString());
    } else if (action.equals(MainActivity.ACTION_GET_CONVERSATION)) {
        broadcastMessage(mCompleteConversation.toString());
    }
    return Service.START_STICKY;
}
```

[1]: https://developer.android.com/reference/android/support/v4/app/NotificationCompat.WearableExtender.html
[2]: https://developer.android.com/training/wearables/notifications/voice-input.html#AddAction
]]>
        </intro>
    </metadata>
</sample>
