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