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