191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn/* 291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Copyright (C) 2014 The Android Open Source Project 391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * 491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * you may not use this file except in compliance with the License. 691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * You may obtain a copy of the License at 791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * 891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * 1091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 1191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * See the License for the specific language governing permissions and 1491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn * limitations under the License. 1591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn */ 1691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 1791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornpackage com.android.test.voiceinteraction; 1891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 1991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Intent; 20c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.os.Bundle; 217444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddharthaimport android.service.voice.AlwaysOnHotwordDetector; 227444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddharthaimport android.service.voice.AlwaysOnHotwordDetector.Callback; 23db92e35211d875eab75787c593eea2988c8a560fSandeep Siddharthaimport android.service.voice.AlwaysOnHotwordDetector.EventPayload; 2491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.VoiceInteractionService; 2591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log; 2691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 2722968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddharthaimport java.util.Arrays; 28dcf3068fcb55f101680e70a8a6f84f3b2c9cb1e3Sandeep Siddharthaimport java.util.Locale; 2922968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha 3091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornpublic class MainInteractionService extends VoiceInteractionService { 3191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final String TAG = "MainInteractionService"; 3291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 337444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha private final Callback mHotwordCallback = new Callback() { 347444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha @Override 35f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha public void onAvailabilityChanged(int status) { 36f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha Log.i(TAG, "onAvailabilityChanged(" + status + ")"); 37f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha hotwordAvailabilityChangeHelper(status); 38f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha } 39f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha 40f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha @Override 41db92e35211d875eab75787c593eea2988c8a560fSandeep Siddhartha public void onDetected(EventPayload eventPayload) { 427444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha Log.i(TAG, "onDetected"); 437444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha } 447444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha 457444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha @Override 461ed12ddb8c46193cc4d790b9c7d6a5d61afb3311Sandeep Siddhartha public void onError() { 471ed12ddb8c46193cc4d790b9c7d6a5d61afb3311Sandeep Siddhartha Log.i(TAG, "onError"); 481ed12ddb8c46193cc4d790b9c7d6a5d61afb3311Sandeep Siddhartha } 49cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha 50cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha @Override 51cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha public void onRecognitionPaused() { 52cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha Log.i(TAG, "onRecognitionPaused"); 53cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha } 54cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha 55cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha @Override 56cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha public void onRecognitionResumed() { 57cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha Log.i(TAG, "onRecognitionResumed"); 58cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha } 597444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha }; 607444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha 617444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha private AlwaysOnHotwordDetector mHotwordDetector; 627444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha 6391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 64fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn public void onReady() { 65fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn super.onReady(); 6691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Log.i(TAG, "Creating " + this); 6722968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha Log.i(TAG, "Keyphrase enrollment error? " + getKeyphraseEnrollmentInfo().getParseError()); 6822968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha Log.i(TAG, "Keyphrase enrollment meta-data: " 69d7018200312e4e4dc3f67cf33dc90bf7ce585844Sandeep + Arrays.toString(getKeyphraseEnrollmentInfo().listKeyphraseMetadata())); 707444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha 71dcf3068fcb55f101680e70a8a6f84f3b2c9cb1e3Sandeep Siddhartha mHotwordDetector = createAlwaysOnHotwordDetector( 72fb30d6936a4793a3369fbf8bf51fa526b8a77272Sandeep Siddhartha "Hello There", Locale.forLanguageTag("en-US"), mHotwordCallback); 736daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha } 746daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha 756daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha @Override 766daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha public int onStartCommand(Intent intent, int flags, int startId) { 776daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha Bundle args = new Bundle(); 786daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha args.putParcelable("intent", new Intent(this, TestInteractionActivity.class)); 796daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha startSession(args); 806daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha stopSelf(startId); 816daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha return START_NOT_STICKY; 826daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha } 837444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha 84f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha private void hotwordAvailabilityChangeHelper(int availability) { 856daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha Log.i(TAG, "Hotword availability = " + availability); 867444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha switch (availability) { 876daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha case AlwaysOnHotwordDetector.STATE_HARDWARE_UNAVAILABLE: 886daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha Log.i(TAG, "STATE_HARDWARE_UNAVAILABLE"); 897444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha break; 906daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha case AlwaysOnHotwordDetector.STATE_KEYPHRASE_UNSUPPORTED: 916daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha Log.i(TAG, "STATE_KEYPHRASE_UNSUPPORTED"); 927444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha break; 936daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha case AlwaysOnHotwordDetector.STATE_KEYPHRASE_UNENROLLED: 946daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha Log.i(TAG, "STATE_KEYPHRASE_UNENROLLED"); 95ae686a51288031271685861436f7c67201791d09Dharmesh Mokani Intent enroll = mHotwordDetector.createEnrollIntent(); 967444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha Log.i(TAG, "Need to enroll with " + enroll); 977444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha break; 986daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha case AlwaysOnHotwordDetector.STATE_KEYPHRASE_ENROLLED: 991ed12ddb8c46193cc4d790b9c7d6a5d61afb3311Sandeep Siddhartha Log.i(TAG, "STATE_KEYPHRASE_ENROLLED - starting recognition"); 1002c0273e50a3162595e9a54030166f2369b039a5aSandeep Siddhartha if (mHotwordDetector.startRecognition( 1012c0273e50a3162595e9a54030166f2369b039a5aSandeep Siddhartha AlwaysOnHotwordDetector.RECOGNITION_FLAG_NONE)) { 1022c0273e50a3162595e9a54030166f2369b039a5aSandeep Siddhartha Log.i(TAG, "startRecognition succeeded"); 1032c0273e50a3162595e9a54030166f2369b039a5aSandeep Siddhartha } else { 1042c0273e50a3162595e9a54030166f2369b039a5aSandeep Siddhartha Log.i(TAG, "startRecognition failed"); 1052c0273e50a3162595e9a54030166f2369b039a5aSandeep Siddhartha } 1067444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha break; 1077444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha } 10891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 10991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn} 110