diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml new file mode 100644 index 0000000..0a18c95 --- /dev/null +++ b/.idea/assetWizardSettings.xml @@ -0,0 +1,146 @@ + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100755 index 0000000..ae78c11 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,113 @@ + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml old mode 100644 new mode 100755 diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml old mode 100644 new mode 100755 diff --git a/.idea/encodings.xml b/.idea/encodings.xml old mode 100644 new mode 100755 diff --git a/.idea/gradle.xml b/.idea/gradle.xml old mode 100644 new mode 100755 index 0e23f8e..b80e4da --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -3,9 +3,12 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml old mode 100644 new mode 100755 index 04c63e4..a0bfecc --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,28 +1,40 @@ - - - @@ -43,17 +55,7 @@ - - - - - - - - - - - + diff --git a/.idea/modules.xml b/.idea/modules.xml old mode 100644 new mode 100755 diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/app/.gitignore b/app/.gitignore old mode 100644 new mode 100755 diff --git a/app/build.gradle b/app/build.gradle old mode 100644 new mode 100755 index f06a34a..6c05555 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,14 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" + compileSdkVersion 29 defaultConfig { applicationId "com.aepronunciation.ipa" - minSdkVersion 9 - targetSdkVersion 25 - versionCode 10 - versionName "2.0.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + minSdkVersion 14 + targetSdkVersion 29 + versionCode 13 + versionName "2.1.1" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { @@ -20,11 +19,12 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { - exclude group: 'com.android.support', module: 'support-annotations' - }) - compile 'com.android.support:appcompat-v7:25.1.0' - compile 'com.android.support:design:25.1.0' - testCompile 'junit:junit:4.12' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.recyclerview:recyclerview:1.0.0' + implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro old mode 100644 new mode 100755 diff --git a/app/release/app-release.aab b/app/release/app-release.aab new file mode 100644 index 0000000..5f6ef76 Binary files /dev/null and b/app/release/app-release.aab differ diff --git a/app/src/androidTest/java/com/aepronunciation/ipa/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/aepronunciation/ipa/ExampleInstrumentedTest.java deleted file mode 100644 index a53db00..0000000 --- a/app/src/androidTest/java/com/aepronunciation/ipa/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.aepronunciation.ipa; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumentation test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() throws Exception { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.aepronunciation.ipa", appContext.getPackageName()); - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml old mode 100644 new mode 100755 index ce17c20..a2e71ed --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,7 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" - android:supportsRtl="true" + android:supportsRtl="false" android:theme="@style/AppTheme"> - > - > - > - > - > - > + + + parsedIpa = DoubleSound.parse(ipa); + if (parsedIpa == null) { + // TODO return a more intelligent error message + // (but this situation shouldn't ever happen) return errorMessage; } // starts with a consonant - if ("ptkʧfθsʃbdgʤvðzʒmnŋlwjhr".contains(parsedIpa[0])) { + if ("ptkʧfθsʃbdgʤvðzʒmnŋlwjhr".contains(parsedIpa.first)) { // ends with a consonant - if ("ptkʧfθsʃbdgʤvðzʒmnŋlwjhr".contains(parsedIpa[1])) { + if ("ptkʧfθsʃbdgʤvðzʒmnŋlwjhr".contains(parsedIpa.second)) { - errorMessage = String.format(context.getString(R.string.error_two_consonants), parsedIpa[0], parsedIpa[1]); + errorMessage = String.format(context.getString(R.string.error_two_consonants), + parsedIpa.first, parsedIpa.second); - } else if (parsedIpa[0].equals("ŋ")) { + } else if (parsedIpa.first.equals("ŋ")) { // starts with ŋ - errorMessage = String.format(context.getString(R.string.error_initial_ng), parsedIpa[0], parsedIpa[1]); + errorMessage = String.format(context.getString(R.string.error_initial_ng), + parsedIpa.first, parsedIpa.second); } } else { // starts with a vowel - if (parsedIpa[1].equals("r")) { + if (parsedIpa.second.equals("r")) { // ends in r errorMessage = context.getString(R.string.error_final_r); - } else if ("iɪɛæɑɔʊuʌəeɪaɪaʊɔɪoʊɝɚɑrɛrɪrɔr".contains(parsedIpa[1])) { + } else if ("iɪɛæɑɔʊuʌəeɪaɪaʊɔɪoʊɝɚɑrɛrɪrɔr".contains(parsedIpa.second)) { // ends with vowel - errorMessage = String.format(context.getString(R.string.error_two_vowels), parsedIpa[0], parsedIpa[1]); + errorMessage = String.format(context.getString(R.string.error_two_vowels), + parsedIpa.first, parsedIpa.second); - } else if ("wjh".contains(parsedIpa[1])) { + } else if ("wjh".contains(parsedIpa.second)) { // ends with wjh - errorMessage = String.format(context.getString(R.string.error_final_wjh), parsedIpa[0], parsedIpa[1]); + errorMessage = String.format(context.getString(R.string.error_final_wjh), + parsedIpa.first, parsedIpa.second); } } diff --git a/app/src/main/java/com/aepronunciation/ipa/AppLocale.java b/app/src/main/java/com/aepronunciation/ipa/AppLocale.java new file mode 100755 index 0000000..d948fcd --- /dev/null +++ b/app/src/main/java/com/aepronunciation/ipa/AppLocale.java @@ -0,0 +1,24 @@ +package com.aepronunciation.ipa; + + +import android.content.Context; + +import java.util.Locale; + +class AppLocale { + static Locale getLocale(Context context) { + // this allows things to only be formatted for translated languages + // All others will use US format. + String currentTranslationLocale = context.getString(R.string.locale); + switch (currentTranslationLocale) { + case "zh-rCN": + return Locale.SIMPLIFIED_CHINESE; + case "zh-rTW": + return Locale.TRADITIONAL_CHINESE; + case "zh": + return Locale.TRADITIONAL_CHINESE; + default: + return Locale.US; + } + } +} diff --git a/app/src/main/java/com/aepronunciation/ipa/DividerItemDecoration.java b/app/src/main/java/com/aepronunciation/ipa/DividerItemDecoration.java old mode 100644 new mode 100755 index 64d9a48..459ed73 --- a/app/src/main/java/com/aepronunciation/ipa/DividerItemDecoration.java +++ b/app/src/main/java/com/aepronunciation/ipa/DividerItemDecoration.java @@ -1,31 +1,23 @@ package com.aepronunciation.ipa; import android.content.Context; -import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.drawable.Drawable; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; class DividerItemDecoration extends RecyclerView.ItemDecoration { - private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; - private Drawable divider; - public DividerItemDecoration(Context context) { - final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS); - divider = styledAttributes.getDrawable(0); - styledAttributes.recycle(); - } - DividerItemDecoration(Context context, int resId) { divider = ContextCompat.getDrawable(context, resId); } @Override - public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); diff --git a/app/src/main/java/com/aepronunciation/ipa/DoubleSound.java b/app/src/main/java/com/aepronunciation/ipa/DoubleSound.java old mode 100644 new mode 100755 index 51d1996..35ac347 --- a/app/src/main/java/com/aepronunciation/ipa/DoubleSound.java +++ b/app/src/main/java/com/aepronunciation/ipa/DoubleSound.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.Map; import java.util.Random; import android.text.TextUtils; @@ -10,82 +11,94 @@ class DoubleSound { // private class variables - private LinkedHashMap hashMap; + private static final Map soundMap = createSoundMap(); + private static final Map specialSoundMap = createSpecialSoundMap(); private static Random random = new Random(); private ArrayList doubleSounds; - // constructor - DoubleSound() { - initMap(); - } - int getSoundCount() { - if (doubleSounds != null) { - return doubleSounds.size(); - } else { - return 0; - } + if (doubleSounds == null) return 0; + return doubleSounds.size(); } - void restrictListToPairsContainingAtLeastOneSoundFrom(ArrayList consonants, ArrayList vowels) { + void restrictListToPairsContainingAtLeastOneSoundFrom( + ArrayList consonants, ArrayList vowels) { // error checking - if (consonants.isEmpty() && vowels.isEmpty()) { - return; - } + if (consonants.isEmpty() && vowels.isEmpty()) return; - // loop through all pairs and add any for which both consonant and vowel are in allowedSounds + // loop through all pairs and add any for which both consonant and vowel + // are in allowedSounds doubleSounds = new ArrayList<>(); - for (String key : hashMap.keySet()) { - Pair cv = PhonemeTable.INSTANCE.splitDoubleSound(key); - if (stringContainsItemFromList(cv.first, consonants) || stringContainsItemFromList(cv.second, vowels)) { + for (String key : soundMap.keySet()) { + Pair cv = Ipa.splitDoubleSound(key); + if (stringContainsItemFromList(cv.first, consonants) || + stringContainsItemFromList(cv.second, vowels)) { doubleSounds.add(key); } } } void restrictListToAllPairsContaining(String ipa) { + if (TextUtils.isEmpty(ipa)) return; - // error checking - if (TextUtils.isEmpty(ipa)) { + if (Ipa.isSpecial(ipa)) { + restrictListToSpecialSoundsContaining(ipa); return; } ArrayList singleItemArray = new ArrayList<>(); singleItemArray.add(ipa); - if (PhonemeTable.INSTANCE.isConsonant(ipa)) { + if (Ipa.isConsonant(ipa)) { restrictListToPairsContainingAtLeastOneSoundFrom(singleItemArray, new ArrayList()); - } else if (PhonemeTable.INSTANCE.isVowel(ipa)) { + } else { // vowel restrictListToPairsContainingAtLeastOneSoundFrom(new ArrayList(), singleItemArray); } } - void restrictListToPairsContainingBothSoundsFrom(ArrayList consonants, ArrayList vowels) { + void restrictListToPairsContainingBothSoundsFrom( + ArrayList consonants, ArrayList vowels) { // Since every pair contains both a vowel and a consonant, // an exact match requires both to be present. - if (vowels.isEmpty() || consonants.isEmpty()) { - return; + if (vowels.isEmpty() || consonants.isEmpty()) return; + + // loop through all pairs and add any for with both consonant and vowel + // are in allowedSounds + doubleSounds = new ArrayList<>(); + for (String key : soundMap.keySet()) { + Pair cv = Ipa.splitDoubleSound(key); + if (stringContainsItemFromList(cv.first, consonants) && + stringContainsItemFromList(cv.second, vowels)) { + doubleSounds.add(key); + } } + } - // loop through all pairs and add any for with both consonant and vowel are in allowedSounds + private void restrictListToSpecialSoundsContaining(String ipa) { doubleSounds = new ArrayList<>(); - for (String key : hashMap.keySet()) { - Pair cv = PhonemeTable.INSTANCE.splitDoubleSound(key); - if (stringContainsItemFromList(cv.first, consonants) && stringContainsItemFromList(cv.second, vowels)) { + for (String key : specialSoundMap.keySet()) { + if (shouldIncludeSpecialSoundForIpa(key, ipa)) { doubleSounds.add(key); } } } + @SuppressWarnings("RedundantIfStatement") + private boolean shouldIncludeSpecialSoundForIpa(String specialSound, String ipa) { + if (!specialSound.contains(ipa)) return false; + if (specialSound.contains(Ipa.flap_t) && ipa.equals(Ipa.schwa)) return false; + return true; + } + void includeAllSounds() { - doubleSounds = new ArrayList<>(hashMap.keySet()); + doubleSounds = new ArrayList<>(soundMap.keySet()); } private static boolean stringContainsItemFromList(String inputString, ArrayList items) { - for(int i =0; i < items.size(); i++) { - if(inputString.equals(items.get(i))) { + for (int i = 0; i < items.size(); i++) { + if (inputString.equals(items.get(i))) { return true; } } @@ -109,844 +122,1012 @@ String getRandomIpa() { int getSoundResourceId(String doubleSoundIpa) { - // returns null if no value found - if (hashMap.containsKey(doubleSoundIpa)){ - return hashMap.get(doubleSoundIpa); - }else{ - return -1; + if (specialSoundMap.containsKey(doubleSoundIpa)) { + return specialSoundMap.get(doubleSoundIpa); + } + + if (soundMap.containsKey(doubleSoundIpa)) { + return soundMap.get(doubleSoundIpa); } + return -1; } - public ArrayList getSounds() { + ArrayList getSounds() { if (doubleSounds == null) { includeAllSounds(); } return doubleSounds; } - // initialize the hashMap when new object created - private void initMap() { - - hashMap = new LinkedHashMap<>(); - - hashMap.put("pi", R.raw.double_p_i); - hashMap.put("pɪ", R.raw.double_p_is); - hashMap.put("peɪ", R.raw.double_p_ei); - hashMap.put("pɛ", R.raw.double_p_e); - hashMap.put("pæ", R.raw.double_p_ae); - hashMap.put("pɑ", R.raw.double_p_a); - hashMap.put("pɔ", R.raw.double_p_c); - hashMap.put("poʊ", R.raw.double_p_ou); - hashMap.put("pʊ", R.raw.double_p_us); - hashMap.put("pu", R.raw.double_p_u); - hashMap.put("pʌ", R.raw.double_p_vu); - hashMap.put("paɪ", R.raw.double_p_ai); - hashMap.put("paʊ", R.raw.double_p_au); - hashMap.put("pɔɪ", R.raw.double_p_oi); - hashMap.put("pɝ", R.raw.double_p_ers); - hashMap.put("pɑr", R.raw.double_p_ar); - hashMap.put("pɛr", R.raw.double_p_er); - hashMap.put("pɪr", R.raw.double_p_ir); - hashMap.put("pɔr", R.raw.double_p_or); - hashMap.put("bi", R.raw.double_b_i); - hashMap.put("bɪ", R.raw.double_b_is); - hashMap.put("beɪ", R.raw.double_b_ei); - hashMap.put("bɛ", R.raw.double_b_e); - hashMap.put("bæ", R.raw.double_b_ae); - hashMap.put("bɑ", R.raw.double_b_a); - hashMap.put("bɔ", R.raw.double_b_c); - hashMap.put("boʊ", R.raw.double_b_ou); - hashMap.put("bʊ", R.raw.double_b_us); - hashMap.put("bu", R.raw.double_b_u); - hashMap.put("bʌ", R.raw.double_b_vu); - hashMap.put("baɪ", R.raw.double_b_ai); - hashMap.put("baʊ", R.raw.double_b_au); - hashMap.put("bɔɪ", R.raw.double_b_oi); - hashMap.put("bɝ", R.raw.double_b_ers); - hashMap.put("bɑr", R.raw.double_b_ar); - hashMap.put("bɛr", R.raw.double_b_er); - hashMap.put("bɪr", R.raw.double_b_ir); - hashMap.put("bɔr", R.raw.double_b_or); - hashMap.put("ti", R.raw.double_t_i); - hashMap.put("tɪ", R.raw.double_t_is); - hashMap.put("teɪ", R.raw.double_t_ei); - hashMap.put("tɛ", R.raw.double_t_e); - hashMap.put("tæ", R.raw.double_t_ae); - hashMap.put("tɑ", R.raw.double_t_a); - hashMap.put("tɔ", R.raw.double_t_c); - hashMap.put("toʊ", R.raw.double_t_ou); - hashMap.put("tʊ", R.raw.double_t_us); - hashMap.put("tu", R.raw.double_t_u); - hashMap.put("tʌ", R.raw.double_t_vu); - hashMap.put("taɪ", R.raw.double_t_ai); - hashMap.put("taʊ", R.raw.double_t_au); - hashMap.put("tɔɪ", R.raw.double_t_oi); - hashMap.put("tɝ", R.raw.double_t_ers); - hashMap.put("tɑr", R.raw.double_t_ar); - hashMap.put("tɛr", R.raw.double_t_er); - hashMap.put("tɪr", R.raw.double_t_ir); - hashMap.put("tɔr", R.raw.double_t_or); - hashMap.put("di", R.raw.double_d_i); - hashMap.put("dɪ", R.raw.double_d_is); - hashMap.put("deɪ", R.raw.double_d_ei); - hashMap.put("dɛ", R.raw.double_d_e); - hashMap.put("dæ", R.raw.double_d_ae); - hashMap.put("dɑ", R.raw.double_d_a); - hashMap.put("dɔ", R.raw.double_d_c); - hashMap.put("doʊ", R.raw.double_d_ou); - hashMap.put("dʊ", R.raw.double_d_us); - hashMap.put("du", R.raw.double_d_u); - hashMap.put("dʌ", R.raw.double_d_vu); - hashMap.put("daɪ", R.raw.double_d_ai); - hashMap.put("daʊ", R.raw.double_d_au); - hashMap.put("dɔɪ", R.raw.double_d_oi); - hashMap.put("dɝ", R.raw.double_d_ers); - hashMap.put("dɑr", R.raw.double_d_ar); - hashMap.put("dɛr", R.raw.double_d_er); - hashMap.put("dɪr", R.raw.double_d_ir); - hashMap.put("dɔr", R.raw.double_d_or); - hashMap.put("ki", R.raw.double_k_i); - hashMap.put("kɪ", R.raw.double_k_is); - hashMap.put("keɪ", R.raw.double_k_ei); - hashMap.put("kɛ", R.raw.double_k_e); - hashMap.put("kæ", R.raw.double_k_ae); - hashMap.put("kɑ", R.raw.double_k_a); - hashMap.put("kɔ", R.raw.double_k_c); - hashMap.put("koʊ", R.raw.double_k_ou); - hashMap.put("kʊ", R.raw.double_k_us); - hashMap.put("ku", R.raw.double_k_u); - hashMap.put("kʌ", R.raw.double_k_vu); - hashMap.put("kaɪ", R.raw.double_k_ai); - hashMap.put("kaʊ", R.raw.double_k_au); - hashMap.put("kɔɪ", R.raw.double_k_oi); - hashMap.put("kɝ", R.raw.double_k_ers); - hashMap.put("kɑr", R.raw.double_k_ar); - hashMap.put("kɛr", R.raw.double_k_er); - hashMap.put("kɪr", R.raw.double_k_ir); - hashMap.put("kɔr", R.raw.double_k_or); - hashMap.put("gi", R.raw.double_g_i); - hashMap.put("gɪ", R.raw.double_g_is); - hashMap.put("geɪ", R.raw.double_g_ei); - hashMap.put("gɛ", R.raw.double_g_e); - hashMap.put("gæ", R.raw.double_g_ae); - hashMap.put("gɑ", R.raw.double_g_a); - hashMap.put("gɔ", R.raw.double_g_c); - hashMap.put("goʊ", R.raw.double_g_ou); - hashMap.put("gʊ", R.raw.double_g_us); - hashMap.put("gu", R.raw.double_g_u); - hashMap.put("gʌ", R.raw.double_g_vu); - hashMap.put("gaɪ", R.raw.double_g_ai); - hashMap.put("gaʊ", R.raw.double_g_au); - hashMap.put("gɔɪ", R.raw.double_g_oi); - hashMap.put("gɝ", R.raw.double_g_ers); - hashMap.put("gɑr", R.raw.double_g_ar); - hashMap.put("gɛr", R.raw.double_g_er); - hashMap.put("gɪr", R.raw.double_g_ir); - hashMap.put("gɔr", R.raw.double_g_or); - hashMap.put("ʧi", R.raw.double_ch_i); - hashMap.put("ʧɪ", R.raw.double_ch_is); - hashMap.put("ʧeɪ", R.raw.double_ch_ei); - hashMap.put("ʧɛ", R.raw.double_ch_e); - hashMap.put("ʧæ", R.raw.double_ch_ae); - hashMap.put("ʧɑ", R.raw.double_ch_a); - hashMap.put("ʧɔ", R.raw.double_ch_c); - hashMap.put("ʧoʊ", R.raw.double_ch_ou); - hashMap.put("ʧʊ", R.raw.double_ch_us); - hashMap.put("ʧu", R.raw.double_ch_u); - hashMap.put("ʧʌ", R.raw.double_ch_vu); - hashMap.put("ʧaɪ", R.raw.double_ch_ai); - hashMap.put("ʧaʊ", R.raw.double_ch_au); - hashMap.put("ʧɔɪ", R.raw.double_ch_oi); - hashMap.put("ʧɝ", R.raw.double_ch_ers); - hashMap.put("ʧɑr", R.raw.double_ch_ar); - hashMap.put("ʧɛr", R.raw.double_ch_er); - hashMap.put("ʧɪr", R.raw.double_ch_ir); - hashMap.put("ʧɔr", R.raw.double_ch_or); - hashMap.put("ʤi", R.raw.double_dzh_i); - hashMap.put("ʤɪ", R.raw.double_dzh_is); - hashMap.put("ʤeɪ", R.raw.double_dzh_ei); - hashMap.put("ʤɛ", R.raw.double_dzh_e); - hashMap.put("ʤæ", R.raw.double_dzh_ae); - hashMap.put("ʤɑ", R.raw.double_dzh_a); - hashMap.put("ʤɔ", R.raw.double_dzh_c); - hashMap.put("ʤoʊ", R.raw.double_dzh_ou); - hashMap.put("ʤʊ", R.raw.double_dzh_us); - hashMap.put("ʤu", R.raw.double_dzh_u); - hashMap.put("ʤʌ", R.raw.double_dzh_vu); - hashMap.put("ʤaɪ", R.raw.double_dzh_ai); - hashMap.put("ʤaʊ", R.raw.double_dzh_au); - hashMap.put("ʤɔɪ", R.raw.double_dzh_oi); - hashMap.put("ʤɝ", R.raw.double_dzh_ers); - hashMap.put("ʤɑr", R.raw.double_dzh_ar); - hashMap.put("ʤɛr", R.raw.double_dzh_er); - hashMap.put("ʤɪr", R.raw.double_dzh_ir); - hashMap.put("ʤɔr", R.raw.double_dzh_or); - hashMap.put("fi", R.raw.double_f_i); - hashMap.put("fɪ", R.raw.double_f_is); - hashMap.put("feɪ", R.raw.double_f_ei); - hashMap.put("fɛ", R.raw.double_f_e); - hashMap.put("fæ", R.raw.double_f_ae); - hashMap.put("fɑ", R.raw.double_f_a); - hashMap.put("fɔ", R.raw.double_f_c); - hashMap.put("foʊ", R.raw.double_f_ou); - hashMap.put("fʊ", R.raw.double_f_us); - hashMap.put("fu", R.raw.double_f_u); - hashMap.put("fʌ", R.raw.double_f_vu); - hashMap.put("faɪ", R.raw.double_f_ai); - hashMap.put("faʊ", R.raw.double_f_au); - hashMap.put("fɔɪ", R.raw.double_f_oi); - hashMap.put("fɝ", R.raw.double_f_ers); - hashMap.put("fɑr", R.raw.double_f_ar); - hashMap.put("fɛr", R.raw.double_f_er); - hashMap.put("fɪr", R.raw.double_f_ir); - hashMap.put("fɔr", R.raw.double_f_or); - hashMap.put("vi", R.raw.double_v_i); - hashMap.put("vɪ", R.raw.double_v_is); - hashMap.put("veɪ", R.raw.double_v_ei); - hashMap.put("vɛ", R.raw.double_v_e); - hashMap.put("væ", R.raw.double_v_ae); - hashMap.put("vɑ", R.raw.double_v_a); - hashMap.put("vɔ", R.raw.double_v_c); - hashMap.put("voʊ", R.raw.double_v_ou); - hashMap.put("vʊ", R.raw.double_v_us); - hashMap.put("vu", R.raw.double_v_u); - hashMap.put("vʌ", R.raw.double_v_vu); - hashMap.put("vaɪ", R.raw.double_v_ai); - hashMap.put("vaʊ", R.raw.double_v_au); - hashMap.put("vɔɪ", R.raw.double_v_oi); - hashMap.put("vɝ", R.raw.double_v_ers); - hashMap.put("vɑr", R.raw.double_v_ar); - hashMap.put("vɛr", R.raw.double_v_er); - hashMap.put("vɪr", R.raw.double_v_ir); - hashMap.put("vɔr", R.raw.double_v_or); - hashMap.put("θi", R.raw.double_th_i); - hashMap.put("θɪ", R.raw.double_th_is); - hashMap.put("θeɪ", R.raw.double_th_ei); - hashMap.put("θɛ", R.raw.double_th_e); - hashMap.put("θæ", R.raw.double_th_ae); - hashMap.put("θɑ", R.raw.double_th_a); - hashMap.put("θɔ", R.raw.double_th_c); - hashMap.put("θoʊ", R.raw.double_th_ou); - hashMap.put("θʊ", R.raw.double_th_us); - hashMap.put("θu", R.raw.double_th_u); - hashMap.put("θʌ", R.raw.double_th_vu); - hashMap.put("θaɪ", R.raw.double_th_ai); - hashMap.put("θaʊ", R.raw.double_th_au); - hashMap.put("θɔɪ", R.raw.double_th_oi); - hashMap.put("θɝ", R.raw.double_th_ers); - hashMap.put("θɑr", R.raw.double_th_ar); - hashMap.put("θɛr", R.raw.double_th_er); - hashMap.put("θɪr", R.raw.double_th_ir); - hashMap.put("θɔr", R.raw.double_th_or); - hashMap.put("ði", R.raw.double_thv_i); - hashMap.put("ðɪ", R.raw.double_thv_is); - hashMap.put("ðeɪ", R.raw.double_thv_ei); - hashMap.put("ðɛ", R.raw.double_thv_e); - hashMap.put("ðæ", R.raw.double_thv_ae); - hashMap.put("ðɑ", R.raw.double_thv_a); - hashMap.put("ðɔ", R.raw.double_thv_c); - hashMap.put("ðoʊ", R.raw.double_thv_ou); - hashMap.put("ðʊ", R.raw.double_thv_us); - hashMap.put("ðu", R.raw.double_thv_u); - hashMap.put("ðʌ", R.raw.double_thv_vu); - hashMap.put("ðaɪ", R.raw.double_thv_ai); - hashMap.put("ðaʊ", R.raw.double_thv_au); - hashMap.put("ðɔɪ", R.raw.double_thv_oi); - hashMap.put("ðɝ", R.raw.double_thv_ers); - hashMap.put("ðɑr", R.raw.double_thv_ar); - hashMap.put("ðɛr", R.raw.double_thv_er); - hashMap.put("ðɪr", R.raw.double_thv_ir); - hashMap.put("ðɔr", R.raw.double_thv_or); - hashMap.put("si", R.raw.double_s_i); - hashMap.put("sɪ", R.raw.double_s_is); - hashMap.put("seɪ", R.raw.double_s_ei); - hashMap.put("sɛ", R.raw.double_s_e); - hashMap.put("sæ", R.raw.double_s_ae); - hashMap.put("sɑ", R.raw.double_s_a); - hashMap.put("sɔ", R.raw.double_s_c); - hashMap.put("soʊ", R.raw.double_s_ou); - hashMap.put("sʊ", R.raw.double_s_us); - hashMap.put("su", R.raw.double_s_u); - hashMap.put("sʌ", R.raw.double_s_vu); - hashMap.put("saɪ", R.raw.double_s_ai); - hashMap.put("saʊ", R.raw.double_s_au); - hashMap.put("sɔɪ", R.raw.double_s_oi); - hashMap.put("sɝ", R.raw.double_s_ers); - hashMap.put("sɑr", R.raw.double_s_ar); - hashMap.put("sɛr", R.raw.double_s_er); - hashMap.put("sɪr", R.raw.double_s_ir); - hashMap.put("sɔr", R.raw.double_s_or); - hashMap.put("zi", R.raw.double_z_i); - hashMap.put("zɪ", R.raw.double_z_is); - hashMap.put("zeɪ", R.raw.double_z_ei); - hashMap.put("zɛ", R.raw.double_z_e); - hashMap.put("zæ", R.raw.double_z_ae); - hashMap.put("zɑ", R.raw.double_z_a); - hashMap.put("zɔ", R.raw.double_z_c); - hashMap.put("zoʊ", R.raw.double_z_ou); - hashMap.put("zʊ", R.raw.double_z_us); - hashMap.put("zu", R.raw.double_z_u); - hashMap.put("zʌ", R.raw.double_z_vu); - hashMap.put("zaɪ", R.raw.double_z_ai); - hashMap.put("zaʊ", R.raw.double_z_au); - hashMap.put("zɔɪ", R.raw.double_z_oi); - hashMap.put("zɝ", R.raw.double_z_ers); - hashMap.put("zɑr", R.raw.double_z_ar); - hashMap.put("zɛr", R.raw.double_z_er); - hashMap.put("zɪr", R.raw.double_z_ir); - hashMap.put("zɔr", R.raw.double_z_or); - hashMap.put("ʃi", R.raw.double_sh_i); - hashMap.put("ʃɪ", R.raw.double_sh_is); - hashMap.put("ʃeɪ", R.raw.double_sh_ei); - hashMap.put("ʃɛ", R.raw.double_sh_e); - hashMap.put("ʃæ", R.raw.double_sh_ae); - hashMap.put("ʃɑ", R.raw.double_sh_a); - hashMap.put("ʃɔ", R.raw.double_sh_c); - hashMap.put("ʃoʊ", R.raw.double_sh_ou); - hashMap.put("ʃʊ", R.raw.double_sh_us); - hashMap.put("ʃu", R.raw.double_sh_u); - hashMap.put("ʃʌ", R.raw.double_sh_vu); - hashMap.put("ʃaɪ", R.raw.double_sh_ai); - hashMap.put("ʃaʊ", R.raw.double_sh_au); - hashMap.put("ʃɔɪ", R.raw.double_sh_oi); - hashMap.put("ʃɝ", R.raw.double_sh_ers); - hashMap.put("ʃɑr", R.raw.double_sh_ar); - hashMap.put("ʃɛr", R.raw.double_sh_er); - hashMap.put("ʃɪr", R.raw.double_sh_ir); - hashMap.put("ʃɔr", R.raw.double_sh_or); - hashMap.put("ʒi", R.raw.double_zh_i); - hashMap.put("ʒɪ", R.raw.double_zh_is); - hashMap.put("ʒeɪ", R.raw.double_zh_ei); - hashMap.put("ʒɛ", R.raw.double_zh_e); - hashMap.put("ʒæ", R.raw.double_zh_ae); - hashMap.put("ʒɑ", R.raw.double_zh_a); - hashMap.put("ʒɔ", R.raw.double_zh_c); - hashMap.put("ʒoʊ", R.raw.double_zh_ou); - hashMap.put("ʒʊ", R.raw.double_zh_us); - hashMap.put("ʒu", R.raw.double_zh_u); - hashMap.put("ʒʌ", R.raw.double_zh_vu); - hashMap.put("ʒaɪ", R.raw.double_zh_ai); - hashMap.put("ʒaʊ", R.raw.double_zh_au); - hashMap.put("ʒɔɪ", R.raw.double_zh_oi); - hashMap.put("ʒɝ", R.raw.double_zh_ers); - hashMap.put("ʒɑr", R.raw.double_zh_ar); - hashMap.put("ʒɛr", R.raw.double_zh_er); - hashMap.put("ʒɪr", R.raw.double_zh_ir); - hashMap.put("ʒɔr", R.raw.double_zh_or); - hashMap.put("mi", R.raw.double_m_i); - hashMap.put("mɪ", R.raw.double_m_is); - hashMap.put("meɪ", R.raw.double_m_ei); - hashMap.put("mɛ", R.raw.double_m_e); - hashMap.put("mæ", R.raw.double_m_ae); - hashMap.put("mɑ", R.raw.double_m_a); - hashMap.put("mɔ", R.raw.double_m_c); - hashMap.put("moʊ", R.raw.double_m_ou); - hashMap.put("mʊ", R.raw.double_m_us); - hashMap.put("mu", R.raw.double_m_u); - hashMap.put("mʌ", R.raw.double_m_vu); - hashMap.put("maɪ", R.raw.double_m_ai); - hashMap.put("maʊ", R.raw.double_m_au); - hashMap.put("mɔɪ", R.raw.double_m_oi); - hashMap.put("mɝ", R.raw.double_m_ers); - hashMap.put("mɑr", R.raw.double_m_ar); - hashMap.put("mɛr", R.raw.double_m_er); - hashMap.put("mɪr", R.raw.double_m_ir); - hashMap.put("mɔr", R.raw.double_m_or); - hashMap.put("ni", R.raw.double_n_i); - hashMap.put("nɪ", R.raw.double_n_is); - hashMap.put("neɪ", R.raw.double_n_ei); - hashMap.put("nɛ", R.raw.double_n_e); - hashMap.put("næ", R.raw.double_n_ae); - hashMap.put("nɑ", R.raw.double_n_a); - hashMap.put("nɔ", R.raw.double_n_c); - hashMap.put("noʊ", R.raw.double_n_ou); - hashMap.put("nʊ", R.raw.double_n_us); - hashMap.put("nu", R.raw.double_n_u); - hashMap.put("nʌ", R.raw.double_n_vu); - hashMap.put("naɪ", R.raw.double_n_ai); - hashMap.put("naʊ", R.raw.double_n_au); - hashMap.put("nɔɪ", R.raw.double_n_oi); - hashMap.put("nɝ", R.raw.double_n_ers); - hashMap.put("nɑr", R.raw.double_n_ar); - hashMap.put("nɛr", R.raw.double_n_er); - hashMap.put("nɪr", R.raw.double_n_ir); - hashMap.put("nɔr", R.raw.double_n_or); - hashMap.put("li", R.raw.double_l_i); - hashMap.put("lɪ", R.raw.double_l_is); - hashMap.put("leɪ", R.raw.double_l_ei); - hashMap.put("lɛ", R.raw.double_l_e); - hashMap.put("læ", R.raw.double_l_ae); - hashMap.put("lɑ", R.raw.double_l_a); - hashMap.put("lɔ", R.raw.double_l_c); - hashMap.put("loʊ", R.raw.double_l_ou); - hashMap.put("lʊ", R.raw.double_l_us); - hashMap.put("lu", R.raw.double_l_u); - hashMap.put("lʌ", R.raw.double_l_vu); - hashMap.put("laɪ", R.raw.double_l_ai); - hashMap.put("laʊ", R.raw.double_l_au); - hashMap.put("lɔɪ", R.raw.double_l_oi); - hashMap.put("lɝ", R.raw.double_l_ers); - hashMap.put("lɑr", R.raw.double_l_ar); - hashMap.put("lɛr", R.raw.double_l_er); - hashMap.put("lɪr", R.raw.double_l_ir); - hashMap.put("lɔr", R.raw.double_l_or); - hashMap.put("wi", R.raw.double_w_i); - hashMap.put("wɪ", R.raw.double_w_is); - hashMap.put("weɪ", R.raw.double_w_ei); - hashMap.put("wɛ", R.raw.double_w_e); - hashMap.put("wæ", R.raw.double_w_ae); - hashMap.put("wɑ", R.raw.double_w_a); - hashMap.put("wɔ", R.raw.double_w_c); - hashMap.put("woʊ", R.raw.double_w_ou); - hashMap.put("wʊ", R.raw.double_w_us); - hashMap.put("wu", R.raw.double_w_u); - hashMap.put("wʌ", R.raw.double_w_vu); - hashMap.put("waɪ", R.raw.double_w_ai); - hashMap.put("waʊ", R.raw.double_w_au); - hashMap.put("wɔɪ", R.raw.double_w_oi); - hashMap.put("wɝ", R.raw.double_w_ers); - hashMap.put("wɑr", R.raw.double_w_ar); - hashMap.put("wɛr", R.raw.double_w_er); - hashMap.put("wɪr", R.raw.double_w_ir); - hashMap.put("wɔr", R.raw.double_w_or); - hashMap.put("ji", R.raw.double_j_i); - hashMap.put("jɪ", R.raw.double_j_is); - hashMap.put("jeɪ", R.raw.double_j_ei); - hashMap.put("jɛ", R.raw.double_j_e); - hashMap.put("jæ", R.raw.double_j_ae); - hashMap.put("jɑ", R.raw.double_j_a); - hashMap.put("jɔ", R.raw.double_j_c); - hashMap.put("joʊ", R.raw.double_j_ou); - hashMap.put("jʊ", R.raw.double_j_us); - hashMap.put("ju", R.raw.double_j_u); - hashMap.put("jʌ", R.raw.double_j_vu); - hashMap.put("jaɪ", R.raw.double_j_ai); - hashMap.put("jaʊ", R.raw.double_j_au); - hashMap.put("jɔɪ", R.raw.double_j_oi); - hashMap.put("jɝ", R.raw.double_j_ers); - hashMap.put("jɑr", R.raw.double_j_ar); - hashMap.put("jɛr", R.raw.double_j_er); - hashMap.put("jɪr", R.raw.double_j_ir); - hashMap.put("jɔr", R.raw.double_j_or); - hashMap.put("hi", R.raw.double_h_i); - hashMap.put("hɪ", R.raw.double_h_is); - hashMap.put("heɪ", R.raw.double_h_ei); - hashMap.put("hɛ", R.raw.double_h_e); - hashMap.put("hæ", R.raw.double_h_ae); - hashMap.put("hɑ", R.raw.double_h_a); - hashMap.put("hɔ", R.raw.double_h_c); - hashMap.put("hoʊ", R.raw.double_h_ou); - hashMap.put("hʊ", R.raw.double_h_us); - hashMap.put("hu", R.raw.double_h_u); - hashMap.put("hʌ", R.raw.double_h_vu); - hashMap.put("haɪ", R.raw.double_h_ai); - hashMap.put("haʊ", R.raw.double_h_au); - hashMap.put("hɔɪ", R.raw.double_h_oi); - hashMap.put("hɝ", R.raw.double_h_ers); - hashMap.put("hɑr", R.raw.double_h_ar); - hashMap.put("hɛr", R.raw.double_h_er); - hashMap.put("hɪr", R.raw.double_h_ir); - hashMap.put("hɔr", R.raw.double_h_or); - hashMap.put("ri", R.raw.double_r_i); - hashMap.put("rɪ", R.raw.double_r_is); - hashMap.put("reɪ", R.raw.double_r_ei); - hashMap.put("rɛ", R.raw.double_r_e); - hashMap.put("ræ", R.raw.double_r_ae); - hashMap.put("rɑ", R.raw.double_r_a); - hashMap.put("rɔ", R.raw.double_r_c); - hashMap.put("roʊ", R.raw.double_r_ou); - hashMap.put("rʊ", R.raw.double_r_us); - hashMap.put("ru", R.raw.double_r_u); - hashMap.put("rʌ", R.raw.double_r_vu); - hashMap.put("raɪ", R.raw.double_r_ai); - hashMap.put("raʊ", R.raw.double_r_au); - hashMap.put("rɔɪ", R.raw.double_r_oi); - hashMap.put("rɝ", R.raw.double_r_ers); - hashMap.put("rɑr", R.raw.double_r_ar); - hashMap.put("rɛr", R.raw.double_r_er); - hashMap.put("rɪr", R.raw.double_r_ir); - hashMap.put("rɔr", R.raw.double_r_or); - hashMap.put("ip", R.raw.double_i_p); - hashMap.put("ɪp", R.raw.double_is_p); - hashMap.put("eɪp", R.raw.double_ei_p); - hashMap.put("ɛp", R.raw.double_e_p); - hashMap.put("æp", R.raw.double_ae_p); - hashMap.put("ɑp", R.raw.double_a_p); - hashMap.put("ɔp", R.raw.double_c_p); - hashMap.put("oʊp", R.raw.double_ou_p); - hashMap.put("ʊp", R.raw.double_us_p); - hashMap.put("up", R.raw.double_u_p); - hashMap.put("ʌp", R.raw.double_vu_p); - hashMap.put("aɪp", R.raw.double_ai_p); - hashMap.put("aʊp", R.raw.double_au_p); - hashMap.put("ɔɪp", R.raw.double_oi_p); - hashMap.put("ɝp", R.raw.double_ers_p); - hashMap.put("ɑrp", R.raw.double_ar_p); - hashMap.put("ɛrp", R.raw.double_er_p); - hashMap.put("ɪrp", R.raw.double_ir_p); - hashMap.put("ɔrp", R.raw.double_or_p); - hashMap.put("ib", R.raw.double_i_b); - hashMap.put("ɪb", R.raw.double_is_b); - hashMap.put("eɪb", R.raw.double_ei_b); - hashMap.put("ɛb", R.raw.double_e_b); - hashMap.put("æb", R.raw.double_ae_b); - hashMap.put("ɑb", R.raw.double_a_b); - hashMap.put("ɔb", R.raw.double_c_b); - hashMap.put("oʊb", R.raw.double_ou_b); - hashMap.put("ʊb", R.raw.double_us_b); - hashMap.put("ub", R.raw.double_u_b); - hashMap.put("ʌb", R.raw.double_vu_b); - hashMap.put("aɪb", R.raw.double_ai_b); - hashMap.put("aʊb", R.raw.double_au_b); - hashMap.put("ɔɪb", R.raw.double_oi_b); - hashMap.put("ɝb", R.raw.double_ers_b); - hashMap.put("ɑrb", R.raw.double_ar_b); - hashMap.put("ɛrb", R.raw.double_er_b); - hashMap.put("ɪrb", R.raw.double_ir_b); - hashMap.put("ɔrb", R.raw.double_or_b); - hashMap.put("it", R.raw.double_i_t); - hashMap.put("ɪt", R.raw.double_is_t); - hashMap.put("eɪt", R.raw.double_ei_t); - hashMap.put("ɛt", R.raw.double_e_t); - hashMap.put("æt", R.raw.double_ae_t); - hashMap.put("ɑt", R.raw.double_a_t); - hashMap.put("ɔt", R.raw.double_c_t); - hashMap.put("oʊt", R.raw.double_ou_t); - hashMap.put("ʊt", R.raw.double_us_t); - hashMap.put("ut", R.raw.double_u_t); - hashMap.put("ʌt", R.raw.double_vu_t); - hashMap.put("aɪt", R.raw.double_ai_t); - hashMap.put("aʊt", R.raw.double_au_t); - hashMap.put("ɔɪt", R.raw.double_oi_t); - hashMap.put("ɝt", R.raw.double_ers_t); - hashMap.put("ɑrt", R.raw.double_ar_t); - hashMap.put("ɛrt", R.raw.double_er_t); - hashMap.put("ɪrt", R.raw.double_ir_t); - hashMap.put("ɔrt", R.raw.double_or_t); - hashMap.put("id", R.raw.double_i_d); - hashMap.put("ɪd", R.raw.double_is_d); - hashMap.put("eɪd", R.raw.double_ei_d); - hashMap.put("ɛd", R.raw.double_e_d); - hashMap.put("æd", R.raw.double_ae_d); - hashMap.put("ɑd", R.raw.double_a_d); - hashMap.put("ɔd", R.raw.double_c_d); - hashMap.put("oʊd", R.raw.double_ou_d); - hashMap.put("ʊd", R.raw.double_us_d); - hashMap.put("ud", R.raw.double_u_d); - hashMap.put("ʌd", R.raw.double_vu_d); - hashMap.put("aɪd", R.raw.double_ai_d); - hashMap.put("aʊd", R.raw.double_au_d); - hashMap.put("ɔɪd", R.raw.double_oi_d); - hashMap.put("ɝd", R.raw.double_ers_d); - hashMap.put("ɑrd", R.raw.double_ar_d); - hashMap.put("ɛrd", R.raw.double_er_d); - hashMap.put("ɪrd", R.raw.double_ir_d); - hashMap.put("ɔrd", R.raw.double_or_d); - hashMap.put("ik", R.raw.double_i_k); - hashMap.put("ɪk", R.raw.double_is_k); - hashMap.put("eɪk", R.raw.double_ei_k); - hashMap.put("ɛk", R.raw.double_e_k); - hashMap.put("æk", R.raw.double_ae_k); - hashMap.put("ɑk", R.raw.double_a_k); - hashMap.put("ɔk", R.raw.double_c_k); - hashMap.put("oʊk", R.raw.double_ou_k); - hashMap.put("ʊk", R.raw.double_us_k); - hashMap.put("uk", R.raw.double_u_k); - hashMap.put("ʌk", R.raw.double_vu_k); - hashMap.put("aɪk", R.raw.double_ai_k); - hashMap.put("aʊk", R.raw.double_au_k); - hashMap.put("ɔɪk", R.raw.double_oi_k); - hashMap.put("ɝk", R.raw.double_ers_k); - hashMap.put("ɑrk", R.raw.double_ar_k); - hashMap.put("ɛrk", R.raw.double_er_k); - hashMap.put("ɪrk", R.raw.double_ir_k); - hashMap.put("ɔrk", R.raw.double_or_k); - hashMap.put("ig", R.raw.double_i_g); - hashMap.put("ɪg", R.raw.double_is_g); - hashMap.put("eɪg", R.raw.double_ei_g); - hashMap.put("ɛg", R.raw.double_e_g); - hashMap.put("æg", R.raw.double_ae_g); - hashMap.put("ɑg", R.raw.double_a_g); - hashMap.put("ɔg", R.raw.double_c_g); - hashMap.put("oʊg", R.raw.double_ou_g); - hashMap.put("ʊg", R.raw.double_us_g); - hashMap.put("ug", R.raw.double_u_g); - hashMap.put("ʌg", R.raw.double_vu_g); - hashMap.put("aɪg", R.raw.double_ai_g); - hashMap.put("aʊg", R.raw.double_au_g); - hashMap.put("ɔɪg", R.raw.double_oi_g); - hashMap.put("ɝg", R.raw.double_ers_g); - hashMap.put("ɑrg", R.raw.double_ar_g); - hashMap.put("ɛrg", R.raw.double_er_g); - hashMap.put("ɪrg", R.raw.double_ir_g); - hashMap.put("ɔrg", R.raw.double_or_g); - hashMap.put("iʧ", R.raw.double_i_ch); - hashMap.put("ɪʧ", R.raw.double_is_ch); - hashMap.put("eɪʧ", R.raw.double_ei_ch); - hashMap.put("ɛʧ", R.raw.double_e_ch); - hashMap.put("æʧ", R.raw.double_ae_ch); - hashMap.put("ɑʧ", R.raw.double_a_ch); - hashMap.put("ɔʧ", R.raw.double_c_ch); - hashMap.put("oʊʧ", R.raw.double_ou_ch); - hashMap.put("ʊʧ", R.raw.double_us_ch); - hashMap.put("uʧ", R.raw.double_u_ch); - hashMap.put("ʌʧ", R.raw.double_vu_ch); - hashMap.put("aɪʧ", R.raw.double_ai_ch); - hashMap.put("aʊʧ", R.raw.double_au_ch); - hashMap.put("ɔɪʧ", R.raw.double_oi_ch); - hashMap.put("ɝʧ", R.raw.double_ers_ch); - hashMap.put("ɑrʧ", R.raw.double_ar_ch); - hashMap.put("ɛrʧ", R.raw.double_er_ch); - hashMap.put("ɪrʧ", R.raw.double_ir_ch); - hashMap.put("ɔrʧ", R.raw.double_or_ch); - hashMap.put("iʤ", R.raw.double_i_dzh); - hashMap.put("ɪʤ", R.raw.double_is_dzh); - hashMap.put("eɪʤ", R.raw.double_ei_dzh); - hashMap.put("ɛʤ", R.raw.double_e_dzh); - hashMap.put("æʤ", R.raw.double_ae_dzh); - hashMap.put("ɑʤ", R.raw.double_a_dzh); - hashMap.put("ɔʤ", R.raw.double_c_dzh); - hashMap.put("oʊʤ", R.raw.double_ou_dzh); - hashMap.put("ʊʤ", R.raw.double_us_dzh); - hashMap.put("uʤ", R.raw.double_u_dzh); - hashMap.put("ʌʤ", R.raw.double_vu_dzh); - hashMap.put("aɪʤ", R.raw.double_ai_dzh); - hashMap.put("aʊʤ", R.raw.double_au_dzh); - hashMap.put("ɔɪʤ", R.raw.double_oi_dzh); - hashMap.put("ɝʤ", R.raw.double_ers_dzh); - hashMap.put("ɑrʤ", R.raw.double_ar_dzh); - hashMap.put("ɛrʤ", R.raw.double_er_dzh); - hashMap.put("ɪrʤ", R.raw.double_ir_dzh); - hashMap.put("ɔrʤ", R.raw.double_or_dzh); - hashMap.put("if", R.raw.double_i_f); - hashMap.put("ɪf", R.raw.double_is_f); - hashMap.put("eɪf", R.raw.double_ei_f); - hashMap.put("ɛf", R.raw.double_e_f); - hashMap.put("æf", R.raw.double_ae_f); - hashMap.put("ɑf", R.raw.double_a_f); - hashMap.put("ɔf", R.raw.double_c_f); - hashMap.put("oʊf", R.raw.double_ou_f); - hashMap.put("ʊf", R.raw.double_us_f); - hashMap.put("uf", R.raw.double_u_f); - hashMap.put("ʌf", R.raw.double_vu_f); - hashMap.put("aɪf", R.raw.double_ai_f); - hashMap.put("aʊf", R.raw.double_au_f); - hashMap.put("ɔɪf", R.raw.double_oi_f); - hashMap.put("ɝf", R.raw.double_ers_f); - hashMap.put("ɑrf", R.raw.double_ar_f); - hashMap.put("ɛrf", R.raw.double_er_f); - hashMap.put("ɪrf", R.raw.double_ir_f); - hashMap.put("ɔrf", R.raw.double_or_f); - hashMap.put("iv", R.raw.double_i_v); - hashMap.put("ɪv", R.raw.double_is_v); - hashMap.put("eɪv", R.raw.double_ei_v); - hashMap.put("ɛv", R.raw.double_e_v); - hashMap.put("æv", R.raw.double_ae_v); - hashMap.put("ɑv", R.raw.double_a_v); - hashMap.put("ɔv", R.raw.double_c_v); - hashMap.put("oʊv", R.raw.double_ou_v); - hashMap.put("ʊv", R.raw.double_us_v); - hashMap.put("uv", R.raw.double_u_v); - hashMap.put("ʌv", R.raw.double_vu_v); - hashMap.put("aɪv", R.raw.double_ai_v); - hashMap.put("aʊv", R.raw.double_au_v); - hashMap.put("ɔɪv", R.raw.double_oi_v); - hashMap.put("ɝv", R.raw.double_ers_v); - hashMap.put("ɑrv", R.raw.double_ar_v); - hashMap.put("ɛrv", R.raw.double_er_v); - hashMap.put("ɪrv", R.raw.double_ir_v); - hashMap.put("ɔrv", R.raw.double_or_v); - hashMap.put("iθ", R.raw.double_i_th); - hashMap.put("ɪθ", R.raw.double_is_th); - hashMap.put("eɪθ", R.raw.double_ei_th); - hashMap.put("ɛθ", R.raw.double_e_th); - hashMap.put("æθ", R.raw.double_ae_th); - hashMap.put("ɑθ", R.raw.double_a_th); - hashMap.put("ɔθ", R.raw.double_c_th); - hashMap.put("oʊθ", R.raw.double_ou_th); - hashMap.put("ʊθ", R.raw.double_us_th); - hashMap.put("uθ", R.raw.double_u_th); - hashMap.put("ʌθ", R.raw.double_vu_th); - hashMap.put("aɪθ", R.raw.double_ai_th); - hashMap.put("aʊθ", R.raw.double_au_th); - hashMap.put("ɔɪθ", R.raw.double_oi_th); - hashMap.put("ɝθ", R.raw.double_ers_th); - hashMap.put("ɑrθ", R.raw.double_ar_th); - hashMap.put("ɛrθ", R.raw.double_er_th); - hashMap.put("ɪrθ", R.raw.double_ir_th); - hashMap.put("ɔrθ", R.raw.double_or_th); - hashMap.put("ið", R.raw.double_i_thv); - hashMap.put("ɪð", R.raw.double_is_thv); - hashMap.put("eɪð", R.raw.double_ei_thv); - hashMap.put("ɛð", R.raw.double_e_thv); - hashMap.put("æð", R.raw.double_ae_thv); - hashMap.put("ɑð", R.raw.double_a_thv); - hashMap.put("ɔð", R.raw.double_c_thv); - hashMap.put("oʊð", R.raw.double_ou_thv); - hashMap.put("ʊð", R.raw.double_us_thv); - hashMap.put("uð", R.raw.double_u_thv); - hashMap.put("ʌð", R.raw.double_vu_thv); - hashMap.put("aɪð", R.raw.double_ai_thv); - hashMap.put("aʊð", R.raw.double_au_thv); - hashMap.put("ɔɪð", R.raw.double_oi_thv); - hashMap.put("ɝð", R.raw.double_ers_thv); - hashMap.put("ɑrð", R.raw.double_ar_thv); - hashMap.put("ɛrð", R.raw.double_er_thv); - hashMap.put("ɪrð", R.raw.double_ir_thv); - hashMap.put("ɔrð", R.raw.double_or_thv); - hashMap.put("is", R.raw.double_i_s); - hashMap.put("ɪs", R.raw.double_is_s); - hashMap.put("eɪs", R.raw.double_ei_s); - hashMap.put("ɛs", R.raw.double_e_s); - hashMap.put("æs", R.raw.double_ae_s); - hashMap.put("ɑs", R.raw.double_a_s); - hashMap.put("ɔs", R.raw.double_c_s); - hashMap.put("oʊs", R.raw.double_ou_s); - hashMap.put("ʊs", R.raw.double_us_s); - hashMap.put("us", R.raw.double_u_s); - hashMap.put("ʌs", R.raw.double_vu_s); - hashMap.put("aɪs", R.raw.double_ai_s); - hashMap.put("aʊs", R.raw.double_au_s); - hashMap.put("ɔɪs", R.raw.double_oi_s); - hashMap.put("ɝs", R.raw.double_ers_s); - hashMap.put("ɑrs", R.raw.double_ar_s); - hashMap.put("ɛrs", R.raw.double_er_s); - hashMap.put("ɪrs", R.raw.double_ir_s); - hashMap.put("ɔrs", R.raw.double_or_s); - hashMap.put("iz", R.raw.double_i_z); - hashMap.put("ɪz", R.raw.double_is_z); - hashMap.put("eɪz", R.raw.double_ei_z); - hashMap.put("ɛz", R.raw.double_e_z); - hashMap.put("æz", R.raw.double_ae_z); - hashMap.put("ɑz", R.raw.double_a_z); - hashMap.put("ɔz", R.raw.double_c_z); - hashMap.put("oʊz", R.raw.double_ou_z); - hashMap.put("ʊz", R.raw.double_us_z); - hashMap.put("uz", R.raw.double_u_z); - hashMap.put("ʌz", R.raw.double_vu_z); - hashMap.put("aɪz", R.raw.double_ai_z); - hashMap.put("aʊz", R.raw.double_au_z); - hashMap.put("ɔɪz", R.raw.double_oi_z); - hashMap.put("ɝz", R.raw.double_ers_z); - hashMap.put("ɑrz", R.raw.double_ar_z); - hashMap.put("ɛrz", R.raw.double_er_z); - hashMap.put("ɪrz", R.raw.double_ir_z); - hashMap.put("ɔrz", R.raw.double_or_z); - hashMap.put("iʃ", R.raw.double_i_sh); - hashMap.put("ɪʃ", R.raw.double_is_sh); - hashMap.put("eɪʃ", R.raw.double_ei_sh); - hashMap.put("ɛʃ", R.raw.double_e_sh); - hashMap.put("æʃ", R.raw.double_ae_sh); - hashMap.put("ɑʃ", R.raw.double_a_sh); - hashMap.put("ɔʃ", R.raw.double_c_sh); - hashMap.put("oʊʃ", R.raw.double_ou_sh); - hashMap.put("ʊʃ", R.raw.double_us_sh); - hashMap.put("uʃ", R.raw.double_u_sh); - hashMap.put("ʌʃ", R.raw.double_vu_sh); - hashMap.put("aɪʃ", R.raw.double_ai_sh); - hashMap.put("aʊʃ", R.raw.double_au_sh); - hashMap.put("ɔɪʃ", R.raw.double_oi_sh); - hashMap.put("ɝʃ", R.raw.double_ers_sh); - hashMap.put("ɑrʃ", R.raw.double_ar_sh); - hashMap.put("ɛrʃ", R.raw.double_er_sh); - hashMap.put("ɪrʃ", R.raw.double_ir_sh); - hashMap.put("ɔrʃ", R.raw.double_or_sh); - hashMap.put("iʒ", R.raw.double_i_zh); - hashMap.put("ɪʒ", R.raw.double_is_zh); - hashMap.put("eɪʒ", R.raw.double_ei_zh); - hashMap.put("ɛʒ", R.raw.double_e_zh); - hashMap.put("æʒ", R.raw.double_ae_zh); - hashMap.put("ɑʒ", R.raw.double_a_zh); - hashMap.put("ɔʒ", R.raw.double_c_zh); - hashMap.put("oʊʒ", R.raw.double_ou_zh); - hashMap.put("ʊʒ", R.raw.double_us_zh); - hashMap.put("uʒ", R.raw.double_u_zh); - hashMap.put("ʌʒ", R.raw.double_vu_zh); - hashMap.put("aɪʒ", R.raw.double_ai_zh); - hashMap.put("aʊʒ", R.raw.double_au_zh); - hashMap.put("ɔɪʒ", R.raw.double_oi_zh); - hashMap.put("ɝʒ", R.raw.double_ers_zh); - hashMap.put("ɑrʒ", R.raw.double_ar_zh); - hashMap.put("ɛrʒ", R.raw.double_er_zh); - hashMap.put("ɪrʒ", R.raw.double_ir_zh); - hashMap.put("ɔrʒ", R.raw.double_or_zh); - hashMap.put("im", R.raw.double_i_m); - hashMap.put("ɪm", R.raw.double_is_m); - hashMap.put("eɪm", R.raw.double_ei_m); - hashMap.put("ɛm", R.raw.double_e_m); - hashMap.put("æm", R.raw.double_ae_m); - hashMap.put("ɑm", R.raw.double_a_m); - hashMap.put("ɔm", R.raw.double_c_m); - hashMap.put("oʊm", R.raw.double_ou_m); - hashMap.put("ʊm", R.raw.double_us_m); - hashMap.put("um", R.raw.double_u_m); - hashMap.put("ʌm", R.raw.double_vu_m); - hashMap.put("aɪm", R.raw.double_ai_m); - hashMap.put("aʊm", R.raw.double_au_m); - hashMap.put("ɔɪm", R.raw.double_oi_m); - hashMap.put("ɝm", R.raw.double_ers_m); - hashMap.put("ɑrm", R.raw.double_ar_m); - hashMap.put("ɛrm", R.raw.double_er_m); - hashMap.put("ɪrm", R.raw.double_ir_m); - hashMap.put("ɔrm", R.raw.double_or_m); - hashMap.put("in", R.raw.double_i_n); - hashMap.put("ɪn", R.raw.double_is_n); - hashMap.put("eɪn", R.raw.double_ei_n); - hashMap.put("ɛn", R.raw.double_e_n); - hashMap.put("æn", R.raw.double_ae_n); - hashMap.put("ɑn", R.raw.double_a_n); - hashMap.put("ɔn", R.raw.double_c_n); - hashMap.put("oʊn", R.raw.double_ou_n); - hashMap.put("ʊn", R.raw.double_us_n); - hashMap.put("un", R.raw.double_u_n); - hashMap.put("ʌn", R.raw.double_vu_n); - hashMap.put("aɪn", R.raw.double_ai_n); - hashMap.put("aʊn", R.raw.double_au_n); - hashMap.put("ɔɪn", R.raw.double_oi_n); - hashMap.put("ɝn", R.raw.double_ers_n); - hashMap.put("ɑrn", R.raw.double_ar_n); - hashMap.put("ɛrn", R.raw.double_er_n); - hashMap.put("ɪrn", R.raw.double_ir_n); - hashMap.put("ɔrn", R.raw.double_or_n); - hashMap.put("iŋ", R.raw.double_i_ng); - hashMap.put("ɪŋ", R.raw.double_is_ng); - hashMap.put("eɪŋ", R.raw.double_ei_ng); - hashMap.put("ɛŋ", R.raw.double_e_ng); - hashMap.put("æŋ", R.raw.double_ae_ng); - hashMap.put("ɑŋ", R.raw.double_a_ng); - hashMap.put("ɔŋ", R.raw.double_c_ng); - hashMap.put("oʊŋ", R.raw.double_ou_ng); - hashMap.put("ʊŋ", R.raw.double_us_ng); - hashMap.put("uŋ", R.raw.double_u_ng); - hashMap.put("ʌŋ", R.raw.double_vu_ng); - hashMap.put("aɪŋ", R.raw.double_ai_ng); - hashMap.put("aʊŋ", R.raw.double_au_ng); - hashMap.put("ɔɪŋ", R.raw.double_oi_ng); - hashMap.put("ɝŋ", R.raw.double_ers_ng); - hashMap.put("ɑrŋ", R.raw.double_ar_ng); - hashMap.put("ɛrŋ", R.raw.double_er_ng); - hashMap.put("ɪrŋ", R.raw.double_ir_ng); - hashMap.put("ɔrŋ", R.raw.double_or_ng); - hashMap.put("il", R.raw.double_i_l); - hashMap.put("ɪl", R.raw.double_is_l); - hashMap.put("eɪl", R.raw.double_ei_l); - hashMap.put("ɛl", R.raw.double_e_l); - hashMap.put("æl", R.raw.double_ae_l); - hashMap.put("ɑl", R.raw.double_a_l); - hashMap.put("ɔl", R.raw.double_c_l); - hashMap.put("oʊl", R.raw.double_ou_l); - hashMap.put("ʊl", R.raw.double_us_l); - hashMap.put("ul", R.raw.double_u_l); - hashMap.put("ʌl", R.raw.double_vu_l); - hashMap.put("aɪl", R.raw.double_ai_l); - hashMap.put("aʊl", R.raw.double_au_l); - hashMap.put("ɔɪl", R.raw.double_oi_l); - hashMap.put("ɝl", R.raw.double_ers_l); - hashMap.put("ɑrl", R.raw.double_ar_l); - hashMap.put("ɛrl", R.raw.double_er_l); - hashMap.put("ɪrl", R.raw.double_ir_l); - hashMap.put("ɔrl", R.raw.double_or_l); + static Pair parse(String ipaDouble) { + if (ipaDouble == null || ipaDouble.length() < 2) return null; + + String first; + String second; + + if (!startsWithTwoCharVowel(ipaDouble)) { + first = ipaDouble.substring(0, 1); + second = ipaDouble.substring(1); + return new Pair<>(first, second); + } + + if (ipaDouble.length() == 2) { + // this is technically an error (shouldn't separate a 2-char vowel) + first = ipaDouble.substring(0, 1); + second = ipaDouble.substring(1); + return new Pair<>(first, second); + } + + first = ipaDouble.substring(0, 2); + second = ipaDouble.substring(2); + return new Pair<>(first, second); + } + + private static boolean startsWithTwoCharVowel(String ipaDouble) { + return ipaDouble.startsWith(Ipa.ai) || ipaDouble.startsWith(Ipa.au) + || ipaDouble.startsWith(Ipa.ei) || ipaDouble.startsWith(Ipa.ou) + || ipaDouble.startsWith(Ipa.oi) || ipaDouble.startsWith(Ipa.ar) + || ipaDouble.startsWith(Ipa.er) || ipaDouble.startsWith(Ipa.ir) + || ipaDouble.startsWith(Ipa.or); + } + + // initialize the result when new object created + private static Map createSoundMap() { + + Map result = new LinkedHashMap<>(); + + result.put("pi", R.raw.double_p_i); + result.put("pɪ", R.raw.double_p_is); + result.put("peɪ", R.raw.double_p_ei); + result.put("pɛ", R.raw.double_p_e); + result.put("pæ", R.raw.double_p_ae); + result.put("pɑ", R.raw.double_p_a); + result.put("pɔ", R.raw.double_p_c); + result.put("poʊ", R.raw.double_p_ou); + result.put("pʊ", R.raw.double_p_us); + result.put("pu", R.raw.double_p_u); + result.put("pʌ", R.raw.double_p_vu); + result.put("paɪ", R.raw.double_p_ai); + result.put("paʊ", R.raw.double_p_au); + result.put("pɔɪ", R.raw.double_p_oi); + result.put("pɝ", R.raw.double_p_ers); + result.put("pɑr", R.raw.double_p_ar); + result.put("pɛr", R.raw.double_p_er); + result.put("pɪr", R.raw.double_p_ir); + result.put("pɔr", R.raw.double_p_or); + result.put("bi", R.raw.double_b_i); + result.put("bɪ", R.raw.double_b_is); + result.put("beɪ", R.raw.double_b_ei); + result.put("bɛ", R.raw.double_b_e); + result.put("bæ", R.raw.double_b_ae); + result.put("bɑ", R.raw.double_b_a); + result.put("bɔ", R.raw.double_b_c); + result.put("boʊ", R.raw.double_b_ou); + result.put("bʊ", R.raw.double_b_us); + result.put("bu", R.raw.double_b_u); + result.put("bʌ", R.raw.double_b_vu); + result.put("baɪ", R.raw.double_b_ai); + result.put("baʊ", R.raw.double_b_au); + result.put("bɔɪ", R.raw.double_b_oi); + result.put("bɝ", R.raw.double_b_ers); + result.put("bɑr", R.raw.double_b_ar); + result.put("bɛr", R.raw.double_b_er); + result.put("bɪr", R.raw.double_b_ir); + result.put("bɔr", R.raw.double_b_or); + result.put("ti", R.raw.double_t_i); + result.put("tɪ", R.raw.double_t_is); + result.put("teɪ", R.raw.double_t_ei); + result.put("tɛ", R.raw.double_t_e); + result.put("tæ", R.raw.double_t_ae); + result.put("tɑ", R.raw.double_t_a); + result.put("tɔ", R.raw.double_t_c); + result.put("toʊ", R.raw.double_t_ou); + result.put("tʊ", R.raw.double_t_us); + result.put("tu", R.raw.double_t_u); + result.put("tʌ", R.raw.double_t_vu); + result.put("taɪ", R.raw.double_t_ai); + result.put("taʊ", R.raw.double_t_au); + result.put("tɔɪ", R.raw.double_t_oi); + result.put("tɝ", R.raw.double_t_ers); + result.put("tɑr", R.raw.double_t_ar); + result.put("tɛr", R.raw.double_t_er); + result.put("tɪr", R.raw.double_t_ir); + result.put("tɔr", R.raw.double_t_or); + result.put("di", R.raw.double_d_i); + result.put("dɪ", R.raw.double_d_is); + result.put("deɪ", R.raw.double_d_ei); + result.put("dɛ", R.raw.double_d_e); + result.put("dæ", R.raw.double_d_ae); + result.put("dɑ", R.raw.double_d_a); + result.put("dɔ", R.raw.double_d_c); + result.put("doʊ", R.raw.double_d_ou); + result.put("dʊ", R.raw.double_d_us); + result.put("du", R.raw.double_d_u); + result.put("dʌ", R.raw.double_d_vu); + result.put("daɪ", R.raw.double_d_ai); + result.put("daʊ", R.raw.double_d_au); + result.put("dɔɪ", R.raw.double_d_oi); + result.put("dɝ", R.raw.double_d_ers); + result.put("dɑr", R.raw.double_d_ar); + result.put("dɛr", R.raw.double_d_er); + result.put("dɪr", R.raw.double_d_ir); + result.put("dɔr", R.raw.double_d_or); + result.put("ki", R.raw.double_k_i); + result.put("kɪ", R.raw.double_k_is); + result.put("keɪ", R.raw.double_k_ei); + result.put("kɛ", R.raw.double_k_e); + result.put("kæ", R.raw.double_k_ae); + result.put("kɑ", R.raw.double_k_a); + result.put("kɔ", R.raw.double_k_c); + result.put("koʊ", R.raw.double_k_ou); + result.put("kʊ", R.raw.double_k_us); + result.put("ku", R.raw.double_k_u); + result.put("kʌ", R.raw.double_k_vu); + result.put("kaɪ", R.raw.double_k_ai); + result.put("kaʊ", R.raw.double_k_au); + result.put("kɔɪ", R.raw.double_k_oi); + result.put("kɝ", R.raw.double_k_ers); + result.put("kɑr", R.raw.double_k_ar); + result.put("kɛr", R.raw.double_k_er); + result.put("kɪr", R.raw.double_k_ir); + result.put("kɔr", R.raw.double_k_or); + result.put("gi", R.raw.double_g_i); + result.put("gɪ", R.raw.double_g_is); + result.put("geɪ", R.raw.double_g_ei); + result.put("gɛ", R.raw.double_g_e); + result.put("gæ", R.raw.double_g_ae); + result.put("gɑ", R.raw.double_g_a); + result.put("gɔ", R.raw.double_g_c); + result.put("goʊ", R.raw.double_g_ou); + result.put("gʊ", R.raw.double_g_us); + result.put("gu", R.raw.double_g_u); + result.put("gʌ", R.raw.double_g_vu); + result.put("gaɪ", R.raw.double_g_ai); + result.put("gaʊ", R.raw.double_g_au); + result.put("gɔɪ", R.raw.double_g_oi); + result.put("gɝ", R.raw.double_g_ers); + result.put("gɑr", R.raw.double_g_ar); + result.put("gɛr", R.raw.double_g_er); + result.put("gɪr", R.raw.double_g_ir); + result.put("gɔr", R.raw.double_g_or); + result.put("ʧi", R.raw.double_ch_i); + result.put("ʧɪ", R.raw.double_ch_is); + result.put("ʧeɪ", R.raw.double_ch_ei); + result.put("ʧɛ", R.raw.double_ch_e); + result.put("ʧæ", R.raw.double_ch_ae); + result.put("ʧɑ", R.raw.double_ch_a); + result.put("ʧɔ", R.raw.double_ch_c); + result.put("ʧoʊ", R.raw.double_ch_ou); + result.put("ʧʊ", R.raw.double_ch_us); + result.put("ʧu", R.raw.double_ch_u); + result.put("ʧʌ", R.raw.double_ch_vu); + result.put("ʧaɪ", R.raw.double_ch_ai); + result.put("ʧaʊ", R.raw.double_ch_au); + result.put("ʧɔɪ", R.raw.double_ch_oi); + result.put("ʧɝ", R.raw.double_ch_ers); + result.put("ʧɑr", R.raw.double_ch_ar); + result.put("ʧɛr", R.raw.double_ch_er); + result.put("ʧɪr", R.raw.double_ch_ir); + result.put("ʧɔr", R.raw.double_ch_or); + result.put("ʤi", R.raw.double_dzh_i); + result.put("ʤɪ", R.raw.double_dzh_is); + result.put("ʤeɪ", R.raw.double_dzh_ei); + result.put("ʤɛ", R.raw.double_dzh_e); + result.put("ʤæ", R.raw.double_dzh_ae); + result.put("ʤɑ", R.raw.double_dzh_a); + result.put("ʤɔ", R.raw.double_dzh_c); + result.put("ʤoʊ", R.raw.double_dzh_ou); + result.put("ʤʊ", R.raw.double_dzh_us); + result.put("ʤu", R.raw.double_dzh_u); + result.put("ʤʌ", R.raw.double_dzh_vu); + result.put("ʤaɪ", R.raw.double_dzh_ai); + result.put("ʤaʊ", R.raw.double_dzh_au); + result.put("ʤɔɪ", R.raw.double_dzh_oi); + result.put("ʤɝ", R.raw.double_dzh_ers); + result.put("ʤɑr", R.raw.double_dzh_ar); + result.put("ʤɛr", R.raw.double_dzh_er); + result.put("ʤɪr", R.raw.double_dzh_ir); + result.put("ʤɔr", R.raw.double_dzh_or); + result.put("fi", R.raw.double_f_i); + result.put("fɪ", R.raw.double_f_is); + result.put("feɪ", R.raw.double_f_ei); + result.put("fɛ", R.raw.double_f_e); + result.put("fæ", R.raw.double_f_ae); + result.put("fɑ", R.raw.double_f_a); + result.put("fɔ", R.raw.double_f_c); + result.put("foʊ", R.raw.double_f_ou); + result.put("fʊ", R.raw.double_f_us); + result.put("fu", R.raw.double_f_u); + result.put("fʌ", R.raw.double_f_vu); + result.put("faɪ", R.raw.double_f_ai); + result.put("faʊ", R.raw.double_f_au); + result.put("fɔɪ", R.raw.double_f_oi); + result.put("fɝ", R.raw.double_f_ers); + result.put("fɑr", R.raw.double_f_ar); + result.put("fɛr", R.raw.double_f_er); + result.put("fɪr", R.raw.double_f_ir); + result.put("fɔr", R.raw.double_f_or); + result.put("vi", R.raw.double_v_i); + result.put("vɪ", R.raw.double_v_is); + result.put("veɪ", R.raw.double_v_ei); + result.put("vɛ", R.raw.double_v_e); + result.put("væ", R.raw.double_v_ae); + result.put("vɑ", R.raw.double_v_a); + result.put("vɔ", R.raw.double_v_c); + result.put("voʊ", R.raw.double_v_ou); + result.put("vʊ", R.raw.double_v_us); + result.put("vu", R.raw.double_v_u); + result.put("vʌ", R.raw.double_v_vu); + result.put("vaɪ", R.raw.double_v_ai); + result.put("vaʊ", R.raw.double_v_au); + result.put("vɔɪ", R.raw.double_v_oi); + result.put("vɝ", R.raw.double_v_ers); + result.put("vɑr", R.raw.double_v_ar); + result.put("vɛr", R.raw.double_v_er); + result.put("vɪr", R.raw.double_v_ir); + result.put("vɔr", R.raw.double_v_or); + result.put("θi", R.raw.double_th_i); + result.put("θɪ", R.raw.double_th_is); + result.put("θeɪ", R.raw.double_th_ei); + result.put("θɛ", R.raw.double_th_e); + result.put("θæ", R.raw.double_th_ae); + result.put("θɑ", R.raw.double_th_a); + result.put("θɔ", R.raw.double_th_c); + result.put("θoʊ", R.raw.double_th_ou); + result.put("θʊ", R.raw.double_th_us); + result.put("θu", R.raw.double_th_u); + result.put("θʌ", R.raw.double_th_vu); + result.put("θaɪ", R.raw.double_th_ai); + result.put("θaʊ", R.raw.double_th_au); + result.put("θɔɪ", R.raw.double_th_oi); + result.put("θɝ", R.raw.double_th_ers); + result.put("θɑr", R.raw.double_th_ar); + result.put("θɛr", R.raw.double_th_er); + result.put("θɪr", R.raw.double_th_ir); + result.put("θɔr", R.raw.double_th_or); + result.put("ði", R.raw.double_thv_i); + result.put("ðɪ", R.raw.double_thv_is); + result.put("ðeɪ", R.raw.double_thv_ei); + result.put("ðɛ", R.raw.double_thv_e); + result.put("ðæ", R.raw.double_thv_ae); + result.put("ðɑ", R.raw.double_thv_a); + result.put("ðɔ", R.raw.double_thv_c); + result.put("ðoʊ", R.raw.double_thv_ou); + result.put("ðʊ", R.raw.double_thv_us); + result.put("ðu", R.raw.double_thv_u); + result.put("ðʌ", R.raw.double_thv_vu); + result.put("ðaɪ", R.raw.double_thv_ai); + result.put("ðaʊ", R.raw.double_thv_au); + result.put("ðɔɪ", R.raw.double_thv_oi); + result.put("ðɝ", R.raw.double_thv_ers); + result.put("ðɑr", R.raw.double_thv_ar); + result.put("ðɛr", R.raw.double_thv_er); + result.put("ðɪr", R.raw.double_thv_ir); + result.put("ðɔr", R.raw.double_thv_or); + result.put("si", R.raw.double_s_i); + result.put("sɪ", R.raw.double_s_is); + result.put("seɪ", R.raw.double_s_ei); + result.put("sɛ", R.raw.double_s_e); + result.put("sæ", R.raw.double_s_ae); + result.put("sɑ", R.raw.double_s_a); + result.put("sɔ", R.raw.double_s_c); + result.put("soʊ", R.raw.double_s_ou); + result.put("sʊ", R.raw.double_s_us); + result.put("su", R.raw.double_s_u); + result.put("sʌ", R.raw.double_s_vu); + result.put("saɪ", R.raw.double_s_ai); + result.put("saʊ", R.raw.double_s_au); + result.put("sɔɪ", R.raw.double_s_oi); + result.put("sɝ", R.raw.double_s_ers); + result.put("sɑr", R.raw.double_s_ar); + result.put("sɛr", R.raw.double_s_er); + result.put("sɪr", R.raw.double_s_ir); + result.put("sɔr", R.raw.double_s_or); + result.put("zi", R.raw.double_z_i); + result.put("zɪ", R.raw.double_z_is); + result.put("zeɪ", R.raw.double_z_ei); + result.put("zɛ", R.raw.double_z_e); + result.put("zæ", R.raw.double_z_ae); + result.put("zɑ", R.raw.double_z_a); + result.put("zɔ", R.raw.double_z_c); + result.put("zoʊ", R.raw.double_z_ou); + result.put("zʊ", R.raw.double_z_us); + result.put("zu", R.raw.double_z_u); + result.put("zʌ", R.raw.double_z_vu); + result.put("zaɪ", R.raw.double_z_ai); + result.put("zaʊ", R.raw.double_z_au); + result.put("zɔɪ", R.raw.double_z_oi); + result.put("zɝ", R.raw.double_z_ers); + result.put("zɑr", R.raw.double_z_ar); + result.put("zɛr", R.raw.double_z_er); + result.put("zɪr", R.raw.double_z_ir); + result.put("zɔr", R.raw.double_z_or); + result.put("ʃi", R.raw.double_sh_i); + result.put("ʃɪ", R.raw.double_sh_is); + result.put("ʃeɪ", R.raw.double_sh_ei); + result.put("ʃɛ", R.raw.double_sh_e); + result.put("ʃæ", R.raw.double_sh_ae); + result.put("ʃɑ", R.raw.double_sh_a); + result.put("ʃɔ", R.raw.double_sh_c); + result.put("ʃoʊ", R.raw.double_sh_ou); + result.put("ʃʊ", R.raw.double_sh_us); + result.put("ʃu", R.raw.double_sh_u); + result.put("ʃʌ", R.raw.double_sh_vu); + result.put("ʃaɪ", R.raw.double_sh_ai); + result.put("ʃaʊ", R.raw.double_sh_au); + result.put("ʃɔɪ", R.raw.double_sh_oi); + result.put("ʃɝ", R.raw.double_sh_ers); + result.put("ʃɑr", R.raw.double_sh_ar); + result.put("ʃɛr", R.raw.double_sh_er); + result.put("ʃɪr", R.raw.double_sh_ir); + result.put("ʃɔr", R.raw.double_sh_or); + result.put("ʒi", R.raw.double_zh_i); + result.put("ʒɪ", R.raw.double_zh_is); + result.put("ʒeɪ", R.raw.double_zh_ei); + result.put("ʒɛ", R.raw.double_zh_e); + result.put("ʒæ", R.raw.double_zh_ae); + result.put("ʒɑ", R.raw.double_zh_a); + result.put("ʒɔ", R.raw.double_zh_c); + result.put("ʒoʊ", R.raw.double_zh_ou); + result.put("ʒʊ", R.raw.double_zh_us); + result.put("ʒu", R.raw.double_zh_u); + result.put("ʒʌ", R.raw.double_zh_vu); + result.put("ʒaɪ", R.raw.double_zh_ai); + result.put("ʒaʊ", R.raw.double_zh_au); + result.put("ʒɔɪ", R.raw.double_zh_oi); + result.put("ʒɝ", R.raw.double_zh_ers); + result.put("ʒɑr", R.raw.double_zh_ar); + result.put("ʒɛr", R.raw.double_zh_er); + result.put("ʒɪr", R.raw.double_zh_ir); + result.put("ʒɔr", R.raw.double_zh_or); + result.put("mi", R.raw.double_m_i); + result.put("mɪ", R.raw.double_m_is); + result.put("meɪ", R.raw.double_m_ei); + result.put("mɛ", R.raw.double_m_e); + result.put("mæ", R.raw.double_m_ae); + result.put("mɑ", R.raw.double_m_a); + result.put("mɔ", R.raw.double_m_c); + result.put("moʊ", R.raw.double_m_ou); + result.put("mʊ", R.raw.double_m_us); + result.put("mu", R.raw.double_m_u); + result.put("mʌ", R.raw.double_m_vu); + result.put("maɪ", R.raw.double_m_ai); + result.put("maʊ", R.raw.double_m_au); + result.put("mɔɪ", R.raw.double_m_oi); + result.put("mɝ", R.raw.double_m_ers); + result.put("mɑr", R.raw.double_m_ar); + result.put("mɛr", R.raw.double_m_er); + result.put("mɪr", R.raw.double_m_ir); + result.put("mɔr", R.raw.double_m_or); + result.put("ni", R.raw.double_n_i); + result.put("nɪ", R.raw.double_n_is); + result.put("neɪ", R.raw.double_n_ei); + result.put("nɛ", R.raw.double_n_e); + result.put("næ", R.raw.double_n_ae); + result.put("nɑ", R.raw.double_n_a); + result.put("nɔ", R.raw.double_n_c); + result.put("noʊ", R.raw.double_n_ou); + result.put("nʊ", R.raw.double_n_us); + result.put("nu", R.raw.double_n_u); + result.put("nʌ", R.raw.double_n_vu); + result.put("naɪ", R.raw.double_n_ai); + result.put("naʊ", R.raw.double_n_au); + result.put("nɔɪ", R.raw.double_n_oi); + result.put("nɝ", R.raw.double_n_ers); + result.put("nɑr", R.raw.double_n_ar); + result.put("nɛr", R.raw.double_n_er); + result.put("nɪr", R.raw.double_n_ir); + result.put("nɔr", R.raw.double_n_or); + result.put("li", R.raw.double_l_i); + result.put("lɪ", R.raw.double_l_is); + result.put("leɪ", R.raw.double_l_ei); + result.put("lɛ", R.raw.double_l_e); + result.put("læ", R.raw.double_l_ae); + result.put("lɑ", R.raw.double_l_a); + result.put("lɔ", R.raw.double_l_c); + result.put("loʊ", R.raw.double_l_ou); + result.put("lʊ", R.raw.double_l_us); + result.put("lu", R.raw.double_l_u); + result.put("lʌ", R.raw.double_l_vu); + result.put("laɪ", R.raw.double_l_ai); + result.put("laʊ", R.raw.double_l_au); + result.put("lɔɪ", R.raw.double_l_oi); + result.put("lɝ", R.raw.double_l_ers); + result.put("lɑr", R.raw.double_l_ar); + result.put("lɛr", R.raw.double_l_er); + result.put("lɪr", R.raw.double_l_ir); + result.put("lɔr", R.raw.double_l_or); + result.put("wi", R.raw.double_w_i); + result.put("wɪ", R.raw.double_w_is); + result.put("weɪ", R.raw.double_w_ei); + result.put("wɛ", R.raw.double_w_e); + result.put("wæ", R.raw.double_w_ae); + result.put("wɑ", R.raw.double_w_a); + result.put("wɔ", R.raw.double_w_c); + result.put("woʊ", R.raw.double_w_ou); + result.put("wʊ", R.raw.double_w_us); + result.put("wu", R.raw.double_w_u); + result.put("wʌ", R.raw.double_w_vu); + result.put("waɪ", R.raw.double_w_ai); + result.put("waʊ", R.raw.double_w_au); + result.put("wɔɪ", R.raw.double_w_oi); + result.put("wɝ", R.raw.double_w_ers); + result.put("wɑr", R.raw.double_w_ar); + result.put("wɛr", R.raw.double_w_er); + result.put("wɪr", R.raw.double_w_ir); + result.put("wɔr", R.raw.double_w_or); + result.put("ji", R.raw.double_j_i); + result.put("jɪ", R.raw.double_j_is); + result.put("jeɪ", R.raw.double_j_ei); + result.put("jɛ", R.raw.double_j_e); + result.put("jæ", R.raw.double_j_ae); + result.put("jɑ", R.raw.double_j_a); + result.put("jɔ", R.raw.double_j_c); + result.put("joʊ", R.raw.double_j_ou); + result.put("jʊ", R.raw.double_j_us); + result.put("ju", R.raw.double_j_u); + result.put("jʌ", R.raw.double_j_vu); + result.put("jaɪ", R.raw.double_j_ai); + result.put("jaʊ", R.raw.double_j_au); + result.put("jɔɪ", R.raw.double_j_oi); + result.put("jɝ", R.raw.double_j_ers); + result.put("jɑr", R.raw.double_j_ar); + result.put("jɛr", R.raw.double_j_er); + result.put("jɪr", R.raw.double_j_ir); + result.put("jɔr", R.raw.double_j_or); + result.put("hi", R.raw.double_h_i); + result.put("hɪ", R.raw.double_h_is); + result.put("heɪ", R.raw.double_h_ei); + result.put("hɛ", R.raw.double_h_e); + result.put("hæ", R.raw.double_h_ae); + result.put("hɑ", R.raw.double_h_a); + result.put("hɔ", R.raw.double_h_c); + result.put("hoʊ", R.raw.double_h_ou); + result.put("hʊ", R.raw.double_h_us); + result.put("hu", R.raw.double_h_u); + result.put("hʌ", R.raw.double_h_vu); + result.put("haɪ", R.raw.double_h_ai); + result.put("haʊ", R.raw.double_h_au); + result.put("hɔɪ", R.raw.double_h_oi); + result.put("hɝ", R.raw.double_h_ers); + result.put("hɑr", R.raw.double_h_ar); + result.put("hɛr", R.raw.double_h_er); + result.put("hɪr", R.raw.double_h_ir); + result.put("hɔr", R.raw.double_h_or); + result.put("ri", R.raw.double_r_i); + result.put("rɪ", R.raw.double_r_is); + result.put("reɪ", R.raw.double_r_ei); + result.put("rɛ", R.raw.double_r_e); + result.put("ræ", R.raw.double_r_ae); + result.put("rɑ", R.raw.double_r_a); + result.put("rɔ", R.raw.double_r_c); + result.put("roʊ", R.raw.double_r_ou); + result.put("rʊ", R.raw.double_r_us); + result.put("ru", R.raw.double_r_u); + result.put("rʌ", R.raw.double_r_vu); + result.put("raɪ", R.raw.double_r_ai); + result.put("raʊ", R.raw.double_r_au); + result.put("rɔɪ", R.raw.double_r_oi); + result.put("rɝ", R.raw.double_r_ers); + result.put("rɑr", R.raw.double_r_ar); + result.put("rɛr", R.raw.double_r_er); + result.put("rɪr", R.raw.double_r_ir); + result.put("rɔr", R.raw.double_r_or); + result.put("ip", R.raw.double_i_p); + result.put("ɪp", R.raw.double_is_p); + result.put("eɪp", R.raw.double_ei_p); + result.put("ɛp", R.raw.double_e_p); + result.put("æp", R.raw.double_ae_p); + result.put("ɑp", R.raw.double_a_p); + result.put("ɔp", R.raw.double_c_p); + result.put("oʊp", R.raw.double_ou_p); + result.put("ʊp", R.raw.double_us_p); + result.put("up", R.raw.double_u_p); + result.put("ʌp", R.raw.double_vu_p); + result.put("aɪp", R.raw.double_ai_p); + result.put("aʊp", R.raw.double_au_p); + result.put("ɔɪp", R.raw.double_oi_p); + result.put("ɝp", R.raw.double_ers_p); + result.put("ɑrp", R.raw.double_ar_p); + result.put("ɛrp", R.raw.double_er_p); + result.put("ɪrp", R.raw.double_ir_p); + result.put("ɔrp", R.raw.double_or_p); + result.put("ib", R.raw.double_i_b); + result.put("ɪb", R.raw.double_is_b); + result.put("eɪb", R.raw.double_ei_b); + result.put("ɛb", R.raw.double_e_b); + result.put("æb", R.raw.double_ae_b); + result.put("ɑb", R.raw.double_a_b); + result.put("ɔb", R.raw.double_c_b); + result.put("oʊb", R.raw.double_ou_b); + result.put("ʊb", R.raw.double_us_b); + result.put("ub", R.raw.double_u_b); + result.put("ʌb", R.raw.double_vu_b); + result.put("aɪb", R.raw.double_ai_b); + result.put("aʊb", R.raw.double_au_b); + result.put("ɔɪb", R.raw.double_oi_b); + result.put("ɝb", R.raw.double_ers_b); + result.put("ɑrb", R.raw.double_ar_b); + result.put("ɛrb", R.raw.double_er_b); + result.put("ɪrb", R.raw.double_ir_b); + result.put("ɔrb", R.raw.double_or_b); + result.put("it", R.raw.double_i_t); + result.put("ɪt", R.raw.double_is_t); + result.put("eɪt", R.raw.double_ei_t); + result.put("ɛt", R.raw.double_e_t); + result.put("æt", R.raw.double_ae_t); + result.put("ɑt", R.raw.double_a_t); + result.put("ɔt", R.raw.double_c_t); + result.put("oʊt", R.raw.double_ou_t); + result.put("ʊt", R.raw.double_us_t); + result.put("ut", R.raw.double_u_t); + result.put("ʌt", R.raw.double_vu_t); + result.put("aɪt", R.raw.double_ai_t); + result.put("aʊt", R.raw.double_au_t); + result.put("ɔɪt", R.raw.double_oi_t); + result.put("ɝt", R.raw.double_ers_t); + result.put("ɑrt", R.raw.double_ar_t); + result.put("ɛrt", R.raw.double_er_t); + result.put("ɪrt", R.raw.double_ir_t); + result.put("ɔrt", R.raw.double_or_t); + result.put("id", R.raw.double_i_d); + result.put("ɪd", R.raw.double_is_d); + result.put("eɪd", R.raw.double_ei_d); + result.put("ɛd", R.raw.double_e_d); + result.put("æd", R.raw.double_ae_d); + result.put("ɑd", R.raw.double_a_d); + result.put("ɔd", R.raw.double_c_d); + result.put("oʊd", R.raw.double_ou_d); + result.put("ʊd", R.raw.double_us_d); + result.put("ud", R.raw.double_u_d); + result.put("ʌd", R.raw.double_vu_d); + result.put("aɪd", R.raw.double_ai_d); + result.put("aʊd", R.raw.double_au_d); + result.put("ɔɪd", R.raw.double_oi_d); + result.put("ɝd", R.raw.double_ers_d); + result.put("ɑrd", R.raw.double_ar_d); + result.put("ɛrd", R.raw.double_er_d); + result.put("ɪrd", R.raw.double_ir_d); + result.put("ɔrd", R.raw.double_or_d); + result.put("ik", R.raw.double_i_k); + result.put("ɪk", R.raw.double_is_k); + result.put("eɪk", R.raw.double_ei_k); + result.put("ɛk", R.raw.double_e_k); + result.put("æk", R.raw.double_ae_k); + result.put("ɑk", R.raw.double_a_k); + result.put("ɔk", R.raw.double_c_k); + result.put("oʊk", R.raw.double_ou_k); + result.put("ʊk", R.raw.double_us_k); + result.put("uk", R.raw.double_u_k); + result.put("ʌk", R.raw.double_vu_k); + result.put("aɪk", R.raw.double_ai_k); + result.put("aʊk", R.raw.double_au_k); + result.put("ɔɪk", R.raw.double_oi_k); + result.put("ɝk", R.raw.double_ers_k); + result.put("ɑrk", R.raw.double_ar_k); + result.put("ɛrk", R.raw.double_er_k); + result.put("ɪrk", R.raw.double_ir_k); + result.put("ɔrk", R.raw.double_or_k); + result.put("ig", R.raw.double_i_g); + result.put("ɪg", R.raw.double_is_g); + result.put("eɪg", R.raw.double_ei_g); + result.put("ɛg", R.raw.double_e_g); + result.put("æg", R.raw.double_ae_g); + result.put("ɑg", R.raw.double_a_g); + result.put("ɔg", R.raw.double_c_g); + result.put("oʊg", R.raw.double_ou_g); + result.put("ʊg", R.raw.double_us_g); + result.put("ug", R.raw.double_u_g); + result.put("ʌg", R.raw.double_vu_g); + result.put("aɪg", R.raw.double_ai_g); + result.put("aʊg", R.raw.double_au_g); + result.put("ɔɪg", R.raw.double_oi_g); + result.put("ɝg", R.raw.double_ers_g); + result.put("ɑrg", R.raw.double_ar_g); + result.put("ɛrg", R.raw.double_er_g); + result.put("ɪrg", R.raw.double_ir_g); + result.put("ɔrg", R.raw.double_or_g); + result.put("iʧ", R.raw.double_i_ch); + result.put("ɪʧ", R.raw.double_is_ch); + result.put("eɪʧ", R.raw.double_ei_ch); + result.put("ɛʧ", R.raw.double_e_ch); + result.put("æʧ", R.raw.double_ae_ch); + result.put("ɑʧ", R.raw.double_a_ch); + result.put("ɔʧ", R.raw.double_c_ch); + result.put("oʊʧ", R.raw.double_ou_ch); + result.put("ʊʧ", R.raw.double_us_ch); + result.put("uʧ", R.raw.double_u_ch); + result.put("ʌʧ", R.raw.double_vu_ch); + result.put("aɪʧ", R.raw.double_ai_ch); + result.put("aʊʧ", R.raw.double_au_ch); + result.put("ɔɪʧ", R.raw.double_oi_ch); + result.put("ɝʧ", R.raw.double_ers_ch); + result.put("ɑrʧ", R.raw.double_ar_ch); + result.put("ɛrʧ", R.raw.double_er_ch); + result.put("ɪrʧ", R.raw.double_ir_ch); + result.put("ɔrʧ", R.raw.double_or_ch); + result.put("iʤ", R.raw.double_i_dzh); + result.put("ɪʤ", R.raw.double_is_dzh); + result.put("eɪʤ", R.raw.double_ei_dzh); + result.put("ɛʤ", R.raw.double_e_dzh); + result.put("æʤ", R.raw.double_ae_dzh); + result.put("ɑʤ", R.raw.double_a_dzh); + result.put("ɔʤ", R.raw.double_c_dzh); + result.put("oʊʤ", R.raw.double_ou_dzh); + result.put("ʊʤ", R.raw.double_us_dzh); + result.put("uʤ", R.raw.double_u_dzh); + result.put("ʌʤ", R.raw.double_vu_dzh); + result.put("aɪʤ", R.raw.double_ai_dzh); + result.put("aʊʤ", R.raw.double_au_dzh); + result.put("ɔɪʤ", R.raw.double_oi_dzh); + result.put("ɝʤ", R.raw.double_ers_dzh); + result.put("ɑrʤ", R.raw.double_ar_dzh); + result.put("ɛrʤ", R.raw.double_er_dzh); + result.put("ɪrʤ", R.raw.double_ir_dzh); + result.put("ɔrʤ", R.raw.double_or_dzh); + result.put("if", R.raw.double_i_f); + result.put("ɪf", R.raw.double_is_f); + result.put("eɪf", R.raw.double_ei_f); + result.put("ɛf", R.raw.double_e_f); + result.put("æf", R.raw.double_ae_f); + result.put("ɑf", R.raw.double_a_f); + result.put("ɔf", R.raw.double_c_f); + result.put("oʊf", R.raw.double_ou_f); + result.put("ʊf", R.raw.double_us_f); + result.put("uf", R.raw.double_u_f); + result.put("ʌf", R.raw.double_vu_f); + result.put("aɪf", R.raw.double_ai_f); + result.put("aʊf", R.raw.double_au_f); + result.put("ɔɪf", R.raw.double_oi_f); + result.put("ɝf", R.raw.double_ers_f); + result.put("ɑrf", R.raw.double_ar_f); + result.put("ɛrf", R.raw.double_er_f); + result.put("ɪrf", R.raw.double_ir_f); + result.put("ɔrf", R.raw.double_or_f); + result.put("iv", R.raw.double_i_v); + result.put("ɪv", R.raw.double_is_v); + result.put("eɪv", R.raw.double_ei_v); + result.put("ɛv", R.raw.double_e_v); + result.put("æv", R.raw.double_ae_v); + result.put("ɑv", R.raw.double_a_v); + result.put("ɔv", R.raw.double_c_v); + result.put("oʊv", R.raw.double_ou_v); + result.put("ʊv", R.raw.double_us_v); + result.put("uv", R.raw.double_u_v); + result.put("ʌv", R.raw.double_vu_v); + result.put("aɪv", R.raw.double_ai_v); + result.put("aʊv", R.raw.double_au_v); + result.put("ɔɪv", R.raw.double_oi_v); + result.put("ɝv", R.raw.double_ers_v); + result.put("ɑrv", R.raw.double_ar_v); + result.put("ɛrv", R.raw.double_er_v); + result.put("ɪrv", R.raw.double_ir_v); + result.put("ɔrv", R.raw.double_or_v); + result.put("iθ", R.raw.double_i_th); + result.put("ɪθ", R.raw.double_is_th); + result.put("eɪθ", R.raw.double_ei_th); + result.put("ɛθ", R.raw.double_e_th); + result.put("æθ", R.raw.double_ae_th); + result.put("ɑθ", R.raw.double_a_th); + result.put("ɔθ", R.raw.double_c_th); + result.put("oʊθ", R.raw.double_ou_th); + result.put("ʊθ", R.raw.double_us_th); + result.put("uθ", R.raw.double_u_th); + result.put("ʌθ", R.raw.double_vu_th); + result.put("aɪθ", R.raw.double_ai_th); + result.put("aʊθ", R.raw.double_au_th); + result.put("ɔɪθ", R.raw.double_oi_th); + result.put("ɝθ", R.raw.double_ers_th); + result.put("ɑrθ", R.raw.double_ar_th); + result.put("ɛrθ", R.raw.double_er_th); + result.put("ɪrθ", R.raw.double_ir_th); + result.put("ɔrθ", R.raw.double_or_th); + result.put("ið", R.raw.double_i_thv); + result.put("ɪð", R.raw.double_is_thv); + result.put("eɪð", R.raw.double_ei_thv); + result.put("ɛð", R.raw.double_e_thv); + result.put("æð", R.raw.double_ae_thv); + result.put("ɑð", R.raw.double_a_thv); + result.put("ɔð", R.raw.double_c_thv); + result.put("oʊð", R.raw.double_ou_thv); + result.put("ʊð", R.raw.double_us_thv); + result.put("uð", R.raw.double_u_thv); + result.put("ʌð", R.raw.double_vu_thv); + result.put("aɪð", R.raw.double_ai_thv); + result.put("aʊð", R.raw.double_au_thv); + result.put("ɔɪð", R.raw.double_oi_thv); + result.put("ɝð", R.raw.double_ers_thv); + result.put("ɑrð", R.raw.double_ar_thv); + result.put("ɛrð", R.raw.double_er_thv); + result.put("ɪrð", R.raw.double_ir_thv); + result.put("ɔrð", R.raw.double_or_thv); + result.put("is", R.raw.double_i_s); + result.put("ɪs", R.raw.double_is_s); + result.put("eɪs", R.raw.double_ei_s); + result.put("ɛs", R.raw.double_e_s); + result.put("æs", R.raw.double_ae_s); + result.put("ɑs", R.raw.double_a_s); + result.put("ɔs", R.raw.double_c_s); + result.put("oʊs", R.raw.double_ou_s); + result.put("ʊs", R.raw.double_us_s); + result.put("us", R.raw.double_u_s); + result.put("ʌs", R.raw.double_vu_s); + result.put("aɪs", R.raw.double_ai_s); + result.put("aʊs", R.raw.double_au_s); + result.put("ɔɪs", R.raw.double_oi_s); + result.put("ɝs", R.raw.double_ers_s); + result.put("ɑrs", R.raw.double_ar_s); + result.put("ɛrs", R.raw.double_er_s); + result.put("ɪrs", R.raw.double_ir_s); + result.put("ɔrs", R.raw.double_or_s); + result.put("iz", R.raw.double_i_z); + result.put("ɪz", R.raw.double_is_z); + result.put("eɪz", R.raw.double_ei_z); + result.put("ɛz", R.raw.double_e_z); + result.put("æz", R.raw.double_ae_z); + result.put("ɑz", R.raw.double_a_z); + result.put("ɔz", R.raw.double_c_z); + result.put("oʊz", R.raw.double_ou_z); + result.put("ʊz", R.raw.double_us_z); + result.put("uz", R.raw.double_u_z); + result.put("ʌz", R.raw.double_vu_z); + result.put("aɪz", R.raw.double_ai_z); + result.put("aʊz", R.raw.double_au_z); + result.put("ɔɪz", R.raw.double_oi_z); + result.put("ɝz", R.raw.double_ers_z); + result.put("ɑrz", R.raw.double_ar_z); + result.put("ɛrz", R.raw.double_er_z); + result.put("ɪrz", R.raw.double_ir_z); + result.put("ɔrz", R.raw.double_or_z); + result.put("iʃ", R.raw.double_i_sh); + result.put("ɪʃ", R.raw.double_is_sh); + result.put("eɪʃ", R.raw.double_ei_sh); + result.put("ɛʃ", R.raw.double_e_sh); + result.put("æʃ", R.raw.double_ae_sh); + result.put("ɑʃ", R.raw.double_a_sh); + result.put("ɔʃ", R.raw.double_c_sh); + result.put("oʊʃ", R.raw.double_ou_sh); + result.put("ʊʃ", R.raw.double_us_sh); + result.put("uʃ", R.raw.double_u_sh); + result.put("ʌʃ", R.raw.double_vu_sh); + result.put("aɪʃ", R.raw.double_ai_sh); + result.put("aʊʃ", R.raw.double_au_sh); + result.put("ɔɪʃ", R.raw.double_oi_sh); + result.put("ɝʃ", R.raw.double_ers_sh); + result.put("ɑrʃ", R.raw.double_ar_sh); + result.put("ɛrʃ", R.raw.double_er_sh); + result.put("ɪrʃ", R.raw.double_ir_sh); + result.put("ɔrʃ", R.raw.double_or_sh); + result.put("iʒ", R.raw.double_i_zh); + result.put("ɪʒ", R.raw.double_is_zh); + result.put("eɪʒ", R.raw.double_ei_zh); + result.put("ɛʒ", R.raw.double_e_zh); + result.put("æʒ", R.raw.double_ae_zh); + result.put("ɑʒ", R.raw.double_a_zh); + result.put("ɔʒ", R.raw.double_c_zh); + result.put("oʊʒ", R.raw.double_ou_zh); + result.put("ʊʒ", R.raw.double_us_zh); + result.put("uʒ", R.raw.double_u_zh); + result.put("ʌʒ", R.raw.double_vu_zh); + result.put("aɪʒ", R.raw.double_ai_zh); + result.put("aʊʒ", R.raw.double_au_zh); + result.put("ɔɪʒ", R.raw.double_oi_zh); + result.put("ɝʒ", R.raw.double_ers_zh); + result.put("ɑrʒ", R.raw.double_ar_zh); + result.put("ɛrʒ", R.raw.double_er_zh); + result.put("ɪrʒ", R.raw.double_ir_zh); + result.put("ɔrʒ", R.raw.double_or_zh); + result.put("im", R.raw.double_i_m); + result.put("ɪm", R.raw.double_is_m); + result.put("eɪm", R.raw.double_ei_m); + result.put("ɛm", R.raw.double_e_m); + result.put("æm", R.raw.double_ae_m); + result.put("ɑm", R.raw.double_a_m); + result.put("ɔm", R.raw.double_c_m); + result.put("oʊm", R.raw.double_ou_m); + result.put("ʊm", R.raw.double_us_m); + result.put("um", R.raw.double_u_m); + result.put("ʌm", R.raw.double_vu_m); + result.put("aɪm", R.raw.double_ai_m); + result.put("aʊm", R.raw.double_au_m); + result.put("ɔɪm", R.raw.double_oi_m); + result.put("ɝm", R.raw.double_ers_m); + result.put("ɑrm", R.raw.double_ar_m); + result.put("ɛrm", R.raw.double_er_m); + result.put("ɪrm", R.raw.double_ir_m); + result.put("ɔrm", R.raw.double_or_m); + result.put("in", R.raw.double_i_n); + result.put("ɪn", R.raw.double_is_n); + result.put("eɪn", R.raw.double_ei_n); + result.put("ɛn", R.raw.double_e_n); + result.put("æn", R.raw.double_ae_n); + result.put("ɑn", R.raw.double_a_n); + result.put("ɔn", R.raw.double_c_n); + result.put("oʊn", R.raw.double_ou_n); + result.put("ʊn", R.raw.double_us_n); + result.put("un", R.raw.double_u_n); + result.put("ʌn", R.raw.double_vu_n); + result.put("aɪn", R.raw.double_ai_n); + result.put("aʊn", R.raw.double_au_n); + result.put("ɔɪn", R.raw.double_oi_n); + result.put("ɝn", R.raw.double_ers_n); + result.put("ɑrn", R.raw.double_ar_n); + result.put("ɛrn", R.raw.double_er_n); + result.put("ɪrn", R.raw.double_ir_n); + result.put("ɔrn", R.raw.double_or_n); + result.put("iŋ", R.raw.double_i_ng); + result.put("ɪŋ", R.raw.double_is_ng); + result.put("eɪŋ", R.raw.double_ei_ng); + result.put("ɛŋ", R.raw.double_e_ng); + result.put("æŋ", R.raw.double_ae_ng); + result.put("ɑŋ", R.raw.double_a_ng); + result.put("ɔŋ", R.raw.double_c_ng); + result.put("oʊŋ", R.raw.double_ou_ng); + result.put("ʊŋ", R.raw.double_us_ng); + result.put("uŋ", R.raw.double_u_ng); + result.put("ʌŋ", R.raw.double_vu_ng); + result.put("aɪŋ", R.raw.double_ai_ng); + result.put("aʊŋ", R.raw.double_au_ng); + result.put("ɔɪŋ", R.raw.double_oi_ng); + result.put("ɝŋ", R.raw.double_ers_ng); + result.put("ɑrŋ", R.raw.double_ar_ng); + result.put("ɛrŋ", R.raw.double_er_ng); + result.put("ɪrŋ", R.raw.double_ir_ng); + result.put("ɔrŋ", R.raw.double_or_ng); + result.put("il", R.raw.double_i_l); + result.put("ɪl", R.raw.double_is_l); + result.put("eɪl", R.raw.double_ei_l); + result.put("ɛl", R.raw.double_e_l); + result.put("æl", R.raw.double_ae_l); + result.put("ɑl", R.raw.double_a_l); + result.put("ɔl", R.raw.double_c_l); + result.put("oʊl", R.raw.double_ou_l); + result.put("ʊl", R.raw.double_us_l); + result.put("ul", R.raw.double_u_l); + result.put("ʌl", R.raw.double_vu_l); + result.put("aɪl", R.raw.double_ai_l); + result.put("aʊl", R.raw.double_au_l); + result.put("ɔɪl", R.raw.double_oi_l); + result.put("ɝl", R.raw.double_ers_l); + result.put("ɑrl", R.raw.double_ar_l); + result.put("ɛrl", R.raw.double_er_l); + result.put("ɪrl", R.raw.double_ir_l); + result.put("ɔrl", R.raw.double_or_l); + + return result; } + // initialize the result when new object created + private static Map createSpecialSoundMap() { + + Map result = new LinkedHashMap<>(); + + result.put("iʔ", R.raw.double_i_glottal); + result.put("ɪʔ", R.raw.double_is_glottal); + result.put("eɪʔ", R.raw.double_ei_glottal); + result.put("ɛʔ", R.raw.double_e_glottal); + result.put("æʔ", R.raw.double_ae_glottal); + result.put("ɑʔ", R.raw.double_a_glottal); + result.put("ɔʔ", R.raw.double_c_glottal); + result.put("oʊʔ", R.raw.double_ou_glottal); + result.put("ʊʔ", R.raw.double_us_glottal); + result.put("uʔ", R.raw.double_u_glottal); + result.put("ʌʔ", R.raw.double_vu_glottal); + result.put("aɪʔ", R.raw.double_ai_glottal); + result.put("aʊʔ", R.raw.double_au_glottal); + result.put("ɔɪʔ", R.raw.double_oi_glottal); + result.put("ɝʔ", R.raw.double_ers_glottal); + result.put("ɑrʔ", R.raw.double_ar_glottal); + result.put("ɛrʔ", R.raw.double_er_glottal); + result.put("ɪrʔ", R.raw.double_ir_glottal); + result.put("ɔrʔ", R.raw.double_or_glottal); + result.put("ˈiɾə", R.raw.double_i_flap_shwua); + result.put("ˈɪɾə", R.raw.double_is_flap_shwua); + result.put("ˈeɪɾə", R.raw.double_ei_flap_shwua); + result.put("ˈɛɾə", R.raw.double_e_flap_shwua); + result.put("ˈæɾə", R.raw.double_ae_flap_shwua); + result.put("ˈɑɾə", R.raw.double_a_flap_shwua); + result.put("ˈɔɾə", R.raw.double_c_flap_shwua); + result.put("ˈoʊɾə", R.raw.double_ou_flap_shwua); + result.put("ˈʊɾə", R.raw.double_us_flap_shwua); + result.put("ˈuɾə", R.raw.double_u_flap_shwua); + result.put("ˈʌɾə", R.raw.double_vu_flap_shwua); + result.put("ˈaɪɾə", R.raw.double_ai_flap_shwua); + result.put("ˈaʊɾə", R.raw.double_au_flap_shwua); + result.put("ˈɔɪɾə", R.raw.double_oi_flap_shwua); + result.put("ˈɝɾə", R.raw.double_ers_flap_shwua); + result.put("ˈɑrɾə", R.raw.double_ar_flap_shwua); + result.put("ˈɛrɾə", R.raw.double_er_flap_shwua); + result.put("ˈɪrɾə", R.raw.double_ir_flap_shwua); + result.put("ˈɔrɾə", R.raw.double_or_flap_shwua); + result.put("pə", R.raw.double_p_shwua); + result.put("tə", R.raw.double_t_shwua); + result.put("kə", R.raw.double_k_shwua); + result.put("ʧə", R.raw.double_ch_shwua); + result.put("fə", R.raw.double_f_shwua); + result.put("θə", R.raw.double_th_shwua); + result.put("sə", R.raw.double_s_shwua); + result.put("ʃə", R.raw.double_sh_shwua); + result.put("bə", R.raw.double_b_shwua); + result.put("də", R.raw.double_d_shwua); + result.put("gə", R.raw.double_g_shwua); + result.put("ʤə", R.raw.double_dzh_shwua); + result.put("və", R.raw.double_v_shwua); + result.put("ðə", R.raw.double_thv_shwua); + result.put("zə", R.raw.double_z_shwua); + result.put("ʒə", R.raw.double_zh_shwua); + result.put("mə", R.raw.double_m_shwua); + result.put("nə", R.raw.double_n_shwua); + result.put("lə", R.raw.double_l_shwua); + result.put("wə", R.raw.double_w_shwua); + result.put("jə", R.raw.double_j_shwua); + result.put("hə", R.raw.double_h_shwua); + result.put("rə", R.raw.double_r_shwua); + result.put("əp", R.raw.double_shwua_p); + result.put("ət", R.raw.double_shwua_t); + result.put("ək", R.raw.double_shwua_k); + result.put("əʧ", R.raw.double_shwua_ch); + result.put("əf", R.raw.double_shwua_f); + result.put("əθ", R.raw.double_shwua_th); + result.put("əs", R.raw.double_shwua_s); + result.put("əʃ", R.raw.double_shwua_sh); + result.put("əb", R.raw.double_shwua_b); + result.put("əd", R.raw.double_shwua_d); + result.put("əg", R.raw.double_shwua_g); + result.put("əʤ", R.raw.double_shwua_dzh); + result.put("əv", R.raw.double_shwua_v); + result.put("əð", R.raw.double_shwua_thv); + result.put("əz", R.raw.double_shwua_z); + result.put("əʒ", R.raw.double_shwua_zh); + result.put("əm", R.raw.double_shwua_m); + result.put("ən", R.raw.double_shwua_n); + result.put("əŋ", R.raw.double_shwua_ng); + result.put("əl", R.raw.double_shwua_l); + result.put("pɚ", R.raw.double_p_eru); + result.put("tɚ", R.raw.double_t_eru); + result.put("kɚ", R.raw.double_k_eru); + result.put("ʧɚ", R.raw.double_ch_eru); + result.put("fɚ", R.raw.double_f_eru); + result.put("θɚ", R.raw.double_th_eru); + result.put("sɚ", R.raw.double_s_eru); + result.put("ʃɚ", R.raw.double_sh_eru); + result.put("bɚ", R.raw.double_b_eru); + result.put("dɚ", R.raw.double_d_eru); + result.put("gɚ", R.raw.double_g_eru); + result.put("ʤɚ", R.raw.double_dzh_eru); + result.put("vɚ", R.raw.double_v_eru); + result.put("ðɚ", R.raw.double_thv_eru); + result.put("zɚ", R.raw.double_z_eru); + result.put("ʒɚ", R.raw.double_zh_eru); + result.put("mɚ", R.raw.double_m_eru); + result.put("nɚ", R.raw.double_n_eru); + result.put("lɚ", R.raw.double_l_eru); + result.put("wɚ", R.raw.double_w_eru); + result.put("jɚ", R.raw.double_j_eru); + result.put("hɚ", R.raw.double_h_eru); + result.put("rɚ", R.raw.double_r_eru); + result.put("ɚp", R.raw.double_eru_p); + result.put("ɚt", R.raw.double_eru_t); + result.put("ɚk", R.raw.double_eru_k); + result.put("ɚʧ", R.raw.double_eru_ch); + result.put("ɚf", R.raw.double_eru_f); + result.put("ɚθ", R.raw.double_eru_th); + result.put("ɚs", R.raw.double_eru_s); + result.put("ɚʃ", R.raw.double_eru_sh); + result.put("ɚb", R.raw.double_eru_b); + result.put("ɚd", R.raw.double_eru_d); + result.put("ɚg", R.raw.double_eru_g); + result.put("ɚʤ", R.raw.double_eru_dzh); + result.put("ɚv", R.raw.double_eru_v); + result.put("ɚð", R.raw.double_eru_thv); + result.put("ɚz", R.raw.double_eru_z); + result.put("ɚʒ", R.raw.double_eru_zh); + result.put("ɚm", R.raw.double_eru_m); + result.put("ɚn", R.raw.double_eru_n); + result.put("ɚŋ", R.raw.double_eru_ng); + result.put("ɚl", R.raw.double_eru_l); + + return result; + } } \ No newline at end of file diff --git a/app/src/main/java/com/aepronunciation/ipa/GridSpacingItemDecoration.java b/app/src/main/java/com/aepronunciation/ipa/GridSpacingItemDecoration.java old mode 100644 new mode 100755 index da3e659..dee4477 --- a/app/src/main/java/com/aepronunciation/ipa/GridSpacingItemDecoration.java +++ b/app/src/main/java/com/aepronunciation/ipa/GridSpacingItemDecoration.java @@ -2,9 +2,9 @@ import android.content.Context; import android.graphics.Rect; -import android.support.annotation.DimenRes; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.DimenRes; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { @@ -20,8 +20,8 @@ private GridSpacingItemDecoration(int itemOffset) { } @Override - public void getItemOffsets(Rect outRect, View view, RecyclerView parent, - RecyclerView.State state) { + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, + @NonNull RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); outRect.set(mItemOffset, mItemOffset, mItemOffset, mItemOffset); } diff --git a/app/src/main/java/com/aepronunciation/ipa/HistoryActivity.java b/app/src/main/java/com/aepronunciation/ipa/HistoryActivity.java old mode 100644 new mode 100755 index d1c1efc..1b7e226 --- a/app/src/main/java/com/aepronunciation/ipa/HistoryActivity.java +++ b/app/src/main/java/com/aepronunciation/ipa/HistoryActivity.java @@ -5,12 +5,14 @@ import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import android.view.MenuItem; import android.view.View; import android.widget.TextView; +import java.lang.ref.WeakReference; + import static com.aepronunciation.ipa.MainActivity.PREFS_NAME; import static com.aepronunciation.ipa.MainActivity.TIME_DEFAULT; import static com.aepronunciation.ipa.MainActivity.TIME_LEARN_DOUBLE_KEY; @@ -30,7 +32,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_history); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // add back arrow to toolbar if (getSupportActionBar() != null){ @@ -39,9 +41,9 @@ protected void onCreate(Bundle savedInstanceState) { } // Create objects - TextView tvTime = (TextView) findViewById(R.id.tvTotalTime); - tvHighSingle = (TextView) findViewById(R.id.tvHighScoreSingles); - tvHighDouble = (TextView) findViewById(R.id.tvHighScoreDoubles); + TextView tvTime = findViewById(R.id.tvTotalTime); + tvHighSingle = findViewById(R.id.tvHighScoreSingles); + tvHighDouble = findViewById(R.id.tvHighScoreDoubles); // get times from preferences SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); @@ -58,7 +60,7 @@ protected void onCreate(Bundle savedInstanceState) { tvTime.setText(TimeUtil.getTimeString(totalTime)); // Get the high scores - new GetHighScores().execute(); + new GetHighScores(this).execute(); } public void timeDetailsClick(View v) { @@ -84,17 +86,23 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } - private class GetHighScores extends AsyncTask { + private static class GetHighScores extends AsyncTask { + + private WeakReference activityReference; + + // only retain a weak reference to the activity + GetHighScores(HistoryActivity context) { + activityReference = new WeakReference<>(context); + } @Override protected int[] doInBackground(Void... params) { int[] result = { -1, -1 }; + HistoryActivity activity = activityReference.get(); try { - - MyDatabaseAdapter dbAdapter = new MyDatabaseAdapter( - getApplicationContext()); + MyDatabaseAdapter dbAdapter = new MyDatabaseAdapter(activity); result = dbAdapter.getHighScores(); } catch (Exception e) { //Log.i("app", e.toString()); @@ -104,17 +112,19 @@ protected int[] doInBackground(Void... params) { @Override protected void onPostExecute(int[] result) { + HistoryActivity activity = activityReference.get(); + if (activity == null || activity.isFinishing()) return; if (result[0] == -1) { - tvHighSingle.setVisibility(View.GONE); + activity.tvHighSingle.setVisibility(View.GONE); } else { - tvHighSingle.setText(String.format(getString(R.string.history_tests_type_single), result[0])); + activity.tvHighSingle.setText(String.format(activity.getString(R.string.history_tests_type_single), result[0])); } if (result[1] == -1) { - tvHighDouble.setVisibility(View.GONE); + activity.tvHighDouble.setVisibility(View.GONE); } else { - tvHighDouble.setText(String.format(getString(R.string.history_tests_type_double), result[1])); + activity.tvHighDouble.setText(String.format(activity.getString(R.string.history_tests_type_double), result[1])); } } diff --git a/app/src/main/java/com/aepronunciation/ipa/HistoryTestDetailsActivity.java b/app/src/main/java/com/aepronunciation/ipa/HistoryTestDetailsActivity.java old mode 100644 new mode 100755 index 08daa6e..295a3c1 --- a/app/src/main/java/com/aepronunciation/ipa/HistoryTestDetailsActivity.java +++ b/app/src/main/java/com/aepronunciation/ipa/HistoryTestDetailsActivity.java @@ -6,15 +6,16 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.appcompat.widget.Toolbar; import android.view.MenuItem; import android.view.View; import android.widget.TextView; +import java.lang.ref.WeakReference; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -24,9 +25,6 @@ public class HistoryTestDetailsActivity extends AppCompatActivity implements TestResultsRecyclerViewAdapter.ItemClickListener, SoundPool.OnLoadCompleteListener { - static final String STATE_SCROLL_POSITION = "scrollPosition"; - - int savedPosition = 0; private TestResultsRecyclerViewAdapter adapter; private static final int SRC_QUALITY = 0; private static final int PRIORITY = 1; @@ -46,7 +44,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_history_test_details); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // add back arrow to toolbar if (getSupportActionBar() != null){ @@ -55,11 +53,11 @@ protected void onCreate(Bundle savedInstanceState) { } // create objects - tvName = (TextView) findViewById(R.id.tvResultName); - tvDate = (TextView) findViewById(R.id.tvResultDate); - tvPercent = (TextView) findViewById(R.id.tvResultPercent); - tvNumberOfQuestions = (TextView) findViewById(R.id.tvResultNumberQuestions); - tvTime = (TextView) findViewById(R.id.tvResultTime); + tvName = findViewById(R.id.tvResultName); + tvDate = findViewById(R.id.tvResultDate); + tvPercent = findViewById(R.id.tvResultPercent); + tvNumberOfQuestions = findViewById(R.id.tvResultNumberQuestions); + tvTime = findViewById(R.id.tvResultTime); // Get extras from Test Activity Bundle bundle = getIntent().getExtras(); @@ -102,7 +100,7 @@ public void onItemClick(View view, int position) { playSound(correctIpa); if (!correctIpa.equals(userIpa)) { int delay = 1000; - if (PhonemeTable.INSTANCE.hasTwoPronunciations(correctIpa)) { + if (Ipa.hasTwoPronunciations(correctIpa)) { delay = 2000; // these sounds need a longer delay } // delay playing second sound @@ -116,12 +114,13 @@ public void run() { } // call: new GetTest().execute(); - private class GetTest extends AsyncTask { + private static class GetTest extends AsyncTask { - private HistoryTestDetailsActivity activity; + private WeakReference activityReference; - public GetTest(HistoryTestDetailsActivity activity) { - this.activity = activity; + // only retain a weak reference to the activity + GetTest(HistoryTestDetailsActivity context) { + activityReference = new WeakReference<>(context); } @Override @@ -132,9 +131,8 @@ protected Test doInBackground(Long... params) { Test test = new Test(); try { - - MyDatabaseAdapter dbAdapter = new MyDatabaseAdapter( - getApplicationContext()); + HistoryTestDetailsActivity activity = activityReference.get(); + MyDatabaseAdapter dbAdapter = new MyDatabaseAdapter(activity); test = dbAdapter.getTest(id); } catch (Exception e) { e.printStackTrace(); @@ -145,23 +143,20 @@ protected Test doInBackground(Long... params) { @Override protected void onPostExecute(Test test) { - - + HistoryTestDetailsActivity activity = activityReference.get(); + if (activity == null || activity.isFinishing()) return; // Get answers from test String userName = test.getUserName(); long dateMilliseconds = test.getDate(); - Locale locale = Locale.US; // default - if (getString(R.string.locale).equals(Locale.CHINESE.toString())) { - locale = Locale.CHINESE; - } + Locale locale = AppLocale.getLocale(activity); Date date = new Date(dateMilliseconds); DateFormat df = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.SHORT, locale); String formattedDate = df.format(date); long timeLength = test.getTimeLength(); - testMode = test.getMode(); + activity.testMode = test.getMode(); int score = test.getScore(); String[] correctAnswers = test.getCorrectAnswers().split(","); String[] userAnswers = test.getUserAnswers().split(","); @@ -175,7 +170,7 @@ protected void onPostExecute(Test test) { } // make answer array object to update recyclerview list - ArrayList answers = new ArrayList(); + ArrayList answers = new ArrayList<>(); for (int i = 0; i < length; i++) { Answer answer = new Answer(); answer.setCorrectAnswer(correctAnswers[i]); @@ -183,20 +178,19 @@ protected void onPostExecute(Test test) { answers.add(answer); } - - RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvTestResults); + RecyclerView recyclerView = activity.findViewById(R.id.rvTestResults); recyclerView.setLayoutManager(new LinearLayoutManager(activity)); recyclerView.addItemDecoration(new DividerItemDecoration(activity, R.drawable.divider)); - adapter = new TestResultsRecyclerViewAdapter(activity, answers, testMode); - adapter.setClickListener(activity); - recyclerView.setAdapter(adapter); - -// // update textviews - tvName.setText(userName); - tvDate.setText(formattedDate); - tvPercent.setText(String.format(getString(R.string.test_results_percent), score)); - tvNumberOfQuestions.setText(String.format(getString(R.string.history_test_details_specific_test_number_of_questions), length)); - tvTime.setText(String.format(getString(R.string.test_results_time), TimeUtil.getTimeString(timeLength))); + activity.adapter = new TestResultsRecyclerViewAdapter(activity, answers, activity.testMode); + activity.adapter.setClickListener(activity); + recyclerView.setAdapter(activity.adapter); + + // update textviews + activity.tvName.setText(userName); + activity.tvDate.setText(formattedDate); + activity.tvPercent.setText(String.format(activity.getString(R.string.test_results_percent), score)); + activity.tvNumberOfQuestions.setText(String.format(activity.getString(R.string.history_test_details_specific_test_number_of_questions), length)); + activity.tvTime.setText(String.format(activity.getString(R.string.test_results_time), TimeUtil.getTimeString(timeLength))); } diff --git a/app/src/main/java/com/aepronunciation/ipa/HistoryTestsActivity.java b/app/src/main/java/com/aepronunciation/ipa/HistoryTestsActivity.java old mode 100644 new mode 100755 index 095bfd7..ec1fe9f --- a/app/src/main/java/com/aepronunciation/ipa/HistoryTestsActivity.java +++ b/app/src/main/java/com/aepronunciation/ipa/HistoryTestsActivity.java @@ -1,14 +1,15 @@ package com.aepronunciation.ipa; +import java.lang.ref.WeakReference; import java.util.ArrayList; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.appcompat.widget.Toolbar; import android.view.MenuItem; import android.view.View; @@ -23,7 +24,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_history_test); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // add back arrow to toolbar if (getSupportActionBar() != null){ @@ -32,7 +33,7 @@ protected void onCreate(Bundle savedInstanceState) { } // set up the RecyclerView - RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvAllTests); + RecyclerView recyclerView = findViewById(R.id.rvAllTests); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new DividerItemDecoration(this, R.drawable.divider)); mData = new ArrayList<>(); @@ -41,18 +42,26 @@ protected void onCreate(Bundle savedInstanceState) { recyclerView.setAdapter(adapter); // get tests - new InitializeTestList().execute(); + new InitializeTestList(this).execute(); } - private class InitializeTestList extends AsyncTask> { + private static class InitializeTestList extends AsyncTask> { + + private WeakReference activityReference; + + // only retain a weak reference to the activity + InitializeTestList(HistoryTestsActivity context) { + activityReference = new WeakReference<>(context); + } @Override protected ArrayList doInBackground(Void... params) { ArrayList result = new ArrayList<>(); + HistoryTestsActivity activity = activityReference.get(); try { - MyDatabaseAdapter dbAdapter = new MyDatabaseAdapter(getApplicationContext()); + MyDatabaseAdapter dbAdapter = new MyDatabaseAdapter(activity); result = dbAdapter.getAllTestScores(); } catch (Exception e) { e.printStackTrace(); @@ -63,10 +72,12 @@ protected ArrayList doInBackground(Void... params) { @Override protected void onPostExecute(ArrayList result) { + HistoryTestsActivity activity = activityReference.get(); + if (activity == null || activity.isFinishing()) return; - mData.clear(); - mData.addAll(result); - adapter.notifyDataSetChanged(); + activity.mData.clear(); + activity.mData.addAll(result); + activity.adapter.notifyDataSetChanged(); } } diff --git a/app/src/main/java/com/aepronunciation/ipa/HistoryTimeActivity.java b/app/src/main/java/com/aepronunciation/ipa/HistoryTimeActivity.java old mode 100644 new mode 100755 index fdebfb9..63e3422 --- a/app/src/main/java/com/aepronunciation/ipa/HistoryTimeActivity.java +++ b/app/src/main/java/com/aepronunciation/ipa/HistoryTimeActivity.java @@ -2,8 +2,8 @@ import android.content.SharedPreferences; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import android.widget.TextView; import static com.aepronunciation.ipa.MainActivity.PREFS_NAME; @@ -23,7 +23,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_history_time); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // add back arrow to toolbar if (getSupportActionBar() != null){ @@ -32,16 +32,16 @@ protected void onCreate(Bundle savedInstanceState) { } // Create objects - TextView tvTimeLearning = (TextView) findViewById(R.id.tvTimeLearning); - TextView tvTimeLearningSingles = (TextView) findViewById(R.id.tvTimeLearningSingles); - TextView tvTimeLearningDoubles = (TextView) findViewById(R.id.tvTimeLearningDoubles); - TextView tvTimePracticing = (TextView) findViewById(R.id.tvTimePracticing); - TextView tvTimePracticingSingles = (TextView) findViewById(R.id.tvTimePracticingSingles); - TextView tvTimePracticingDoubles = (TextView) findViewById(R.id.tvTimePracticingDoubles); - TextView tvTimeTesting = (TextView) findViewById(R.id.tvTimeTesting); - TextView tvTimeTestingSingles = (TextView) findViewById(R.id.tvTimeTestingSingles); - TextView tvTimeTestingDoubles = (TextView) findViewById(R.id.tvTimeTestingDoubles); - TextView tvTotalTime = (TextView) findViewById(R.id.tvTotalTime); + TextView tvTimeLearning = findViewById(R.id.tvTimeLearning); + TextView tvTimeLearningSingles = findViewById(R.id.tvTimeLearningSingles); + TextView tvTimeLearningDoubles = findViewById(R.id.tvTimeLearningDoubles); + TextView tvTimePracticing = findViewById(R.id.tvTimePracticing); + TextView tvTimePracticingSingles = findViewById(R.id.tvTimePracticingSingles); + TextView tvTimePracticingDoubles = findViewById(R.id.tvTimePracticingDoubles); + TextView tvTimeTesting = findViewById(R.id.tvTimeTesting); + TextView tvTimeTestingSingles = findViewById(R.id.tvTimeTestingSingles); + TextView tvTimeTestingDoubles = findViewById(R.id.tvTimeTestingDoubles); + TextView tvTotalTime = findViewById(R.id.tvTotalTime); // get times from preferences SharedPreferences settings = getSharedPreferences(PREFS_NAME, diff --git a/app/src/main/java/com/aepronunciation/ipa/Ipa.java b/app/src/main/java/com/aepronunciation/ipa/Ipa.java new file mode 100755 index 0000000..ac4efae --- /dev/null +++ b/app/src/main/java/com/aepronunciation/ipa/Ipa.java @@ -0,0 +1,163 @@ +package com.aepronunciation.ipa; + + +import android.util.Pair; + +import java.util.ArrayList; + +class Ipa { + + static final int NUMBER_OF_VOWELS = 21; + static final int NUMBER_OF_VOWELS_FOR_DOUBLES = 19; // not ə, ɚ + static final int NUMBER_OF_CONSONANTS = 26; + static final int NUMBER_OF_CONSONANTS_FOR_DOUBLES = 24; // not ʔ. ɾ + + // return + static Pair splitDoubleSound(String s) { + if (isConsonant(s.substring(0, 1))) { + return Pair.create(s.substring(0, 1), s.substring(1)); + } + return Pair.create(s.substring(s.length() - 1), s.substring(0, s.length() - 1)); + } + + static boolean isConsonant(String ipa) { + return "ptkʧfθsʃbdgʤvðzʒmnŋlwjhrʔɾ".contains(ipa); + } + + static boolean isSpecial(String ipa) { + return "ʔɾəɚ".contains(ipa); + } + + static boolean hasTwoPronunciations(String ipa) { + return "fvθðmnl".contains(ipa); + } + + static ArrayList getAllVowels() { + ArrayList vowels = new ArrayList<>(); + vowels.add(i); + vowels.add(i_short); + vowels.add(e_short); + vowels.add(ae); + vowels.add(a); + vowels.add(c_backwards); + vowels.add(u_short); + vowels.add(u); + vowels.add(v_upsidedown); + vowels.add(schwa); + vowels.add(ei); + vowels.add(ai); + vowels.add(au); + vowels.add(oi); + vowels.add(ou); + vowels.add(er_stressed); + vowels.add(er_unstressed); + vowels.add(ar); + vowels.add(er); + vowels.add(ir); + vowels.add(or); + return vowels; + } + + + static ArrayList getAllConsonants() { + ArrayList consonants = new ArrayList<>(); + consonants.add(p); + consonants.add(t); + consonants.add(k); + consonants.add(ch); + consonants.add(f); + consonants.add(th_voiceless); + consonants.add(s); + consonants.add(sh); + consonants.add(b); + consonants.add(d); + consonants.add(g); + consonants.add(dzh); + consonants.add(v); + consonants.add(th_voiced); + consonants.add(z); + consonants.add(zh); + consonants.add(m); + consonants.add(n); + consonants.add(ng); + consonants.add(l); + consonants.add(w); + consonants.add(j); + consonants.add(h); + consonants.add(r); + consonants.add(glottal_stop); + consonants.add(flap_t); + + return consonants; + } + static final String p = "p"; + static final String t = "t"; + static final String k = "k"; + static final String ch = "ʧ"; + static final String f = "f"; + static final String th_voiceless = "θ"; + static final String s = "s"; + static final String sh = "ʃ"; + static final String b = "b"; + static final String d = "d"; + static final String g = "g"; + static final String dzh = "ʤ"; + static final String v = "v"; + static final String th_voiced = "ð"; + static final String z = "z"; + static final String zh = "ʒ"; + static final String m = "m"; + static final String n = "n"; + static final String ng = "ŋ"; + static final String l = "l"; + static final String w = "w"; + static final String j = "j"; + static final String h = "h"; + static final String r = "r"; + static final String i = "i"; + static final String i_short = "ɪ"; + static final String e_short = "ɛ"; + static final String ae = "æ"; + static final String a = "ɑ"; + static final String c_backwards = "ɔ"; + static final String u_short = "ʊ"; + static final String u = "u"; + static final String v_upsidedown = "ʌ"; + static final String schwa = "ə"; + static final String ei = "eɪ"; + static final String ai = "aɪ"; + static final String au = "aʊ"; + static final String oi = "ɔɪ"; + static final String ou = "oʊ"; + static final String flap_t = "ɾ"; + static final String er_stressed = "ɝ"; + static final String er_unstressed = "ɚ"; + static final String ar = "ɑr"; + static final String er = "ɛr"; + static final String ir = "ɪr"; + static final String or = "ɔr"; + static final String glottal_stop = "ʔ"; + static final String left_bracket = "["; + static final String right_bracket = "]"; + static final String slash = "/"; + static final String undertie = "‿"; + //static final String space = "\u0020"; + static final String primary_stress = "ˈ"; + static final String secondary_stress = "ˌ"; + static final String long_vowel = "ː"; + //static final String return = "\n"; + static final String alt_e_short = "e"; + static final String alt_c_backwards = "ɒ"; + static final String alt_ou = "əʊ"; + static final String alt_er_stressed = "ɜː"; + static final String alt_er_unstressed = "ə"; + static final String alt_ar = "ɑː"; + static final String alt_er = "eə"; + static final String alt_ir = "ɪə"; + static final String alt_or = "ɔː"; + static final String alt_l = "ɫ"; + static final String alt_w = "ʍ"; + static final String alt_h = "ʰ"; + + static final String alt_r = "ɹ"; +} diff --git a/app/src/main/java/com/aepronunciation/ipa/IpaCheckBox.java b/app/src/main/java/com/aepronunciation/ipa/IpaCheckBox.java old mode 100644 new mode 100755 index dd26334..f3042d5 --- a/app/src/main/java/com/aepronunciation/ipa/IpaCheckBox.java +++ b/app/src/main/java/com/aepronunciation/ipa/IpaCheckBox.java @@ -3,9 +3,9 @@ import android.content.Context; import android.graphics.Typeface; import android.util.AttributeSet; -import android.widget.CheckBox; +import androidx.appcompat.widget.AppCompatCheckBox; -public class IpaCheckBox extends CheckBox { +public class IpaCheckBox extends AppCompatCheckBox { // Constructors public IpaCheckBox(Context context, AttributeSet attrs, int defStyle) { diff --git a/app/src/main/java/com/aepronunciation/ipa/IpaEditText.java b/app/src/main/java/com/aepronunciation/ipa/IpaEditText.java old mode 100644 new mode 100755 index b8e3265..ded13d9 --- a/app/src/main/java/com/aepronunciation/ipa/IpaEditText.java +++ b/app/src/main/java/com/aepronunciation/ipa/IpaEditText.java @@ -2,11 +2,11 @@ import android.content.Context; import android.graphics.Typeface; +import androidx.appcompat.widget.AppCompatEditText; import android.util.AttributeSet; -import android.widget.EditText; -public class IpaEditText extends EditText { +public class IpaEditText extends AppCompatEditText { // Constructors public IpaEditText(Context context, AttributeSet attrs, int defStyle) { diff --git a/app/src/main/java/com/aepronunciation/ipa/IpaTextView.java b/app/src/main/java/com/aepronunciation/ipa/IpaTextView.java old mode 100644 new mode 100755 index d4d31fe..ee9a527 --- a/app/src/main/java/com/aepronunciation/ipa/IpaTextView.java +++ b/app/src/main/java/com/aepronunciation/ipa/IpaTextView.java @@ -2,10 +2,10 @@ import android.content.Context; import android.graphics.Typeface; +import androidx.appcompat.widget.AppCompatTextView; import android.util.AttributeSet; -import android.widget.TextView; -public class IpaTextView extends TextView { +public class IpaTextView extends AppCompatTextView { // Constructors public IpaTextView(Context context, AttributeSet attrs, int defStyle) { diff --git a/app/src/main/java/com/aepronunciation/ipa/KeyboardFragment.java b/app/src/main/java/com/aepronunciation/ipa/KeyboardFragment.java old mode 100644 new mode 100755 index 0c00d88..e5272c1 --- a/app/src/main/java/com/aepronunciation/ipa/KeyboardFragment.java +++ b/app/src/main/java/com/aepronunciation/ipa/KeyboardFragment.java @@ -2,8 +2,9 @@ import android.content.Context; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.core.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -37,7 +38,7 @@ public void onCreate(Bundle savedInstanceState) { } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_keyboard, container, false); @@ -49,7 +50,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, // Add listeners for all keys for (int id : mLayoutToString.keySet()) { - RelativeLayout rlKey = (RelativeLayout) view.findViewById(id); + RelativeLayout rlKey = view.findViewById(id); rlKey.setOnClickListener(this); } @@ -199,6 +200,8 @@ public void updateKeysFor(SoundMode mode) { } public void updateKeyAppearanceForSelectedSounds(ArrayList selectedSounds) { + Context context = getContext(); + if (context == null) return; int selectedColor = ContextCompat.getColor(getContext(),R.color.keyboard_text_normal); int unselectedColor = ContextCompat.getColor(getContext(),R.color.keyboard_text_unselected); @@ -215,7 +218,7 @@ public void updateKeyAppearanceForSelectedSounds(ArrayList selectedSound break; } } - textView = (IpaTextView) view.findViewById(id); + textView = view.findViewById(id); if (isSelected) { textView.setTextColor(selectedColor); } else { diff --git a/app/src/main/java/com/aepronunciation/ipa/KeyboardInputActivity.java b/app/src/main/java/com/aepronunciation/ipa/KeyboardInputActivity.java old mode 100644 new mode 100755 index 07da2e0..1bc3d9d --- a/app/src/main/java/com/aepronunciation/ipa/KeyboardInputActivity.java +++ b/app/src/main/java/com/aepronunciation/ipa/KeyboardInputActivity.java @@ -1,17 +1,17 @@ package com.aepronunciation.ipa; - -import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.os.Build; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import android.text.Editable; import android.text.InputType; import android.text.TextUtils; import android.view.KeyEvent; @@ -32,27 +32,25 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_keyboard_input); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // add back arrow to toolbar - if (getSupportActionBar() != null){ + if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); } // disable rotation for smaller devices - if(getResources().getBoolean(R.bool.portrait_only)){ + if (getResources().getBoolean(R.bool.portrait_only)) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } // prevent system keyboard from appearing - editText = (IpaEditText) findViewById(R.id.etInputWindow); - if (android.os.Build.VERSION.SDK_INT >= 11) { - editText.setRawInputType(InputType.TYPE_CLASS_TEXT); - editText.setTextIsSelectable(true); - } else { - editText.setRawInputType(InputType.TYPE_NULL); - editText.setFocusable(true); + editText = findViewById(R.id.etInputWindow); + editText.setRawInputType(InputType.TYPE_CLASS_TEXT); + editText.setTextIsSelectable(true); + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + editText.setShowSoftInputOnFocus(false); } // load keyboard fragment @@ -62,8 +60,6 @@ protected void onCreate(Bundle savedInstanceState) { transaction.commit(); } - @SuppressLint("NewApi") - @SuppressWarnings("deprecation") private void copyText() { CharSequence text = editText.getText(); @@ -71,22 +67,19 @@ private void copyText() { return; } - int sdk = android.os.Build.VERSION.SDK_INT; - if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) { - android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - clipboard.setText(text); - } else { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("IPA text", text); - clipboard.setPrimaryClip(clip); - } + + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + android.content.ClipData clip = android.content.ClipData.newPlainText("IPA text", text); + clipboard.setPrimaryClip(clip); Toast.makeText(this, getString(R.string.keyboard_input_toast_text_copied), Toast.LENGTH_SHORT).show(); } private void clearText() { - if (editText.getText().length() < CONFIRM_DELETE_TEXT_LENGTH) { + Editable text = editText.getText(); + if (text == null) return; + if (text.length() < CONFIRM_DELETE_TEXT_LENGTH) { editText.setText(""); return; } @@ -116,14 +109,14 @@ public void onClick(DialogInterface dialog, int id) { private void shareText() { - CharSequence text = editText.getText().toString(); - if (TextUtils.isEmpty(text)) { + CharSequence text = editText.getText(); + if (text == null) { return; } Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); - sendIntent.putExtra(Intent.EXTRA_TEXT, text); + sendIntent.putExtra(Intent.EXTRA_TEXT, text.toString()); sendIntent.setType("text/plain"); startActivity(Intent.createChooser(sendIntent, getString(R.string.keyboard_menu_share_chooser_title))); } @@ -157,10 +150,13 @@ public boolean onOptionsItemSelected(MenuItem item) { @Override public void onKeyTouched(String keyString) { + Editable text = editText.getText(); + if (text == null) return; int start = Math.max(editText.getSelectionStart(), 0); int end = Math.max(editText.getSelectionEnd(), 0); - editText.getText().replace(Math.min(start, end), Math.max(start, end), + text.replace(Math.min(start, end), Math.max(start, end), keyString, 0, keyString.length()); + editText.setSelection(editText.getSelectionEnd()); } @Override diff --git a/app/src/main/java/com/aepronunciation/ipa/KeyboardInputFragment.java b/app/src/main/java/com/aepronunciation/ipa/KeyboardInputFragment.java old mode 100644 new mode 100755 index 9b40c58..9b57739 --- a/app/src/main/java/com/aepronunciation/ipa/KeyboardInputFragment.java +++ b/app/src/main/java/com/aepronunciation/ipa/KeyboardInputFragment.java @@ -2,7 +2,8 @@ import android.content.Context; import android.os.Bundle; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -34,23 +35,23 @@ public void onCreate(Bundle savedInstanceState) { } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_keyboard_input, container, false); // Add listeners for all keys for (int id : mClickMap.keySet()) { - RelativeLayout rlKey = (RelativeLayout) view.findViewById(id); + RelativeLayout rlKey = view.findViewById(id); rlKey.setOnClickListener(this); } for (int id : mLongClickMap.keySet()) { - RelativeLayout rlKey = (RelativeLayout) view.findViewById(id); + RelativeLayout rlKey = view.findViewById(id); rlKey.setOnLongClickListener(this); } - RelativeLayout rlBackspace = (RelativeLayout) view.findViewById(R.id.key_backspace); + RelativeLayout rlBackspace = view.findViewById(R.id.key_backspace); rlBackspace.setOnClickListener(backspaceClick); return view; diff --git a/app/src/main/java/com/aepronunciation/ipa/LearnDoubleDialogFragment.java b/app/src/main/java/com/aepronunciation/ipa/LearnDoubleDialogFragment.java old mode 100644 new mode 100755 index 5ad0b29..eb33fea --- a/app/src/main/java/com/aepronunciation/ipa/LearnDoubleDialogFragment.java +++ b/app/src/main/java/com/aepronunciation/ipa/LearnDoubleDialogFragment.java @@ -5,23 +5,21 @@ import android.media.AudioManager; import android.media.SoundPool; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.appcompat.app.AlertDialog; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; - public class LearnDoubleDialogFragment extends DialogFragment implements LearnDoubleRecyclerViewAdapter.ItemClickListener, SoundPool.OnLoadCompleteListener { private DoubleSound doubleSound; LearnDoubleRecyclerViewAdapter adapter; - private SpecialSound specialSound; String ipa; private static final int SRC_QUALITY = 0; @@ -41,19 +39,10 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { doubleSound = new DoubleSound(); doubleSound.restrictListToAllPairsContaining(ipa); - - if (PhonemeTable.INSTANCE.isSpecial(ipa)) { - specialSound = new SpecialSound(); - specialSound.loadSoundsFor(ipa); - adapter = new LearnDoubleRecyclerViewAdapter(getActivity(), specialSound.getSounds()); - } else { - doubleSound = new DoubleSound(); - doubleSound.restrictListToAllPairsContaining(ipa); - adapter = new LearnDoubleRecyclerViewAdapter(getActivity(), doubleSound.getSounds()); - } + adapter = new LearnDoubleRecyclerViewAdapter(getActivity(), doubleSound.getSounds()); // set up the RecyclerView - RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rvLearnDouble); + RecyclerView recyclerView = view.findViewById(R.id.rvLearnDouble); int numberOfColumns = 6; recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), numberOfColumns)); GridSpacingItemDecoration itemDecoration = new GridSpacingItemDecoration(getActivity(), R.dimen.grid_item_spacing); @@ -118,12 +107,7 @@ public void onItemClick(View view, int position) { String clickedIpaString = adapter.getItem(position); // use the string to look up the audio resource id - int soundId; - if (PhonemeTable.INSTANCE.isSpecial(ipa)) { - soundId = specialSound.getSoundResourceId(clickedIpaString); - } else { - soundId = doubleSound.getSoundResourceId(clickedIpaString); - } + int soundId = doubleSound.getSoundResourceId(clickedIpaString); // use the id to load (and play) the sound soundPool.load(getActivity(), soundId, PRIORITY); diff --git a/app/src/main/java/com/aepronunciation/ipa/LearnDoubleRecyclerViewAdapter.java b/app/src/main/java/com/aepronunciation/ipa/LearnDoubleRecyclerViewAdapter.java old mode 100644 new mode 100755 index afce6f1..db85b6f --- a/app/src/main/java/com/aepronunciation/ipa/LearnDoubleRecyclerViewAdapter.java +++ b/app/src/main/java/com/aepronunciation/ipa/LearnDoubleRecyclerViewAdapter.java @@ -1,19 +1,19 @@ package com.aepronunciation.ipa; import android.content.Context; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import java.util.Collections; import java.util.List; class LearnDoubleRecyclerViewAdapter extends RecyclerView.Adapter { - private List mData = Collections.emptyList(); + private List mData; private LayoutInflater mInflater; private ItemClickListener mClickListener; @@ -24,15 +24,16 @@ class LearnDoubleRecyclerViewAdapter extends RecyclerView.Adapter ipaForVideo = createVideoMap(); + private Map ipaForDescription = createDescriptionMap(); + private Map ipaForExample1 = createExample1Map(); + private Map ipaForExample2 = createExample2Map(); + private Map ipaForExample3 = createExample3Map(); private static final int SRC_QUALITY = 0; private static final int PRIORITY = 1; private SoundPool soundPool = null; @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View layout = inflater.inflate(R.layout.fragment_learn_single, container, false); - tvIpaSymbol = (TextView) layout.findViewById(R.id.tvLearnSingleIpaSound); - videoView = (VideoView) layout.findViewById(R.id.videoview); - tvIpaDescription = (TextView) layout.findViewById(R.id.tvLearnSingleIpaDescription); - rlExample1 = (RelativeLayout) layout.findViewById(R.id.rlExample1); - rlExample2 = (RelativeLayout) layout.findViewById(R.id.rlExample2); - rlExample3 = (RelativeLayout) layout.findViewById(R.id.rlExample3); - rlMore = (RelativeLayout) layout.findViewById(R.id.rlMore); - tvExample1 = (TextView) layout.findViewById(R.id.tvExample1); - tvExample2 = (TextView) layout.findViewById(R.id.tvExample2); - tvExample3 = (TextView) layout.findViewById(R.id.tvExample3); + tvIpaSymbol = layout.findViewById(R.id.tvLearnSingleIpaSound); + videoView = layout.findViewById(R.id.videoview); + tvIpaDescription = layout.findViewById(R.id.tvLearnSingleIpaDescription); + rlExample1 = layout.findViewById(R.id.rlExample1); + rlExample2 = layout.findViewById(R.id.rlExample2); + rlExample3 = layout.findViewById(R.id.rlExample3); + rlMore = layout.findViewById(R.id.rlMore); + tvExample1 = layout.findViewById(R.id.tvExample1); + tvExample2 = layout.findViewById(R.id.tvExample2); + tvExample3 = layout.findViewById(R.id.tvExample3); // set listeners rlExample1.setOnClickListener(this); @@ -103,9 +112,11 @@ public void onActivityCreated(Bundle savedInstanceState) { } else { tvIpaSymbol.setText(getString(R.string.key_ae)); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_ae); - videoView.setVideoURI(videoUri); - videoView.seekTo(1); + if (getActivity() != null) { + videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_ae); + videoView.setVideoURI(videoUri); + videoView.seekTo(1); + } tvIpaDescription.setText(getString( R.string.ae_description)); tvExample1.setText(getString(R.string.ae_example1)); @@ -126,7 +137,7 @@ public void onPause() { } @Override - public void onSaveInstanceState(Bundle savedInstanceState) { + public void onSaveInstanceState(@NonNull Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); //Save the fragment's state here @@ -162,7 +173,7 @@ public void onClick(View v) { } else { // Button: "more..." Bundle args = new Bundle(); - args.putString(LearnDoubleDialogFragment.KEY_DIALOG_IPA, tvIpaSymbol.getText().toString()); + args.putString(LearnDoubleDialogFragment.KEY_DIALOG_IPA, ipa); LearnDoubleDialogFragment dialog = new LearnDoubleDialogFragment(); dialog.setArguments(args); dialog.show(getChildFragmentManager(), "TagDoubleSounds"); @@ -170,754 +181,314 @@ public void onClick(View v) { } - public void onNewSelection(String keyString) { - - switch (keyString) { - - case "i": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_i); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.i_description)); - tvExample1.setText(getString(R.string.i_example1)); - tvExample2.setText(getString(R.string.i_example2)); - tvExample3.setText(getString(R.string.i_example3)); - - //soundPool.load(context, R.raw.single_i_long, PRIORITY); - videoView.start(); - break; - - case "ɪ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_i_short); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.i_short_description)); - tvExample1.setText(getString( - R.string.i_short_example1)); - tvExample2.setText(getString( - R.string.i_short_example2)); - tvExample3.setText(getString( - R.string.i_short_example3)); - - //soundPool.load(context, R.raw.single_i_short, PRIORITY); - videoView.start(); - break; - - case "ɛ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_e_short); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.e_short_description)); - tvExample1.setText(getString( - R.string.e_short_example1)); - tvExample2.setText(getString( - R.string.e_short_example2)); - tvExample3.setText(getString( - R.string.e_short_example3)); - - //soundPool.load(context, R.raw.single_e_short, PRIORITY); - videoView.start(); - break; - - case "æ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_ae); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.ae_description)); - tvExample1.setText(getString(R.string.ae_example1)); - tvExample2.setText(getString(R.string.ae_example2)); - tvExample3.setText(getString(R.string.ae_example3)); - - //soundPool.load(context, R.raw.single_ae, PRIORITY); - videoView.start(); - break; - - case "ɑ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_a); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.a_description)); - tvExample1.setText(getString(R.string.a_example1)); - tvExample2.setText(getString(R.string.a_example2)); - tvExample3.setText(getString(R.string.a_example3)); - - //soundPool.load(context, R.raw.single_a, PRIORITY); - videoView.start(); - break; - - case "ɔ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_c_backwards); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.c_backwards_description)); - tvExample1.setText(getString( - R.string.c_backwards_example1)); - tvExample2.setText(getString( - R.string.c_backwards_example2)); - tvExample3.setText(getString( - R.string.c_backwards_example3)); - - //soundPool.load(context, R.raw.single_c_backwards, PRIORITY); - videoView.start(); - break; - - case "ʊ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_u_short); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.u_short_description)); - tvExample1.setText(getString( - R.string.u_short_example1)); - tvExample2.setText(getString( - R.string.u_short_example2)); - tvExample3.setText(getString( - R.string.u_short_example3)); - - //soundPool.load(context, R.raw.single_u_short, PRIORITY); - videoView.start(); - break; - - case "u": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_u); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.u_description)); - tvExample1.setText(getString(R.string.u_example1)); - tvExample2.setText(getString(R.string.u_example2)); - tvExample3.setText(getString(R.string.u_example3)); - - //soundPool.load(context, R.raw.single_u, PRIORITY); - videoView.start(); - break; - - case "ʌ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_v_upsidedown); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.v_upsidedown_description)); - tvExample1.setText(getString( - R.string.v_upsidedown_example1)); - tvExample2.setText(getString( - R.string.v_upsidedown_example2)); - tvExample3.setText(getString( - R.string.v_upsidedown_example3)); - - //soundPool.load(context, R.raw.single_v_upsidedown, PRIORITY); - videoView.start(); - break; - - case "ə": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_shwua); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString(R.string.schwa_description)); - tvExample1.setText(getResources() - .getString(R.string.schwa_example1)); - tvExample2.setText(getResources() - .getString(R.string.schwa_example2)); - tvExample3.setText(getResources() - .getString(R.string.schwa_example3)); - - //soundPool.load(context, R.raw.single_schwa, PRIORITY); - videoView.start(); - break; - - case "eɪ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_ei); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString(R.string.ei_description)); - tvExample1.setText(getString(R.string.ei_example1)); - tvExample2.setText(getString(R.string.ei_example2)); - tvExample3.setText(getString(R.string.ei_example3)); - - //soundPool.load(context, R.raw.single_ei, PRIORITY); - videoView.start(); - break; - - case "aɪ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_ai); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString(R.string.ai_description)); - tvExample1.setText(getString(R.string.ai_example1)); - tvExample2.setText(getString(R.string.ai_example2)); - tvExample3.setText(getString(R.string.ai_example3)); - - //soundPool.load(context, R.raw.single_ai, PRIORITY); - videoView.start(); - break; - - case "aʊ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_au); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString(R.string.au_description)); - tvExample1.setText(getString(R.string.au_example1)); - tvExample2.setText(getString(R.string.au_example2)); - tvExample3.setText(getString(R.string.au_example3)); - - //soundPool.load(context, R.raw.single_au, PRIORITY); - videoView.start(); - break; - - case "ɔɪ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_oi); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString(R.string.oi_description)); - tvExample1.setText(getString(R.string.oi_example1)); - tvExample2.setText(getString(R.string.oi_example2)); - tvExample3.setText(getString(R.string.oi_example3)); - - //soundPool.load(context, R.raw.single_oi, PRIORITY); - videoView.start(); - break; - - case "oʊ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_ou); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString(R.string.ou_description)); - tvExample1.setText(getString(R.string.ou_example1)); - tvExample2.setText(getString(R.string.ou_example2)); - tvExample3.setText(getString(R.string.ou_example3)); - - //soundPool.load(context, R.raw.single_ou, PRIORITY); - videoView.start(); - break; - - case "ɝ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_er_stressed); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString(R.string.er_stressed_description)); - tvExample1.setText(getString(R.string.er_stressed_example1)); - tvExample2.setText(getString(R.string.er_stressed_example2)); - tvExample3.setText(getString(R.string.er_stressed_example3)); - - //soundPool.load(context, R.raw.single_er_stressed, PRIORITY); - videoView.start(); - break; - - case "ɚ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_er_unstressed); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.er_unstressed_description)); - tvExample1.setText(getString( - R.string.er_unstressed_example1)); - tvExample2.setText(getString( - R.string.er_unstressed_example2)); - tvExample3.setText(getString( - R.string.er_unstressed_example3)); - - //soundPool.load(context, R.raw.single_er_unstressed, PRIORITY); - videoView.start(); - break; - - case "ɑr": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_ar); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.ar_description)); - tvExample1.setText(getString(R.string.ar_example1)); - tvExample2.setText(getString(R.string.ar_example2)); - tvExample3.setText(getString(R.string.ar_example3)); - - //soundPool.load(context, R.raw.single_ar, PRIORITY); - videoView.start(); - break; - - case "ɛr": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_er); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.er_description)); - tvExample1.setText(getString(R.string.er_example1)); - tvExample2.setText(getString(R.string.er_example2)); - tvExample3.setText(getString(R.string.er_example3)); - - //soundPool.load(context, R.raw.single_er, PRIORITY); - videoView.start(); - break; - - case "ɪr": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_ir); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.ir_description)); - tvExample1.setText(getString(R.string.ir_example1)); - tvExample2.setText(getString(R.string.ir_example2)); - tvExample3.setText(getString(R.string.ir_example3)); - - //soundPool.load(context, R.raw.single_ir, PRIORITY); - videoView.start(); - break; - - case "ɔr": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_or); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.or_description)); - tvExample1.setText(getString(R.string.or_example1)); - tvExample2.setText(getString(R.string.or_example2)); - tvExample3.setText(getString(R.string.or_example3)); - - //soundPool.load(context, R.raw.single_or, PRIORITY); - videoView.start(); - break; - - case "p": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_p); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.p_description)); - tvExample1.setText(getString(R.string.p_example1)); - tvExample2.setText(getString(R.string.p_example2)); - tvExample3.setText(getString(R.string.p_example3)); - - //soundPool.load(context, R.raw.single_p, PRIORITY); - videoView.start(); - break; - - case "t": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_t); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.t_description)); - tvExample1.setText(getString(R.string.t_example1)); - tvExample2.setText(getString(R.string.t_example2)); - tvExample3.setText(getString(R.string.t_example3)); - - //soundPool.load(context, R.raw.single_t, PRIORITY); - videoView.start(); - break; - - case "k": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_k); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.k_description)); - tvExample1.setText(getString(R.string.k_example1)); - tvExample2.setText(getString(R.string.k_example2)); - tvExample3.setText(getString(R.string.k_example3)); - - //soundPool.load(context, R.raw.single_k, PRIORITY); - videoView.start(); - break; - - case "ʧ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_ch); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.ch_description)); - tvExample1.setText(getString(R.string.ch_example1)); - tvExample2.setText(getString(R.string.ch_example2)); - tvExample3.setText(getString(R.string.ch_example3)); - - //soundPool.load(context, R.raw.single_ch, PRIORITY); - videoView.start(); - break; - - case "f": + public void onNewSelection(String ipa) { + if (getActivity() == null) return; - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_f); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.f_description)); - tvExample1.setText(getString(R.string.f_example1)); - tvExample2.setText(getString(R.string.f_example2)); - tvExample3.setText(getString(R.string.f_example3)); - - //soundPool.load(context, R.raw.single_f, PRIORITY); - videoView.start(); - break; - - case "θ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_th_voiceless); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.th_voiceless_description)); - tvExample1.setText(getString( - R.string.th_voiceless_example1)); - tvExample2.setText(getString( - R.string.th_voiceless_example2)); - tvExample3.setText(getString( - R.string.th_voiceless_example3)); - - //soundPool.load(context, R.raw.single_th_voiceless, PRIORITY); - videoView.start(); - break; - - case "s": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_s); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.s_description)); - tvExample1.setText(getString(R.string.s_example1)); - tvExample2.setText(getString(R.string.s_example2)); - tvExample3.setText(getString(R.string.s_example3)); - - //soundPool.load(context, R.raw.single_s, PRIORITY); - videoView.start(); - break; - - case "ʃ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_sh); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.sh_description)); - tvExample1.setText(getString(R.string.sh_example1)); - tvExample2.setText(getString(R.string.sh_example2)); - tvExample3.setText(getString(R.string.sh_example3)); - - //soundPool.load(context, R.raw.single_sh, PRIORITY); - videoView.start(); - break; - - case "b": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_b); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.b_description)); - tvExample1.setText(getString(R.string.b_example1)); - tvExample2.setText(getString(R.string.b_example2)); - tvExample3.setText(getString(R.string.b_example3)); - - //soundPool.load(context, R.raw.single_b, PRIORITY); - videoView.start(); - break; - - case "d": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_d); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.d_description)); - tvExample1.setText(getString(R.string.d_example1)); - tvExample2.setText(getString(R.string.d_example2)); - tvExample3.setText(getString(R.string.d_example3)); - - //soundPool.load(context, R.raw.single_d, PRIORITY); - videoView.start(); - break; - - case "g": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_g); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.g_description)); - tvExample1.setText(getString(R.string.g_example1)); - tvExample2.setText(getString(R.string.g_example2)); - tvExample3.setText(getString(R.string.g_example3)); - - //soundPool.load(context, R.raw.single_g, PRIORITY); - videoView.start(); - break; - - case "ʤ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_dzh); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.dzh_description)); - tvExample1.setText(getString(R.string.dzh_example1)); - tvExample2.setText(getString(R.string.dzh_example2)); - tvExample3.setText(getString(R.string.dzh_example3)); - - //soundPool.load(context, R.raw.single_dzh, PRIORITY); - videoView.start(); - break; - - case "v": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_v); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.v_description)); - tvExample1.setText(getString(R.string.v_example1)); - tvExample2.setText(getString(R.string.v_example2)); - tvExample3.setText(getString(R.string.v_example3)); - - //soundPool.load(context, R.raw.single_v, PRIORITY); - videoView.start(); - break; - - case "ð": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_th_voiced); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.th_voiced_description)); - tvExample1.setText(getString( - R.string.th_voiced_example1)); - tvExample2.setText(getString( - R.string.th_voiced_example2)); - tvExample3.setText(getString( - R.string.th_voiced_example3)); - - //soundPool.load(context, R.raw.single_th_voiced, PRIORITY); - videoView.start(); - break; - - case "z": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_z); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.z_description)); - tvExample1.setText(getString(R.string.z_example1)); - tvExample2.setText(getString(R.string.z_example2)); - tvExample3.setText(getString(R.string.z_example3)); - - //soundPool.load(context, R.raw.single_z, PRIORITY); - videoView.start(); - break; - - case "ʒ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_zh); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.zh_description)); - tvExample1.setText(getString(R.string.zh_example1)); - tvExample2.setText(getString(R.string.zh_example2)); - tvExample3.setText(getString(R.string.zh_example3)); - - //soundPool.load(context, R.raw.single_zh, PRIORITY); - videoView.start(); - break; - - case "m": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_m); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.m_description)); - tvExample1.setText(getString(R.string.m_example1)); - tvExample2.setText(getString(R.string.m_example2)); - tvExample3.setText(getString(R.string.m_example3)); - - //soundPool.load(context, R.raw.single_m, PRIORITY); - videoView.start(); - break; + int videoId = ipaForVideo.get(ipa); + int descriptionId = ipaForDescription.get(ipa); + int example1Id = ipaForExample1.get(ipa); + int example2Id = ipaForExample2.get(ipa); + int example3Id = ipaForExample3.get(ipa); - case "n": + tvIpaSymbol.setText(ipa); + videoUri = Uri.parse("android.resource://" + + getActivity().getPackageName() + + "/" + videoId); + videoView.setVideoURI(videoUri); + tvIpaDescription.setText(getString(descriptionId)); + tvExample1.setText(getString(example1Id)); + tvExample2.setText(getString(example2Id)); + tvExample3.setText(getString(example3Id)); - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_n); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.n_description)); - tvExample1.setText(getString(R.string.n_example1)); - tvExample2.setText(getString(R.string.n_example2)); - tvExample3.setText(getString(R.string.n_example3)); - - //soundPool.load(context, R.raw.single_n, PRIORITY); - videoView.start(); - break; - - case "ŋ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_ng); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.ng_description)); - tvExample1.setText(getString(R.string.ng_example1)); - tvExample2.setText(getString(R.string.ng_example2)); - tvExample3.setText(getString(R.string.ng_example3)); - - //soundPool.load(context, R.raw.single_ng, PRIORITY); - videoView.start(); - break; - - case "l": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_l); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.l_description)); - tvExample1.setText(getString(R.string.l_example1)); - tvExample2.setText(getString(R.string.l_example2)); - tvExample3.setText(getString(R.string.l_example3)); - - //soundPool.load(context, R.raw.single_l, PRIORITY); - videoView.start(); - break; - - case "w": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_w); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.w_description)); - tvExample1.setText(getString(R.string.w_example1)); - tvExample2.setText(getString(R.string.w_example2)); - tvExample3.setText(getString(R.string.w_example3)); - - //soundPool.load(context, R.raw.single_w, PRIORITY); - videoView.start(); - break; - - case "j": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_j); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.j_description)); - tvExample1.setText(getString(R.string.j_example1)); - tvExample2.setText(getString(R.string.j_example2)); - tvExample3.setText(getString(R.string.j_example3)); - - //soundPool.load(context, R.raw.single_j, PRIORITY); - videoView.start(); - break; - - case "h": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_h); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.h_description)); - tvExample1.setText(getString(R.string.h_example1)); - tvExample2.setText(getString(R.string.h_example2)); - tvExample3.setText(getString(R.string.h_example3)); - - //soundPool.load(context, R.raw.single_h, PRIORITY); - videoView.start(); - break; + videoView.start(); + } - case "r": - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_r); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.r_description)); - tvExample1.setText(getString(R.string.r_example1)); - tvExample2.setText(getString(R.string.r_example2)); - tvExample3.setText(getString(R.string.r_example3)); + @Override + public void onLoadComplete(SoundPool sPool, int sid, int status) { - //soundPool.load(context, R.raw.single_r, PRIORITY); - videoView.start(); - break; + if (status != 0) // 0=success + return; + soundPool.play(sid, 1, 1, PRIORITY, 0, 1.0f); + soundPool.unload(sid); - case "ʔ": + } - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_glottal_stop); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.glottal_stop_description)); - tvExample1.setText(getString( - R.string.glottal_stop_example1)); - tvExample2.setText(getString( - R.string.glottal_stop_example2)); - tvExample3.setText(getString( - R.string.glottal_stop_example3)); - - //soundPool.load(context, R.raw.single_glottal_stop, PRIORITY); - videoView.start(); - break; - - case "ɾ": - - tvIpaSymbol.setText(keyString); - videoUri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.v_t_flap); - videoView.setVideoURI(videoUri); - tvIpaDescription.setText(getString( - R.string.flap_t_description)); - tvExample1.setText(getString( - R.string.flap_t_example1)); - tvExample2.setText(getString( - R.string.flap_t_example2)); - tvExample3.setText(getString( - R.string.flap_t_example3)); - - //soundPool.load(context, R.raw.single_flap_t, PRIORITY); - videoView.start(); - break; + private static Map createVideoMap() { + + Map result = new LinkedHashMap<>(); + + result.put("p", R.raw.v_p); + result.put("t", R.raw.v_t); + result.put("k", R.raw.v_k); + result.put("ʧ", R.raw.v_ch); + result.put("f", R.raw.v_f); + result.put("θ", R.raw.v_th_voiceless); + result.put("s", R.raw.v_s); + result.put("ʃ", R.raw.v_sh); + result.put("b", R.raw.v_b); + result.put("d", R.raw.v_d); + result.put("g", R.raw.v_g); + result.put("ʤ", R.raw.v_dzh); + result.put("v", R.raw.v_v); + result.put("ð", R.raw.v_th_voiced); + result.put("z", R.raw.v_z); + result.put("ʒ", R.raw.v_zh); + result.put("m", R.raw.v_m); + result.put("n", R.raw.v_n); + result.put("ŋ", R.raw.v_ng); + result.put("l", R.raw.v_l); + result.put("w", R.raw.v_w); + result.put("j", R.raw.v_j); + result.put("h", R.raw.v_h); + result.put("r", R.raw.v_r); + result.put("i", R.raw.v_i); + result.put("ɪ", R.raw.v_i_short); + result.put("ɛ", R.raw.v_e_short); + result.put("æ", R.raw.v_ae); + result.put("ɑ", R.raw.v_a); + result.put("ɔ", R.raw.v_c_backwards); + result.put("ʊ", R.raw.v_u_short); + result.put("u", R.raw.v_u); + result.put("ʌ", R.raw.v_v_upsidedown); + result.put("ə", R.raw.v_schwa); + result.put("eɪ", R.raw.v_ei); + result.put("aɪ", R.raw.v_ai); + result.put("aʊ", R.raw.v_au); + result.put("ɔɪ", R.raw.v_oi); + result.put("oʊ", R.raw.v_ou); + result.put("ɾ", R.raw.v_flap_t); + result.put("ɝ", R.raw.v_er_stressed); + result.put("ɚ", R.raw.v_er_unstressed); + result.put("ɑr", R.raw.v_ar); + result.put("ɛr", R.raw.v_er); + result.put("ɪr", R.raw.v_ir); + result.put("ɔr", R.raw.v_or); + result.put("ʔ", R.raw.v_glottal_stop); + + return result; + } - } + private static Map createDescriptionMap() { + + Map result = new LinkedHashMap<>(); + + result.put("p", R.string.p_description); + result.put("t", R.string.t_description); + result.put("k", R.string.k_description); + result.put("ʧ", R.string.ch_description); + result.put("f", R.string.f_description); + result.put("θ", R.string.th_voiceless_description); + result.put("s", R.string.s_description); + result.put("ʃ", R.string.sh_description); + result.put("b", R.string.b_description); + result.put("d", R.string.d_description); + result.put("g", R.string.g_description); + result.put("ʤ", R.string.dzh_description); + result.put("v", R.string.v_description); + result.put("ð", R.string.th_voiced_description); + result.put("z", R.string.z_description); + result.put("ʒ", R.string.zh_description); + result.put("m", R.string.m_description); + result.put("n", R.string.n_description); + result.put("ŋ", R.string.ng_description); + result.put("l", R.string.l_description); + result.put("w", R.string.w_description); + result.put("j", R.string.j_description); + result.put("h", R.string.h_description); + result.put("r", R.string.r_description); + result.put("i", R.string.i_description); + result.put("ɪ", R.string.i_short_description); + result.put("ɛ", R.string.e_short_description); + result.put("æ", R.string.ae_description); + result.put("ɑ", R.string.a_description); + result.put("ɔ", R.string.c_backwards_description); + result.put("ʊ", R.string.u_short_description); + result.put("u", R.string.u_description); + result.put("ʌ", R.string.v_upsidedown_description); + result.put("ə", R.string.schwa_description); + result.put("eɪ", R.string.ei_description); + result.put("aɪ", R.string.ai_description); + result.put("aʊ", R.string.au_description); + result.put("ɔɪ", R.string.oi_description); + result.put("oʊ", R.string.ou_description); + result.put("ɾ", R.string.flap_t_description); + result.put("ɝ", R.string.er_stressed_description); + result.put("ɚ", R.string.er_unstressed_description); + result.put("ɑr", R.string.ar_description); + result.put("ɛr", R.string.er_description); + result.put("ɪr", R.string.ir_description); + result.put("ɔr", R.string.or_description); + result.put("ʔ", R.string.glottal_stop_description); + + return result; } - @Override - public void onLoadComplete(SoundPool sPool, int sid, int status) { - if (status != 0) // 0=success - return; + private static Map createExample1Map() { + + Map result = new LinkedHashMap<>(); + + result.put("p", R.string.p_example1); + result.put("t", R.string.t_example1); + result.put("k", R.string.k_example1); + result.put("ʧ", R.string.ch_example1); + result.put("f", R.string.f_example1); + result.put("θ", R.string.th_voiceless_example1); + result.put("s", R.string.s_example1); + result.put("ʃ", R.string.sh_example1); + result.put("b", R.string.b_example1); + result.put("d", R.string.d_example1); + result.put("g", R.string.g_example1); + result.put("ʤ", R.string.dzh_example1); + result.put("v", R.string.v_example1); + result.put("ð", R.string.th_voiced_example1); + result.put("z", R.string.z_example1); + result.put("ʒ", R.string.zh_example1); + result.put("m", R.string.m_example1); + result.put("n", R.string.n_example1); + result.put("ŋ", R.string.ng_example1); + result.put("l", R.string.l_example1); + result.put("w", R.string.w_example1); + result.put("j", R.string.j_example1); + result.put("h", R.string.h_example1); + result.put("r", R.string.r_example1); + result.put("i", R.string.i_example1); + result.put("ɪ", R.string.i_short_example1); + result.put("ɛ", R.string.e_short_example1); + result.put("æ", R.string.ae_example1); + result.put("ɑ", R.string.a_example1); + result.put("ɔ", R.string.c_backwards_example1); + result.put("ʊ", R.string.u_short_example1); + result.put("u", R.string.u_example1); + result.put("ʌ", R.string.v_upsidedown_example1); + result.put("ə", R.string.schwa_example1); + result.put("eɪ", R.string.ei_example1); + result.put("aɪ", R.string.ai_example1); + result.put("aʊ", R.string.au_example1); + result.put("ɔɪ", R.string.oi_example1); + result.put("oʊ", R.string.ou_example1); + result.put("ɾ", R.string.flap_t_example1); + result.put("ɝ", R.string.er_stressed_example1); + result.put("ɚ", R.string.er_unstressed_example1); + result.put("ɑr", R.string.ar_example1); + result.put("ɛr", R.string.er_example1); + result.put("ɪr", R.string.ir_example1); + result.put("ɔr", R.string.or_example1); + result.put("ʔ", R.string.glottal_stop_example1); + + return result; + } - soundPool.play(sid, 1, 1, PRIORITY, 0, 1.0f); - soundPool.unload(sid); + private static Map createExample2Map() { + + Map result = new LinkedHashMap<>(); + + result.put("p", R.string.p_example2); + result.put("t", R.string.t_example2); + result.put("k", R.string.k_example2); + result.put("ʧ", R.string.ch_example2); + result.put("f", R.string.f_example2); + result.put("θ", R.string.th_voiceless_example2); + result.put("s", R.string.s_example2); + result.put("ʃ", R.string.sh_example2); + result.put("b", R.string.b_example2); + result.put("d", R.string.d_example2); + result.put("g", R.string.g_example2); + result.put("ʤ", R.string.dzh_example2); + result.put("v", R.string.v_example2); + result.put("ð", R.string.th_voiced_example2); + result.put("z", R.string.z_example2); + result.put("ʒ", R.string.zh_example2); + result.put("m", R.string.m_example2); + result.put("n", R.string.n_example2); + result.put("ŋ", R.string.ng_example2); + result.put("l", R.string.l_example2); + result.put("w", R.string.w_example2); + result.put("j", R.string.j_example2); + result.put("h", R.string.h_example2); + result.put("r", R.string.r_example2); + result.put("i", R.string.i_example2); + result.put("ɪ", R.string.i_short_example2); + result.put("ɛ", R.string.e_short_example2); + result.put("æ", R.string.ae_example2); + result.put("ɑ", R.string.a_example2); + result.put("ɔ", R.string.c_backwards_example2); + result.put("ʊ", R.string.u_short_example2); + result.put("u", R.string.u_example2); + result.put("ʌ", R.string.v_upsidedown_example2); + result.put("ə", R.string.schwa_example2); + result.put("eɪ", R.string.ei_example2); + result.put("aɪ", R.string.ai_example2); + result.put("aʊ", R.string.au_example2); + result.put("ɔɪ", R.string.oi_example2); + result.put("oʊ", R.string.ou_example2); + result.put("ɾ", R.string.flap_t_example2); + result.put("ɝ", R.string.er_stressed_example2); + result.put("ɚ", R.string.er_unstressed_example2); + result.put("ɑr", R.string.ar_example2); + result.put("ɛr", R.string.er_example2); + result.put("ɪr", R.string.ir_example2); + result.put("ɔr", R.string.or_example2); + result.put("ʔ", R.string.glottal_stop_example2); + + return result; + } + private static Map createExample3Map() { + + Map result = new LinkedHashMap<>(); + + result.put("p", R.string.p_example3); + result.put("t", R.string.t_example3); + result.put("k", R.string.k_example3); + result.put("ʧ", R.string.ch_example3); + result.put("f", R.string.f_example3); + result.put("θ", R.string.th_voiceless_example3); + result.put("s", R.string.s_example3); + result.put("ʃ", R.string.sh_example3); + result.put("b", R.string.b_example3); + result.put("d", R.string.d_example3); + result.put("g", R.string.g_example3); + result.put("ʤ", R.string.dzh_example3); + result.put("v", R.string.v_example3); + result.put("ð", R.string.th_voiced_example3); + result.put("z", R.string.z_example3); + result.put("ʒ", R.string.zh_example3); + result.put("m", R.string.m_example3); + result.put("n", R.string.n_example3); + result.put("ŋ", R.string.ng_example3); + result.put("l", R.string.l_example3); + result.put("w", R.string.w_example3); + result.put("j", R.string.j_example3); + result.put("h", R.string.h_example3); + result.put("r", R.string.r_example3); + result.put("i", R.string.i_example3); + result.put("ɪ", R.string.i_short_example3); + result.put("ɛ", R.string.e_short_example3); + result.put("æ", R.string.ae_example3); + result.put("ɑ", R.string.a_example3); + result.put("ɔ", R.string.c_backwards_example3); + result.put("ʊ", R.string.u_short_example3); + result.put("u", R.string.u_example3); + result.put("ʌ", R.string.v_upsidedown_example3); + result.put("ə", R.string.schwa_example3); + result.put("eɪ", R.string.ei_example3); + result.put("aɪ", R.string.ai_example3); + result.put("aʊ", R.string.au_example3); + result.put("ɔɪ", R.string.oi_example3); + result.put("oʊ", R.string.ou_example3); + result.put("ɾ", R.string.flap_t_example3); + result.put("ɝ", R.string.er_stressed_example3); + result.put("ɚ", R.string.er_unstressed_example3); + result.put("ɑr", R.string.ar_example3); + result.put("ɛr", R.string.er_example3); + result.put("ɪr", R.string.ir_example3); + result.put("ɔr", R.string.or_example3); + result.put("ʔ", R.string.glottal_stop_example3); + + return result; } } diff --git a/app/src/main/java/com/aepronunciation/ipa/MainActivity.java b/app/src/main/java/com/aepronunciation/ipa/MainActivity.java old mode 100644 new mode 100755 index 935ea72..7f5ddd9 --- a/app/src/main/java/com/aepronunciation/ipa/MainActivity.java +++ b/app/src/main/java/com/aepronunciation/ipa/MainActivity.java @@ -3,14 +3,15 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; -import android.support.design.widget.TabLayout; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v7.app.AppCompatActivity; +import androidx.annotation.NonNull; +import com.google.android.material.tabs.TabLayout; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -54,16 +55,16 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - tabLayout = (TabLayout) findViewById(R.id.tab_layout); + tabLayout = findViewById(R.id.tab_layout); tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.main_tab_learn))); tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.main_tab_practice))); tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.main_tab_test))); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); - viewPager = (ViewPager) findViewById(R.id.pager); + viewPager = findViewById(R.id.pager); CustomPagerAdapter adapter = new CustomPagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount()); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); @@ -158,6 +159,10 @@ public boolean onOptionsItemSelected(MenuItem item) { intent = new Intent(this, HistoryActivity.class); startActivity(intent); return true; + case R.id.action_personal_evaluation: + intent = new Intent(this, PersonalEvaluationActivity.class); + startActivity(intent); + return true; case R.id.action_about: intent = new Intent(this, AboutActivity.class); startActivity(intent); @@ -171,6 +176,7 @@ public boolean onOptionsItemSelected(MenuItem item) { @Override protected void onActivityResult (int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); if (requestCode == TEST_RESULTS_RESULT) { if (resultCode == RESULT_OK) { @@ -201,23 +207,23 @@ private class CustomPagerAdapter extends FragmentStatePagerAdapter { this.mNumOfTabs = NumOfTabs; } + @NonNull @Override public Fragment getItem(int position) { switch (position) { - case 0: - return new LearnFragment(); case 1: return new PracticeFragment(); case 2: return new TestFragment(); default: - return null; + return new LearnFragment(); } } + @NonNull @Override - public Object instantiateItem(ViewGroup container, int position) { + public Object instantiateItem(@NonNull ViewGroup container, int position) { Fragment createdFragment = (Fragment) super.instantiateItem(container, position); switch (position) { case 0: diff --git a/app/src/main/java/com/aepronunciation/ipa/MyDatabaseAdapter.java b/app/src/main/java/com/aepronunciation/ipa/MyDatabaseAdapter.java old mode 100644 new mode 100755 index bfc9113..7344799 --- a/app/src/main/java/com/aepronunciation/ipa/MyDatabaseAdapter.java +++ b/app/src/main/java/com/aepronunciation/ipa/MyDatabaseAdapter.java @@ -26,7 +26,7 @@ ArrayList getAllTestScores() { SQLiteDatabase db = helper.getWritableDatabase(); String[] columns = { MyDatabaseHelper.ID, MyDatabaseHelper.USER_NAME, MyDatabaseHelper.TEST_DATE, MyDatabaseHelper.TEST_MODE, - MyDatabaseHelper.SCORE, MyDatabaseHelper.CORRECT_ANSWER, MyDatabaseHelper.WRONG }; + MyDatabaseHelper.SCORE, MyDatabaseHelper.CORRECT_ANSWER }; String orderBy = MyDatabaseHelper.TEST_DATE + " DESC"; Cursor cursor = db.query(MyDatabaseHelper.TESTS_TABLE_NAME, columns, null, null, null, null, orderBy, null); @@ -36,7 +36,7 @@ ArrayList getAllTestScores() { int indexMode = cursor.getColumnIndex(MyDatabaseHelper.TEST_MODE); int indexScore = cursor.getColumnIndex(MyDatabaseHelper.SCORE); int indexCorrect = cursor.getColumnIndex(MyDatabaseHelper.CORRECT_ANSWER); - int indexWrong = cursor.getColumnIndex(MyDatabaseHelper.WRONG); + //int indexWrong = cursor.getColumnIndex(MyDatabaseHelper.WRONG); while (cursor.moveToNext()) { @@ -56,7 +56,7 @@ ArrayList getAllTestScores() { test.setScore(cursor.getInt(indexScore)); test.setCorrectAnswers(cursor.getString(indexCorrect)); - test.setWrong(cursor.getString(indexWrong)); + //test.setWrong(cursor.getString(indexWrong)); allTests.add(test); } @@ -75,8 +75,7 @@ Test getTest(long rowId) { String[] columns = { MyDatabaseHelper.ID, MyDatabaseHelper.USER_NAME, MyDatabaseHelper.TEST_DATE, MyDatabaseHelper.TIME_LENGTH, MyDatabaseHelper.TEST_MODE, MyDatabaseHelper.SCORE, - MyDatabaseHelper.CORRECT_ANSWER, MyDatabaseHelper.USER_ANSWER, - MyDatabaseHelper.WRONG }; + MyDatabaseHelper.CORRECT_ANSWER, MyDatabaseHelper.USER_ANSWER }; String whereClause = MyDatabaseHelper.ID + " =?"; String[] whereArgs = { Long.toString(rowId) }; Cursor cursor = db.query(MyDatabaseHelper.TESTS_TABLE_NAME, columns, @@ -90,7 +89,7 @@ Test getTest(long rowId) { int indexScore = cursor.getColumnIndex(MyDatabaseHelper.SCORE); int indexCorrect = cursor.getColumnIndex(MyDatabaseHelper.CORRECT_ANSWER); int indexUserAnswer = cursor.getColumnIndex(MyDatabaseHelper.USER_ANSWER); - int indexWrong = cursor.getColumnIndex(MyDatabaseHelper.WRONG); + //int indexWrong = cursor.getColumnIndex(MyDatabaseHelper.WRONG); while (cursor.moveToNext()) { test.setId(cursor.getLong(indexId)); @@ -107,7 +106,7 @@ Test getTest(long rowId) { test.setScore(cursor.getInt(indexScore)); test.setCorrectAnswers(cursor.getString(indexCorrect)); test.setUserAnswers(cursor.getString(indexUserAnswer)); - test.setWrong(cursor.getString(indexWrong)); + //test.setWrong(cursor.getString(indexWrong)); } cursor.close(); @@ -118,6 +117,8 @@ Test getTest(long rowId) { int[] getHighScores() { + // TODO this could be refactored to use a SQL max function + int[] highScores = new int[2]; SQLiteDatabase db = helper.getWritableDatabase(); @@ -158,31 +159,8 @@ int[] getHighScores() { return highScores; } - public ArrayList getAllUsers() { - - ArrayList results = new ArrayList<>(); - SQLiteDatabase db = helper.getReadableDatabase(); - String[] columns = { MyDatabaseHelper.USER_NAME }; - Cursor cursor = db.query(true, MyDatabaseHelper.TESTS_TABLE_NAME, - columns, null, null, null, null, null, null); - - int wordIndex = cursor.getColumnIndex(MyDatabaseHelper.USER_NAME); - - String tempString; - while (cursor.moveToNext()) { - - tempString = cursor.getString(wordIndex); - results.add(tempString); - } - - cursor.close(); - db.close(); - return results; - - } - long addTest(String name, long time, String testmode, int score, - String correctAnswers, String userAnswers, String wrong) { + String correctAnswers, String userAnswers) { // get current Unix epoc time in milliseconds long date = System.currentTimeMillis(); @@ -196,24 +174,13 @@ long addTest(String name, long time, String testmode, int score, contentValues.put(MyDatabaseHelper.SCORE, score); contentValues.put(MyDatabaseHelper.CORRECT_ANSWER, correctAnswers); contentValues.put(MyDatabaseHelper.USER_ANSWER, userAnswers); - contentValues.put(MyDatabaseHelper.WRONG, wrong); + contentValues.put(MyDatabaseHelper.WRONG, ""); // Deprecated, inserting dummy value long id = db.insert(MyDatabaseHelper.TESTS_TABLE_NAME, null, contentValues); db.close(); return id; } - public int deleteTest(long rowId) { - - SQLiteDatabase db = helper.getWritableDatabase(); - String whereClause = MyDatabaseHelper.ID + " =?"; - String[] whereArgs = { Long.toString(rowId) }; - int count = db.delete(MyDatabaseHelper.TESTS_TABLE_NAME, whereClause, - whereArgs); - db.close(); - return count; - } - // Making this an inner class rather than a separate class so that outer // class can securely refer to private variables in this class private static class MyDatabaseHelper extends SQLiteOpenHelper { @@ -236,14 +203,22 @@ private static class MyDatabaseHelper extends SQLiteOpenHelper { private static final String SCORE = "score"; private static final String CORRECT_ANSWER = "correct"; private static final String USER_ANSWER = "user_answer"; - private static final String WRONG = "wrong"; + private static final String WRONG = "wrong"; // DEPRECATED + // I'm only leaving in the WRONG column so that I don't have to + // upgrade the database. Just ignoring it for now. // SQL statements private static final String CREATE_TEST_TABLE = "CREATE TABLE " - + TESTS_TABLE_NAME + " (" + ID + " INTEGER PRIMARY KEY," - + USER_NAME + " TEXT NOT NULL," + TEST_DATE + " INTEGER," - + TIME_LENGTH + " INTEGER," + TEST_MODE + " TEXT NOT NULL," - + SCORE + " INTEGER," + CORRECT_ANSWER + " TEXT NOT NULL," - + USER_ANSWER + " TEXT NOT NULL," + WRONG + " TEXT NOT NULL)"; + + TESTS_TABLE_NAME + " (" + + ID + " INTEGER PRIMARY KEY," + + USER_NAME + " TEXT NOT NULL," + + TEST_DATE + " INTEGER," + + TIME_LENGTH + " INTEGER," + + TEST_MODE + " TEXT NOT NULL," + + SCORE + " INTEGER," + + CORRECT_ANSWER + " TEXT NOT NULL," + + USER_ANSWER + " TEXT NOT NULL," + + WRONG + " TEXT NOT NULL" + + ")"; private static final String DROP_TEST_TABLE = "DROP TABLE IF EXISTS " + TESTS_TABLE_NAME; diff --git a/app/src/main/java/com/aepronunciation/ipa/PersonalEvaluationActivity.java b/app/src/main/java/com/aepronunciation/ipa/PersonalEvaluationActivity.java new file mode 100755 index 0000000..bb6d5da --- /dev/null +++ b/app/src/main/java/com/aepronunciation/ipa/PersonalEvaluationActivity.java @@ -0,0 +1,43 @@ +package com.aepronunciation.ipa; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import android.view.MenuItem; +import android.view.View; + +public class PersonalEvaluationActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_personal_evaluation); + + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + // add back arrow to toolbar + if (getSupportActionBar() != null){ + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + + } + + public void requestEvaluationClick(View v) { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.personal_evaluation_contact_url))); + startActivity(browserIntent); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // handle arrow click here + if (item.getItemId() == android.R.id.home) { + finish(); // close this activity and return to preview activity (if there is any) + } + + return super.onOptionsItemSelected(item); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/aepronunciation/ipa/PhonemeTable.java b/app/src/main/java/com/aepronunciation/ipa/PhonemeTable.java deleted file mode 100644 index e1c0f86..0000000 --- a/app/src/main/java/com/aepronunciation/ipa/PhonemeTable.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.aepronunciation.ipa; - -import android.util.Pair; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -class PhonemeTable { - - private static final int P_VOWEL = 1; - private static final int P_CONSONANT = 2; - private static final int P_SPECIAL = 4; - private static final int P_UNSTRESSED = 8; - private static final int P_INITIAL_FINAL = 16; - - static final int NUMBER_OF_VOWELS = 21; - static final int NUMBER_OF_VOWELS_FOR_DOUBLES = 19; // not ə, ɚ - static final int NUMBER_OF_CONSONANTS = 26; - static final int NUMBER_OF_CONSONANTS_FOR_DOUBLES = 24; // not ʔ. ɾ - - static final PhonemeTable INSTANCE = new PhonemeTable(); - - private HashMap soundFlagsMap; - - private PhonemeTable() { - init(); - } - - boolean isVowel(String s) { - return (getFlags(s) & P_VOWEL) != 0; - } - - boolean isConsonant(String s) { - return (getFlags(s) & P_CONSONANT) != 0; - } - - boolean isSpecial(String s) { - return (getFlags(s) & P_SPECIAL) != 0; - } - - boolean hasTwoPronunciations(String s) { - return (getFlags(s) & P_INITIAL_FINAL) != 0; - } - - - private int getFlags(String s) { - if (soundFlagsMap.containsKey(s)) { - return soundFlagsMap.get(s); - } - return 0; - } - - ArrayList getAllVowels() { - ArrayList vowels = new ArrayList<>(); - for (Map.Entry entry: soundFlagsMap.entrySet()) { - if ((entry.getValue() & P_VOWEL) != 0) { - vowels.add(entry.getKey()); - } - } - return vowels; - } - - ArrayList getAllConsonants() { - ArrayList vowels = new ArrayList<>(); - for (Map.Entry entry: soundFlagsMap.entrySet()) { - if ((entry.getValue() & P_CONSONANT) != 0) { - vowels.add(entry.getKey()); - } - } - return vowels; - } - - private void init() { - soundFlagsMap = new HashMap<>(); - - soundFlagsMap.put("p", P_CONSONANT); - soundFlagsMap.put("t", P_CONSONANT); - soundFlagsMap.put("k", P_CONSONANT); - soundFlagsMap.put("ʧ", P_CONSONANT); - soundFlagsMap.put("f", P_CONSONANT | P_INITIAL_FINAL); - soundFlagsMap.put("θ", P_CONSONANT | P_INITIAL_FINAL); - soundFlagsMap.put("s", P_CONSONANT); - soundFlagsMap.put("ʃ", P_CONSONANT); - soundFlagsMap.put("b", P_CONSONANT); - soundFlagsMap.put("d", P_CONSONANT); - soundFlagsMap.put("g", P_CONSONANT); - soundFlagsMap.put("ʤ", P_CONSONANT); - soundFlagsMap.put("v", P_CONSONANT | P_INITIAL_FINAL); - soundFlagsMap.put("ð", P_CONSONANT | P_INITIAL_FINAL); - soundFlagsMap.put("z", P_CONSONANT); - soundFlagsMap.put("ʒ", P_CONSONANT); - soundFlagsMap.put("m", P_CONSONANT | P_INITIAL_FINAL); - soundFlagsMap.put("n", P_CONSONANT | P_INITIAL_FINAL); - soundFlagsMap.put("ŋ", P_CONSONANT); - soundFlagsMap.put("l", P_CONSONANT | P_INITIAL_FINAL); - soundFlagsMap.put("w", P_CONSONANT); - soundFlagsMap.put("j", P_CONSONANT); - soundFlagsMap.put("h", P_CONSONANT); - soundFlagsMap.put("r", P_CONSONANT); - soundFlagsMap.put("ʔ", P_CONSONANT | P_SPECIAL); - soundFlagsMap.put("ɾ", P_CONSONANT | P_SPECIAL); - soundFlagsMap.put("i", P_VOWEL); - soundFlagsMap.put("ɪ", P_VOWEL); - soundFlagsMap.put("ɛ", P_VOWEL); - soundFlagsMap.put("æ", P_VOWEL); - soundFlagsMap.put("ɑ", P_VOWEL); - soundFlagsMap.put("ɔ", P_VOWEL); - soundFlagsMap.put("ʊ", P_VOWEL); - soundFlagsMap.put("u", P_VOWEL); - soundFlagsMap.put("ʌ", P_VOWEL); - soundFlagsMap.put("ə", P_VOWEL | P_UNSTRESSED | P_SPECIAL); - soundFlagsMap.put("eɪ", P_VOWEL); - soundFlagsMap.put("aɪ", P_VOWEL); - soundFlagsMap.put("aʊ", P_VOWEL); - soundFlagsMap.put("ɔɪ", P_VOWEL); - soundFlagsMap.put("oʊ", P_VOWEL); - soundFlagsMap.put("ɝ", P_VOWEL); - soundFlagsMap.put("ɚ", P_VOWEL | P_UNSTRESSED | P_SPECIAL); - soundFlagsMap.put("ɑr", P_VOWEL); - soundFlagsMap.put("ɛr", P_VOWEL); - soundFlagsMap.put("ɪr", P_VOWEL); - soundFlagsMap.put("ɔr", P_VOWEL); - } - - // return - Pair splitDoubleSound(String s) { - if (isConsonant(s.substring(0, 1))) { - return Pair.create(s.substring(0,1), s.substring(1)); - } else { - return Pair.create(s.substring(s.length()-1), s.substring(0, s.length()-1)); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/aepronunciation/ipa/PracticeContentFragment.java b/app/src/main/java/com/aepronunciation/ipa/PracticeContentFragment.java old mode 100644 new mode 100755 index d895bee..947de14 --- a/app/src/main/java/com/aepronunciation/ipa/PracticeContentFragment.java +++ b/app/src/main/java/com/aepronunciation/ipa/PracticeContentFragment.java @@ -2,7 +2,6 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; @@ -11,10 +10,11 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.Fragment; -import android.support.v4.content.ContextCompat; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.Fragment; +import androidx.core.content.ContextCompat; +import androidx.appcompat.app.AlertDialog; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; @@ -31,12 +31,16 @@ import static com.aepronunciation.ipa.MainActivity.PRACTICE_MODE_IS_SINGLE_KEY; import static com.aepronunciation.ipa.MainActivity.PREFS_NAME; -public class PracticeContentFragment extends Fragment implements View.OnClickListener, - SoundPool.OnLoadCompleteListener, SelectSoundDialogFragment.SelectSoundDialogListener { +public class PracticeContentFragment extends Fragment + implements + View.OnClickListener, + SoundPool.OnLoadCompleteListener, + SelectSoundDialogFragment.SelectSoundDialogListener { public interface PracticeScreenListener { void updateKeyboardKeysFor(SoundMode mode); + void updateKeyboardKeySelectionFor(ArrayList selectedSounds); } @@ -50,8 +54,8 @@ public interface PracticeScreenListener { private TextView tvPercent; private TextView tvWrong; private String currentIpa = ""; - TransitionDrawable rightAnswerTransistion; - TransitionDrawable wrongAnswerTransistion; + TransitionDrawable rightAnswerTransition; + TransitionDrawable wrongAnswerTransition; private static final int SRC_QUALITY = 0; private static final int PRIORITY = 1; private SoundPool soundPool = null; @@ -63,28 +67,30 @@ public interface PracticeScreenListener { private boolean alreadyMadeWrongAnswerForThisIpa = false; ArrayList previouslyChosenVowels; ArrayList previouslyChosenConsonants; + private static final int SOUND_POOL_LOAD_SUCCESS = 0; static final int MINIMUM_POPULATION_SIZE_FOR_WHICH_REPEATS_NOT_ALLOWED = 4; + @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View layout = inflater.inflate(R.layout.fragment_practice_screen, container, false); // create objects - tvInputWindow = (TextView) layout.findViewById(R.id.tvInputWindow); - llInputWindowBorder = (LinearLayout) layout.findViewById(R.id.llInputWindowBorder); - tvPracticeMode = (TextView) layout.findViewById(R.id.tvPracticeMode); - tvRight = (TextView) layout.findViewById(R.id.tvPracticeNumberRight); - tvPercent = (TextView) layout.findViewById(R.id.tvPracticePercentRight); - tvWrong = (TextView) layout.findViewById(R.id.tvPracticeNumberWrong); + tvInputWindow = layout.findViewById(R.id.tvInputWindow); + llInputWindowBorder = layout.findViewById(R.id.llInputWindowBorder); + tvPracticeMode = layout.findViewById(R.id.tvPracticeMode); + tvRight = layout.findViewById(R.id.tvPracticeNumberRight); + tvPercent = layout.findViewById(R.id.tvPracticePercentRight); + tvWrong = layout.findViewById(R.id.tvPracticeNumberWrong); singleSound = new SingleSound(); doubleSound = new DoubleSound(); - RelativeLayout rlPlayButton = (RelativeLayout) layout.findViewById(R.id.playButtonLayout); - RelativeLayout rlSettingsButton = (RelativeLayout) layout.findViewById(R.id.settingsButtonLayout); - RelativeLayout rlTellMeButton = (RelativeLayout) layout.findViewById(R.id.tellMeButtonLayout); - ImageView clearButton = (ImageView) layout.findViewById(R.id.ivClear); + RelativeLayout rlPlayButton = layout.findViewById(R.id.playButtonLayout); + RelativeLayout rlSettingsButton = layout.findViewById(R.id.settingsButtonLayout); + RelativeLayout rlTellMeButton = layout.findViewById(R.id.tellMeButtonLayout); + ImageView clearButton = layout.findViewById(R.id.ivClear); // set listeners rlPlayButton.setOnClickListener(this); @@ -93,21 +99,17 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, clearButton.setOnClickListener(this); // Create the green and red effects for right/wrong answers - Drawable backgrounds[] = new Drawable[2]; - backgrounds[0] = ContextCompat.getDrawable(getActivity(), R.drawable.input_window_normal); - backgrounds[1] = ContextCompat.getDrawable(getActivity(), R.drawable.input_window_right); - rightAnswerTransistion = new TransitionDrawable(backgrounds); - backgrounds[1] = ContextCompat.getDrawable(getActivity(), R.drawable.input_window_wrong); - wrongAnswerTransistion = new TransitionDrawable(backgrounds); + if (getActivity() != null) { + Drawable backgrounds[] = new Drawable[2]; + backgrounds[0] = ContextCompat.getDrawable(getActivity(), R.drawable.input_window_normal); + backgrounds[1] = ContextCompat.getDrawable(getActivity(), R.drawable.input_window_right); + rightAnswerTransition = new TransitionDrawable(backgrounds); + backgrounds[1] = ContextCompat.getDrawable(getActivity(), R.drawable.input_window_wrong); + wrongAnswerTransition = new TransitionDrawable(backgrounds); + } // get saved practice mode - SharedPreferences settings = getActivity().getSharedPreferences(PREFS_NAME, MODE_PRIVATE); - boolean isSingle = settings.getBoolean(PRACTICE_MODE_IS_SINGLE_KEY, true); - if (isSingle) { - practiceMode = SoundMode.Single; - } else { - practiceMode = SoundMode.Double; - } + updatePracticeModeFromSharedPreferences(); // Initialize UI resetToInitialValues(); @@ -144,6 +146,17 @@ public void onAttach(Context context) { } } + private void updatePracticeModeFromSharedPreferences() { + if (getActivity() == null) return; + SharedPreferences settings = getActivity().getSharedPreferences(PREFS_NAME, MODE_PRIVATE); + boolean isSingle = settings.getBoolean(PRACTICE_MODE_IS_SINGLE_KEY, true); + if (isSingle) { + practiceMode = SoundMode.Single; + } else { + practiceMode = SoundMode.Double; + } + } + public void playClick() { @@ -158,10 +171,10 @@ public void playClick() { } // allow repeated sounds for small population sizes - if (practiceMode==SoundMode.Single && + if (practiceMode == SoundMode.Single && singleSound.getSoundCount() < MINIMUM_POPULATION_SIZE_FOR_WHICH_REPEATS_NOT_ALLOWED) { break; - } else if (practiceMode==SoundMode.Double && + } else if (practiceMode == SoundMode.Double && doubleSound.getSoundCount() < MINIMUM_POPULATION_SIZE_FOR_WHICH_REPEATS_NOT_ALLOWED) { break; } @@ -171,7 +184,7 @@ public void playClick() { currentIpa = ipa; readyForNewSound = false; alreadyMadeWrongAnswerForThisIpa = false; - rightAnswerTransistion.resetTransition(); + rightAnswerTransition.resetTransition(); tvInputWindow.setText(""); } @@ -189,7 +202,7 @@ public void tellMeClick() { } tvInputWindow.setText(currentIpa); - animateBackground(true); + animateBackgroundForCorrectAnswer(); playSound(currentIpa); readyForNewSound = true; } @@ -197,7 +210,7 @@ public void tellMeClick() { public void clearClick() { tvInputWindow.setText(""); inputKeyCounter = 0; - rightAnswerTransistion.resetTransition(); + rightAnswerTransition.resetTransition(); } public void onKeyTouched(String keyString) { @@ -207,9 +220,7 @@ public void onKeyTouched(String keyString) { } // don't allow more clicks when green - if (readyForNewSound) { - return; - } + if (readyForNewSound) return; if (practiceMode == SoundMode.Double && inputKeyCounter >= 2) { tvInputWindow.setText(""); @@ -230,8 +241,8 @@ public void onKeyTouched(String keyString) { // check if right or not if (userAnswer.equals(currentIpa)) { - // if right then animate backgound to green and back - animateBackground(true); + // if right then animate background to green and back + animateBackgroundForCorrectAnswer(); // update label if (!alreadyMadeWrongAnswerForThisIpa) { @@ -243,7 +254,7 @@ public void onKeyTouched(String keyString) { } else { // wrong answer // if wrong then animate to red and back - animateBackground(false); + animateBackgroundForWrongAnswer(); // update label if (!alreadyMadeWrongAnswerForThisIpa) { @@ -274,14 +285,10 @@ private void playSound(String ipaSound) { soundId = doubleSound.getSoundResourceId(ipaSound); if (soundId == -1) { - + if (getActivity() == null) return; AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage(Answer.getErrorMessage(getActivity(), ipaSound)); - builder.setPositiveButton(R.string.error_dialog_ok_button, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - // User clicked OK button - } - }); + builder.setPositiveButton(R.string.error_dialog_ok_button, null); AlertDialog dialog = builder.create(); dialog.show(); return; @@ -301,7 +308,7 @@ private void resetToInitialValues() { updateStatLabels(); inputKeyCounter = 0; tvInputWindow.setText(""); - rightAnswerTransistion.resetTransition(); + rightAnswerTransition.resetTransition(); if (practiceMode == SoundMode.Single) { tvPracticeMode.setText(getString(R.string.practice_mode_single)); } else { @@ -310,11 +317,11 @@ private void resetToInitialValues() { } private void updateStatLabels() { - tvRight.setText(Integer.toString(numberCorrect)); - tvWrong.setText(Integer.toString(numberWrong)); + tvRight.setText(String.valueOf(numberCorrect)); + tvWrong.setText(String.valueOf(numberWrong)); if (numberCorrect + numberWrong > 0) { - int percent = (int) (100 * numberCorrect/(double) (numberCorrect + numberWrong)); - tvPercent.setText(Integer.toString(percent) + "%"); + int percent = (int) (100 * numberCorrect / (double) (numberCorrect + numberWrong)); + tvPercent.setText(String.valueOf(percent) + "%"); } else { tvPercent.setText("0%"); } @@ -322,49 +329,46 @@ private void updateStatLabels() { @SuppressWarnings("deprecation") @SuppressLint("NewApi") - private void animateBackground(boolean answerIsCorrect) { - - if (answerIsCorrect) { - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + private void animateBackgroundForCorrectAnswer() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + llInputWindowBorder.setBackground(rightAnswerTransition); + } else { + llInputWindowBorder.setBackgroundDrawable(rightAnswerTransition); + } + rightAnswerTransition.startTransition(300); + } - //tvInputWindow.setBackground(rightAnswerTransistion); - llInputWindowBorder.setBackground(rightAnswerTransistion); - } else { - llInputWindowBorder.setBackgroundDrawable(rightAnswerTransistion); - } + @SuppressWarnings("deprecation") + @SuppressLint("NewApi") + private void animateBackgroundForWrongAnswer() { - rightAnswerTransistion.startTransition(300); - // rightAnswerTransistion.reverseTransition(300); + final int TRANSITION_START_TIME = 300; + final int TRANSITION_REVERSE_TIME = 300; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + llInputWindowBorder.setBackground(wrongAnswerTransition); } else { + llInputWindowBorder.setBackgroundDrawable(wrongAnswerTransition); + } - final int TRANSITION_START_TIME = 300; - final int TRANSITION_REVERSE_TIME = 300; + wrongAnswerTransition.startTransition(300); + wrongAnswerTransition.reverseTransition(300); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - llInputWindowBorder.setBackground(wrongAnswerTransistion); - } else { - llInputWindowBorder.setBackgroundDrawable(wrongAnswerTransistion); + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + tvInputWindow.setText(""); } + }, TRANSITION_START_TIME + TRANSITION_REVERSE_TIME); - wrongAnswerTransistion.startTransition(300); - wrongAnswerTransistion.reverseTransition(300); - - Handler handler = new Handler(); - handler.postDelayed(new Runnable() { - @Override - public void run() { - tvInputWindow.setText(""); - } - }, TRANSITION_START_TIME + TRANSITION_REVERSE_TIME); - } } + @Override public void onLoadComplete(SoundPool sPool, int sid, int status) { - if (status != 0) // 0=success + if (status != SOUND_POOL_LOAD_SUCCESS) return; soundPool.play(sid, 1, 1, PRIORITY, 0, 1.0f); @@ -434,29 +438,31 @@ public void updateUiForSelectedSounds(SoundMode numberSounds, allChosenSounds.addAll(chosenConsonants); if (practiceMode == SoundMode.Double) { if (chosenVowels.isEmpty()) { - allChosenSounds.addAll(PhonemeTable.INSTANCE.getAllVowels()); + allChosenSounds.addAll(Ipa.getAllVowels()); } if (chosenConsonants.isEmpty()) { - allChosenSounds.addAll(PhonemeTable.INSTANCE.getAllConsonants()); + allChosenSounds.addAll(Ipa.getAllConsonants()); } } mListener.updateKeyboardKeySelectionFor(allChosenSounds); // update user preferences and time - SharedPreferences settings = getActivity().getSharedPreferences(PREFS_NAME, MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - StudyTimer timer = StudyTimer.getInstance(); - if (practiceMode == SoundMode.Single) { - editor.putBoolean(PRACTICE_MODE_IS_SINGLE_KEY, true); - timer.start(getActivity(), StudyTimer.StudyType.PracticeSingle); - } else { - editor.putBoolean(PRACTICE_MODE_IS_SINGLE_KEY, false); - timer.start(getActivity(), StudyTimer.StudyType.PracticeDouble); + if (getActivity() != null) { + SharedPreferences settings = getActivity().getSharedPreferences(PREFS_NAME, MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + StudyTimer timer = StudyTimer.getInstance(); + if (practiceMode == SoundMode.Single) { + editor.putBoolean(PRACTICE_MODE_IS_SINGLE_KEY, true); + timer.start(getActivity(), StudyTimer.StudyType.PracticeSingle); + } else { + editor.putBoolean(PRACTICE_MODE_IS_SINGLE_KEY, false); + timer.start(getActivity(), StudyTimer.StudyType.PracticeDouble); + } + editor.apply(); } - editor.apply(); // update practice mode label - if (practiceMode== SoundMode.Single) { + if (practiceMode == SoundMode.Single) { tvPracticeMode.setText(getString(R.string.practice_mode_single)); } else { tvPracticeMode.setText(getString(R.string.practice_mode_double)); @@ -466,12 +472,12 @@ public void updateUiForSelectedSounds(SoundMode numberSounds, if (practiceMode == SoundMode.Single) { singleSound.restrictListTo(chosenConsonants, chosenVowels); } else { // Double - if ((chosenVowels.size()==0 && chosenConsonants.size() == 0) || - (chosenVowels.size() == PhonemeTable.NUMBER_OF_VOWELS_FOR_DOUBLES && - chosenConsonants.size() == PhonemeTable.NUMBER_OF_CONSONANTS_FOR_DOUBLES)) { + if ((chosenVowels.size() == 0 && chosenConsonants.size() == 0) || + (chosenVowels.size() == Ipa.NUMBER_OF_VOWELS_FOR_DOUBLES && + chosenConsonants.size() == Ipa.NUMBER_OF_CONSONANTS_FOR_DOUBLES)) { // all or none selected doubleSound.includeAllSounds(); - } else if (chosenVowels.size()==0 || chosenConsonants.size() == 0) { + } else if (chosenVowels.size() == 0 || chosenConsonants.size() == 0) { // if none of one kind and a few of the other kind, then do inclusive match (any containing pair) doubleSound.restrictListToPairsContainingAtLeastOneSoundFrom(chosenConsonants, chosenVowels); } else { diff --git a/app/src/main/java/com/aepronunciation/ipa/PracticeFragment.java b/app/src/main/java/com/aepronunciation/ipa/PracticeFragment.java old mode 100644 new mode 100755 index 83543a6..1fe52d6 --- a/app/src/main/java/com/aepronunciation/ipa/PracticeFragment.java +++ b/app/src/main/java/com/aepronunciation/ipa/PracticeFragment.java @@ -1,8 +1,9 @@ package com.aepronunciation.ipa; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -16,12 +17,12 @@ public class PracticeFragment extends Fragment implements PracticeContentFragmen KeyboardFragment childKeyboardFragment; @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_fragment_practice, container, false); } @Override - public void onViewCreated(View view, Bundle savedInstanceState) { + public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); childPracticeFragment = new PracticeContentFragment(); @@ -34,7 +35,7 @@ public void onViewCreated(View view, Bundle savedInstanceState) { // required method for PracticeContentFragment.PracticeScreenListener @Override public void updateKeyboardKeysFor(SoundMode mode) { - // find the currect fragment and then perform the appropriate action on it + // find the correct fragment and then perform the appropriate action on it Fragment f = getChildFragmentManager().findFragmentById(R.id.keyboard_frame); if (f instanceof KeyboardFragment) { // update display diff --git a/app/src/main/java/com/aepronunciation/ipa/SelectSoundDialogFragment.java b/app/src/main/java/com/aepronunciation/ipa/SelectSoundDialogFragment.java old mode 100644 new mode 100755 index 457e93f..35855e8 --- a/app/src/main/java/com/aepronunciation/ipa/SelectSoundDialogFragment.java +++ b/app/src/main/java/com/aepronunciation/ipa/SelectSoundDialogFragment.java @@ -6,9 +6,9 @@ import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.appcompat.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; @@ -45,7 +45,7 @@ void onDialogPositiveClick( CheckBox cbConsonantsCategory; CheckBox[] checkBoxesVowels; CheckBox[] checkBoxesConsonants; - CheckBox cbShwua; + CheckBox cbSchwa; CheckBox cbUnstressedEr; CheckBox cbGlottalStop; CheckBox cbFlapT; @@ -59,12 +59,12 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.dialog_select_sound, null); - rbSingle = (RadioButton) view.findViewById(R.id.radio_single); - rbDouble = (RadioButton) view.findViewById(R.id.radio_double); - cbShwua = (CheckBox) view.findViewById(R.id.cb_shwua); - cbUnstressedEr = (CheckBox) view.findViewById(R.id.cb_er_unstressed); - cbGlottalStop = (CheckBox) view.findViewById(R.id.cb_glottal_stop); - cbFlapT = (CheckBox) view.findViewById(R.id.cb_flap_t); + rbSingle = view.findViewById(R.id.radio_single); + rbDouble = view.findViewById(R.id.radio_double); + cbSchwa = view.findViewById(R.id.cb_shwua); + cbUnstressedEr = view.findViewById(R.id.cb_er_unstressed); + cbGlottalStop = view.findViewById(R.id.cb_glottal_stop); + cbFlapT = view.findViewById(R.id.cb_flap_t); // get saved practice mode SharedPreferences settings = getActivity().getSharedPreferences(PREFS_NAME, MODE_PRIVATE); @@ -73,7 +73,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { rbSingle.setChecked(true); } else { rbDouble.setChecked(true); - cbShwua.setVisibility(View.GONE); + cbSchwa.setVisibility(View.GONE); cbUnstressedEr.setVisibility(View.GONE); cbGlottalStop.setVisibility(View.GONE); cbFlapT.setVisibility(View.GONE); @@ -81,7 +81,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { initializeCheckBoxes(view); - final RadioGroup rg = (RadioGroup) view.findViewById(R.id.select_sounds_radio_group); + final RadioGroup rg = view.findViewById(R.id.select_sounds_radio_group); rg.setOnCheckedChangeListener(radioGroupListener); // disable the OK button @@ -144,7 +144,7 @@ public void onResume() { @Override public void onClick(View v) { SoundMode soundType = SoundMode.Double; - RadioButton single = (RadioButton) alertDialog.findViewById(R.id.radio_single); + RadioButton single = alertDialog.findViewById(R.id.radio_single); if (single != null && single.isChecked()) { soundType = SoundMode.Single; } @@ -175,63 +175,63 @@ private void initializeCheckBoxes(View layout) { checkBoxesVowels = new CheckBox[]{ - (CheckBox) layout.findViewById(R.id.cb_i), - (CheckBox) layout.findViewById(R.id.cb_i_short), - (CheckBox) layout.findViewById(R.id.cb_e_short), - (CheckBox) layout.findViewById(R.id.cb_ae), - (CheckBox) layout.findViewById(R.id.cb_a), - (CheckBox) layout.findViewById(R.id.cb_c_backwards), - (CheckBox) layout.findViewById(R.id.cb_u_short), - (CheckBox) layout.findViewById(R.id.cb_u), - (CheckBox) layout.findViewById(R.id.cb_v_upsidedown), - cbShwua, - (CheckBox) layout.findViewById(R.id.cb_ei), - (CheckBox) layout.findViewById(R.id.cb_ai), - (CheckBox) layout.findViewById(R.id.cb_au), - (CheckBox) layout.findViewById(R.id.cb_oi), - (CheckBox) layout.findViewById(R.id.cb_ou), - (CheckBox) layout.findViewById(R.id.cb_er_stressed), + layout.findViewById(R.id.cb_i), + layout.findViewById(R.id.cb_i_short), + layout.findViewById(R.id.cb_e_short), + layout.findViewById(R.id.cb_ae), + layout.findViewById(R.id.cb_a), + layout.findViewById(R.id.cb_c_backwards), + layout.findViewById(R.id.cb_u_short), + layout.findViewById(R.id.cb_u), + layout.findViewById(R.id.cb_v_upsidedown), + cbSchwa, + layout.findViewById(R.id.cb_ei), + layout.findViewById(R.id.cb_ai), + layout.findViewById(R.id.cb_au), + layout.findViewById(R.id.cb_oi), + layout.findViewById(R.id.cb_ou), + layout.findViewById(R.id.cb_er_stressed), cbUnstressedEr, - (CheckBox) layout.findViewById(R.id.cb_ar), - (CheckBox) layout.findViewById(R.id.cb_er), - (CheckBox) layout.findViewById(R.id.cb_ir), - (CheckBox) layout.findViewById(R.id.cb_or) + layout.findViewById(R.id.cb_ar), + layout.findViewById(R.id.cb_er), + layout.findViewById(R.id.cb_ir), + layout.findViewById(R.id.cb_or) }; checkBoxesConsonants = new CheckBox[]{ - (CheckBox) layout.findViewById(R.id.cb_p), - (CheckBox) layout.findViewById(R.id.cb_b), - (CheckBox) layout.findViewById(R.id.cb_t), - (CheckBox) layout.findViewById(R.id.cb_d), - (CheckBox) layout.findViewById(R.id.cb_k), - (CheckBox) layout.findViewById(R.id.cb_g), - (CheckBox) layout.findViewById(R.id.cb_ch), - (CheckBox) layout.findViewById(R.id.cb_dzh), - (CheckBox) layout.findViewById(R.id.cb_f), - (CheckBox) layout.findViewById(R.id.cb_v), - (CheckBox) layout.findViewById(R.id.cb_th_voiceless), - (CheckBox) layout.findViewById(R.id.cb_th_voiced), - (CheckBox) layout.findViewById(R.id.cb_s), - (CheckBox) layout.findViewById(R.id.cb_z), - (CheckBox) layout.findViewById(R.id.cb_sh), - (CheckBox) layout.findViewById(R.id.cb_zh), - (CheckBox) layout.findViewById(R.id.cb_m), - (CheckBox) layout.findViewById(R.id.cb_n), - (CheckBox) layout.findViewById(R.id.cb_ng), - (CheckBox) layout.findViewById(R.id.cb_l), - (CheckBox) layout.findViewById(R.id.cb_w), - (CheckBox) layout.findViewById(R.id.cb_j), - (CheckBox) layout.findViewById(R.id.cb_h), - (CheckBox) layout.findViewById(R.id.cb_r), + layout.findViewById(R.id.cb_p), + layout.findViewById(R.id.cb_b), + layout.findViewById(R.id.cb_t), + layout.findViewById(R.id.cb_d), + layout.findViewById(R.id.cb_k), + layout.findViewById(R.id.cb_g), + layout.findViewById(R.id.cb_ch), + layout.findViewById(R.id.cb_dzh), + layout.findViewById(R.id.cb_f), + layout.findViewById(R.id.cb_v), + layout.findViewById(R.id.cb_th_voiceless), + layout.findViewById(R.id.cb_th_voiced), + layout.findViewById(R.id.cb_s), + layout.findViewById(R.id.cb_z), + layout.findViewById(R.id.cb_sh), + layout.findViewById(R.id.cb_zh), + layout.findViewById(R.id.cb_m), + layout.findViewById(R.id.cb_n), + layout.findViewById(R.id.cb_ng), + layout.findViewById(R.id.cb_l), + layout.findViewById(R.id.cb_w), + layout.findViewById(R.id.cb_j), + layout.findViewById(R.id.cb_h), + layout.findViewById(R.id.cb_r), cbGlottalStop, cbFlapT }; - if (checkBoxesConsonants.length != PhonemeTable.NUMBER_OF_CONSONANTS || - checkBoxesVowels.length != PhonemeTable.NUMBER_OF_VOWELS) { + if (checkBoxesConsonants.length != Ipa.NUMBER_OF_CONSONANTS || + checkBoxesVowels.length != Ipa.NUMBER_OF_VOWELS) { throw new RuntimeException("update number of checkboxes if vowels or consonant number changes"); } - cbVowelsCategory = (CheckBox) layout.findViewById(R.id.cbVowels); - cbConsonantsCategory = (CheckBox) layout.findViewById(R.id.cbConsonants); + cbVowelsCategory = layout.findViewById(R.id.cbVowels); + cbConsonantsCategory = layout.findViewById(R.id.cbConsonants); // get saved settings @@ -321,14 +321,14 @@ public void onCheckedChanged(RadioGroup radioGroup, int checkedId) { switch (checkedId) { case R.id.radio_single: // show optional sounds (unstressed er, shwua, glottal stop and flap t) - cbShwua.setVisibility(View.VISIBLE); + cbSchwa.setVisibility(View.VISIBLE); cbUnstressedEr.setVisibility(View.VISIBLE); cbGlottalStop.setVisibility(View.VISIBLE); cbFlapT.setVisibility(View.VISIBLE); break; case R.id.radio_double: // hide optional sounds - cbShwua.setVisibility(View.GONE); + cbSchwa.setVisibility(View.GONE); cbUnstressedEr.setVisibility(View.GONE); cbGlottalStop.setVisibility(View.GONE); cbFlapT.setVisibility(View.GONE); @@ -379,7 +379,7 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { private boolean getButtonShouldBeEnabledState() { - // count the number of checked boxes for conconants and vowels + // count the number of checked boxes for consonants and vowels int vowelsChecked = 0; for (CheckBox cb : checkBoxesVowels) { if (cb.isChecked() && cb.getVisibility() == View.VISIBLE) { diff --git a/app/src/main/java/com/aepronunciation/ipa/SingleSound.java b/app/src/main/java/com/aepronunciation/ipa/SingleSound.java old mode 100644 new mode 100755 diff --git a/app/src/main/java/com/aepronunciation/ipa/SoundMode.java b/app/src/main/java/com/aepronunciation/ipa/SoundMode.java old mode 100644 new mode 100755 diff --git a/app/src/main/java/com/aepronunciation/ipa/SpecialSound.java b/app/src/main/java/com/aepronunciation/ipa/SpecialSound.java deleted file mode 100644 index cda3fbd..0000000 --- a/app/src/main/java/com/aepronunciation/ipa/SpecialSound.java +++ /dev/null @@ -1,217 +0,0 @@ -package com.aepronunciation.ipa; - -import java.util.ArrayList; -import java.util.LinkedHashMap; - -import android.text.TextUtils; - -class SpecialSound { - - // These are double sounds that are used in the learning tab but not in - // the practice or tests. - - // private class variables - private LinkedHashMap glottalHashMap; - private LinkedHashMap flapHashMap; - private LinkedHashMap shwuaHashMap; - private LinkedHashMap erUnstressedHashMap; - private ArrayList doubleSounds; - - private static final String FLAP_T = "ɾ"; - private static final String GLOTTAL_STOP = "ʔ"; - private static final String SHWUA = "ə"; - private static final String ER_UNSTRESSED = "ɚ"; - - // constructor - SpecialSound() { - initTreeMap(); - } - - - void loadSoundsFor(String ipa) { - - // error checking - if (TextUtils.isEmpty(ipa)) { - return; - } - - if (ipa.equals(GLOTTAL_STOP)) { - doubleSounds = new ArrayList<>(glottalHashMap.keySet()); - } else if (ipa.equals(FLAP_T)) { - doubleSounds = new ArrayList<>(flapHashMap.keySet()); - } else if (ipa.equals(SHWUA)) { - doubleSounds = new ArrayList<>(shwuaHashMap.keySet()); - } else if (ipa.equals(ER_UNSTRESSED)) { - doubleSounds = new ArrayList<>(erUnstressedHashMap.keySet()); - } - - } - - - int getSoundResourceId(String doubleSoundIpa) { - - // returns null if no value found - if (glottalHashMap.containsKey(doubleSoundIpa)) { - return glottalHashMap.get(doubleSoundIpa); - } else if (flapHashMap.containsKey(doubleSoundIpa)) { - return flapHashMap.get(doubleSoundIpa); - } else if (shwuaHashMap.containsKey(doubleSoundIpa)) { - return shwuaHashMap.get(doubleSoundIpa); - } else if (erUnstressedHashMap.containsKey(doubleSoundIpa)) { - return erUnstressedHashMap.get(doubleSoundIpa); - }else{ - return -1; - } - - } - - public ArrayList getSounds() { - if (doubleSounds == null) { - doubleSounds = new ArrayList<>(); - } - return doubleSounds; - } - - // initialize the hashMap when new object created - private void initTreeMap() { - - glottalHashMap = new LinkedHashMap<>(); - - glottalHashMap.put("iʔ", R.raw.double_i_glottal); - glottalHashMap.put("ɪʔ", R.raw.double_is_glottal); - glottalHashMap.put("eɪʔ", R.raw.double_ei_glottal); - glottalHashMap.put("ɛʔ", R.raw.double_e_glottal); - glottalHashMap.put("æʔ", R.raw.double_ae_glottal); - glottalHashMap.put("ɑʔ", R.raw.double_a_glottal); - glottalHashMap.put("ɔʔ", R.raw.double_c_glottal); - glottalHashMap.put("oʊʔ", R.raw.double_ou_glottal); - glottalHashMap.put("ʊʔ", R.raw.double_us_glottal); - glottalHashMap.put("uʔ", R.raw.double_u_glottal); - glottalHashMap.put("ʌʔ", R.raw.double_vu_glottal); - glottalHashMap.put("aɪʔ", R.raw.double_ai_glottal); - glottalHashMap.put("aʊʔ", R.raw.double_au_glottal); - glottalHashMap.put("ɔɪʔ", R.raw.double_oi_glottal); - glottalHashMap.put("ɝʔ", R.raw.double_ers_glottal); - glottalHashMap.put("ɑrʔ", R.raw.double_ar_glottal); - glottalHashMap.put("ɛrʔ", R.raw.double_er_glottal); - glottalHashMap.put("ɪrʔ", R.raw.double_ir_glottal); - glottalHashMap.put("ɔrʔ", R.raw.double_or_glottal); - - - flapHashMap = new LinkedHashMap<>(); - - flapHashMap.put("ˈiɾə", R.raw.double_i_flap_shwua); - flapHashMap.put("ˈɪɾə", R.raw.double_is_flap_shwua); - flapHashMap.put("ˈeɪɾə", R.raw.double_ei_flap_shwua); - flapHashMap.put("ˈɛɾə", R.raw.double_e_flap_shwua); - flapHashMap.put("ˈæɾə", R.raw.double_ae_flap_shwua); - flapHashMap.put("ˈɑɾə", R.raw.double_a_flap_shwua); - flapHashMap.put("ˈɔɾə", R.raw.double_c_flap_shwua); - flapHashMap.put("ˈoʊɾə", R.raw.double_ou_flap_shwua); - flapHashMap.put("ˈʊɾə", R.raw.double_us_flap_shwua); - flapHashMap.put("ˈuɾə", R.raw.double_u_flap_shwua); - flapHashMap.put("ˈʌɾə", R.raw.double_vu_flap_shwua); - flapHashMap.put("ˈaɪɾə", R.raw.double_ai_flap_shwua); - flapHashMap.put("ˈaʊɾə", R.raw.double_au_flap_shwua); - flapHashMap.put("ˈɔɪɾə", R.raw.double_oi_flap_shwua); - flapHashMap.put("ˈɝɾə", R.raw.double_ers_flap_shwua); - flapHashMap.put("ˈɑrɾə", R.raw.double_ar_flap_shwua); - flapHashMap.put("ˈɛrɾə", R.raw.double_er_flap_shwua); - flapHashMap.put("ˈɪrɾə", R.raw.double_ir_flap_shwua); - flapHashMap.put("ˈɔrɾə", R.raw.double_or_flap_shwua); - - shwuaHashMap = new LinkedHashMap<>(); - - shwuaHashMap.put("pə", R.raw.double_p_shwua); - shwuaHashMap.put("tə", R.raw.double_t_shwua); - shwuaHashMap.put("kə", R.raw.double_k_shwua); - shwuaHashMap.put("ʧə", R.raw.double_ch_shwua); - shwuaHashMap.put("fə", R.raw.double_f_shwua); - shwuaHashMap.put("θə", R.raw.double_th_shwua); - shwuaHashMap.put("sə", R.raw.double_s_shwua); - shwuaHashMap.put("ʃə", R.raw.double_sh_shwua); - shwuaHashMap.put("bə", R.raw.double_b_shwua); - shwuaHashMap.put("də", R.raw.double_d_shwua); - shwuaHashMap.put("gə", R.raw.double_g_shwua); - shwuaHashMap.put("ʤə", R.raw.double_dzh_shwua); - shwuaHashMap.put("və", R.raw.double_v_shwua); - shwuaHashMap.put("ðə", R.raw.double_thv_shwua); - shwuaHashMap.put("zə", R.raw.double_z_shwua); - shwuaHashMap.put("ʒə", R.raw.double_zh_shwua); - shwuaHashMap.put("mə", R.raw.double_m_shwua); - shwuaHashMap.put("nə", R.raw.double_n_shwua); - shwuaHashMap.put("lə", R.raw.double_l_shwua); - shwuaHashMap.put("wə", R.raw.double_w_shwua); - shwuaHashMap.put("jə", R.raw.double_j_shwua); - shwuaHashMap.put("hə", R.raw.double_h_shwua); - shwuaHashMap.put("rə", R.raw.double_r_shwua); - shwuaHashMap.put("əp", R.raw.double_shwua_p); - shwuaHashMap.put("ət", R.raw.double_shwua_t); - shwuaHashMap.put("ək", R.raw.double_shwua_k); - shwuaHashMap.put("əʧ", R.raw.double_shwua_ch); - shwuaHashMap.put("əf", R.raw.double_shwua_f); - shwuaHashMap.put("əθ", R.raw.double_shwua_th); - shwuaHashMap.put("əs", R.raw.double_shwua_s); - shwuaHashMap.put("əʃ", R.raw.double_shwua_sh); - shwuaHashMap.put("əb", R.raw.double_shwua_b); - shwuaHashMap.put("əd", R.raw.double_shwua_d); - shwuaHashMap.put("əg", R.raw.double_shwua_g); - shwuaHashMap.put("əʤ", R.raw.double_shwua_dzh); - shwuaHashMap.put("əv", R.raw.double_shwua_v); - shwuaHashMap.put("əð", R.raw.double_shwua_thv); - shwuaHashMap.put("əz", R.raw.double_shwua_z); - shwuaHashMap.put("əʒ", R.raw.double_shwua_zh); - shwuaHashMap.put("əm", R.raw.double_shwua_m); - shwuaHashMap.put("ən", R.raw.double_shwua_n); - shwuaHashMap.put("əŋ", R.raw.double_shwua_ng); - shwuaHashMap.put("əl", R.raw.double_shwua_l); - - erUnstressedHashMap = new LinkedHashMap<>(); - - erUnstressedHashMap.put("pɚ", R.raw.double_p_eru); - erUnstressedHashMap.put("tɚ", R.raw.double_t_eru); - erUnstressedHashMap.put("kɚ", R.raw.double_k_eru); - erUnstressedHashMap.put("ʧɚ", R.raw.double_ch_eru); - erUnstressedHashMap.put("fɚ", R.raw.double_f_eru); - erUnstressedHashMap.put("θɚ", R.raw.double_th_eru); - erUnstressedHashMap.put("sɚ", R.raw.double_s_eru); - erUnstressedHashMap.put("ʃɚ", R.raw.double_sh_eru); - erUnstressedHashMap.put("bɚ", R.raw.double_b_eru); - erUnstressedHashMap.put("dɚ", R.raw.double_d_eru); - erUnstressedHashMap.put("gɚ", R.raw.double_g_eru); - erUnstressedHashMap.put("ʤɚ", R.raw.double_dzh_eru); - erUnstressedHashMap.put("vɚ", R.raw.double_v_eru); - erUnstressedHashMap.put("ðɚ", R.raw.double_thv_eru); - erUnstressedHashMap.put("zɚ", R.raw.double_z_eru); - erUnstressedHashMap.put("ʒɚ", R.raw.double_zh_eru); - erUnstressedHashMap.put("mɚ", R.raw.double_m_eru); - erUnstressedHashMap.put("nɚ", R.raw.double_n_eru); - erUnstressedHashMap.put("lɚ", R.raw.double_l_eru); - erUnstressedHashMap.put("wɚ", R.raw.double_w_eru); - erUnstressedHashMap.put("jɚ", R.raw.double_j_eru); - erUnstressedHashMap.put("hɚ", R.raw.double_h_eru); - erUnstressedHashMap.put("rɚ", R.raw.double_r_eru); - erUnstressedHashMap.put("ɚp", R.raw.double_eru_p); - erUnstressedHashMap.put("ɚt", R.raw.double_eru_t); - erUnstressedHashMap.put("ɚk", R.raw.double_eru_k); - erUnstressedHashMap.put("ɚʧ", R.raw.double_eru_ch); - erUnstressedHashMap.put("ɚf", R.raw.double_eru_f); - erUnstressedHashMap.put("ɚθ", R.raw.double_eru_th); - erUnstressedHashMap.put("ɚs", R.raw.double_eru_s); - erUnstressedHashMap.put("ɚʃ", R.raw.double_eru_sh); - erUnstressedHashMap.put("ɚb", R.raw.double_eru_b); - erUnstressedHashMap.put("ɚd", R.raw.double_eru_d); - erUnstressedHashMap.put("ɚg", R.raw.double_eru_g); - erUnstressedHashMap.put("ɚʤ", R.raw.double_eru_dzh); - erUnstressedHashMap.put("ɚv", R.raw.double_eru_v); - erUnstressedHashMap.put("ɚð", R.raw.double_eru_thv); - erUnstressedHashMap.put("ɚz", R.raw.double_eru_z); - erUnstressedHashMap.put("ɚʒ", R.raw.double_eru_zh); - erUnstressedHashMap.put("ɚm", R.raw.double_eru_m); - erUnstressedHashMap.put("ɚn", R.raw.double_eru_n); - erUnstressedHashMap.put("ɚŋ", R.raw.double_eru_ng); - erUnstressedHashMap.put("ɚl", R.raw.double_eru_l); - - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/aepronunciation/ipa/StudyTimer.java b/app/src/main/java/com/aepronunciation/ipa/StudyTimer.java old mode 100644 new mode 100755 diff --git a/app/src/main/java/com/aepronunciation/ipa/Test.java b/app/src/main/java/com/aepronunciation/ipa/Test.java old mode 100644 new mode 100755 index b384362..38e3a18 --- a/app/src/main/java/com/aepronunciation/ipa/Test.java +++ b/app/src/main/java/com/aepronunciation/ipa/Test.java @@ -11,7 +11,7 @@ public class Test { private int score; private String correctAnswers; private String userAnswers; - private String wrong; + //private String wrong; // constructor public Test() {} @@ -49,10 +49,6 @@ String getUserAnswers() { return userAnswers; } - String getWrong() { - return wrong; - } - // setters void setId(long id) { this.id = id; @@ -86,8 +82,4 @@ void setUserAnswers(String userAnswers) { this.userAnswers = userAnswers; } - void setWrong(String wrong) { - this.wrong = wrong; - } - } \ No newline at end of file diff --git a/app/src/main/java/com/aepronunciation/ipa/TestActivity.java b/app/src/main/java/com/aepronunciation/ipa/TestActivity.java old mode 100644 new mode 100755 index 4325897..b779615 --- a/app/src/main/java/com/aepronunciation/ipa/TestActivity.java +++ b/app/src/main/java/com/aepronunciation/ipa/TestActivity.java @@ -4,9 +4,9 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.os.Bundle; -import android.support.v4.app.FragmentTransaction; -import android.support.v4.app.Fragment; -import android.support.v7.app.AppCompatActivity; +import androidx.fragment.app.FragmentTransaction; +import androidx.fragment.app.Fragment; +import androidx.appcompat.app.AppCompatActivity; import static com.aepronunciation.ipa.MainActivity.NUMBER_OF_QUESTIONS_KEY; import static com.aepronunciation.ipa.MainActivity.TEST_MODE_KEY; @@ -52,7 +52,7 @@ protected void onCreate(Bundle savedInstanceState) { @Override public void onKeyTouched(String keyString) { - // find the currect fragment and then perform the appropriate action on it + // find the correct fragment and then perform the appropriate action on it Fragment f = getSupportFragmentManager().findFragmentById(R.id.test_content_frame); if (f instanceof TestContentFragment) { // update display diff --git a/app/src/main/java/com/aepronunciation/ipa/TestContentFragment.java b/app/src/main/java/com/aepronunciation/ipa/TestContentFragment.java old mode 100644 new mode 100755 index 000615f..503bb86 --- a/app/src/main/java/com/aepronunciation/ipa/TestContentFragment.java +++ b/app/src/main/java/com/aepronunciation/ipa/TestContentFragment.java @@ -4,7 +4,8 @@ import android.media.AudioManager; import android.media.SoundPool; import android.os.Bundle; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; @@ -32,7 +33,6 @@ public class TestContentFragment extends Fragment implements View.OnClickListene private DoubleSound doubleSound; private TextView tvInputWindow; private TextView tvQuestionNumber; - private RelativeLayout playButton; private RelativeLayout nextButton; private String currentIpa = ""; private static final int SRC_QUALITY = 0; @@ -43,31 +43,36 @@ public class TestContentFragment extends Fragment implements View.OnClickListene int questionNumber = 0; // zero based long startTime; - // single only keys - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View layout = inflater.inflate(R.layout.fragment_test_content, container, false); // get arguments - studentName = getArguments().getString(TEST_NAME_KEY); - totalNumberOfQuestions = getArguments().getInt(NUMBER_OF_QUESTIONS_KEY, 50); - testMode = SoundMode.fromString(getArguments().getString(TEST_MODE_KEY)); + if (getArguments() == null) { + studentName = getString(R.string.test_default_name); + totalNumberOfQuestions = 50; + testMode = SoundMode.Single; + } else { + studentName = getArguments().getString(TEST_NAME_KEY); + totalNumberOfQuestions = getArguments().getInt(NUMBER_OF_QUESTIONS_KEY, 50); + testMode = SoundMode.fromString(getArguments().getString(TEST_MODE_KEY)); + } + // 2D answer array initialization answers = new ArrayList<>(); // create objects - tvQuestionNumber = (TextView) layout.findViewById(R.id.tvQuestionNumber); - tvInputWindow = (TextView) layout.findViewById(R.id.tvInputWindow); - playButton = (RelativeLayout) layout.findViewById(R.id.playButtonLayout); - nextButton = (RelativeLayout) layout.findViewById(R.id.nextButtonLayout); - ImageView clearButton = (ImageView) layout.findViewById(R.id.ivClear); + tvQuestionNumber = layout.findViewById(R.id.tvQuestionNumber); + tvInputWindow = layout.findViewById(R.id.tvInputWindow); + RelativeLayout playButton = layout.findViewById(R.id.playButtonLayout); + nextButton = layout.findViewById(R.id.nextButtonLayout); + ImageView clearButton = layout.findViewById(R.id.ivClear); // set mode label - TextView tvPracticeMode = (TextView) layout.findViewById(R.id.tvTestMode); + TextView tvPracticeMode = layout.findViewById(R.id.tvTestMode); if (testMode == SoundMode.Single) { tvPracticeMode.setText(getString(R.string.practice_mode_single)); } else { @@ -82,10 +87,15 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, nextButton.setOnClickListener(this); clearButton.setOnClickListener(this); - // question number - tvQuestionNumber.setText(Integer.toString(questionNumber + 1)); + // disable sound effects + playButton.setSoundEffectsEnabled(false); + nextButton.setSoundEffectsEnabled(false); + clearButton.setSoundEffectsEnabled(false); - // start timing the test (seperate from StudyTimer + // get ready to play first sound + prepareForNextSound(); + + // start timing the test (separate from StudyTimer) if (savedInstanceState == null) { startTime = System.nanoTime(); } @@ -127,25 +137,30 @@ public void onPause() { public void playClick() { if (readyForNewSound) { - - - String ipa; - do { - if (testMode == SoundMode.Single) { - ipa = singleSound.getRandomIpa(); - } else { - ipa = doubleSound.getRandomIpa(); - } - } while (currentIpa.equals(ipa)); // don't allow repeat questions - - - currentIpa = ipa; - readyForNewSound = false; - tvInputWindow.setText(""); + prepareForNextSound(); + return; } playSound(currentIpa); + } + private void prepareForNextSound() { + currentIpa = getRandomIpa(); + readyForNewSound = false; + tvInputWindow.setText(""); + tvQuestionNumber.setText(String.valueOf(questionNumber + 1)); + } + + private String getRandomIpa() { + String ipa; + do { + if (testMode == SoundMode.Single) { + ipa = singleSound.getRandomIpa(); + } else { + ipa = doubleSound.getRandomIpa(); + } + } while (currentIpa.equals(ipa)); // don't allow repeat questions + return ipa; } public void clearClick() { @@ -156,6 +171,7 @@ public void clearClick() { } public void nextClick() { + if (getActivity() == null) return; String userAnswer = tvInputWindow.getText().toString(); @@ -186,10 +202,9 @@ public void nextClick() { } else { // Auto play next sound - playButton.performClick(); - tvQuestionNumber.setText(Integer.toString(questionNumber + 1)); + prepareForNextSound(); + playSound(currentIpa); } - } private void playSound(String ipaSound) { @@ -226,7 +241,8 @@ public void onKeyTouched(String keyString) { } else if (testMode == SoundMode.Double && inputKeyCounter <= 2) { String oldText = tvInputWindow.getText().toString(); - tvInputWindow.setText(oldText + keyString); + String newText = oldText + keyString; + tvInputWindow.setText(newText); if (TextUtils.isEmpty(oldText)) return; } nextButton.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/com/aepronunciation/ipa/TestFragment.java b/app/src/main/java/com/aepronunciation/ipa/TestFragment.java old mode 100644 new mode 100755 index 8ae7320..0957272 --- a/app/src/main/java/com/aepronunciation/ipa/TestFragment.java +++ b/app/src/main/java/com/aepronunciation/ipa/TestFragment.java @@ -3,7 +3,8 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; @@ -32,15 +33,16 @@ public class TestFragment extends Fragment implements View.OnClickListener { SharedPreferences settings; @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab_fragment_test, container, false); // setup name + if (getActivity() == null) return view; SharedPreferences settings = getActivity().getSharedPreferences(PREFS_NAME, MODE_PRIVATE); String defaultName = getString(R.string.test_default_name); String name = settings.getString(TEST_NAME_KEY, defaultName); - etName = (EditText) view.findViewById(R.id.etName); + etName = view.findViewById(R.id.etName); if (!name.equals(defaultName)) { etName.setText(name); etName.clearFocus(); @@ -48,8 +50,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa // set up test mode String testModeString = settings.getString(TEST_MODE_KEY, SoundMode.Single.getPersistentMemoryString()); - rbSingle = (RadioButton) view.findViewById(R.id.rbTestSetupSingle); - RadioButton rbDouble = (RadioButton) view.findViewById(R.id.rbTestSetupDouble); + rbSingle = view.findViewById(R.id.rbTestSetupSingle); + RadioButton rbDouble = view.findViewById(R.id.rbTestSetupDouble); if (testModeString.equals(SoundMode.Double.getPersistentMemoryString())) { rbDouble.setChecked(true); } else { // default @@ -57,7 +59,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa } // Setup spinner - spinner = (Spinner) view.findViewById(R.id.spinnerQuestions); + spinner = view.findViewById(R.id.spinnerQuestions); ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(), R.array.listvalues, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); @@ -68,7 +70,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa spinner.setSelection(spinnerPosition); // begin button - RelativeLayout beginButton = (RelativeLayout) view.findViewById(R.id.beginButtonLayout); + RelativeLayout beginButton = view.findViewById(R.id.beginButtonLayout); beginButton.setOnClickListener(this); return view; @@ -95,12 +97,15 @@ public void beginClick() { } // Save to preferences - settings = getActivity().getSharedPreferences(PREFS_NAME, MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - editor.putString(NUMBER_OF_QUESTIONS_KEY, questions); - editor.putString(TEST_MODE_KEY, testModeString); - editor.putString(TEST_NAME_KEY, name); - editor.apply(); + if (getActivity() != null) { + settings = getActivity().getSharedPreferences(PREFS_NAME, MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putString(NUMBER_OF_QUESTIONS_KEY, questions); + editor.putString(TEST_MODE_KEY, testModeString); + editor.putString(TEST_NAME_KEY, name); + editor.apply(); + } + // Start test activity Intent intent = new Intent(getActivity(), TestActivity.class); diff --git a/app/src/main/java/com/aepronunciation/ipa/TestResultsActivity.java b/app/src/main/java/com/aepronunciation/ipa/TestResultsActivity.java old mode 100644 new mode 100755 index d7f7cdb..a3ed017 --- a/app/src/main/java/com/aepronunciation/ipa/TestResultsActivity.java +++ b/app/src/main/java/com/aepronunciation/ipa/TestResultsActivity.java @@ -7,12 +7,15 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.appcompat.widget.Toolbar; + import java.text.DateFormat; + +import android.util.Pair; import android.view.MenuItem; import android.view.View; import android.widget.RelativeLayout; @@ -34,21 +37,11 @@ public class TestResultsActivity extends AppCompatActivity implements TestResultsRecyclerViewAdapter.ItemClickListener, SoundPool.OnLoadCompleteListener { - // Wrong answers are stored in a string in the following format - // ipa + # + times wrong + ; substituted ipa + # times substituted + , - // example: ɪ#3;i#2;ɛ#1,f#1;θ#1 - // comma (,) separates each main sound that was gotten wrong - // semicolon (;) separates main sound from substituted sounds - // first sound is always main, following are all subs - // number sign (#) separates ipa sounds from their count values - - //ListView listView; - private static String userName; - private static long timeLength; - public static SoundMode testMode; - private static int score; - private static ArrayList answers; - private static StringBuilder wrong; + private String userName; + private long timeLength; + private SoundMode testMode; + private int score; + private ArrayList answers; private TestResultsRecyclerViewAdapter adapter; private static final int SRC_QUALITY = 0; @@ -63,10 +56,10 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test_results); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // add back arrow to toolbar - if (getSupportActionBar() != null){ + if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); } @@ -80,14 +73,14 @@ protected void onCreate(Bundle savedInstanceState) { .getParcelableArrayList("com.aepronunciation.ipa.testAnswers"); // create objects - TextView tvName = (TextView) findViewById(R.id.tvResultName); - TextView tvDate = (TextView) findViewById(R.id.tvResultDate); - TextView tvPercent = (TextView) findViewById(R.id.tvResultPercent); - TextView tvCorrect = (TextView) findViewById(R.id.tvResultCorrect); - TextView tvWrong = (TextView) findViewById(R.id.tvResultWrong); - TextView tvTime = (TextView) findViewById(R.id.tvResultTime); - - RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvTestResults); + TextView tvName = findViewById(R.id.tvResultName); + TextView tvDate = findViewById(R.id.tvResultDate); + TextView tvPercent = findViewById(R.id.tvResultPercent); + TextView tvCorrect = findViewById(R.id.tvResultCorrect); + TextView tvWrong = findViewById(R.id.tvResultWrong); + TextView tvTime = findViewById(R.id.tvResultTime); + + RecyclerView recyclerView = findViewById(R.id.rvTestResults); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new DividerItemDecoration(this, R.drawable.divider)); adapter = new TestResultsRecyclerViewAdapter(this, answers, testMode); @@ -97,10 +90,9 @@ protected void onCreate(Bundle savedInstanceState) { singleSound = new SingleSound(); doubleSound = new DoubleSound(); - wrong = new StringBuilder(); // calculate score - int numberCorrect = calculateScore(answers); + int numberCorrect = calculateNumberCorrect(answers); int totalNumber = answers.size(); if (testMode == SoundMode.Double) { totalNumber *= 2; @@ -109,22 +101,14 @@ protected void onCreate(Bundle savedInstanceState) { // hide practice button if all correct if (numberCorrect == totalNumber) { - RelativeLayout practiceButton = (RelativeLayout) findViewById(R.id.rlPracticeDifficultButton); + RelativeLayout practiceButton = findViewById(R.id.rlPracticeDifficultButton); practiceButton.setVisibility(View.INVISIBLE); } - // get date/time - Locale locale = Locale.US; // default - if (getString(R.string.locale).equals(Locale.CHINESE.toString())) { - locale = Locale.CHINESE; - } - Date date = new Date(System.currentTimeMillis()); - DateFormat df = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.SHORT, locale); - String formattedDate = df.format(date); // update textviews tvName.setText(userName); - tvDate.setText(formattedDate); + tvDate.setText(getFormattedDate()); tvPercent.setText(String.format(getString(R.string.test_results_percent), score)); tvCorrect.setText(String.format(getString(R.string.test_results_right), numberCorrect)); tvWrong.setText(String.format(getString(R.string.test_results_wrong), totalNumber - numberCorrect)); @@ -137,6 +121,13 @@ protected void onCreate(Bundle savedInstanceState) { } + private String getFormattedDate() { + Locale locale = AppLocale.getLocale(this); + Date date = new Date(System.currentTimeMillis()); + DateFormat df = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.SHORT, locale); + return df.format(date); + } + @Override protected void onResume() { @@ -167,76 +158,43 @@ protected void onPause() { } - private int calculateScore(ArrayList answers) { + private int calculateNumberCorrect(ArrayList answers) { - Answer tempAnswer; - String correct; - String user; int numCorrect = 0; - for (int i = 0; i < answers.size(); i++) { - - tempAnswer = answers.get(i); - correct = tempAnswer.getCorrectAnswer(); - user = tempAnswer.getUserAnswer(); - - if (testMode == SoundMode.Double) { - String[] parsedCorrect; - String[] parcedUser; - - if (correct.equals(user)) { - numCorrect += 2; - } else { - parsedCorrect = Answer.parseDouble(correct); - parcedUser = Answer.parseDouble(user); - if (parsedCorrect == null || parcedUser == null) { - return 0; - } - if (parsedCorrect[0].equals(parcedUser[0])) { - numCorrect++; - } else { - if (wrong.length() > 0) { - wrong.append(","); - } - wrong.append(parsedCorrect[0]).append(";").append(parcedUser[0]); - } - if (parsedCorrect[1].equals(parcedUser[1])) { - numCorrect++; - } else { - if (wrong.length() > 0) { - wrong.append(","); - } - wrong.append(parsedCorrect[1]).append(";").append(parcedUser[1]); - } - } - } else { // single - if (correct.equals(user)) { - numCorrect++; - } else { - if (wrong.length() > 0) { - wrong.append(","); - } - wrong.append(correct).append(";").append(user); - } + for (Answer answer : answers) { + String correct = answer.getCorrectAnswer(); + String user = answer.getUserAnswer(); + + // Single + if (testMode == SoundMode.Single) { + if (correct.equals(user)) numCorrect++; + continue; } - } + // Double + Pair parsedCorrect = DoubleSound.parse(correct); + Pair parsedUser = DoubleSound.parse(user); + if (parsedCorrect == null || parsedUser == null) { + continue; + } + if (parsedCorrect.first.equals(parsedUser.first)) { + numCorrect++; + } + if (parsedCorrect.second.equals(parsedUser.second)) { + numCorrect++; + } + } return numCorrect; - } private Set findNeedToPracticeSounds(ArrayList answers) { - String userAnswer; - String correctAnswer; - String[] parsedCorrect; - String[] parcedUser; - Set practiceSet = new HashSet<>(); for (Answer answer : answers) { - userAnswer = answer.getUserAnswer(); - correctAnswer = answer.getCorrectAnswer(); + String userAnswer = answer.getUserAnswer(); + String correctAnswer = answer.getCorrectAnswer(); if (testMode == SoundMode.Single) { @@ -247,16 +205,16 @@ private Set findNeedToPracticeSounds(ArrayList answers) { } else if (testMode == SoundMode.Double) { - parsedCorrect = Answer.parseDouble(correctAnswer); - parcedUser = Answer.parseDouble(userAnswer); - if (parcedUser == null || parsedCorrect == null) return practiceSet; - if (!parcedUser[0].equals(parsedCorrect[0])) { - practiceSet.add(parcedUser[0]); - practiceSet.add(parsedCorrect[0]); + Pair parsedCorrect = DoubleSound.parse(correctAnswer); + Pair parsedUser = DoubleSound.parse(userAnswer); + if (parsedUser == null || parsedCorrect == null) continue; + if (!parsedUser.first.equals(parsedCorrect.first)) { + practiceSet.add(parsedUser.first); + practiceSet.add(parsedCorrect.first); } - if (!parcedUser[1].equals(parsedCorrect[1])) { - practiceSet.add(parcedUser[1]); - practiceSet.add(parsedCorrect[1]); + if (!parsedUser.second.equals(parsedCorrect.second)) { + practiceSet.add(parsedUser.second); + practiceSet.add(parsedCorrect.second); } } @@ -276,7 +234,7 @@ public void onItemClick(View view, int position) { playSound(correctIpa); if (!correctIpa.equals(userIpa)) { int delay = 1000; - if (PhonemeTable.INSTANCE.hasTwoPronunciations(correctIpa)) { + if (Ipa.hasTwoPronunciations(correctIpa)) { delay = 2000; // these sounds need a longer delay } // delay playing second sound @@ -296,27 +254,22 @@ protected Void doInBackground(Void... params) { StringBuilder correctAnswersConcat = new StringBuilder(); StringBuilder userAnswersConcat = new StringBuilder(); - for (int i = 0; i < answers.size(); i++) { + for (Answer answer : answers) { if (correctAnswersConcat.length() > 0) { // comma separated values correctAnswersConcat.append(","); userAnswersConcat.append(","); } - correctAnswersConcat.append(answers.get(i).getCorrectAnswer()); - userAnswersConcat.append(answers.get(i).getUserAnswer()); + correctAnswersConcat.append(answer.getCorrectAnswer()); + userAnswersConcat.append(answer.getUserAnswer()); } - // sort wrong ones by frequency - String sortedWrong = new Wrong().getIpaSortedByFrequency(wrong - .toString()); - try { - MyDatabaseAdapter dbAdapter = new MyDatabaseAdapter( getApplicationContext()); - dbAdapter.addTest(userName, timeLength, testMode.getPersistentMemoryString(), score, + dbAdapter.addTest(userName, timeLength, testMode.getPersistentMemoryString(), score, correctAnswersConcat.toString(), - userAnswersConcat.toString(), sortedWrong); + userAnswersConcat.toString()); } catch (Exception e) { e.printStackTrace(); } @@ -333,7 +286,7 @@ private void playSound(String ipaSound) { // look up audio resource id for that sound if (testMode == SoundMode.Double) { soundId = doubleSound.getSoundResourceId(ipaSound); - } else if (testMode == SoundMode.Single){ + } else if (testMode == SoundMode.Single) { soundId = singleSound.getSoundResourceId(ipaSound); } @@ -383,10 +336,10 @@ public void practiceDifficultClick(View view) { ArrayList consonantArray = new ArrayList<>(); Set allSounds = findNeedToPracticeSounds(answers); for (String sound : allSounds) { - if (PhonemeTable.INSTANCE.isVowel(sound)) { - vowelArray.add(sound); - } else { + if (Ipa.isConsonant(sound)) { consonantArray.add(sound); + } else { + vowelArray.add(sound); } } diff --git a/app/src/main/java/com/aepronunciation/ipa/TestResultsRecyclerViewAdapter.java b/app/src/main/java/com/aepronunciation/ipa/TestResultsRecyclerViewAdapter.java old mode 100644 new mode 100755 index c73eec3..50f407e --- a/app/src/main/java/com/aepronunciation/ipa/TestResultsRecyclerViewAdapter.java +++ b/app/src/main/java/com/aepronunciation/ipa/TestResultsRecyclerViewAdapter.java @@ -3,9 +3,11 @@ import android.content.Context; import android.graphics.Color; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.text.SpannableString; import android.text.style.ForegroundColorSpan; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,18 +29,19 @@ class TestResultsRecyclerViewAdapter extends RecyclerView.Adapter parsedUser = DoubleSound.parse(userAnswer.toString()); + if (parsedUser == null) { holder.tvUser.setText(userAnswer); return; } boolean firstWrong = !answer.getCorrectAnswer().startsWith( - parcedUser[0]); + parsedUser.first); boolean secondWrong = !answer.getCorrectAnswer().endsWith( - parcedUser[1]); + parsedUser.second); // change wrong sounds to red if (firstWrong && secondWrong) { @@ -64,10 +67,10 @@ public void onBindViewHolder(ViewHolder holder, int position) { userAnswer.length(), 0); }else if (firstWrong) { userAnswer.setSpan(new ForegroundColorSpan(Color.RED), 0, - parcedUser[0].length(), 0); + parsedUser.first.length(), 0); }else{ userAnswer.setSpan(new ForegroundColorSpan(Color.RED), - parcedUser[0].length(), userAnswer.length(), 0); + parsedUser.first.length(), userAnswer.length(), 0); } holder.tvUser.setText(userAnswer); @@ -99,9 +102,9 @@ class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener ViewHolder(View itemView) { super(itemView); - tvNumber = (IpaTextView) itemView.findViewById(R.id.tvNumberItem); - tvCorrect = (IpaTextView) itemView.findViewById(R.id.tvCorrectAnswerItem); - tvUser = (IpaTextView) itemView.findViewById(R.id.tvUserAnswerItem); + tvNumber = itemView.findViewById(R.id.tvNumberItem); + tvCorrect = itemView.findViewById(R.id.tvCorrectAnswerItem); + tvUser = itemView.findViewById(R.id.tvUserAnswerItem); itemView.setOnClickListener(this); } diff --git a/app/src/main/java/com/aepronunciation/ipa/TestsAllRecyclerViewAdapter.java b/app/src/main/java/com/aepronunciation/ipa/TestsAllRecyclerViewAdapter.java old mode 100644 new mode 100755 index 88f5cf5..386d905 --- a/app/src/main/java/com/aepronunciation/ipa/TestsAllRecyclerViewAdapter.java +++ b/app/src/main/java/com/aepronunciation/ipa/TestsAllRecyclerViewAdapter.java @@ -2,7 +2,8 @@ import android.content.Context; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -28,15 +29,16 @@ class TestsAllRecyclerViewAdapter extends RecyclerView.Adapter ipaMap = new HashMap<>(); - - // parse string and put it in a frequency map - boolean matchFound = false; - String[] wrongList = concat.split(","); - String[] pair = new String[2]; - for (String item : wrongList) { - pair = item.split(";"); - // item[0] is correct answer (that was gotten wrong) - // item[1] is substitute (wrong guess) - for (Map.Entry entry : ipaMap.entrySet()) { - if (entry.getKey().equals(pair[0])) { - // increment frequency - ipaMap.put(entry.getKey(), entry.getValue() + 1); - matchFound = true; - break; - } - } - if (matchFound) { - matchFound = false; - } else { - // if no matches then add new ipa to list - ipaMap.put(pair[0], 1); - } - } - - // sort by frequency - Map sorted = sortByValues(ipaMap); - StringBuilder returnString = new StringBuilder(); - boolean firstLoop = true; - for (Map.Entry entry : sorted.entrySet()) { - if (firstLoop) { - returnString.append(entry.getKey()).append("(").append(entry.getValue()).append(")"); - firstLoop = false; - } else { - returnString.append(", "); - returnString.append(entry.getKey()).append("(").append(entry.getValue()).append(")"); - } - } - - return returnString.toString(); - } - - /* - * Java method to sort Map in Java by value e.g. HashMap or Hashtable throw - * NullPointerException if Map contains null values It also sort values even - * if they are duplicates - */ - private static Map sortByValues( - Map map) { - List> entries = new LinkedList>( - map.entrySet()); - - Collections.sort(entries, new Comparator>() { - - @Override - public int compare(Entry o1, Entry o2) { - return o2.getValue().compareTo(o1.getValue()); - } - }); - - // LinkedHashMap will keep the keys in the order they are inserted - // which is currently sorted on natural ordering - Map sortedMap = new LinkedHashMap(); - - for (Map.Entry entry : entries) { - sortedMap.put(entry.getKey(), entry.getValue()); - } - - return sortedMap; - } - -} \ No newline at end of file diff --git a/app/src/main/res/drawable/button.xml b/app/src/main/res/drawable/button.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/divider.xml b/app/src/main/res/drawable/divider.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..2408e30 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..6bb0037 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/input_window_normal.xml b/app/src/main/res/drawable/input_window_normal.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/input_window_right.xml b/app/src/main/res/drawable/input_window_right.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/input_window_wrong.xml b/app/src/main/res/drawable/input_window_wrong.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/keys.xml b/app/src/main/res/drawable/keys.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/next_button.xml b/app/src/main/res/drawable/next_button.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/rounded_outline.xml b/app/src/main/res/drawable/rounded_outline.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/test_results_list_bg.xml b/app/src/main/res/drawable/test_results_list_bg.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml old mode 100644 new mode 100755 index c065555..de04b84 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical" > - - - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_history_test_details.xml b/app/src/main/res/layout/activity_history_test_details.xml old mode 100644 new mode 100755 index 41120a2..34ca419 --- a/app/src/main/res/layout/activity_history_test_details.xml +++ b/app/src/main/res/layout/activity_history_test_details.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_test.xml b/app/src/main/res/layout/activity_test.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/layout/activity_test_results.xml b/app/src/main/res/layout/activity_test_results.xml old mode 100644 new mode 100755 index 9e203df..21f0b29 --- a/app/src/main/res/layout/activity_test_results.xml +++ b/app/src/main/res/layout/activity_test_results.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - @@ -79,7 +80,7 @@ - - + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..bbd3e02 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_chevron_right_black_24dp.png b/app/src/main/res/mipmap-hdpi/ic_chevron_right_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_clear_black_24dp.png b/app/src/main/res/mipmap-hdpi/ic_clear_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_clear_white_24dp.png b/app/src/main/res/mipmap-hdpi/ic_clear_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_content_copy_white_24dp.png b/app/src/main/res/mipmap-hdpi/ic_content_copy_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_history_white_24dp.png b/app/src/main/res/mipmap-hdpi/ic_history_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_info_outline_white_24dp.png b/app/src/main/res/mipmap-hdpi/ic_info_outline_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_keyboard_backspace_black_24dp.png b/app/src/main/res/mipmap-hdpi/ic_keyboard_backspace_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_keyboard_return_black_24dp.png b/app/src/main/res/mipmap-hdpi/ic_keyboard_return_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_keyboard_white_24dp.png b/app/src/main/res/mipmap-hdpi/ic_keyboard_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png old mode 100644 new mode 100755 index fad1b0c..89ccff1 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..716b182 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_play_arrow_black_48dp.png b/app/src/main/res/mipmap-hdpi/ic_play_arrow_black_48dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_settings_black_24dp.png b/app/src/main/res/mipmap-hdpi/ic_settings_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_share_white_24dp.png b/app/src/main/res/mipmap-hdpi/ic_share_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_space_bar_black_24dp.png b/app/src/main/res/mipmap-hdpi/ic_space_bar_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_chevron_right_black_24dp.png b/app/src/main/res/mipmap-mdpi/ic_chevron_right_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_clear_black_24dp.png b/app/src/main/res/mipmap-mdpi/ic_clear_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_clear_white_24dp.png b/app/src/main/res/mipmap-mdpi/ic_clear_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_content_copy_white_24dp.png b/app/src/main/res/mipmap-mdpi/ic_content_copy_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_history_white_24dp.png b/app/src/main/res/mipmap-mdpi/ic_history_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_info_outline_white_24dp.png b/app/src/main/res/mipmap-mdpi/ic_info_outline_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_keyboard_backspace_black_24dp.png b/app/src/main/res/mipmap-mdpi/ic_keyboard_backspace_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_keyboard_return_black_24dp.png b/app/src/main/res/mipmap-mdpi/ic_keyboard_return_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_keyboard_white_24dp.png b/app/src/main/res/mipmap-mdpi/ic_keyboard_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png old mode 100644 new mode 100755 index 87c4272..64951f5 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..ad4e990 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_play_arrow_black_48dp.png b/app/src/main/res/mipmap-mdpi/ic_play_arrow_black_48dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_settings_black_24dp.png b/app/src/main/res/mipmap-mdpi/ic_settings_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_share_white_24dp.png b/app/src/main/res/mipmap-mdpi/ic_share_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_space_bar_black_24dp.png b/app/src/main/res/mipmap-mdpi/ic_space_bar_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_chevron_right_black_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_chevron_right_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_clear_black_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_clear_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_clear_white_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_clear_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_content_copy_white_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_content_copy_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_history_white_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_history_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_info_outline_white_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_info_outline_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_keyboard_backspace_black_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_keyboard_backspace_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_keyboard_return_black_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_keyboard_return_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_keyboard_white_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_keyboard_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png old mode 100644 new mode 100755 index 4ee37ff..aa60f7c Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..5554367 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_play_arrow_black_48dp.png b/app/src/main/res/mipmap-xhdpi/ic_play_arrow_black_48dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_settings_black_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_settings_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_share_white_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_share_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_space_bar_black_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_space_bar_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_chevron_right_black_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_chevron_right_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_clear_black_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_clear_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_clear_white_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_clear_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_content_copy_white_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_content_copy_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_history_white_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_history_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_info_outline_white_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_info_outline_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_keyboard_backspace_black_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_keyboard_backspace_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_keyboard_return_black_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_keyboard_return_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_keyboard_white_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_keyboard_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png old mode 100644 new mode 100755 index a92c97a..084b6de Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..bcbaa3f Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_play_arrow_black_48dp.png b/app/src/main/res/mipmap-xxhdpi/ic_play_arrow_black_48dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_settings_black_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_settings_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_share_white_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_share_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_space_bar_black_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_space_bar_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_chevron_right_black_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_chevron_right_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_clear_black_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_clear_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_clear_white_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_clear_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_content_copy_white_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_content_copy_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_history_white_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_history_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_info_outline_white_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_info_outline_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_keyboard_backspace_black_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_keyboard_backspace_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_keyboard_return_black_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_keyboard_return_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_keyboard_white_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_keyboard_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png old mode 100644 new mode 100755 index 21a6b5e..2ee69bd Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..790f10e Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_play_arrow_black_48dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_play_arrow_black_48dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_settings_black_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_settings_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_share_white_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_share_white_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_space_bar_black_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_space_bar_black_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_b.mp3 b/app/src/main/res/raw/double_a_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_ch.mp3 b/app/src/main/res/raw/double_a_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_d.mp3 b/app/src/main/res/raw/double_a_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_dzh.mp3 b/app/src/main/res/raw/double_a_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_f.mp3 b/app/src/main/res/raw/double_a_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_flap_shwua.mp3 b/app/src/main/res/raw/double_a_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_g.mp3 b/app/src/main/res/raw/double_a_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_glottal.mp3 b/app/src/main/res/raw/double_a_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_k.mp3 b/app/src/main/res/raw/double_a_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_l.mp3 b/app/src/main/res/raw/double_a_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_m.mp3 b/app/src/main/res/raw/double_a_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_n.mp3 b/app/src/main/res/raw/double_a_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_ng.mp3 b/app/src/main/res/raw/double_a_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_p.mp3 b/app/src/main/res/raw/double_a_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_s.mp3 b/app/src/main/res/raw/double_a_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_sh.mp3 b/app/src/main/res/raw/double_a_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_t.mp3 b/app/src/main/res/raw/double_a_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_th.mp3 b/app/src/main/res/raw/double_a_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_thv.mp3 b/app/src/main/res/raw/double_a_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_v.mp3 b/app/src/main/res/raw/double_a_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_z.mp3 b/app/src/main/res/raw/double_a_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_a_zh.mp3 b/app/src/main/res/raw/double_a_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_b.mp3 b/app/src/main/res/raw/double_ae_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_ch.mp3 b/app/src/main/res/raw/double_ae_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_d.mp3 b/app/src/main/res/raw/double_ae_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_dzh.mp3 b/app/src/main/res/raw/double_ae_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_f.mp3 b/app/src/main/res/raw/double_ae_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_flap_shwua.mp3 b/app/src/main/res/raw/double_ae_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_g.mp3 b/app/src/main/res/raw/double_ae_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_glottal.mp3 b/app/src/main/res/raw/double_ae_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_k.mp3 b/app/src/main/res/raw/double_ae_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_l.mp3 b/app/src/main/res/raw/double_ae_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_m.mp3 b/app/src/main/res/raw/double_ae_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_n.mp3 b/app/src/main/res/raw/double_ae_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_ng.mp3 b/app/src/main/res/raw/double_ae_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_p.mp3 b/app/src/main/res/raw/double_ae_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_s.mp3 b/app/src/main/res/raw/double_ae_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_sh.mp3 b/app/src/main/res/raw/double_ae_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_t.mp3 b/app/src/main/res/raw/double_ae_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_th.mp3 b/app/src/main/res/raw/double_ae_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_thv.mp3 b/app/src/main/res/raw/double_ae_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_v.mp3 b/app/src/main/res/raw/double_ae_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_z.mp3 b/app/src/main/res/raw/double_ae_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ae_zh.mp3 b/app/src/main/res/raw/double_ae_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_b.mp3 b/app/src/main/res/raw/double_ai_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_ch.mp3 b/app/src/main/res/raw/double_ai_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_d.mp3 b/app/src/main/res/raw/double_ai_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_dzh.mp3 b/app/src/main/res/raw/double_ai_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_f.mp3 b/app/src/main/res/raw/double_ai_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_flap_shwua.mp3 b/app/src/main/res/raw/double_ai_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_g.mp3 b/app/src/main/res/raw/double_ai_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_glottal.mp3 b/app/src/main/res/raw/double_ai_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_k.mp3 b/app/src/main/res/raw/double_ai_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_l.mp3 b/app/src/main/res/raw/double_ai_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_m.mp3 b/app/src/main/res/raw/double_ai_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_n.mp3 b/app/src/main/res/raw/double_ai_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_ng.mp3 b/app/src/main/res/raw/double_ai_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_p.mp3 b/app/src/main/res/raw/double_ai_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_s.mp3 b/app/src/main/res/raw/double_ai_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_sh.mp3 b/app/src/main/res/raw/double_ai_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_t.mp3 b/app/src/main/res/raw/double_ai_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_th.mp3 b/app/src/main/res/raw/double_ai_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_thv.mp3 b/app/src/main/res/raw/double_ai_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_v.mp3 b/app/src/main/res/raw/double_ai_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_z.mp3 b/app/src/main/res/raw/double_ai_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ai_zh.mp3 b/app/src/main/res/raw/double_ai_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_b.mp3 b/app/src/main/res/raw/double_ar_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_ch.mp3 b/app/src/main/res/raw/double_ar_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_d.mp3 b/app/src/main/res/raw/double_ar_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_dzh.mp3 b/app/src/main/res/raw/double_ar_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_f.mp3 b/app/src/main/res/raw/double_ar_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_flap_shwua.mp3 b/app/src/main/res/raw/double_ar_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_g.mp3 b/app/src/main/res/raw/double_ar_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_glottal.mp3 b/app/src/main/res/raw/double_ar_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_k.mp3 b/app/src/main/res/raw/double_ar_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_l.mp3 b/app/src/main/res/raw/double_ar_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_m.mp3 b/app/src/main/res/raw/double_ar_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_n.mp3 b/app/src/main/res/raw/double_ar_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_ng.mp3 b/app/src/main/res/raw/double_ar_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_p.mp3 b/app/src/main/res/raw/double_ar_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_s.mp3 b/app/src/main/res/raw/double_ar_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_sh.mp3 b/app/src/main/res/raw/double_ar_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_t.mp3 b/app/src/main/res/raw/double_ar_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_th.mp3 b/app/src/main/res/raw/double_ar_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_thv.mp3 b/app/src/main/res/raw/double_ar_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_v.mp3 b/app/src/main/res/raw/double_ar_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_z.mp3 b/app/src/main/res/raw/double_ar_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ar_zh.mp3 b/app/src/main/res/raw/double_ar_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_b.mp3 b/app/src/main/res/raw/double_au_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_ch.mp3 b/app/src/main/res/raw/double_au_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_d.mp3 b/app/src/main/res/raw/double_au_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_dzh.mp3 b/app/src/main/res/raw/double_au_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_f.mp3 b/app/src/main/res/raw/double_au_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_flap_shwua.mp3 b/app/src/main/res/raw/double_au_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_g.mp3 b/app/src/main/res/raw/double_au_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_glottal.mp3 b/app/src/main/res/raw/double_au_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_k.mp3 b/app/src/main/res/raw/double_au_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_l.mp3 b/app/src/main/res/raw/double_au_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_m.mp3 b/app/src/main/res/raw/double_au_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_n.mp3 b/app/src/main/res/raw/double_au_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_ng.mp3 b/app/src/main/res/raw/double_au_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_p.mp3 b/app/src/main/res/raw/double_au_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_s.mp3 b/app/src/main/res/raw/double_au_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_sh.mp3 b/app/src/main/res/raw/double_au_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_t.mp3 b/app/src/main/res/raw/double_au_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_th.mp3 b/app/src/main/res/raw/double_au_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_thv.mp3 b/app/src/main/res/raw/double_au_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_v.mp3 b/app/src/main/res/raw/double_au_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_z.mp3 b/app/src/main/res/raw/double_au_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_au_zh.mp3 b/app/src/main/res/raw/double_au_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_a.mp3 b/app/src/main/res/raw/double_b_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_ae.mp3 b/app/src/main/res/raw/double_b_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_ai.mp3 b/app/src/main/res/raw/double_b_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_ar.mp3 b/app/src/main/res/raw/double_b_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_au.mp3 b/app/src/main/res/raw/double_b_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_c.mp3 b/app/src/main/res/raw/double_b_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_e.mp3 b/app/src/main/res/raw/double_b_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_ei.mp3 b/app/src/main/res/raw/double_b_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_er.mp3 b/app/src/main/res/raw/double_b_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_ers.mp3 b/app/src/main/res/raw/double_b_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_eru.mp3 b/app/src/main/res/raw/double_b_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_i.mp3 b/app/src/main/res/raw/double_b_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_ir.mp3 b/app/src/main/res/raw/double_b_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_is.mp3 b/app/src/main/res/raw/double_b_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_oi.mp3 b/app/src/main/res/raw/double_b_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_or.mp3 b/app/src/main/res/raw/double_b_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_ou.mp3 b/app/src/main/res/raw/double_b_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_shwua.mp3 b/app/src/main/res/raw/double_b_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_u.mp3 b/app/src/main/res/raw/double_b_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_us.mp3 b/app/src/main/res/raw/double_b_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_b_vu.mp3 b/app/src/main/res/raw/double_b_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_b.mp3 b/app/src/main/res/raw/double_c_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_ch.mp3 b/app/src/main/res/raw/double_c_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_d.mp3 b/app/src/main/res/raw/double_c_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_dzh.mp3 b/app/src/main/res/raw/double_c_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_f.mp3 b/app/src/main/res/raw/double_c_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_flap_shwua.mp3 b/app/src/main/res/raw/double_c_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_g.mp3 b/app/src/main/res/raw/double_c_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_glottal.mp3 b/app/src/main/res/raw/double_c_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_k.mp3 b/app/src/main/res/raw/double_c_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_l.mp3 b/app/src/main/res/raw/double_c_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_m.mp3 b/app/src/main/res/raw/double_c_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_n.mp3 b/app/src/main/res/raw/double_c_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_ng.mp3 b/app/src/main/res/raw/double_c_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_p.mp3 b/app/src/main/res/raw/double_c_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_s.mp3 b/app/src/main/res/raw/double_c_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_sh.mp3 b/app/src/main/res/raw/double_c_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_t.mp3 b/app/src/main/res/raw/double_c_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_th.mp3 b/app/src/main/res/raw/double_c_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_thv.mp3 b/app/src/main/res/raw/double_c_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_v.mp3 b/app/src/main/res/raw/double_c_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_z.mp3 b/app/src/main/res/raw/double_c_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_c_zh.mp3 b/app/src/main/res/raw/double_c_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_a.mp3 b/app/src/main/res/raw/double_ch_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_ae.mp3 b/app/src/main/res/raw/double_ch_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_ai.mp3 b/app/src/main/res/raw/double_ch_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_ar.mp3 b/app/src/main/res/raw/double_ch_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_au.mp3 b/app/src/main/res/raw/double_ch_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_c.mp3 b/app/src/main/res/raw/double_ch_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_e.mp3 b/app/src/main/res/raw/double_ch_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_ei.mp3 b/app/src/main/res/raw/double_ch_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_er.mp3 b/app/src/main/res/raw/double_ch_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_ers.mp3 b/app/src/main/res/raw/double_ch_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_eru.mp3 b/app/src/main/res/raw/double_ch_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_i.mp3 b/app/src/main/res/raw/double_ch_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_ir.mp3 b/app/src/main/res/raw/double_ch_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_is.mp3 b/app/src/main/res/raw/double_ch_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_oi.mp3 b/app/src/main/res/raw/double_ch_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_or.mp3 b/app/src/main/res/raw/double_ch_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_ou.mp3 b/app/src/main/res/raw/double_ch_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_shwua.mp3 b/app/src/main/res/raw/double_ch_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_u.mp3 b/app/src/main/res/raw/double_ch_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_us.mp3 b/app/src/main/res/raw/double_ch_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ch_vu.mp3 b/app/src/main/res/raw/double_ch_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_a.mp3 b/app/src/main/res/raw/double_d_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_ae.mp3 b/app/src/main/res/raw/double_d_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_ai.mp3 b/app/src/main/res/raw/double_d_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_ar.mp3 b/app/src/main/res/raw/double_d_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_au.mp3 b/app/src/main/res/raw/double_d_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_c.mp3 b/app/src/main/res/raw/double_d_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_e.mp3 b/app/src/main/res/raw/double_d_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_ei.mp3 b/app/src/main/res/raw/double_d_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_er.mp3 b/app/src/main/res/raw/double_d_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_ers.mp3 b/app/src/main/res/raw/double_d_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_eru.mp3 b/app/src/main/res/raw/double_d_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_i.mp3 b/app/src/main/res/raw/double_d_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_ir.mp3 b/app/src/main/res/raw/double_d_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_is.mp3 b/app/src/main/res/raw/double_d_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_oi.mp3 b/app/src/main/res/raw/double_d_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_or.mp3 b/app/src/main/res/raw/double_d_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_ou.mp3 b/app/src/main/res/raw/double_d_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_shwua.mp3 b/app/src/main/res/raw/double_d_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_u.mp3 b/app/src/main/res/raw/double_d_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_us.mp3 b/app/src/main/res/raw/double_d_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_d_vu.mp3 b/app/src/main/res/raw/double_d_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_a.mp3 b/app/src/main/res/raw/double_dzh_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_ae.mp3 b/app/src/main/res/raw/double_dzh_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_ai.mp3 b/app/src/main/res/raw/double_dzh_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_ar.mp3 b/app/src/main/res/raw/double_dzh_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_au.mp3 b/app/src/main/res/raw/double_dzh_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_c.mp3 b/app/src/main/res/raw/double_dzh_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_e.mp3 b/app/src/main/res/raw/double_dzh_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_ei.mp3 b/app/src/main/res/raw/double_dzh_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_er.mp3 b/app/src/main/res/raw/double_dzh_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_ers.mp3 b/app/src/main/res/raw/double_dzh_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_eru.mp3 b/app/src/main/res/raw/double_dzh_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_i.mp3 b/app/src/main/res/raw/double_dzh_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_ir.mp3 b/app/src/main/res/raw/double_dzh_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_is.mp3 b/app/src/main/res/raw/double_dzh_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_oi.mp3 b/app/src/main/res/raw/double_dzh_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_or.mp3 b/app/src/main/res/raw/double_dzh_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_ou.mp3 b/app/src/main/res/raw/double_dzh_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_shwua.mp3 b/app/src/main/res/raw/double_dzh_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_u.mp3 b/app/src/main/res/raw/double_dzh_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_us.mp3 b/app/src/main/res/raw/double_dzh_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_dzh_vu.mp3 b/app/src/main/res/raw/double_dzh_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_b.mp3 b/app/src/main/res/raw/double_e_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_ch.mp3 b/app/src/main/res/raw/double_e_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_d.mp3 b/app/src/main/res/raw/double_e_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_dzh.mp3 b/app/src/main/res/raw/double_e_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_f.mp3 b/app/src/main/res/raw/double_e_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_flap_shwua.mp3 b/app/src/main/res/raw/double_e_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_g.mp3 b/app/src/main/res/raw/double_e_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_glottal.mp3 b/app/src/main/res/raw/double_e_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_k.mp3 b/app/src/main/res/raw/double_e_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_l.mp3 b/app/src/main/res/raw/double_e_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_m.mp3 b/app/src/main/res/raw/double_e_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_n.mp3 b/app/src/main/res/raw/double_e_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_ng.mp3 b/app/src/main/res/raw/double_e_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_p.mp3 b/app/src/main/res/raw/double_e_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_s.mp3 b/app/src/main/res/raw/double_e_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_sh.mp3 b/app/src/main/res/raw/double_e_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_t.mp3 b/app/src/main/res/raw/double_e_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_th.mp3 b/app/src/main/res/raw/double_e_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_thv.mp3 b/app/src/main/res/raw/double_e_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_v.mp3 b/app/src/main/res/raw/double_e_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_z.mp3 b/app/src/main/res/raw/double_e_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_e_zh.mp3 b/app/src/main/res/raw/double_e_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_b.mp3 b/app/src/main/res/raw/double_ei_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_ch.mp3 b/app/src/main/res/raw/double_ei_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_d.mp3 b/app/src/main/res/raw/double_ei_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_dzh.mp3 b/app/src/main/res/raw/double_ei_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_f.mp3 b/app/src/main/res/raw/double_ei_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_flap_shwua.mp3 b/app/src/main/res/raw/double_ei_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_g.mp3 b/app/src/main/res/raw/double_ei_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_glottal.mp3 b/app/src/main/res/raw/double_ei_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_k.mp3 b/app/src/main/res/raw/double_ei_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_l.mp3 b/app/src/main/res/raw/double_ei_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_m.mp3 b/app/src/main/res/raw/double_ei_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_n.mp3 b/app/src/main/res/raw/double_ei_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_ng.mp3 b/app/src/main/res/raw/double_ei_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_p.mp3 b/app/src/main/res/raw/double_ei_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_s.mp3 b/app/src/main/res/raw/double_ei_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_sh.mp3 b/app/src/main/res/raw/double_ei_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_t.mp3 b/app/src/main/res/raw/double_ei_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_th.mp3 b/app/src/main/res/raw/double_ei_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_thv.mp3 b/app/src/main/res/raw/double_ei_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_v.mp3 b/app/src/main/res/raw/double_ei_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_z.mp3 b/app/src/main/res/raw/double_ei_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ei_zh.mp3 b/app/src/main/res/raw/double_ei_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_b.mp3 b/app/src/main/res/raw/double_er_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_ch.mp3 b/app/src/main/res/raw/double_er_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_d.mp3 b/app/src/main/res/raw/double_er_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_dzh.mp3 b/app/src/main/res/raw/double_er_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_f.mp3 b/app/src/main/res/raw/double_er_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_flap_shwua.mp3 b/app/src/main/res/raw/double_er_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_g.mp3 b/app/src/main/res/raw/double_er_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_glottal.mp3 b/app/src/main/res/raw/double_er_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_k.mp3 b/app/src/main/res/raw/double_er_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_l.mp3 b/app/src/main/res/raw/double_er_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_m.mp3 b/app/src/main/res/raw/double_er_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_n.mp3 b/app/src/main/res/raw/double_er_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_ng.mp3 b/app/src/main/res/raw/double_er_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_p.mp3 b/app/src/main/res/raw/double_er_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_s.mp3 b/app/src/main/res/raw/double_er_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_sh.mp3 b/app/src/main/res/raw/double_er_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_t.mp3 b/app/src/main/res/raw/double_er_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_th.mp3 b/app/src/main/res/raw/double_er_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_thv.mp3 b/app/src/main/res/raw/double_er_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_v.mp3 b/app/src/main/res/raw/double_er_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_z.mp3 b/app/src/main/res/raw/double_er_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_er_zh.mp3 b/app/src/main/res/raw/double_er_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_b.mp3 b/app/src/main/res/raw/double_ers_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_ch.mp3 b/app/src/main/res/raw/double_ers_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_d.mp3 b/app/src/main/res/raw/double_ers_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_dzh.mp3 b/app/src/main/res/raw/double_ers_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_f.mp3 b/app/src/main/res/raw/double_ers_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_flap_shwua.mp3 b/app/src/main/res/raw/double_ers_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_g.mp3 b/app/src/main/res/raw/double_ers_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_glottal.mp3 b/app/src/main/res/raw/double_ers_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_k.mp3 b/app/src/main/res/raw/double_ers_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_l.mp3 b/app/src/main/res/raw/double_ers_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_m.mp3 b/app/src/main/res/raw/double_ers_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_n.mp3 b/app/src/main/res/raw/double_ers_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_ng.mp3 b/app/src/main/res/raw/double_ers_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_p.mp3 b/app/src/main/res/raw/double_ers_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_s.mp3 b/app/src/main/res/raw/double_ers_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_sh.mp3 b/app/src/main/res/raw/double_ers_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_t.mp3 b/app/src/main/res/raw/double_ers_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_th.mp3 b/app/src/main/res/raw/double_ers_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_thv.mp3 b/app/src/main/res/raw/double_ers_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_v.mp3 b/app/src/main/res/raw/double_ers_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_z.mp3 b/app/src/main/res/raw/double_ers_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ers_zh.mp3 b/app/src/main/res/raw/double_ers_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_b.mp3 b/app/src/main/res/raw/double_eru_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_ch.mp3 b/app/src/main/res/raw/double_eru_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_d.mp3 b/app/src/main/res/raw/double_eru_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_dzh.mp3 b/app/src/main/res/raw/double_eru_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_f.mp3 b/app/src/main/res/raw/double_eru_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_g.mp3 b/app/src/main/res/raw/double_eru_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_k.mp3 b/app/src/main/res/raw/double_eru_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_l.mp3 b/app/src/main/res/raw/double_eru_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_m.mp3 b/app/src/main/res/raw/double_eru_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_n.mp3 b/app/src/main/res/raw/double_eru_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_ng.mp3 b/app/src/main/res/raw/double_eru_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_p.mp3 b/app/src/main/res/raw/double_eru_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_s.mp3 b/app/src/main/res/raw/double_eru_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_sh.mp3 b/app/src/main/res/raw/double_eru_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_t.mp3 b/app/src/main/res/raw/double_eru_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_th.mp3 b/app/src/main/res/raw/double_eru_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_thv.mp3 b/app/src/main/res/raw/double_eru_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_v.mp3 b/app/src/main/res/raw/double_eru_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_z.mp3 b/app/src/main/res/raw/double_eru_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_eru_zh.mp3 b/app/src/main/res/raw/double_eru_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_a.mp3 b/app/src/main/res/raw/double_f_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_ae.mp3 b/app/src/main/res/raw/double_f_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_ai.mp3 b/app/src/main/res/raw/double_f_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_ar.mp3 b/app/src/main/res/raw/double_f_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_au.mp3 b/app/src/main/res/raw/double_f_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_c.mp3 b/app/src/main/res/raw/double_f_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_e.mp3 b/app/src/main/res/raw/double_f_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_ei.mp3 b/app/src/main/res/raw/double_f_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_er.mp3 b/app/src/main/res/raw/double_f_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_ers.mp3 b/app/src/main/res/raw/double_f_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_eru.mp3 b/app/src/main/res/raw/double_f_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_i.mp3 b/app/src/main/res/raw/double_f_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_ir.mp3 b/app/src/main/res/raw/double_f_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_is.mp3 b/app/src/main/res/raw/double_f_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_oi.mp3 b/app/src/main/res/raw/double_f_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_or.mp3 b/app/src/main/res/raw/double_f_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_ou.mp3 b/app/src/main/res/raw/double_f_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_shwua.mp3 b/app/src/main/res/raw/double_f_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_u.mp3 b/app/src/main/res/raw/double_f_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_us.mp3 b/app/src/main/res/raw/double_f_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_f_vu.mp3 b/app/src/main/res/raw/double_f_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_a.mp3 b/app/src/main/res/raw/double_g_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_ae.mp3 b/app/src/main/res/raw/double_g_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_ai.mp3 b/app/src/main/res/raw/double_g_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_ar.mp3 b/app/src/main/res/raw/double_g_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_au.mp3 b/app/src/main/res/raw/double_g_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_c.mp3 b/app/src/main/res/raw/double_g_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_e.mp3 b/app/src/main/res/raw/double_g_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_ei.mp3 b/app/src/main/res/raw/double_g_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_er.mp3 b/app/src/main/res/raw/double_g_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_ers.mp3 b/app/src/main/res/raw/double_g_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_eru.mp3 b/app/src/main/res/raw/double_g_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_i.mp3 b/app/src/main/res/raw/double_g_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_ir.mp3 b/app/src/main/res/raw/double_g_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_is.mp3 b/app/src/main/res/raw/double_g_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_oi.mp3 b/app/src/main/res/raw/double_g_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_or.mp3 b/app/src/main/res/raw/double_g_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_ou.mp3 b/app/src/main/res/raw/double_g_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_shwua.mp3 b/app/src/main/res/raw/double_g_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_u.mp3 b/app/src/main/res/raw/double_g_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_us.mp3 b/app/src/main/res/raw/double_g_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_g_vu.mp3 b/app/src/main/res/raw/double_g_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_a.mp3 b/app/src/main/res/raw/double_h_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_ae.mp3 b/app/src/main/res/raw/double_h_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_ai.mp3 b/app/src/main/res/raw/double_h_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_ar.mp3 b/app/src/main/res/raw/double_h_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_au.mp3 b/app/src/main/res/raw/double_h_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_c.mp3 b/app/src/main/res/raw/double_h_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_e.mp3 b/app/src/main/res/raw/double_h_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_ei.mp3 b/app/src/main/res/raw/double_h_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_er.mp3 b/app/src/main/res/raw/double_h_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_ers.mp3 b/app/src/main/res/raw/double_h_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_eru.mp3 b/app/src/main/res/raw/double_h_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_i.mp3 b/app/src/main/res/raw/double_h_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_ir.mp3 b/app/src/main/res/raw/double_h_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_is.mp3 b/app/src/main/res/raw/double_h_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_oi.mp3 b/app/src/main/res/raw/double_h_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_or.mp3 b/app/src/main/res/raw/double_h_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_ou.mp3 b/app/src/main/res/raw/double_h_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_shwua.mp3 b/app/src/main/res/raw/double_h_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_u.mp3 b/app/src/main/res/raw/double_h_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_us.mp3 b/app/src/main/res/raw/double_h_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_h_vu.mp3 b/app/src/main/res/raw/double_h_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_b.mp3 b/app/src/main/res/raw/double_i_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_ch.mp3 b/app/src/main/res/raw/double_i_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_d.mp3 b/app/src/main/res/raw/double_i_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_dzh.mp3 b/app/src/main/res/raw/double_i_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_f.mp3 b/app/src/main/res/raw/double_i_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_flap_shwua.mp3 b/app/src/main/res/raw/double_i_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_g.mp3 b/app/src/main/res/raw/double_i_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_glottal.mp3 b/app/src/main/res/raw/double_i_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_k.mp3 b/app/src/main/res/raw/double_i_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_l.mp3 b/app/src/main/res/raw/double_i_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_m.mp3 b/app/src/main/res/raw/double_i_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_n.mp3 b/app/src/main/res/raw/double_i_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_ng.mp3 b/app/src/main/res/raw/double_i_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_p.mp3 b/app/src/main/res/raw/double_i_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_s.mp3 b/app/src/main/res/raw/double_i_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_sh.mp3 b/app/src/main/res/raw/double_i_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_t.mp3 b/app/src/main/res/raw/double_i_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_th.mp3 b/app/src/main/res/raw/double_i_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_thv.mp3 b/app/src/main/res/raw/double_i_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_v.mp3 b/app/src/main/res/raw/double_i_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_z.mp3 b/app/src/main/res/raw/double_i_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_i_zh.mp3 b/app/src/main/res/raw/double_i_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_b.mp3 b/app/src/main/res/raw/double_ir_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_ch.mp3 b/app/src/main/res/raw/double_ir_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_d.mp3 b/app/src/main/res/raw/double_ir_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_dzh.mp3 b/app/src/main/res/raw/double_ir_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_f.mp3 b/app/src/main/res/raw/double_ir_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_flap_shwua.mp3 b/app/src/main/res/raw/double_ir_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_g.mp3 b/app/src/main/res/raw/double_ir_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_glottal.mp3 b/app/src/main/res/raw/double_ir_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_k.mp3 b/app/src/main/res/raw/double_ir_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_l.mp3 b/app/src/main/res/raw/double_ir_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_m.mp3 b/app/src/main/res/raw/double_ir_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_n.mp3 b/app/src/main/res/raw/double_ir_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_ng.mp3 b/app/src/main/res/raw/double_ir_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_p.mp3 b/app/src/main/res/raw/double_ir_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_s.mp3 b/app/src/main/res/raw/double_ir_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_sh.mp3 b/app/src/main/res/raw/double_ir_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_t.mp3 b/app/src/main/res/raw/double_ir_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_th.mp3 b/app/src/main/res/raw/double_ir_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_thv.mp3 b/app/src/main/res/raw/double_ir_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_v.mp3 b/app/src/main/res/raw/double_ir_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_z.mp3 b/app/src/main/res/raw/double_ir_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ir_zh.mp3 b/app/src/main/res/raw/double_ir_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_b.mp3 b/app/src/main/res/raw/double_is_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_ch.mp3 b/app/src/main/res/raw/double_is_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_d.mp3 b/app/src/main/res/raw/double_is_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_dzh.mp3 b/app/src/main/res/raw/double_is_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_f.mp3 b/app/src/main/res/raw/double_is_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_flap_shwua.mp3 b/app/src/main/res/raw/double_is_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_g.mp3 b/app/src/main/res/raw/double_is_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_glottal.mp3 b/app/src/main/res/raw/double_is_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_k.mp3 b/app/src/main/res/raw/double_is_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_l.mp3 b/app/src/main/res/raw/double_is_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_m.mp3 b/app/src/main/res/raw/double_is_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_n.mp3 b/app/src/main/res/raw/double_is_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_ng.mp3 b/app/src/main/res/raw/double_is_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_p.mp3 b/app/src/main/res/raw/double_is_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_s.mp3 b/app/src/main/res/raw/double_is_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_sh.mp3 b/app/src/main/res/raw/double_is_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_t.mp3 b/app/src/main/res/raw/double_is_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_th.mp3 b/app/src/main/res/raw/double_is_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_thv.mp3 b/app/src/main/res/raw/double_is_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_v.mp3 b/app/src/main/res/raw/double_is_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_z.mp3 b/app/src/main/res/raw/double_is_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_is_zh.mp3 b/app/src/main/res/raw/double_is_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_a.mp3 b/app/src/main/res/raw/double_j_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_ae.mp3 b/app/src/main/res/raw/double_j_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_ai.mp3 b/app/src/main/res/raw/double_j_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_ar.mp3 b/app/src/main/res/raw/double_j_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_au.mp3 b/app/src/main/res/raw/double_j_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_c.mp3 b/app/src/main/res/raw/double_j_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_e.mp3 b/app/src/main/res/raw/double_j_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_ei.mp3 b/app/src/main/res/raw/double_j_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_er.mp3 b/app/src/main/res/raw/double_j_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_ers.mp3 b/app/src/main/res/raw/double_j_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_eru.mp3 b/app/src/main/res/raw/double_j_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_i.mp3 b/app/src/main/res/raw/double_j_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_ir.mp3 b/app/src/main/res/raw/double_j_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_is.mp3 b/app/src/main/res/raw/double_j_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_oi.mp3 b/app/src/main/res/raw/double_j_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_or.mp3 b/app/src/main/res/raw/double_j_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_ou.mp3 b/app/src/main/res/raw/double_j_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_shwua.mp3 b/app/src/main/res/raw/double_j_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_u.mp3 b/app/src/main/res/raw/double_j_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_us.mp3 b/app/src/main/res/raw/double_j_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_j_vu.mp3 b/app/src/main/res/raw/double_j_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_a.mp3 b/app/src/main/res/raw/double_k_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_ae.mp3 b/app/src/main/res/raw/double_k_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_ai.mp3 b/app/src/main/res/raw/double_k_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_ar.mp3 b/app/src/main/res/raw/double_k_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_au.mp3 b/app/src/main/res/raw/double_k_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_c.mp3 b/app/src/main/res/raw/double_k_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_e.mp3 b/app/src/main/res/raw/double_k_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_ei.mp3 b/app/src/main/res/raw/double_k_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_er.mp3 b/app/src/main/res/raw/double_k_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_ers.mp3 b/app/src/main/res/raw/double_k_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_eru.mp3 b/app/src/main/res/raw/double_k_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_i.mp3 b/app/src/main/res/raw/double_k_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_ir.mp3 b/app/src/main/res/raw/double_k_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_is.mp3 b/app/src/main/res/raw/double_k_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_oi.mp3 b/app/src/main/res/raw/double_k_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_or.mp3 b/app/src/main/res/raw/double_k_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_ou.mp3 b/app/src/main/res/raw/double_k_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_shwua.mp3 b/app/src/main/res/raw/double_k_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_u.mp3 b/app/src/main/res/raw/double_k_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_us.mp3 b/app/src/main/res/raw/double_k_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_k_vu.mp3 b/app/src/main/res/raw/double_k_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_a.mp3 b/app/src/main/res/raw/double_l_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_ae.mp3 b/app/src/main/res/raw/double_l_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_ai.mp3 b/app/src/main/res/raw/double_l_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_ar.mp3 b/app/src/main/res/raw/double_l_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_au.mp3 b/app/src/main/res/raw/double_l_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_c.mp3 b/app/src/main/res/raw/double_l_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_e.mp3 b/app/src/main/res/raw/double_l_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_ei.mp3 b/app/src/main/res/raw/double_l_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_er.mp3 b/app/src/main/res/raw/double_l_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_ers.mp3 b/app/src/main/res/raw/double_l_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_eru.mp3 b/app/src/main/res/raw/double_l_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_i.mp3 b/app/src/main/res/raw/double_l_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_ir.mp3 b/app/src/main/res/raw/double_l_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_is.mp3 b/app/src/main/res/raw/double_l_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_oi.mp3 b/app/src/main/res/raw/double_l_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_or.mp3 b/app/src/main/res/raw/double_l_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_ou.mp3 b/app/src/main/res/raw/double_l_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_shwua.mp3 b/app/src/main/res/raw/double_l_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_u.mp3 b/app/src/main/res/raw/double_l_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_us.mp3 b/app/src/main/res/raw/double_l_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_l_vu.mp3 b/app/src/main/res/raw/double_l_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_a.mp3 b/app/src/main/res/raw/double_m_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_ae.mp3 b/app/src/main/res/raw/double_m_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_ai.mp3 b/app/src/main/res/raw/double_m_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_ar.mp3 b/app/src/main/res/raw/double_m_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_au.mp3 b/app/src/main/res/raw/double_m_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_c.mp3 b/app/src/main/res/raw/double_m_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_e.mp3 b/app/src/main/res/raw/double_m_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_ei.mp3 b/app/src/main/res/raw/double_m_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_er.mp3 b/app/src/main/res/raw/double_m_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_ers.mp3 b/app/src/main/res/raw/double_m_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_eru.mp3 b/app/src/main/res/raw/double_m_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_i.mp3 b/app/src/main/res/raw/double_m_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_ir.mp3 b/app/src/main/res/raw/double_m_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_is.mp3 b/app/src/main/res/raw/double_m_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_oi.mp3 b/app/src/main/res/raw/double_m_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_or.mp3 b/app/src/main/res/raw/double_m_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_ou.mp3 b/app/src/main/res/raw/double_m_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_shwua.mp3 b/app/src/main/res/raw/double_m_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_u.mp3 b/app/src/main/res/raw/double_m_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_us.mp3 b/app/src/main/res/raw/double_m_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_m_vu.mp3 b/app/src/main/res/raw/double_m_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_a.mp3 b/app/src/main/res/raw/double_n_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_ae.mp3 b/app/src/main/res/raw/double_n_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_ai.mp3 b/app/src/main/res/raw/double_n_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_ar.mp3 b/app/src/main/res/raw/double_n_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_au.mp3 b/app/src/main/res/raw/double_n_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_c.mp3 b/app/src/main/res/raw/double_n_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_e.mp3 b/app/src/main/res/raw/double_n_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_ei.mp3 b/app/src/main/res/raw/double_n_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_er.mp3 b/app/src/main/res/raw/double_n_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_ers.mp3 b/app/src/main/res/raw/double_n_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_eru.mp3 b/app/src/main/res/raw/double_n_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_i.mp3 b/app/src/main/res/raw/double_n_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_ir.mp3 b/app/src/main/res/raw/double_n_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_is.mp3 b/app/src/main/res/raw/double_n_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_oi.mp3 b/app/src/main/res/raw/double_n_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_or.mp3 b/app/src/main/res/raw/double_n_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_ou.mp3 b/app/src/main/res/raw/double_n_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_shwua.mp3 b/app/src/main/res/raw/double_n_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_u.mp3 b/app/src/main/res/raw/double_n_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_us.mp3 b/app/src/main/res/raw/double_n_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_n_vu.mp3 b/app/src/main/res/raw/double_n_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_b.mp3 b/app/src/main/res/raw/double_oi_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_ch.mp3 b/app/src/main/res/raw/double_oi_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_d.mp3 b/app/src/main/res/raw/double_oi_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_dzh.mp3 b/app/src/main/res/raw/double_oi_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_f.mp3 b/app/src/main/res/raw/double_oi_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_flap_shwua.mp3 b/app/src/main/res/raw/double_oi_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_g.mp3 b/app/src/main/res/raw/double_oi_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_glottal.mp3 b/app/src/main/res/raw/double_oi_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_k.mp3 b/app/src/main/res/raw/double_oi_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_l.mp3 b/app/src/main/res/raw/double_oi_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_m.mp3 b/app/src/main/res/raw/double_oi_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_n.mp3 b/app/src/main/res/raw/double_oi_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_ng.mp3 b/app/src/main/res/raw/double_oi_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_p.mp3 b/app/src/main/res/raw/double_oi_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_s.mp3 b/app/src/main/res/raw/double_oi_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_sh.mp3 b/app/src/main/res/raw/double_oi_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_t.mp3 b/app/src/main/res/raw/double_oi_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_th.mp3 b/app/src/main/res/raw/double_oi_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_thv.mp3 b/app/src/main/res/raw/double_oi_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_v.mp3 b/app/src/main/res/raw/double_oi_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_z.mp3 b/app/src/main/res/raw/double_oi_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_oi_zh.mp3 b/app/src/main/res/raw/double_oi_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_b.mp3 b/app/src/main/res/raw/double_or_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_ch.mp3 b/app/src/main/res/raw/double_or_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_d.mp3 b/app/src/main/res/raw/double_or_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_dzh.mp3 b/app/src/main/res/raw/double_or_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_f.mp3 b/app/src/main/res/raw/double_or_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_flap_shwua.mp3 b/app/src/main/res/raw/double_or_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_g.mp3 b/app/src/main/res/raw/double_or_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_glottal.mp3 b/app/src/main/res/raw/double_or_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_k.mp3 b/app/src/main/res/raw/double_or_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_l.mp3 b/app/src/main/res/raw/double_or_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_m.mp3 b/app/src/main/res/raw/double_or_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_n.mp3 b/app/src/main/res/raw/double_or_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_ng.mp3 b/app/src/main/res/raw/double_or_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_p.mp3 b/app/src/main/res/raw/double_or_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_s.mp3 b/app/src/main/res/raw/double_or_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_sh.mp3 b/app/src/main/res/raw/double_or_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_t.mp3 b/app/src/main/res/raw/double_or_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_th.mp3 b/app/src/main/res/raw/double_or_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_thv.mp3 b/app/src/main/res/raw/double_or_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_v.mp3 b/app/src/main/res/raw/double_or_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_z.mp3 b/app/src/main/res/raw/double_or_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_or_zh.mp3 b/app/src/main/res/raw/double_or_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_b.mp3 b/app/src/main/res/raw/double_ou_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_ch.mp3 b/app/src/main/res/raw/double_ou_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_d.mp3 b/app/src/main/res/raw/double_ou_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_dzh.mp3 b/app/src/main/res/raw/double_ou_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_f.mp3 b/app/src/main/res/raw/double_ou_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_flap_shwua.mp3 b/app/src/main/res/raw/double_ou_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_g.mp3 b/app/src/main/res/raw/double_ou_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_glottal.mp3 b/app/src/main/res/raw/double_ou_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_k.mp3 b/app/src/main/res/raw/double_ou_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_l.mp3 b/app/src/main/res/raw/double_ou_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_m.mp3 b/app/src/main/res/raw/double_ou_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_n.mp3 b/app/src/main/res/raw/double_ou_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_ng.mp3 b/app/src/main/res/raw/double_ou_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_p.mp3 b/app/src/main/res/raw/double_ou_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_s.mp3 b/app/src/main/res/raw/double_ou_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_sh.mp3 b/app/src/main/res/raw/double_ou_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_t.mp3 b/app/src/main/res/raw/double_ou_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_th.mp3 b/app/src/main/res/raw/double_ou_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_thv.mp3 b/app/src/main/res/raw/double_ou_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_v.mp3 b/app/src/main/res/raw/double_ou_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_z.mp3 b/app/src/main/res/raw/double_ou_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_ou_zh.mp3 b/app/src/main/res/raw/double_ou_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_a.mp3 b/app/src/main/res/raw/double_p_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_ae.mp3 b/app/src/main/res/raw/double_p_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_ai.mp3 b/app/src/main/res/raw/double_p_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_ar.mp3 b/app/src/main/res/raw/double_p_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_au.mp3 b/app/src/main/res/raw/double_p_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_c.mp3 b/app/src/main/res/raw/double_p_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_e.mp3 b/app/src/main/res/raw/double_p_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_ei.mp3 b/app/src/main/res/raw/double_p_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_er.mp3 b/app/src/main/res/raw/double_p_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_ers.mp3 b/app/src/main/res/raw/double_p_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_eru.mp3 b/app/src/main/res/raw/double_p_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_i.mp3 b/app/src/main/res/raw/double_p_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_ir.mp3 b/app/src/main/res/raw/double_p_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_is.mp3 b/app/src/main/res/raw/double_p_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_oi.mp3 b/app/src/main/res/raw/double_p_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_or.mp3 b/app/src/main/res/raw/double_p_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_ou.mp3 b/app/src/main/res/raw/double_p_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_shwua.mp3 b/app/src/main/res/raw/double_p_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_u.mp3 b/app/src/main/res/raw/double_p_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_us.mp3 b/app/src/main/res/raw/double_p_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_p_vu.mp3 b/app/src/main/res/raw/double_p_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_a.mp3 b/app/src/main/res/raw/double_r_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_ae.mp3 b/app/src/main/res/raw/double_r_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_ai.mp3 b/app/src/main/res/raw/double_r_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_ar.mp3 b/app/src/main/res/raw/double_r_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_au.mp3 b/app/src/main/res/raw/double_r_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_c.mp3 b/app/src/main/res/raw/double_r_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_e.mp3 b/app/src/main/res/raw/double_r_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_ei.mp3 b/app/src/main/res/raw/double_r_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_er.mp3 b/app/src/main/res/raw/double_r_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_ers.mp3 b/app/src/main/res/raw/double_r_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_eru.mp3 b/app/src/main/res/raw/double_r_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_i.mp3 b/app/src/main/res/raw/double_r_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_ir.mp3 b/app/src/main/res/raw/double_r_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_is.mp3 b/app/src/main/res/raw/double_r_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_oi.mp3 b/app/src/main/res/raw/double_r_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_or.mp3 b/app/src/main/res/raw/double_r_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_ou.mp3 b/app/src/main/res/raw/double_r_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_shwua.mp3 b/app/src/main/res/raw/double_r_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_u.mp3 b/app/src/main/res/raw/double_r_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_us.mp3 b/app/src/main/res/raw/double_r_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_r_vu.mp3 b/app/src/main/res/raw/double_r_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_a.mp3 b/app/src/main/res/raw/double_s_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_ae.mp3 b/app/src/main/res/raw/double_s_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_ai.mp3 b/app/src/main/res/raw/double_s_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_ar.mp3 b/app/src/main/res/raw/double_s_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_au.mp3 b/app/src/main/res/raw/double_s_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_c.mp3 b/app/src/main/res/raw/double_s_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_e.mp3 b/app/src/main/res/raw/double_s_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_ei.mp3 b/app/src/main/res/raw/double_s_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_er.mp3 b/app/src/main/res/raw/double_s_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_ers.mp3 b/app/src/main/res/raw/double_s_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_eru.mp3 b/app/src/main/res/raw/double_s_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_i.mp3 b/app/src/main/res/raw/double_s_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_ir.mp3 b/app/src/main/res/raw/double_s_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_is.mp3 b/app/src/main/res/raw/double_s_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_oi.mp3 b/app/src/main/res/raw/double_s_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_or.mp3 b/app/src/main/res/raw/double_s_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_ou.mp3 b/app/src/main/res/raw/double_s_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_shwua.mp3 b/app/src/main/res/raw/double_s_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_u.mp3 b/app/src/main/res/raw/double_s_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_us.mp3 b/app/src/main/res/raw/double_s_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_s_vu.mp3 b/app/src/main/res/raw/double_s_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_a.mp3 b/app/src/main/res/raw/double_sh_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_ae.mp3 b/app/src/main/res/raw/double_sh_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_ai.mp3 b/app/src/main/res/raw/double_sh_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_ar.mp3 b/app/src/main/res/raw/double_sh_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_au.mp3 b/app/src/main/res/raw/double_sh_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_c.mp3 b/app/src/main/res/raw/double_sh_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_e.mp3 b/app/src/main/res/raw/double_sh_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_ei.mp3 b/app/src/main/res/raw/double_sh_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_er.mp3 b/app/src/main/res/raw/double_sh_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_ers.mp3 b/app/src/main/res/raw/double_sh_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_eru.mp3 b/app/src/main/res/raw/double_sh_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_i.mp3 b/app/src/main/res/raw/double_sh_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_ir.mp3 b/app/src/main/res/raw/double_sh_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_is.mp3 b/app/src/main/res/raw/double_sh_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_oi.mp3 b/app/src/main/res/raw/double_sh_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_or.mp3 b/app/src/main/res/raw/double_sh_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_ou.mp3 b/app/src/main/res/raw/double_sh_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_shwua.mp3 b/app/src/main/res/raw/double_sh_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_u.mp3 b/app/src/main/res/raw/double_sh_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_us.mp3 b/app/src/main/res/raw/double_sh_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_sh_vu.mp3 b/app/src/main/res/raw/double_sh_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_b.mp3 b/app/src/main/res/raw/double_shwua_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_ch.mp3 b/app/src/main/res/raw/double_shwua_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_d.mp3 b/app/src/main/res/raw/double_shwua_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_dzh.mp3 b/app/src/main/res/raw/double_shwua_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_f.mp3 b/app/src/main/res/raw/double_shwua_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_g.mp3 b/app/src/main/res/raw/double_shwua_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_k.mp3 b/app/src/main/res/raw/double_shwua_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_l.mp3 b/app/src/main/res/raw/double_shwua_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_m.mp3 b/app/src/main/res/raw/double_shwua_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_n.mp3 b/app/src/main/res/raw/double_shwua_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_ng.mp3 b/app/src/main/res/raw/double_shwua_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_p.mp3 b/app/src/main/res/raw/double_shwua_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_s.mp3 b/app/src/main/res/raw/double_shwua_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_sh.mp3 b/app/src/main/res/raw/double_shwua_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_t.mp3 b/app/src/main/res/raw/double_shwua_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_th.mp3 b/app/src/main/res/raw/double_shwua_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_thv.mp3 b/app/src/main/res/raw/double_shwua_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_v.mp3 b/app/src/main/res/raw/double_shwua_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_z.mp3 b/app/src/main/res/raw/double_shwua_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_shwua_zh.mp3 b/app/src/main/res/raw/double_shwua_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_a.mp3 b/app/src/main/res/raw/double_t_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_ae.mp3 b/app/src/main/res/raw/double_t_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_ai.mp3 b/app/src/main/res/raw/double_t_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_ar.mp3 b/app/src/main/res/raw/double_t_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_au.mp3 b/app/src/main/res/raw/double_t_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_c.mp3 b/app/src/main/res/raw/double_t_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_e.mp3 b/app/src/main/res/raw/double_t_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_ei.mp3 b/app/src/main/res/raw/double_t_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_er.mp3 b/app/src/main/res/raw/double_t_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_ers.mp3 b/app/src/main/res/raw/double_t_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_eru.mp3 b/app/src/main/res/raw/double_t_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_i.mp3 b/app/src/main/res/raw/double_t_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_ir.mp3 b/app/src/main/res/raw/double_t_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_is.mp3 b/app/src/main/res/raw/double_t_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_oi.mp3 b/app/src/main/res/raw/double_t_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_or.mp3 b/app/src/main/res/raw/double_t_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_ou.mp3 b/app/src/main/res/raw/double_t_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_shwua.mp3 b/app/src/main/res/raw/double_t_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_u.mp3 b/app/src/main/res/raw/double_t_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_us.mp3 b/app/src/main/res/raw/double_t_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_t_vu.mp3 b/app/src/main/res/raw/double_t_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_a.mp3 b/app/src/main/res/raw/double_th_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_ae.mp3 b/app/src/main/res/raw/double_th_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_ai.mp3 b/app/src/main/res/raw/double_th_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_ar.mp3 b/app/src/main/res/raw/double_th_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_au.mp3 b/app/src/main/res/raw/double_th_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_c.mp3 b/app/src/main/res/raw/double_th_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_e.mp3 b/app/src/main/res/raw/double_th_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_ei.mp3 b/app/src/main/res/raw/double_th_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_er.mp3 b/app/src/main/res/raw/double_th_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_ers.mp3 b/app/src/main/res/raw/double_th_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_eru.mp3 b/app/src/main/res/raw/double_th_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_i.mp3 b/app/src/main/res/raw/double_th_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_ir.mp3 b/app/src/main/res/raw/double_th_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_is.mp3 b/app/src/main/res/raw/double_th_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_oi.mp3 b/app/src/main/res/raw/double_th_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_or.mp3 b/app/src/main/res/raw/double_th_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_ou.mp3 b/app/src/main/res/raw/double_th_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_shwua.mp3 b/app/src/main/res/raw/double_th_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_u.mp3 b/app/src/main/res/raw/double_th_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_us.mp3 b/app/src/main/res/raw/double_th_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_th_vu.mp3 b/app/src/main/res/raw/double_th_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_a.mp3 b/app/src/main/res/raw/double_thv_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_ae.mp3 b/app/src/main/res/raw/double_thv_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_ai.mp3 b/app/src/main/res/raw/double_thv_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_ar.mp3 b/app/src/main/res/raw/double_thv_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_au.mp3 b/app/src/main/res/raw/double_thv_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_c.mp3 b/app/src/main/res/raw/double_thv_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_e.mp3 b/app/src/main/res/raw/double_thv_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_ei.mp3 b/app/src/main/res/raw/double_thv_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_er.mp3 b/app/src/main/res/raw/double_thv_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_ers.mp3 b/app/src/main/res/raw/double_thv_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_eru.mp3 b/app/src/main/res/raw/double_thv_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_i.mp3 b/app/src/main/res/raw/double_thv_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_ir.mp3 b/app/src/main/res/raw/double_thv_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_is.mp3 b/app/src/main/res/raw/double_thv_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_oi.mp3 b/app/src/main/res/raw/double_thv_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_or.mp3 b/app/src/main/res/raw/double_thv_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_ou.mp3 b/app/src/main/res/raw/double_thv_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_shwua.mp3 b/app/src/main/res/raw/double_thv_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_u.mp3 b/app/src/main/res/raw/double_thv_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_us.mp3 b/app/src/main/res/raw/double_thv_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_thv_vu.mp3 b/app/src/main/res/raw/double_thv_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_b.mp3 b/app/src/main/res/raw/double_u_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_ch.mp3 b/app/src/main/res/raw/double_u_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_d.mp3 b/app/src/main/res/raw/double_u_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_dzh.mp3 b/app/src/main/res/raw/double_u_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_f.mp3 b/app/src/main/res/raw/double_u_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_flap_shwua.mp3 b/app/src/main/res/raw/double_u_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_g.mp3 b/app/src/main/res/raw/double_u_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_glottal.mp3 b/app/src/main/res/raw/double_u_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_k.mp3 b/app/src/main/res/raw/double_u_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_l.mp3 b/app/src/main/res/raw/double_u_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_m.mp3 b/app/src/main/res/raw/double_u_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_n.mp3 b/app/src/main/res/raw/double_u_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_ng.mp3 b/app/src/main/res/raw/double_u_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_p.mp3 b/app/src/main/res/raw/double_u_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_s.mp3 b/app/src/main/res/raw/double_u_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_sh.mp3 b/app/src/main/res/raw/double_u_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_t.mp3 b/app/src/main/res/raw/double_u_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_th.mp3 b/app/src/main/res/raw/double_u_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_thv.mp3 b/app/src/main/res/raw/double_u_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_v.mp3 b/app/src/main/res/raw/double_u_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_z.mp3 b/app/src/main/res/raw/double_u_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_u_zh.mp3 b/app/src/main/res/raw/double_u_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_b.mp3 b/app/src/main/res/raw/double_us_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_ch.mp3 b/app/src/main/res/raw/double_us_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_d.mp3 b/app/src/main/res/raw/double_us_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_dzh.mp3 b/app/src/main/res/raw/double_us_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_f.mp3 b/app/src/main/res/raw/double_us_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_flap_shwua.mp3 b/app/src/main/res/raw/double_us_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_g.mp3 b/app/src/main/res/raw/double_us_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_glottal.mp3 b/app/src/main/res/raw/double_us_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_k.mp3 b/app/src/main/res/raw/double_us_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_l.mp3 b/app/src/main/res/raw/double_us_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_m.mp3 b/app/src/main/res/raw/double_us_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_n.mp3 b/app/src/main/res/raw/double_us_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_ng.mp3 b/app/src/main/res/raw/double_us_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_p.mp3 b/app/src/main/res/raw/double_us_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_s.mp3 b/app/src/main/res/raw/double_us_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_sh.mp3 b/app/src/main/res/raw/double_us_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_t.mp3 b/app/src/main/res/raw/double_us_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_th.mp3 b/app/src/main/res/raw/double_us_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_thv.mp3 b/app/src/main/res/raw/double_us_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_v.mp3 b/app/src/main/res/raw/double_us_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_z.mp3 b/app/src/main/res/raw/double_us_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_us_zh.mp3 b/app/src/main/res/raw/double_us_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_a.mp3 b/app/src/main/res/raw/double_v_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_ae.mp3 b/app/src/main/res/raw/double_v_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_ai.mp3 b/app/src/main/res/raw/double_v_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_ar.mp3 b/app/src/main/res/raw/double_v_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_au.mp3 b/app/src/main/res/raw/double_v_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_c.mp3 b/app/src/main/res/raw/double_v_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_e.mp3 b/app/src/main/res/raw/double_v_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_ei.mp3 b/app/src/main/res/raw/double_v_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_er.mp3 b/app/src/main/res/raw/double_v_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_ers.mp3 b/app/src/main/res/raw/double_v_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_eru.mp3 b/app/src/main/res/raw/double_v_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_i.mp3 b/app/src/main/res/raw/double_v_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_ir.mp3 b/app/src/main/res/raw/double_v_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_is.mp3 b/app/src/main/res/raw/double_v_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_oi.mp3 b/app/src/main/res/raw/double_v_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_or.mp3 b/app/src/main/res/raw/double_v_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_ou.mp3 b/app/src/main/res/raw/double_v_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_shwua.mp3 b/app/src/main/res/raw/double_v_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_u.mp3 b/app/src/main/res/raw/double_v_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_us.mp3 b/app/src/main/res/raw/double_v_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_v_vu.mp3 b/app/src/main/res/raw/double_v_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_b.mp3 b/app/src/main/res/raw/double_vu_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_ch.mp3 b/app/src/main/res/raw/double_vu_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_d.mp3 b/app/src/main/res/raw/double_vu_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_dzh.mp3 b/app/src/main/res/raw/double_vu_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_f.mp3 b/app/src/main/res/raw/double_vu_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_flap_shwua.mp3 b/app/src/main/res/raw/double_vu_flap_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_g.mp3 b/app/src/main/res/raw/double_vu_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_glottal.mp3 b/app/src/main/res/raw/double_vu_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_k.mp3 b/app/src/main/res/raw/double_vu_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_l.mp3 b/app/src/main/res/raw/double_vu_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_m.mp3 b/app/src/main/res/raw/double_vu_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_n.mp3 b/app/src/main/res/raw/double_vu_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_ng.mp3 b/app/src/main/res/raw/double_vu_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_p.mp3 b/app/src/main/res/raw/double_vu_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_s.mp3 b/app/src/main/res/raw/double_vu_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_sh.mp3 b/app/src/main/res/raw/double_vu_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_t.mp3 b/app/src/main/res/raw/double_vu_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_th.mp3 b/app/src/main/res/raw/double_vu_th.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_thv.mp3 b/app/src/main/res/raw/double_vu_thv.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_v.mp3 b/app/src/main/res/raw/double_vu_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_z.mp3 b/app/src/main/res/raw/double_vu_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_vu_zh.mp3 b/app/src/main/res/raw/double_vu_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_a.mp3 b/app/src/main/res/raw/double_w_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_ae.mp3 b/app/src/main/res/raw/double_w_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_ai.mp3 b/app/src/main/res/raw/double_w_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_ar.mp3 b/app/src/main/res/raw/double_w_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_au.mp3 b/app/src/main/res/raw/double_w_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_c.mp3 b/app/src/main/res/raw/double_w_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_e.mp3 b/app/src/main/res/raw/double_w_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_ei.mp3 b/app/src/main/res/raw/double_w_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_er.mp3 b/app/src/main/res/raw/double_w_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_ers.mp3 b/app/src/main/res/raw/double_w_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_eru.mp3 b/app/src/main/res/raw/double_w_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_i.mp3 b/app/src/main/res/raw/double_w_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_ir.mp3 b/app/src/main/res/raw/double_w_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_is.mp3 b/app/src/main/res/raw/double_w_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_oi.mp3 b/app/src/main/res/raw/double_w_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_or.mp3 b/app/src/main/res/raw/double_w_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_ou.mp3 b/app/src/main/res/raw/double_w_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_shwua.mp3 b/app/src/main/res/raw/double_w_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_u.mp3 b/app/src/main/res/raw/double_w_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_us.mp3 b/app/src/main/res/raw/double_w_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_w_vu.mp3 b/app/src/main/res/raw/double_w_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_a.mp3 b/app/src/main/res/raw/double_z_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_ae.mp3 b/app/src/main/res/raw/double_z_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_ai.mp3 b/app/src/main/res/raw/double_z_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_ar.mp3 b/app/src/main/res/raw/double_z_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_au.mp3 b/app/src/main/res/raw/double_z_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_c.mp3 b/app/src/main/res/raw/double_z_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_e.mp3 b/app/src/main/res/raw/double_z_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_ei.mp3 b/app/src/main/res/raw/double_z_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_er.mp3 b/app/src/main/res/raw/double_z_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_ers.mp3 b/app/src/main/res/raw/double_z_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_eru.mp3 b/app/src/main/res/raw/double_z_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_i.mp3 b/app/src/main/res/raw/double_z_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_ir.mp3 b/app/src/main/res/raw/double_z_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_is.mp3 b/app/src/main/res/raw/double_z_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_oi.mp3 b/app/src/main/res/raw/double_z_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_or.mp3 b/app/src/main/res/raw/double_z_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_ou.mp3 b/app/src/main/res/raw/double_z_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_shwua.mp3 b/app/src/main/res/raw/double_z_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_u.mp3 b/app/src/main/res/raw/double_z_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_us.mp3 b/app/src/main/res/raw/double_z_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_z_vu.mp3 b/app/src/main/res/raw/double_z_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_a.mp3 b/app/src/main/res/raw/double_zh_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_ae.mp3 b/app/src/main/res/raw/double_zh_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_ai.mp3 b/app/src/main/res/raw/double_zh_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_ar.mp3 b/app/src/main/res/raw/double_zh_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_au.mp3 b/app/src/main/res/raw/double_zh_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_c.mp3 b/app/src/main/res/raw/double_zh_c.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_e.mp3 b/app/src/main/res/raw/double_zh_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_ei.mp3 b/app/src/main/res/raw/double_zh_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_er.mp3 b/app/src/main/res/raw/double_zh_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_ers.mp3 b/app/src/main/res/raw/double_zh_ers.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_eru.mp3 b/app/src/main/res/raw/double_zh_eru.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_i.mp3 b/app/src/main/res/raw/double_zh_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_ir.mp3 b/app/src/main/res/raw/double_zh_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_is.mp3 b/app/src/main/res/raw/double_zh_is.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_oi.mp3 b/app/src/main/res/raw/double_zh_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_or.mp3 b/app/src/main/res/raw/double_zh_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_ou.mp3 b/app/src/main/res/raw/double_zh_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_shwua.mp3 b/app/src/main/res/raw/double_zh_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_u.mp3 b/app/src/main/res/raw/double_zh_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_us.mp3 b/app/src/main/res/raw/double_zh_us.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/double_zh_vu.mp3 b/app/src/main/res/raw/double_zh_vu.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_a.mp3 b/app/src/main/res/raw/single_a.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_ae.mp3 b/app/src/main/res/raw/single_ae.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_ai.mp3 b/app/src/main/res/raw/single_ai.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_ar.mp3 b/app/src/main/res/raw/single_ar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_au.mp3 b/app/src/main/res/raw/single_au.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_b.mp3 b/app/src/main/res/raw/single_b.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_c_backwards.mp3 b/app/src/main/res/raw/single_c_backwards.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_ch.mp3 b/app/src/main/res/raw/single_ch.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_d.mp3 b/app/src/main/res/raw/single_d.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_dzh.mp3 b/app/src/main/res/raw/single_dzh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_e.mp3 b/app/src/main/res/raw/single_e.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_ei.mp3 b/app/src/main/res/raw/single_ei.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_er.mp3 b/app/src/main/res/raw/single_er.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_er_stressed.mp3 b/app/src/main/res/raw/single_er_stressed.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_er_unstressed.mp3 b/app/src/main/res/raw/single_er_unstressed.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_f.mp3 b/app/src/main/res/raw/single_f.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_flap_t.mp3 b/app/src/main/res/raw/single_flap_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_g.mp3 b/app/src/main/res/raw/single_g.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_glottal_stop.mp3 b/app/src/main/res/raw/single_glottal_stop.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_h.mp3 b/app/src/main/res/raw/single_h.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_i.mp3 b/app/src/main/res/raw/single_i.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_i_short.mp3 b/app/src/main/res/raw/single_i_short.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_ir.mp3 b/app/src/main/res/raw/single_ir.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_j.mp3 b/app/src/main/res/raw/single_j.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_k.mp3 b/app/src/main/res/raw/single_k.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_l.mp3 b/app/src/main/res/raw/single_l.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_m.mp3 b/app/src/main/res/raw/single_m.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_n.mp3 b/app/src/main/res/raw/single_n.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_ng.mp3 b/app/src/main/res/raw/single_ng.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_oi.mp3 b/app/src/main/res/raw/single_oi.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_or.mp3 b/app/src/main/res/raw/single_or.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_ou.mp3 b/app/src/main/res/raw/single_ou.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_p.mp3 b/app/src/main/res/raw/single_p.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_r.mp3 b/app/src/main/res/raw/single_r.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_s.mp3 b/app/src/main/res/raw/single_s.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_sh.mp3 b/app/src/main/res/raw/single_sh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_shwua.mp3 b/app/src/main/res/raw/single_shwua.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_t.mp3 b/app/src/main/res/raw/single_t.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_th_voiced.mp3 b/app/src/main/res/raw/single_th_voiced.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_th_voiceless.mp3 b/app/src/main/res/raw/single_th_voiceless.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_u.mp3 b/app/src/main/res/raw/single_u.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_u_short.mp3 b/app/src/main/res/raw/single_u_short.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_v.mp3 b/app/src/main/res/raw/single_v.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_v_upsidedown.mp3 b/app/src/main/res/raw/single_v_upsidedown.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_w.mp3 b/app/src/main/res/raw/single_w.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_z.mp3 b/app/src/main/res/raw/single_z.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/single_zh.mp3 b/app/src/main/res/raw/single_zh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_a.mp4 b/app/src/main/res/raw/v_a.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_ae.mp4 b/app/src/main/res/raw/v_ae.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_ai.mp4 b/app/src/main/res/raw/v_ai.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_ar.mp4 b/app/src/main/res/raw/v_ar.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_au.mp4 b/app/src/main/res/raw/v_au.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_b.mp4 b/app/src/main/res/raw/v_b.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_c_backwards.mp4 b/app/src/main/res/raw/v_c_backwards.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_ch.mp4 b/app/src/main/res/raw/v_ch.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_d.mp4 b/app/src/main/res/raw/v_d.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_dzh.mp4 b/app/src/main/res/raw/v_dzh.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_e_short.mp4 b/app/src/main/res/raw/v_e_short.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_ei.mp4 b/app/src/main/res/raw/v_ei.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_er.mp4 b/app/src/main/res/raw/v_er.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_er_stressed.mp4 b/app/src/main/res/raw/v_er_stressed.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_er_unstressed.mp4 b/app/src/main/res/raw/v_er_unstressed.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_f.mp4 b/app/src/main/res/raw/v_f.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_t_flap.mp4 b/app/src/main/res/raw/v_flap_t.mp4 old mode 100644 new mode 100755 similarity index 100% rename from app/src/main/res/raw/v_t_flap.mp4 rename to app/src/main/res/raw/v_flap_t.mp4 diff --git a/app/src/main/res/raw/v_g.mp4 b/app/src/main/res/raw/v_g.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_glottal_stop.mp4 b/app/src/main/res/raw/v_glottal_stop.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_h.mp4 b/app/src/main/res/raw/v_h.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_i.mp4 b/app/src/main/res/raw/v_i.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_i_short.mp4 b/app/src/main/res/raw/v_i_short.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_ir.mp4 b/app/src/main/res/raw/v_ir.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_j.mp4 b/app/src/main/res/raw/v_j.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_k.mp4 b/app/src/main/res/raw/v_k.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_l.mp4 b/app/src/main/res/raw/v_l.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_m.mp4 b/app/src/main/res/raw/v_m.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_n.mp4 b/app/src/main/res/raw/v_n.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_ng.mp4 b/app/src/main/res/raw/v_ng.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_oi.mp4 b/app/src/main/res/raw/v_oi.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_or.mp4 b/app/src/main/res/raw/v_or.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_ou.mp4 b/app/src/main/res/raw/v_ou.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_p.mp4 b/app/src/main/res/raw/v_p.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_r.mp4 b/app/src/main/res/raw/v_r.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_s.mp4 b/app/src/main/res/raw/v_s.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_shwua.mp4 b/app/src/main/res/raw/v_schwa.mp4 old mode 100644 new mode 100755 similarity index 100% rename from app/src/main/res/raw/v_shwua.mp4 rename to app/src/main/res/raw/v_schwa.mp4 diff --git a/app/src/main/res/raw/v_sh.mp4 b/app/src/main/res/raw/v_sh.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_t.mp4 b/app/src/main/res/raw/v_t.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_th_voiced.mp4 b/app/src/main/res/raw/v_th_voiced.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_th_voiceless.mp4 b/app/src/main/res/raw/v_th_voiceless.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_u.mp4 b/app/src/main/res/raw/v_u.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_u_short.mp4 b/app/src/main/res/raw/v_u_short.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_v.mp4 b/app/src/main/res/raw/v_v.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_v_upsidedown.mp4 b/app/src/main/res/raw/v_v_upsidedown.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_w.mp4 b/app/src/main/res/raw/v_w.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_z.mp4 b/app/src/main/res/raw/v_z.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/v_zh.mp4 b/app/src/main/res/raw/v_zh.mp4 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_above.mp3 b/app/src/main/res/raw/word_above.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_again.mp3 b/app/src/main/res/raw/word_again.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_age.mp3 b/app/src/main/res/raw/word_age.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_agile.mp3 b/app/src/main/res/raw/word_agile.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_ahead.mp3 b/app/src/main/res/raw/word_ahead.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_aired.mp3 b/app/src/main/res/raw/word_aired.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_arm.mp3 b/app/src/main/res/raw/word_arm.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_ash.mp3 b/app/src/main/res/raw/word_ash.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_bad.mp3 b/app/src/main/res/raw/word_bad.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_bat.mp3 b/app/src/main/res/raw/word_bat.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_bathe.mp3 b/app/src/main/res/raw/word_bathe.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_beige.mp3 b/app/src/main/res/raw/word_beige.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_bill.mp3 b/app/src/main/res/raw/word_bill.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_birthday.mp3 b/app/src/main/res/raw/word_birthday.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_bite.mp3 b/app/src/main/res/raw/word_bite.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_blue.mp3 b/app/src/main/res/raw/word_blue.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_boy.mp3 b/app/src/main/res/raw/word_boy.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_button.mp3 b/app/src/main/res/raw/word_button.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_call.mp3 b/app/src/main/res/raw/word_call.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_car.mp3 b/app/src/main/res/raw/word_car.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_card.mp3 b/app/src/main/res/raw/word_card.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_cards.mp3 b/app/src/main/res/raw/word_cards.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_cars.mp3 b/app/src/main/res/raw/word_cars.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_chairs.mp3 b/app/src/main/res/raw/word_chairs.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_church.mp3 b/app/src/main/res/raw/word_church.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_cool.mp3 b/app/src/main/res/raw/word_cool.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_cove.mp3 b/app/src/main/res/raw/word_cove.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_cow.mp3 b/app/src/main/res/raw/word_cow.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_cube.mp3 b/app/src/main/res/raw/word_cube.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_delicious.mp3 b/app/src/main/res/raw/word_delicious.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_each.mp3 b/app/src/main/res/raw/word_each.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_eachof.mp3 b/app/src/main/res/raw/word_eachof.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_ear.mp3 b/app/src/main/res/raw/word_ear.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_earth.mp3 b/app/src/main/res/raw/word_earth.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_edge.mp3 b/app/src/main/res/raw/word_edge.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_every.mp3 b/app/src/main/res/raw/word_every.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_father.mp3 b/app/src/main/res/raw/word_father.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_fly.mp3 b/app/src/main/res/raw/word_fly.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_gift.mp3 b/app/src/main/res/raw/word_gift.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_good.mp3 b/app/src/main/res/raw/word_good.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_have.mp3 b/app/src/main/res/raw/word_have.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_her.mp3 b/app/src/main/res/raw/word_her.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_here.mp3 b/app/src/main/res/raw/word_here.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_him.mp3 b/app/src/main/res/raw/word_him.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_if.mp3 b/app/src/main/res/raw/word_if.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_im.mp3 b/app/src/main/res/raw/word_im.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_it.mp3 b/app/src/main/res/raw/word_it.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_jonathan.mp3 b/app/src/main/res/raw/word_jonathan.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_jump.mp3 b/app/src/main/res/raw/word_jump.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_little.mp3 b/app/src/main/res/raw/word_little.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_loud.mp3 b/app/src/main/res/raw/word_loud.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_low.mp3 b/app/src/main/res/raw/word_low.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_ma.mp3 b/app/src/main/res/raw/word_ma.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_may.mp3 b/app/src/main/res/raw/word_may.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_me.mp3 b/app/src/main/res/raw/word_me.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_mother.mp3 b/app/src/main/res/raw/word_mother.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_new.mp3 b/app/src/main/res/raw/word_new.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_north.mp3 b/app/src/main/res/raw/word_north.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_oars.mp3 b/app/src/main/res/raw/word_oars.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_oath.mp3 b/app/src/main/res/raw/word_oath.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_oil.mp3 b/app/src/main/res/raw/word_oil.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_on.mp3 b/app/src/main/res/raw/word_on.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_ooze.mp3 b/app/src/main/res/raw/word_ooze.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_ought.mp3 b/app/src/main/res/raw/word_ought.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_out.mp3 b/app/src/main/res/raw/word_out.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_panda.mp3 b/app/src/main/res/raw/word_panda.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_part.mp3 b/app/src/main/res/raw/word_part.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_pass.mp3 b/app/src/main/res/raw/word_pass.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_perform.mp3 b/app/src/main/res/raw/word_perform.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_pig.mp3 b/app/src/main/res/raw/word_pig.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_pleasure.mp3 b/app/src/main/res/raw/word_pleasure.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_put.mp3 b/app/src/main/res/raw/word_put.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_put_glottal.mp3 b/app/src/main/res/raw/word_put_glottal.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_raced.mp3 b/app/src/main/res/raw/word_raced.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_raised.mp3 b/app/src/main/res/raw/word_raised.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_read.mp3 b/app/src/main/res/raw/word_read.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_real.mp3 b/app/src/main/res/raw/word_real.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_rib.mp3 b/app/src/main/res/raw/word_rib.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_ringing.mp3 b/app/src/main/res/raw/word_ringing.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_roar.mp3 b/app/src/main/res/raw/word_roar.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_safe.mp3 b/app/src/main/res/raw/word_safe.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_said.mp3 b/app/src/main/res/raw/word_said.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_saw.mp3 b/app/src/main/res/raw/word_saw.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_set.mp3 b/app/src/main/res/raw/word_set.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_shoot.mp3 b/app/src/main/res/raw/word_shoot.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_should.mp3 b/app/src/main/res/raw/word_should.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_skill.mp3 b/app/src/main/res/raw/word_skill.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_speak.mp3 b/app/src/main/res/raw/word_speak.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_sting.mp3 b/app/src/main/res/raw/word_sting.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_stop.mp3 b/app/src/main/res/raw/word_stop.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_sun.mp3 b/app/src/main/res/raw/word_sun.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_sung.mp3 b/app/src/main/res/raw/word_sung.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_there.mp3 b/app/src/main/res/raw/word_there.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_think.mp3 b/app/src/main/res/raw/word_think.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_thirty.mp3 b/app/src/main/res/raw/word_thirty.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_toad.mp3 b/app/src/main/res/raw/word_toad.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_twelve.mp3 b/app/src/main/res/raw/word_twelve.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_uhhuh.mp3 b/app/src/main/res/raw/word_uhhuh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_uhoh.mp3 b/app/src/main/res/raw/word_uhoh.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_up.mp3 b/app/src/main/res/raw/word_up.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_usually.mp3 b/app/src/main/res/raw/word_usually.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_very.mp3 b/app/src/main/res/raw/word_very.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_voice.mp3 b/app/src/main/res/raw/word_voice.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_wary.mp3 b/app/src/main/res/raw/word_wary.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_water.mp3 b/app/src/main/res/raw/word_water.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_week.mp3 b/app/src/main/res/raw/word_week.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_weird.mp3 b/app/src/main/res/raw/word_weird.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_what.mp3 b/app/src/main/res/raw/word_what.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_wished.mp3 b/app/src/main/res/raw/word_wished.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_wonderful.mp3 b/app/src/main/res/raw/word_wonderful.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_year.mp3 b/app/src/main/res/raw/word_year.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_yellow.mp3 b/app/src/main/res/raw/word_yellow.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/raw/word_zoo.mp3 b/app/src/main/res/raw/word_zoo.mp3 old mode 100644 new mode 100755 diff --git a/app/src/main/res/values-large/bools.xml b/app/src/main/res/values-large/bools.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/values-sw600dp/bools.xml b/app/src/main/res/values-sw600dp/bools.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml old mode 100644 new mode 100755 index 552cf61..1eaef4f --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,13 +1,8 @@ - - 5 - 10 - 25 - 50 - 100 - + + zh-rCN 在英式英语中/i/音标通常写作/i:/,两个点代表发长音。但是在美式发音中加点与不加点没多大区别。所以美式音标不加两个点。它在浊辅音前发长音,清辅音前发短音。 在英式英语中/ɑ/音标通常写作/ɑː/。注意在美式英语中它的发音与/ʌ/有很大区别。还有/ɑ/与汉语拼音中\"a\"也不同。(在国际音标中,汉语拼音的\"a\"写作/a/)。 @@ -16,7 +11,7 @@ /ʊ/与/u/发音不同。在长音与短音方面区别不是很大,而是嘴型的大小和舌头的位置。 /ʌ/与/ɑ/读音不同。在长音与短音方面区别不是很大,而是嘴型的大小和舌头的位置。注意它的发音与英式英语/ʌ/音标的发音稍微有所不同。当/ʌ/不读成重音时,通常写成/ə/。 英式英语的音标中使用/e/音标来表示这个发音。实际上,根据标准国际音标它应该被写成/ɛ/。嘴张开的程度比/æ/小,舌尖更靠前一点。 - "发/æ/音时,嘴张开的程度要像/ɑ/一样大,嘴角像/ɛ/那样拉向两边,但舌头应该比/ɛ/更往后一些。 + 发/æ/音时,嘴张开的程度要像/ɑ/一样大,嘴角像/ɛ/那样拉向两边,但舌头应该比/ɛ/更往后一些。 根据国际音标,美式英语中使用的/ɔ/这个音标应该被写成/ɒ/,但为了和大多数词典保持一致,我们使用了/ɔ/。(注意,/ɔː/用于英式音标时发音是不一样的,英式音标的/ɔː/是标准国际音标。)大约40%的美国人不发这个音,他们用/ɑ/代替,上述的例子可以这样发音:/ɑt/,/kɑt/,和/sɑ/。 元音/ə/是美式发音中最常见的一个音。它常用于非重读音节的单词。当此元音重读时通常写成/ʌ/。 /eɪ/是双元音。它由/e/和/ɪ/两个单音组成。在有些美式发音的词典中有时也写成/e/。不要与英式音标/e/混淆,事实上它发/ɛ/音,美式英语中带/eɪ/音的词,英式英语中的发音应该为/ɛi/。但是它们依旧都写成/eɪ/。 @@ -58,6 +53,7 @@ 这个音标叫做齿龈闪音,在中国英语课本中通常不教,但是它在美式发音中非常重要。当/t/音出现在非重读的音节中并在两个元音之间,/ɾ/音通常会代替/t/音。尽管不准确,但是/ɾ/音标也可以写成/d/。这种情况下,上述例子应该被写成/ˈwɑdɚ/,/ˈlɪdəl/和/\'θɝdi/。 美式发音 输入音标 + 人工测试 关于应用 历史记录 /%1$s/的延伸 @@ -111,7 +107,6 @@ 练习 测试 单音标 - zh 双音标 (%1$d) 单音标 (%1$d) 双音标: %1$d%% @@ -126,4 +121,5 @@ 单音标 无名 + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml new file mode 100755 index 0000000..787e87a --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,127 @@ + + + + + + + + zh-rTW + + 在英式英語中/i/音標通常寫作/i:/,兩個點代表發長音。但是在美式發音中加點與不加點沒多大區別。所以美式音標不加兩個點。它在濁輔音前發長音,清輔音前發短音。 + 在英式英語中/ɑ/音標通常寫作/ɑː/。注意在美式英語中它的發音與/ʌ/有很大區別。還有/ɑ/與漢語拼音中\"a\"也不同。(在國際音標中,漢語拼音的\"a\"寫作/a/)。 + 在英式英語中/u/音標通常寫作/uː/,但是像/iː/、/aː/、/ɔː/這些長元音的點在美式英語中不必加。美式英語中所有重讀的元音在濁輔音前發長音,清輔音前發短音。 + /ɪ/與/i/發音不同。在長音與短音方面區別不是很大,最主要的區別是你嘴型的大小和舌頭的位置。跟/i/音相比,嘴要稍微再咧開一點,舌頭的放置要靠後一點。 + /ʊ/與/u/發音不同。在長音與短音方面區別不是很大,而是嘴型的大小和舌頭的位置。 + /ʌ/與/ɑ/讀音不同。在長音與短音方面區別不是很大,而是嘴型的大小和舌頭的位置。注意它的發音與英式英語/ʌ/音標的發音稍微有所不同。當/ʌ/不讀成重音時,通常寫成/ə/。 + 英式英語的音標中使用/e/音標來表示這個發音。實際上,根據標準國際音標它應該被寫成/ɛ/。嘴張開的程度比/æ/小,舌尖更靠前一點。 + 發/æ/音時,嘴張開的程度要像/ɑ/一樣大,嘴角像/ɛ/那樣拉向兩邊,但舌頭應該比/ɛ/更往後一些。 + 根據國際音標,美式英語中使用的/ɔ/這個音標應該被寫成/ɒ/,但為了和大多數詞典保持一致,我們使用了/ɔ/。(注意,/ɔː/用於英式音標時發音是不一樣的,英式音標的/ɔː/是標準國際音標。)大約40%的美國人不發這個音,他們用/ɑ/代替,上述的例子可以這樣發音:/ɑt/,/kɑt/,和/sɑ/。 + 元音/ə/是美式發音中最常見的一個音。它常用於非重讀音節的單詞。當此元音重讀時通常寫成/ʌ/。 + /eɪ/是雙元音。它由/e/和/ɪ/兩個單音組成。在有些美式發音的詞典中有時也寫成/e/。不要與英式音標/e/混淆,事實上它發/ɛ/音,美式英語中帶/eɪ/音的詞,英式英語中的發音應該為/ɛi/。但是它們依舊都寫成/eɪ/。 + /aɪ/是雙元音。它由/a/和/ɪ/兩個單音組成。注意:/aɪ/與/æ/發音不同。 + /aʊ/是雙元音。它由/a/和/ʊ/兩個單音組成。注意:/aʊ/與/ɔ/發音不同。還要注意/aʊ/與漢語拼音中\"ao\"發音也不同。 + /ɔɪ/是雙元音。它由/ɔ/和/ɪ/兩個單音組成。/ɔɪ/中的ɔ與此應用中的/ɔ/發音不同。(這是因為在美式英語中,/ɔ/應該寫為/ɒ/。)讀/ɔɪ/時,口型由小而圓開始。 + /oʊ/是雙元音。它由/o/和/ʊ/兩個單音組成。在有些美式發音的詞典中有時也寫成/o/。注意它與英式發音/əʊ/有輕微的不同。 + /ɝ/音有時候寫為/ər/或/əɹ/。這是在重讀音節或單音節詞中的發音。當/ɝ/非重讀時,寫成/ɚ/。英式英語中沒有/ɝ​​/音,美國人發/ɝ/的單詞中英國人發/ɜː/音。 + /ɚ/的發音與/ɝ/相同,/ɚ/用於輕讀的音節,而/ɝ/用於重讀的音節。它有時寫為/ər/或/əɹ/。英式英語中沒有/ɚ/音,美國人發/ɚ/的單詞中英國人發/ə/音。 + 根據國際音標更加正確地寫法是/ɑɹ/或者/ɑɚ/。英式英語中沒有/ɑr/音,美國人發/ɑr/的單詞中英國人發/ɑː/音。 + 根據國際音標更加正確的寫法是/ɛɹ/或者/ɛɚ/。英式英語中沒有/ɛr/音,美國人發/ɛr/的單詞中英國人發/eə/音。 + 根據國際音標更加正確的寫法是/ɪɹ/或者/ɪɚ/。英式英語中沒有/ɪr/音,美國人發/ɑr/的單詞中英國人發/ɪr/音。 + 根據國際音標更加正確的寫法是/ɔɹ/或者/ɔɚ/。/ɔr/中的ɔ與此應用中的/ɔ/發音不同。(這是因為在美式英語中,/ɔ/應該寫為/ɒ/。)讀/ɔr/時,口型由小而圓開始。英式英語中沒有/ɔr/音,美國人發/ɔr/的單詞中英國人發/ɔ:/音。 + 位於詞首時是送氣音[pʰ],但在字母s後和詞尾時是非送氣的[p](跟漢語拼音的\"b\"音一樣)。注意不要把第三個例子讀成/stapə/。 + 位於詞首時是送氣音[tʰ],但在字母s後和詞尾時是非送氣的[t](跟漢語拼音的\"d\"音一樣)。注意不要把第三個例子讀成/ɪtə/,/ɪts/或/ɪtʰ/,還要注意\"t\"在美式英語發音中經常改變發音,像/ɾ/和/ʔ/。 + 位於詞首時是送氣音[kʰ],但在字母s後和詞尾時是非送氣的[k](跟漢語拼音的\"g\"音一樣)。注意不要把第三個例子讀成/wikə/。 + 注意/b/在單詞詞尾的發音,不要把第三個例子讀成/rɪbə/或者是/rɪp/。英語中的/b/和漢語拼音中的\"b\"不同。 + 注意/d/在單詞詞尾的發音,不要把第三個例子讀成/kɑrdə/或者是/kɑrt/。英語中的/d/和漢語拼音中的\"d\"不同。 + 注意/g/在單詞詞尾的發音,不要把第三個例子讀成/pɪgə/或者是/pɪk/。英語中的/g/和漢語拼音中的\"g\"不同。 + 注意/f/在單詞詞尾的發音,不要把第三個例子讀成/ɪfə/。 + 注意/s/在單詞詞尾的發音,不要把第三個例子讀成/pæsə/。 + 注意/ʧ/在單詞詞尾的發音,不要把第三個例子讀成/ʧɝʧə/。英語中的/ʧ/和漢語拼音中的\"ch\"、\"q\"不同。(在國際音標中,漢語拼音的\"ch\"是[ʈʂʰ]音,\"q\"是[tɕʰ]音。) + 注意/ʃ/在單詞詞尾的發音,不要把第三個例子讀成/æʃə/。英語中的/ʃ/和漢語拼音中的\"sh\"、\"x\"不同。(在國際音標中,漢語拼音的\"sh\"是[ʂ]音,\"x\"是[ɕ]音。) + 注意/ʤ/在單詞詞尾的發音,不要把第三個例子讀成/ɛʤə/。英語中的/ʤ/和漢語拼音中的\"zh\"、\"j\"不同。(在國際音標中,漢語拼音的\"zh\"是[ʈʂ]音,\"j\"是[tɕ]音。) + /v/和/f/口型相同。唯一的不同之處就是/v/是濁音。注意/v/與/w/兩者發音的不同。發/v/音時,上齒要輕輕接觸下唇。還要注意第三個例子不要讀成/hævə/。 + /z/和/s/口型相同。唯一的不同之處就是/z/是濁音。不要讀成/dz/。英語中的/z/和漢語拼音中的\"z\"不同。(在國際音標中,漢語拼音的\"z\"是[ts]音,\"c\"是[tsʰ]音。) + /ʒ/和/ʃ/口型相同。唯一的不同之處就是/ʒ/是濁音。注意區別/r/和/ʒ/。 + /ð/和/θ/口型相同,最主要的區別就是/ð/是濁音。發/ð/時舌頭輕觸上齒的底部。 + 這個音標的發音,舌頭輕微觸到上齒底部,不要讀成/s/。 + 注意/m/在單詞詞尾的發音,不要把第三個例子讀成/ɑrmə/。 + 注意/n/在單詞詞尾的發音,不要把第三個例子讀成/sʌnə/。 + 這個音不會出現在英語單詞的詞首。 + 這個音不會出現在英語單詞的詞尾。注意/w/和/v/的不同之處。讀/w/音時,嘴唇要形成一個小圓且不要觸碰牙齒。一小部分美國人將\"wh\"音發成/hw/(在國際音標中是/ʍ/)。 + 這個音不會出現在英語單詞的詞尾。注意year和ear的不同之處。 + 這個音不會出現在英語單詞的詞尾。注意英語中的/h/與漢語拼音中的\"h\"不同。(在國際音標中,漢語拼音的\"h\"是[x]音。) + 當/l/在單詞開頭時,它就讀國際音標中本身的音標。當字母l在單詞詞尾時發音有所不同,它就發國際音標的[ɫ]音。但是在這個應用的練習和考試中,我們用/l/音標代替[ɫ]音(在許多課本和詞典中也是如此)。第二個例子也能寫成/kuəl/,不要把最後倆個例子讀成/kuo/或/bɪo/。你的嘴唇應該放鬆且不能移動。 + 根據國際音標,這個音應該寫為/ɹ/。(國際音標中的/r/實際上是顫音,就像蒙語中的\"r\")。然而,為了與許多課本和詞典保持一致,在這裡使用/r/音標。要注意/r/和/ʒ/的不同之處,也要注意英語中的/r/與漢語拼音中的\"r\"的不同之處。(在國際音標中,漢語拼音的\"r\"是/ɻ/音。) + 這個音被稱作為聲門塞音。在中國的英語課本中通常不講,但是它在美式發音中非常重要。注意例一put的不同發音,/pʊt/與/pʊʔ/。/ʔ/音經常代替/t/音,特別是在單詞詞尾和句子中間。 + 這個音標叫做齒齦閃音,在中國英語課本中通常不教,但是它在美式發音中非常重要。當/t/音出現在非重讀的音節中並在兩個元音之間,/ɾ/音通常會代替/t/音。儘管不準確,但是/ɾ/音標也可以寫成/d/。這種情況下,上述例子應該被寫成/ˈwɑdɚ/,/ˈlɪdəl/和/\'θɝdi/。 + 美式發音 + 輸入音標 + 人工測試 + 關於應用 + 歷史記錄 + /%1$s/的延伸 + 雙音標 + 選擇音標 + 雙音標 + 單音標 + 確定 + 取消 + 輔音 + 元音 + 姓名 + 數量: + 開始 + 雙音標 + 單音標 + 類型: + 測試 + 考試結果 + 正確: %1$d + 錯誤: %1$d + 用時: %1$s + 糾錯練習 + 歷史記錄 + 總時長 + 最佳記錄 + 詳情 + 時間詳情 + 測試詳情 + 美式發音 + 關於應用 + 如果你有任何問題或者建議,請聯繫我們。 + 聯繫方式 + 已複製 + 刪除 + 複製 + 分享 + 分享到 + 輸入音標 + 測試詳情 + 確定要全部刪除嗎? + 刪除 + 在此應用以r結尾的只有這5個(ɝ,ɑr,ɛr,ɪr,ɔr),不需要另外加工。 + 你輸入的是%1$s和%2$s(兩個輔音)。你應該輸入一個元音和一個輔音。 + 你輸入的是%1$s和%2$s(兩個元音)。你應該輸入一個元音和一個輔音。 + 你輸入的是%1$s和%2$s。但是%2$s不會出現在單詞結尾。 + 你輸入的是%1$s和%2$s。但是在英語中,%2$s不會出現在單詞開頭。 + 知道了 + 更多示例 + 學習 + 練習 + 測試 + 單音標 + 雙音標 (%1$d) + 單音標 (%1$d) + 雙音標: %1$d%% + 單音標: %1$d%% + 數量: %1$d + 版本%1$s + 學習時長 + 練習時長 + 考試時長 + 總時長 + 雙音標 + 單音標 + 無名 + + \ No newline at end of file diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml new file mode 100755 index 0000000..61b636e --- /dev/null +++ b/app/src/main/res/values-zh/strings.xml @@ -0,0 +1,128 @@ + + + + + + + + zh + + 在英式英語中/i/音標通常寫作/i:/,兩個點代表發長音。但是在美式發音中加點與不加點沒多大區別。所以美式音標不加兩個點。它在濁輔音前發長音,清輔音前發短音。 + 在英式英語中/ɑ/音標通常寫作/ɑː/。注意在美式英語中它的發音與/ʌ/有很大區別。還有/ɑ/與漢語拼音中\"a\"也不同。(在國際音標中,漢語拼音的\"a\"寫作/a/)。 + 在英式英語中/u/音標通常寫作/uː/,但是像/iː/、/aː/、/ɔː/這些長元音的點在美式英語中不必加。美式英語中所有重讀的元音在濁輔音前發長音,清輔音前發短音。 + /ɪ/與/i/發音不同。在長音與短音方面區別不是很大,最主要的區別是你嘴型的大小和舌頭的位置。跟/i/音相比,嘴要稍微再咧開一點,舌頭的放置要靠後一點。 + /ʊ/與/u/發音不同。在長音與短音方面區別不是很大,而是嘴型的大小和舌頭的位置。 + /ʌ/與/ɑ/讀音不同。在長音與短音方面區別不是很大,而是嘴型的大小和舌頭的位置。注意它的發音與英式英語/ʌ/音標的發音稍微有所不同。當/ʌ/不讀成重音時,通常寫成/ə/。 + 英式英語的音標中使用/e/音標來表示這個發音。實際上,根據標準國際音標它應該被寫成/ɛ/。嘴張開的程度比/æ/小,舌尖更靠前一點。 + 發/æ/音時,嘴張開的程度要像/ɑ/一樣大,嘴角像/ɛ/那樣拉向兩邊,但舌頭應該比/ɛ/更往後一些。 + 根據國際音標,美式英語中使用的/ɔ/這個音標應該被寫成/ɒ/,但為了和大多數詞典保持一致,我們使用了/ɔ/。(注意,/ɔː/用於英式音標時發音是不一樣的,英式音標的/ɔː/是標準國際音標。)大約40%的美國人不發這個音,他們用/ɑ/代替,上述的例子可以這樣發音:/ɑt/,/kɑt/,和/sɑ/。 + 元音/ə/是美式發音中最常見的一個音。它常用於非重讀音節的單詞。當此元音重讀時通常寫成/ʌ/。 + /eɪ/是雙元音。它由/e/和/ɪ/兩個單音組成。在有些美式發音的詞典中有時也寫成/e/。不要與英式音標/e/混淆,事實上它發/ɛ/音,美式英語中帶/eɪ/音的詞,英式英語中的發音應該為/ɛi/。但是它們依舊都寫成/eɪ/。 + /aɪ/是雙元音。它由/a/和/ɪ/兩個單音組成。注意:/aɪ/與/æ/發音不同。 + /aʊ/是雙元音。它由/a/和/ʊ/兩個單音組成。注意:/aʊ/與/ɔ/發音不同。還要注意/aʊ/與漢語拼音中\"ao\"發音也不同。 + /ɔɪ/是雙元音。它由/ɔ/和/ɪ/兩個單音組成。/ɔɪ/中的ɔ與此應用中的/ɔ/發音不同。(這是因為在美式英語中,/ɔ/應該寫為/ɒ/。)讀/ɔɪ/時,口型由小而圓開始。 + /oʊ/是雙元音。它由/o/和/ʊ/兩個單音組成。在有些美式發音的詞典中有時也寫成/o/。注意它與英式發音/əʊ/有輕微的不同。 + /ɝ/音有時候寫為/ər/或/əɹ/。這是在重讀音節或單音節詞中的發音。當/ɝ/非重讀時,寫成/ɚ/。英式英語中沒有/ɝ​​/音,美國人發/ɝ/的單詞中英國人發/ɜː/音。 + /ɚ/的發音與/ɝ/相同,/ɚ/用於輕讀的音節,而/ɝ/用於重讀的音節。它有時寫為/ər/或/əɹ/。英式英語中沒有/ɚ/音,美國人發/ɚ/的單詞中英國人發/ə/音。 + 根據國際音標更加正確地寫法是/ɑɹ/或者/ɑɚ/。英式英語中沒有/ɑr/音,美國人發/ɑr/的單詞中英國人發/ɑː/音。 + 根據國際音標更加正確的寫法是/ɛɹ/或者/ɛɚ/。英式英語中沒有/ɛr/音,美國人發/ɛr/的單詞中英國人發/eə/音。 + 根據國際音標更加正確的寫法是/ɪɹ/或者/ɪɚ/。英式英語中沒有/ɪr/音,美國人發/ɑr/的單詞中英國人發/ɪr/音。 + 根據國際音標更加正確的寫法是/ɔɹ/或者/ɔɚ/。/ɔr/中的ɔ與此應用中的/ɔ/發音不同。(這是因為在美式英語中,/ɔ/應該寫為/ɒ/。)讀/ɔr/時,口型由小而圓開始。英式英語中沒有/ɔr/音,美國人發/ɔr/的單詞中英國人發/ɔ:/音。 + 位於詞首時是送氣音[pʰ],但在字母s後和詞尾時是非送氣的[p](跟漢語拼音的\"b\"音一樣)。注意不要把第三個例子讀成/stapə/。 + 位於詞首時是送氣音[tʰ],但在字母s後和詞尾時是非送氣的[t](跟漢語拼音的\"d\"音一樣)。注意不要把第三個例子讀成/ɪtə/,/ɪts/或/ɪtʰ/,還要注意\"t\"在美式英語發音中經常改變發音,像/ɾ/和/ʔ/。 + 位於詞首時是送氣音[kʰ],但在字母s後和詞尾時是非送氣的[k](跟漢語拼音的\"g\"音一樣)。注意不要把第三個例子讀成/wikə/。 + 注意/b/在單詞詞尾的發音,不要把第三個例子讀成/rɪbə/或者是/rɪp/。英語中的/b/和漢語拼音中的\"b\"不同。 + 注意/d/在單詞詞尾的發音,不要把第三個例子讀成/kɑrdə/或者是/kɑrt/。英語中的/d/和漢語拼音中的\"d\"不同。 + 注意/g/在單詞詞尾的發音,不要把第三個例子讀成/pɪgə/或者是/pɪk/。英語中的/g/和漢語拼音中的\"g\"不同。 + 注意/f/在單詞詞尾的發音,不要把第三個例子讀成/ɪfə/。 + 注意/s/在單詞詞尾的發音,不要把第三個例子讀成/pæsə/。 + 注意/ʧ/在單詞詞尾的發音,不要把第三個例子讀成/ʧɝʧə/。英語中的/ʧ/和漢語拼音中的\"ch\"、\"q\"不同。(在國際音標中,漢語拼音的\"ch\"是[ʈʂʰ]音,\"q\"是[tɕʰ]音。) + 注意/ʃ/在單詞詞尾的發音,不要把第三個例子讀成/æʃə/。英語中的/ʃ/和漢語拼音中的\"sh\"、\"x\"不同。(在國際音標中,漢語拼音的\"sh\"是[ʂ]音,\"x\"是[ɕ]音。) + 注意/ʤ/在單詞詞尾的發音,不要把第三個例子讀成/ɛʤə/。英語中的/ʤ/和漢語拼音中的\"zh\"、\"j\"不同。(在國際音標中,漢語拼音的\"zh\"是[ʈʂ]音,\"j\"是[tɕ]音。) + /v/和/f/口型相同。唯一的不同之處就是/v/是濁音。注意/v/與/w/兩者發音的不同。發/v/音時,上齒要輕輕接觸下唇。還要注意第三個例子不要讀成/hævə/。 + /z/和/s/口型相同。唯一的不同之處就是/z/是濁音。不要讀成/dz/。英語中的/z/和漢語拼音中的\"z\"不同。(在國際音標中,漢語拼音的\"z\"是[ts]音,\"c\"是[tsʰ]音。) + /ʒ/和/ʃ/口型相同。唯一的不同之處就是/ʒ/是濁音。注意區別/r/和/ʒ/。 + /ð/和/θ/口型相同,最主要的區別就是/ð/是濁音。發/ð/時舌頭輕觸上齒的底部。 + 這個音標的發音,舌頭輕微觸到上齒底部,不要讀成/s/。 + 注意/m/在單詞詞尾的發音,不要把第三個例子讀成/ɑrmə/。 + 注意/n/在單詞詞尾的發音,不要把第三個例子讀成/sʌnə/。 + 這個音不會出現在英語單詞的詞首。 + 這個音不會出現在英語單詞的詞尾。注意/w/和/v/的不同之處。讀/w/音時,嘴唇要形成一個小圓且不要觸碰牙齒。一小部分美國人將\"wh\"音發成/hw/(在國際音標中是/ʍ/)。 + 這個音不會出現在英語單詞的詞尾。注意year和ear的不同之處。 + 這個音不會出現在英語單詞的詞尾。注意英語中的/h/與漢語拼音中的\"h\"不同。(在國際音標中,漢語拼音的\"h\"是[x]音。) + 當/l/在單詞開頭時,它就讀國際音標中本身的音標。當字母l在單詞詞尾時發音有所不同,它就發國際音標的[ɫ]音。但是在這個應用的練習和考試中,我們用/l/音標代替[ɫ]音(在許多課本和詞典中也是如此)。第二個例子也能寫成/kuəl/,不要把最後倆個例子讀成/kuo/或/bɪo/。你的嘴唇應該放鬆且不能移動。 + 根據國際音標,這個音應該寫為/ɹ/。(國際音標中的/r/實際上是顫音,就像蒙語中的\"r\")。然而,為了與許多課本和詞典保持一致,在這裡使用/r/音標。要注意/r/和/ʒ/的不同之處,也要注意英語中的/r/與漢語拼音中的\"r\"的不同之處。(在國際音標中,漢語拼音的\"r\"是/ɻ/音。) + 這個音被稱作為聲門塞音。在中國的英語課本中通常不講,但是它在美式發音中非常重要。注意例一put的不同發音,/pʊt/與/pʊʔ/。/ʔ/音經常代替/t/音,特別是在單詞詞尾和句子中間。 + 這個音標叫做齒齦閃音,在中國英語課本中通常不教,但是它在美式發音中非常重要。當/t/音出現在非重讀的音節中並在兩個元音之間,/ɾ/音通常會代替/t/音。儘管不準確,但是/ɾ/音標也可以寫成/d/。這種情況下,上述例子應該被寫成/ˈwɑdɚ/,/ˈlɪdəl/和/\'θɝdi/。 + 美式發音 + 輸入音標 + 人工測試 + 關於應用 + 歷史記錄 + /%1$s/的延伸 + 雙音標 + 選擇音標 + 雙音標 + 單音標 + 確定 + 取消 + 輔音 + 元音 + 姓名 + 數量: + 開始 + 雙音標 + 單音標 + 類型: + 測試 + 考試結果 + 正確: %1$d + 錯誤: %1$d + 用時: %1$s + 糾錯練習 + 歷史記錄 + 總時長 + 最佳記錄 + 詳情 + 時間詳情 + 測試詳情 + 美式發音 + 關於應用 + 如果你有任何問題或者建議,請聯繫我們。 + 聯繫方式 + 已複製 + 刪除 + 複製 + 分享 + 分享到 + 輸入音標 + 測試詳情 + 確定要全部刪除嗎? + 刪除 + 在此應用以r結尾的只有這5個(ɝ,ɑr,ɛr,ɪr,ɔr),不需要另外加工。 + 你輸入的是%1$s和%2$s(兩個輔音)。你應該輸入一個元音和一個輔音。 + 你輸入的是%1$s和%2$s(兩個元音)。你應該輸入一個元音和一個輔音。 + 你輸入的是%1$s和%2$s。但是%2$s不會出現在單詞結尾。 + 你輸入的是%1$s和%2$s。但是在英語中,%2$s不會出現在單詞開頭。 + 知道了 + 更多示例 + 學習 + 練習 + 測試 + 單音標 + 雙音標 (%1$d) + 單音標 (%1$d) + 雙音標: %1$d%% + 單音標: %1$d%% + 數量: %1$d + 版本%1$s + 學習時長 + 練習時長 + 考試時長 + 總時長 + 雙音標 + 單音標 + 無名 + + + \ No newline at end of file diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml old mode 100644 new mode 100755 index 73b8d5b..a0cb858 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ Keyboard History + Personal evaluation About @@ -86,7 +87,13 @@ Version %1$s If you have any questions, comments, or suggestions, then please leave a message. Contact - http://www.aepronunciation.com/app/ + http://www.aepronunciation.com + + + + A limitation of this app is that it is unable to give you feedback on your actual spoken pronunciation. If you would like the app author to evaluate a recording of your pronunciation, you can use this third-party website. + Request evaluation + https://www.fiverr.com/suragch/analyze-your-pronunciation-of-american-english Write IPA diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml old mode 100644 new mode 100755 index d1358c7..e3ba013 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -6,6 +6,7 @@ @color/primary @color/primary_dark @color/accent + false