package org.openhab.habwear.habbutler;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.speech.RecognizerIntent;
import android.support.wearable.view.WatchViewStub;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;
import org.openhab.habdroid.R;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
public static final String WEAR_COMMAND_BROADCAST = "org.openhab.habdroid.command.Wear_App_Command";
private static final int SPEECH_REQUEST_CODE = 0;
private final String TAG = "Wear";
private ImageView mImageNoConnection;
private IDeviceCommunicator mobileCommunicator;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new Handler();
setContentView(R.layout.activity_main);
final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
@Override
public void onLayoutInflated(WatchViewStub stub) {
mImageNoConnection = (ImageView) stub.findViewById(R.id.imageNoConnection);
mImageNoConnection.setVisibility(View.GONE);
ImageButton buttonSpeak = (ImageButton) stub.findViewById(R.id.buttonSpeak);
buttonSpeak.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
displaySpeechRecognizer();
}
});
ImageButton buttonFavorites = (ImageButton) stub.findViewById(R.id.buttonFavorites);
buttonFavorites.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessageToPhone("hi");
}
});
}
});
// retrieveDeviceNode();
mobileCommunicator = new MobileCommunicator(this);
final Intent intent = getIntent();
if (getIntent() != null)
handleActivityIntent(intent);
}
private void handleActivityIntent(final Intent intent) {
final Context context = this;
if (WearListenerService.WEAR_COMMAND_RESULT.equals(intent.getAction())) {
final String message = intent.getStringExtra(WearListenerService.WEAR_COMMAND_RESULT_MESSAGE);
Log.v(TAG, "Received: '" + message + "'");
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
});
} else {
Log.v(TAG, "Unknown => " + intent.getAction());
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "Unknown => " + intent.getAction(), Toast.LENGTH_SHORT).show();
}
});
}
}
@Override
protected void onResume() {
super.onResume();
mobileCommunicator.resume();
}
@Override
protected void onPause() {
mobileCommunicator.dispose();
super.onPause();
}
private void displaySpeechRecognizer() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES, new String[]{"sv-SE", "en-US"});
// intent.putExtra("android.speech.extra.EXTRA_ADDITIONAL_LANGUAGES", new String[]{"sv-SE","en-US"});
startActivityForResult(intent, SPEECH_REQUEST_CODE);
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Bundle languageDetails = data.getBundleExtra(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS);
if(languageDetails != null) {
if (languageDetails.containsKey(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE)){
String languagePreference = languageDetails.getString(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE);
Log.d("language preference",languagePreference);
}
if (languageDetails.containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)){
List<String> supportedLanguages = languageDetails.getStringArrayList( RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES);
for(String s:supportedLanguages){
Log.d("supported language",s);
}
}
}
if (requestCode == SPEECH_REQUEST_CODE && resultCode == RESULT_OK) {
ArrayList<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
// List<String> results2 = data.getStringArrayListExtra(RecognizerIntent.EXTRA_LANGUAGE);
Intent intent = new Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS);
LangBroadcastReceiver myBroadcastReceiver = new LangBroadcastReceiver(this, results);
sendOrderedBroadcast(intent, null, myBroadcastReceiver, null, Activity.RESULT_OK, null, null);
String spokenText = results.get(0);
Log.d(TAG, String.format("Spoken phrase: '%s'", spokenText));
// Log.d(TAG, "EXTRA_SUPPORTED_LANGUAGES: " + data.getStringExtra(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES));
Log.d(TAG, "EXTRA_LANGUAGE: " + data.getStringArrayListExtra(RecognizerIntent.EXTRA_LANGUAGE));
Log.d(TAG, "EXTRA_LANGUAGE_MODEL: " + data.getStringExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL));
Log.d(TAG, "EXTRA_LANGUAGE_PREFERENCE: " + data.getStringArrayListExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE));
if(spokenText.length() > 0) {
// Intent broadcastIntent = new Intent("Wear_Command");
// broadcastIntent.putExtra("Wear_Command", "get kitchen temperature");
// broadcastIntent.putExtra("Android_Wear_Conversation_Id", 0);
// intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
// this.getApplicationContext().sendBroadcast(broadcastIntent);
sendMessageToPhone(spokenText);
// Intent broadcastIntent = new Intent(WEAR_COMMAND_BROADCAST);
// broadcastIntent.putExtra(WEAR_COMMAND_BROADCAST, spokenText);
// broadcastIntent.putExtra(COMMAND_CONVERSATION_ID, OPENHAB_SYSTEM_CONVERSATION_ID);
// sendBroadcast(broadcastIntent);
// Log.d(TAG, "'Wear_Command' broadcast sent with 'Android_Wear_Conversation_Id' = 0");
}
}
}
// private GoogleApiClient getGoogleApiClient(Context context) {
// return new GoogleApiClient.Builder(context)
// .addApi(Wearable.API)
// .build();
// }
//
// public String nodeId;
//
// private void retrieveDeviceNode() {
// final GoogleApiClient client = getGoogleApiClient(this);
// final long CONNECTION_TIME_OUT_MS = 5000;
// new Thread(new Runnable() {
// @Override
// public void run() {
// client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);
// NodeApi.GetConnectedNodesResult result =
// Wearable.NodeApi.getConnectedNodes(client).await();
// List<Node> nodes = result.getNodes();
// if (nodes.size() > 0) {
// nodeId = nodes.get(0).getId();
// }
// client.disconnect();
// }
// }).start();
// }
private void sendMessageToPhone(final String message) {
Log.v(TAG, String.format("About to send '%s'...", message));
mobileCommunicator.sendMessage(MobileCommunicator.WEAR_COMMAND, message.getBytes(StandardCharsets.UTF_8));
// final GoogleApiClient client = getGoogleApiClient(this);
// final long CONNECTION_TIME_OUT_MS = 5000;
// if (nodeId != null) {
// new Thread(new Runnable() {
// @Override
// public void run() {
// client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);
// Wearable.MessageApi.sendMessage(client, nodeId, WEAR_COMMAND_BROADCAST, message.getBytes());
// client.disconnect();
// }
// }).start();
// }
}
}
class LangBroadcastReceiver extends BroadcastReceiver {
private final String TAG = "Wear";
ArrayList<String> recognisedText;
Activity parentActivity;
LangBroadcastReceiver(Activity activity, ArrayList<String> arrayList) {
recognisedText = arrayList;
parentActivity = activity;
}
@Override
public void onReceive(Context context, Intent intent) {
Bundle results = getResultExtras(true);
String lang = results.getString(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE);
Log.d(TAG, "LangBroadcastReceiver: Got 'EXTRA_LANGUAGE_PREFERENCE' = " + lang);
// now handle the recognisedText with the known language.
}
}