1457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi/*
2457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi * Copyright (C) 2009 The Android Open Source Project
3457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi *
4457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi * you may not use this file except in compliance with the License.
6457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi * You may obtain a copy of the License at
7457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi *
8457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi *
10457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi * See the License for the specific language governing permissions and
14457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi * limitations under the License.
15457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi */
16457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi
17457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivipackage com.svox.pico;
18457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi
19457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Triviimport java.io.File;
20457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi
21457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Triviimport android.app.Activity;
22457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Triviimport android.content.Intent;
23457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Triviimport android.os.Bundle;
248bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chenimport android.os.Environment;
25457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Triviimport android.speech.tts.TextToSpeech;
26457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi
278bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chenimport java.util.ArrayList;
288bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chenimport java.util.HashMap;
298bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen
30457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi/*
31457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi * Checks if the voice data for the SVOX Pico Engine is present on the
32457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi * sd card.
33457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi */
34457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivipublic class CheckVoiceData extends Activity {
35a8d076f716bca609b7e740cd888177fbc589a521Jean-Michel Trivi
36a8d076f716bca609b7e740cd888177fbc589a521Jean-Michel Trivi    // The following constants are the same path constants as the ones defined
37a8d076f716bca609b7e740cd888177fbc589a521Jean-Michel Trivi    // in external/svox/pico/tts/com_svox_picottsengine.cpp
388bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen    private final static String PICO_LINGWARE_PATH =
398bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen            Environment.getExternalStorageDirectory() + "/svox/";
40a8d076f716bca609b7e740cd888177fbc589a521Jean-Michel Trivi    private final static String PICO_SYSTEM_LINGWARE_PATH = "/system/tts/lang_pico/";
41457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi
42457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi    private final static String[] dataFiles = {
43457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi            "de-DE_gl0_sg.bin", "de-DE_ta.bin", "en-GB_kh0_sg.bin", "en-GB_ta.bin",
44457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi            "en-US_lh0_sg.bin", "en-US_ta.bin", "es-ES_ta.bin", "es-ES_zl0_sg.bin",
45457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi            "fr-FR_nk0_sg.bin", "fr-FR_ta.bin", "it-IT_cm0_sg.bin", "it-IT_ta.bin"
46457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi    };
47457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi
48457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi    private final static String[] dataFilesInfo = {
49457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi        "deu-DEU", "deu-DEU", "eng-GBR", "eng-GBR", "eng-USA", "eng-USA",
50457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi        "spa-ESP", "spa-ESP", "fra-FRA", "fra-FRA", "ita-ITA", "ita-ITA"
51457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi    };
52457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi
538bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen    private final static String[] supportedLanguages = {
548bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        "deu-DEU", "eng-GBR", "eng-USA", "spa-ESP", "fra-FRA", "ita-ITA"
558bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen    };
568bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen
57457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi    @Override
58457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi    protected void onCreate(Bundle savedInstanceState) {
59457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi        super.onCreate(savedInstanceState);
60457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi
61457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi        int result = TextToSpeech.Engine.CHECK_VOICE_DATA_PASS;
628bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        boolean foundMatch = false;
638bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen
648bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        ArrayList<String> available = new ArrayList<String>();
658bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        ArrayList<String> unavailable = new ArrayList<String>();
668bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen
678bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        HashMap<String, Boolean> languageCountry = new HashMap<String, Boolean>();
688bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen
698bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        Bundle bundle = getIntent().getExtras();
708bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        if (bundle != null){
718bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen            ArrayList<String> langCountryVars = bundle.getStringArrayList(
72d64ebdacdb42fcae607ce7942e810b6047f2368aCharles Chen                    TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR);
738bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen            if (langCountryVars != null){
748bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                for (int i = 0; i < langCountryVars.size(); i++){
758bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                    if (langCountryVars.get(i).length() > 0){
768bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                        languageCountry.put(langCountryVars.get(i), true);
778bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                    }
788bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                }
798bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen            }
808bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        }
81457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi
82457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi        // Check for files
838bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        for (int i = 0; i < supportedLanguages.length; i++){
848bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen            if ((languageCountry.size() < 1) ||
858bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                (languageCountry.containsKey(supportedLanguages[i]))){
868bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                if (!fileExists(dataFiles[2 * i]) ||
878bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                    !fileExists(dataFiles[(2 * i) + 1])){
888bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                    result = TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA;
898bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                    unavailable.add(supportedLanguages[i]);
908bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                } else {
918bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                    available.add(supportedLanguages[i]);
928bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                    foundMatch = true;
938bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen                }
94457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi            }
95457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi        }
96457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi
978bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        if ((languageCountry.size() > 0) && !foundMatch){
988bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen            result = TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL;
998bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        }
1008bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen
101457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi        // Put the root directory for the sd card data + the data filenames
102457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi        Intent returnData = new Intent();
103a8d076f716bca609b7e740cd888177fbc589a521Jean-Michel Trivi        returnData.putExtra(TextToSpeech.Engine.EXTRA_VOICE_DATA_ROOT_DIRECTORY, PICO_LINGWARE_PATH);
104b641dea8fc113cbb6976eed9e073381a024ec224Jean-Michel Trivi        returnData.putExtra(TextToSpeech.Engine.EXTRA_VOICE_DATA_FILES, dataFiles);
105b641dea8fc113cbb6976eed9e073381a024ec224Jean-Michel Trivi        returnData.putExtra(TextToSpeech.Engine.EXTRA_VOICE_DATA_FILES_INFO, dataFilesInfo);
106457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi
107d64ebdacdb42fcae607ce7942e810b6047f2368aCharles Chen        returnData.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES, available);
108d64ebdacdb42fcae607ce7942e810b6047f2368aCharles Chen        returnData.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES, unavailable);
109457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi        setResult(result, returnData);
110457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi        finish();
111457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi    }
112457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi
1138bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen    private boolean fileExists(String filename){
1148bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        File tempFile = new File(PICO_LINGWARE_PATH + filename);
1158bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        File tempFileSys = new File(PICO_SYSTEM_LINGWARE_PATH + filename);
1168bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        if ((!tempFile.exists()) && (!tempFileSys.exists())) {
1178bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen            return false;
1188bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        }
1198bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen        return true;
1208bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen    }
1218bc57e033a49d7470407cc6da6021eb2d8dde990Charles Chen
122457577f13ed73218544fa62fb16f7daac90f931fJean-Michel Trivi}
123