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