122968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha/* 222968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * Copyright (C) 2014 The Android Open Source Project 322968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * 422968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * Licensed under the Apache License, Version 2.0 (the "License"); 522968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * you may not use this file except in compliance with the License. 622968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * You may obtain a copy of the License at 722968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * 822968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * http://www.apache.org/licenses/LICENSE-2.0 922968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * 1022968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * Unless required by applicable law or agreed to in writing, software 1122968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * distributed under the License is distributed on an "AS IS" BASIS, 1222968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1322968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * See the License for the specific language governing permissions and 1422968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha * limitations under the License. 1522968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha */ 1622968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha 1722968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddharthapackage com.android.test.voiceenrollment; 1822968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha 19b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddharthaimport java.util.Random; 20b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddharthaimport java.util.UUID; 21b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha 2222968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddharthaimport android.app.Activity; 23b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddharthaimport android.hardware.soundtrigger.SoundTrigger; 24b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddharthaimport android.hardware.soundtrigger.SoundTrigger.Keyphrase; 25b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddharthaimport android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel; 26b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddharthaimport android.os.Bundle; 27b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddharthaimport android.os.UserManager; 28b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddharthaimport android.util.Log; 29b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddharthaimport android.view.View; 30b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddharthaimport android.widget.Toast; 3122968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha 3222968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddharthapublic class TestEnrollmentActivity extends Activity { 33b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha private static final String TAG = "TestEnrollmentActivity"; 340aa05d738822f435ceb4686f156d0182a1b01d1eJoe Onorato private static final boolean DBG = false; 35b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha 36b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha /** Keyphrase related constants, must match those defined in enrollment_application.xml */ 37b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha private static final int KEYPHRASE_ID = 101; 38b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha private static final int RECOGNITION_MODES = SoundTrigger.RECOGNITION_MODE_VOICE_TRIGGER; 39b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha private static final String BCP47_LOCALE = "fr-FR"; 40b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha private static final String TEXT = "Hello There"; 41b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha 42b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha private EnrollmentUtil mEnrollmentUtil; 43b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha private Random mRandom; 44b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha 45b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha @Override 46b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha protected void onCreate(Bundle savedInstanceState) { 47b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha if (DBG) Log.d(TAG, "onCreate"); 48b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha super.onCreate(savedInstanceState); 49b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha setContentView(R.layout.main); 50b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha mEnrollmentUtil = new EnrollmentUtil(); 51b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha mRandom = new Random(); 52b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha } 53b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha 54b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha /** 55b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha * Called when the user clicks the enroll button. 56b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha * Performs a fresh enrollment. 57b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha */ 58b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha public void onEnrollButtonClicked(View v) { 59b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha Keyphrase kp = new Keyphrase(KEYPHRASE_ID, RECOGNITION_MODES, BCP47_LOCALE, TEXT, 60b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha new int[] { UserManager.get(this).getUserHandle() /* current user */}); 61b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha UUID modelUuid = UUID.randomUUID(); 62b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha // Generate a fake model to push. 63b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha byte[] data = new byte[1024]; 64b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha mRandom.nextBytes(data); 65b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha KeyphraseSoundModel soundModel = new KeyphraseSoundModel(modelUuid, null, data, 66b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha new Keyphrase[] { kp }); 67b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha boolean status = mEnrollmentUtil.addOrUpdateSoundModel(soundModel); 68b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha if (status) { 69b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha Toast.makeText( 70b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha this, "Successfully enrolled, model UUID=" + modelUuid, Toast.LENGTH_SHORT) 71b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha .show(); 72b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha } else { 73b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha Toast.makeText(this, "Failed to enroll!!!" + modelUuid, Toast.LENGTH_SHORT).show(); 74b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha } 75b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha } 76b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha 77b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha /** 78b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha * Called when the user clicks the un-enroll button. 79b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha * Clears the enrollment information for the user. 80b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha */ 81b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha public void onUnEnrollButtonClicked(View v) { 82b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha KeyphraseSoundModel soundModel = mEnrollmentUtil.getSoundModel(KEYPHRASE_ID, BCP47_LOCALE); 83b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha if (soundModel == null) { 84b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha Toast.makeText(this, "Sound model not found!!!", Toast.LENGTH_SHORT).show(); 85b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha return; 86b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha } 87b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha boolean status = mEnrollmentUtil.deleteSoundModel(KEYPHRASE_ID, BCP47_LOCALE); 88b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha if (status) { 89b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha Toast.makeText(this, "Successfully un-enrolled, model UUID=" + soundModel.uuid, 90b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha Toast.LENGTH_SHORT) 91b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha .show(); 92b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha } else { 93b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha Toast.makeText(this, "Failed to un-enroll!!!", Toast.LENGTH_SHORT).show(); 94b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha } 95b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha } 96b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha 97b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha /** 98b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha * Called when the user clicks the re-enroll button. 99b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha * Uses the previously enrolled sound model and makes changes to it before pushing it back. 100b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha */ 101b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha public void onReEnrollButtonClicked(View v) { 102b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha KeyphraseSoundModel soundModel = mEnrollmentUtil.getSoundModel(KEYPHRASE_ID, BCP47_LOCALE); 103b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha if (soundModel == null) { 104b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha Toast.makeText(this, "Sound model not found!!!", Toast.LENGTH_SHORT).show(); 105b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha return; 106b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha } 107b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha // Generate a fake model to push. 108b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha byte[] data = new byte[2048]; 109b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha mRandom.nextBytes(data); 110b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha KeyphraseSoundModel updated = new KeyphraseSoundModel(soundModel.uuid, 111b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha soundModel.vendorUuid, data, soundModel.keyphrases); 112b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha boolean status = mEnrollmentUtil.addOrUpdateSoundModel(updated); 113b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha if (status) { 114b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha Toast.makeText(this, "Successfully re-enrolled, model UUID=" + updated.uuid, 115b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha Toast.LENGTH_SHORT) 116b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha .show(); 117b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha } else { 118b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha Toast.makeText(this, "Failed to re-enroll!!!", Toast.LENGTH_SHORT).show(); 119b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha } 120b585ac5b5e672c11c80a01eb42a0d3ebd495f21bSandeep Siddhartha } 12122968950b814e66a6aa119ea92ae648884cbe0d9Sandeep Siddhartha} 122