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