| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.example.android.ttsengine; |
| |
| import android.app.Activity; |
| import android.content.Intent; |
| import android.os.Bundle; |
| import android.speech.tts.TextToSpeech; |
| import android.text.TextUtils; |
| import android.util.Log; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| /* |
| * Checks if the voice data is present. |
| */ |
| public class CheckVoiceData extends Activity { |
| private static final String TAG = "CheckVoiceData"; |
| |
| private static final String[] SUPPORTED_LANGUAGES = { "eng-GBR", "eng-USA" }; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| |
| Intent intent = getIntent(); |
| List<String> checkLanguages = getCheckVoiceDataFor(intent); |
| |
| // If the call didn't specify which languages to check, check |
| // for all the supported ones. |
| if (checkLanguages.isEmpty()) { |
| checkLanguages = Arrays.asList(SUPPORTED_LANGUAGES); |
| } |
| |
| ArrayList<String> available = new ArrayList<String>(); |
| ArrayList<String> unavailable = new ArrayList<String>(); |
| |
| for (String lang : checkLanguages) { |
| // This check is required because checkLanguages might contain |
| // an arbitrary list of languages if the intent specified them |
| // {@link #getCheckVoiceDataFor}. |
| if (isLanguageSupported(lang)) { |
| if (isDataInstalled(lang)) { |
| available.add(lang); |
| } else { |
| unavailable.add(lang); |
| } |
| } |
| } |
| |
| int result; |
| if (!checkLanguages.isEmpty() && available.isEmpty()) { |
| // No voices available at all. |
| result = TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL; |
| } else if (!unavailable.isEmpty()) { |
| // Some voices are available, but some have missing |
| // data. |
| result = TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA; |
| } else { |
| // All voices are available. |
| result = TextToSpeech.Engine.CHECK_VOICE_DATA_PASS; |
| } |
| |
| // We now return the list of available and unavailable voices |
| // as well as the return code. |
| Intent returnData = new Intent(); |
| returnData.putStringArrayListExtra( |
| TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES, available); |
| returnData.putStringArrayListExtra( |
| TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES, unavailable); |
| setResult(result, returnData); |
| finish(); |
| } |
| |
| /** |
| * The intent that launches this activity can contain an intent extra |
| * {@link TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR} that might specify |
| * a given language to check voice data for. If the intent does not contain |
| * this extra, we assume that a voice check for all supported languages |
| * was requested. |
| */ |
| private List<String> getCheckVoiceDataFor(Intent intent) { |
| ArrayList<String> list = intent.getStringArrayListExtra( |
| TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR); |
| ArrayList<String> ret = new ArrayList<String>(); |
| if (list != null) { |
| for (String lang : list) { |
| if (!TextUtils.isEmpty(lang)) { |
| ret.add(lang); |
| } |
| } |
| } |
| return ret; |
| } |
| |
| /** |
| * Checks whether a given language is in the list of supported languages. |
| */ |
| private boolean isLanguageSupported(String input) { |
| for (String lang : SUPPORTED_LANGUAGES) { |
| if (lang.equals(input)) { |
| return true; |
| } |
| } |
| |
| return false; |
| } |
| |
| /* |
| * Note that in our example, all data is packaged in our APK as |
| * assets (it could be a raw resource as well). This check is unnecessary |
| * because it will always succeed. |
| * |
| * If for example, engine data was downloaded or installed on external storage, |
| * this check would make much more sense. |
| */ |
| private boolean isDataInstalled(String lang) { |
| try { |
| InputStream is = getAssets().open(lang + ".freq"); |
| |
| if (is != null) { |
| is.close(); |
| } else { |
| return false; |
| } |
| } catch (IOException e) { |
| Log.w(TAG, "Unable to find data for: " + lang + ", exception: " + e); |
| return false; |
| } |
| |
| // The asset InputStream was non null, and therefore this |
| // data file is available. |
| return true; |
| } |
| } |