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 19ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackbornimport android.content.ComponentName; 2091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.content.Intent; 21c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackbornimport android.os.Bundle; 227444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddharthaimport android.service.voice.AlwaysOnHotwordDetector; 237444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddharthaimport android.service.voice.AlwaysOnHotwordDetector.Callback; 24db92e35211d875eab75787c593eea2988c8a560fSandeep Siddharthaimport android.service.voice.AlwaysOnHotwordDetector.EventPayload; 2591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.VoiceInteractionService; 262ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackbornimport android.service.voice.VoiceInteractionSession; 2791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.util.Log; 2891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 2922968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddharthaimport java.util.Arrays; 30dcf3068fcb55f101680e70a8a6f84f3b2c9cb1e3Sandeep Siddharthaimport java.util.Locale; 3122968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha 3291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornpublic class MainInteractionService extends VoiceInteractionService { 3391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn static final String TAG = "MainInteractionService"; 3491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 357444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha private final Callback mHotwordCallback = new Callback() { 367444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha @Override 37f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha public void onAvailabilityChanged(int status) { 38f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha Log.i(TAG, "onAvailabilityChanged(" + status + ")"); 39f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha hotwordAvailabilityChangeHelper(status); 40f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha } 41f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha 42f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha @Override 43db92e35211d875eab75787c593eea2988c8a560fSandeep Siddhartha public void onDetected(EventPayload eventPayload) { 447444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha Log.i(TAG, "onDetected"); 457444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha } 467444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha 477444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha @Override 481ed12ddb8c46193cc4d790b9c7d6a5d61afb3311Sandeep Siddhartha public void onError() { 491ed12ddb8c46193cc4d790b9c7d6a5d61afb3311Sandeep Siddhartha Log.i(TAG, "onError"); 501ed12ddb8c46193cc4d790b9c7d6a5d61afb3311Sandeep Siddhartha } 51cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha 52cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha @Override 53cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha public void onRecognitionPaused() { 54cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha Log.i(TAG, "onRecognitionPaused"); 55cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha } 56cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha 57cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha @Override 58cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha public void onRecognitionResumed() { 59cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha Log.i(TAG, "onRecognitionResumed"); 60cb4e81c7fe1ec843d80f7604a688c71086c23685Sandeep Siddhartha } 617444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha }; 627444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha 637444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha private AlwaysOnHotwordDetector mHotwordDetector; 647444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha 6591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn @Override 66fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn public void onReady() { 67fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn super.onReady(); 6891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Log.i(TAG, "Creating " + this); 6922968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha Log.i(TAG, "Keyphrase enrollment error? " + getKeyphraseEnrollmentInfo().getParseError()); 7022968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha Log.i(TAG, "Keyphrase enrollment meta-data: " 71d7018200312e4e4dc3f67cf33dc90bf7ce585844Sandeep + Arrays.toString(getKeyphraseEnrollmentInfo().listKeyphraseMetadata())); 727444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha 73dcf3068fcb55f101680e70a8a6f84f3b2c9cb1e3Sandeep Siddhartha mHotwordDetector = createAlwaysOnHotwordDetector( 74fb30d6936a4793a3369fbf8bf51fa526b8a77272Sandeep Siddhartha "Hello There", Locale.forLanguageTag("en-US"), mHotwordCallback); 756daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha } 766daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha 77f63bc523eadbe01ce0a5ad52868a5dccb3d5f6ddSandeep Siddhartha private void hotwordAvailabilityChangeHelper(int availability) { 786daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha Log.i(TAG, "Hotword availability = " + availability); 797444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha switch (availability) { 806daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha case AlwaysOnHotwordDetector.STATE_HARDWARE_UNAVAILABLE: 816daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha Log.i(TAG, "STATE_HARDWARE_UNAVAILABLE"); 827444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha break; 836daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha case AlwaysOnHotwordDetector.STATE_KEYPHRASE_UNSUPPORTED: 846daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha Log.i(TAG, "STATE_KEYPHRASE_UNSUPPORTED"); 857444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha break; 866daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha case AlwaysOnHotwordDetector.STATE_KEYPHRASE_UNENROLLED: 876daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha Log.i(TAG, "STATE_KEYPHRASE_UNENROLLED"); 88ae686a51288031271685861436f7c67201791d09Dharmesh Mokani Intent enroll = mHotwordDetector.createEnrollIntent(); 897444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha Log.i(TAG, "Need to enroll with " + enroll); 907444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha break; 916daae9622672e0b38fc2efed29f68061d749caccSandeep Siddhartha case AlwaysOnHotwordDetector.STATE_KEYPHRASE_ENROLLED: 921ed12ddb8c46193cc4d790b9c7d6a5d61afb3311Sandeep Siddhartha Log.i(TAG, "STATE_KEYPHRASE_ENROLLED - starting recognition"); 932c0273e50a3162595e9a54030166f2369b039a5aSandeep Siddhartha if (mHotwordDetector.startRecognition( 942c0273e50a3162595e9a54030166f2369b039a5aSandeep Siddhartha AlwaysOnHotwordDetector.RECOGNITION_FLAG_NONE)) { 952c0273e50a3162595e9a54030166f2369b039a5aSandeep Siddhartha Log.i(TAG, "startRecognition succeeded"); 962c0273e50a3162595e9a54030166f2369b039a5aSandeep Siddhartha } else { 972c0273e50a3162595e9a54030166f2369b039a5aSandeep Siddhartha Log.i(TAG, "startRecognition failed"); 982c0273e50a3162595e9a54030166f2369b039a5aSandeep Siddhartha } 997444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha break; 1007444c906faef1f7a9a6e6f7a443ba156f1e856beSandeep Siddhartha } 10191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 10291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn} 103