package com.iwedia.service.system.language_and_keyboard;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.TreeSet;
import android.annotation.SuppressLint;
import android.content.res.Configuration;
import android.util.Log;
import com.iwedia.service.IWEDIAService;
import com.iwedia.service.system.application.ApplicationManager;
import com.iwedia.service.widget.WidgetManager;
@SuppressLint("DefaultLocale")
public class LanguageManager {
private static final String LOG_TAG = "LanguageManager";
private static LanguageManager instance = null;
private Object am;
private Class<?> ActivityManagerNative;
private Class<?> IActivityManager;
private Method getDefault;
private Method getConfiguration;
private Configuration config;
private List<String> listOfAvailableLanguages;
public LanguageManager() {
try {
// this is the only way to change config settings for now
ActivityManagerNative = Class
.forName("android.app.ActivityManagerNative");
IActivityManager = Class.forName("android.app.IActivityManager");
getDefault = null;
getDefault = ActivityManagerNative.getMethod("getDefault",
(Class<?>[]) null);
am = IActivityManager.cast(getDefault.invoke(ActivityManagerNative,
(Object[]) null));
getConfiguration = am.getClass().getMethod("getConfiguration",
(Class<?>[]) null);
config = (Configuration) getConfiguration.invoke(am,
(Object[]) null);
} catch (Exception e) {
e.printStackTrace();
}
listOfAvailableLanguages = new ArrayList<String>();
listOfAvailableLanguages.add("English");
listOfAvailableLanguages.add("中文 (简体)");
listOfAvailableLanguages.add("中文 (繁體)");
listOfAvailableLanguages.add("Norsk");
listOfAvailableLanguages.add("Svenska");
listOfAvailableLanguages.add("Dansk");
listOfAvailableLanguages.add("Suomi");
listOfAvailableLanguages.add("Icelandic");
}
public void changeLanguage(String language) {
Locale locale;
if (language.contains("English")) {
locale = new Locale("en");
} else if (language.contains("简体")) {
locale = new Locale("zh", "CN");
} else if (language.contains("繁體")) {
locale = new Locale("zh", "TW");
} else if (language.contains("Norsk")) {
locale = new Locale("nb", "NO");
} else if (language.contains("Svenska")) {
locale = new Locale("sv", "SE");
} else if (language.contains("Dansk¸")) {
locale = new Locale("da", "DK");
} else if (language.contains("Suomi")) {
locale = new Locale("fi", "FI");
} else if (language.contains("Icelandic")) {
locale = new Locale("is", "IS");
} else {
locale = new Locale(language);
}
Locale.setDefault(locale);
config.locale = locale;
updateConfiguration("updateConfiguration");
ApplicationManager.getInstance().initApplications();
WidgetManager.getInstance().initializeInstalledWidgets(
IWEDIAService.getContext());
}
public void setFontScale(float scale) {
config.fontScale = scale;
updateConfiguration("updatePersistentConfiguration");
}
public float getActiveFontScale() {
return config.fontScale;
}
public void updateConfiguration(String update) {
try {
Class<?> configClass = config.getClass();
Field f = configClass.getField("userSetLocale");
f.setBoolean(config, true);
Class<?>[] args = new Class[1];
args[0] = Configuration.class;
Method updateConfiguration = am.getClass().getMethod(update, args);
updateConfiguration.invoke(am, config);
} catch (Exception e) {
e.printStackTrace();
}
}
public int getActiveLanguage() {
int index = 0;
Locale.setDefault(config.locale);
String language = config.locale.toString();
if (language.contains("en")) {
index = 0;
} else if (language.contains("zh_CN")) {
index = 1;
} else if (language.contains("zh_TW")) {
index = 2;
} else if (language.contains("nb_NO")) {
index = 3;
} else if (language.contains("sv_SE")) {
index = 4;
} else if (language.contains("da")) {
index = 5;
} else if (language.contains("fi_FI")) {
index = 6;
} else if (language.contains("is_IS")) {
index = 7;
}
return index;
}
public List<String> getAvailableLanguages() {
return listOfAvailableLanguages;
}
public static LanguageManager getInstance() {
if (instance == null) {
instance = new LanguageManager();
}
return instance;
}
/**
* @return Avalable audio languages for current service. If they are not
* available, it returns null.
*/
public String convertTrigramsToLanguage(String language, boolean isLanguage) {
String languageToDisplay;
if (isLanguage) {
languageToDisplay = checkTrigrams(language);
} else {
languageToDisplay = checkCountries(language);
}
if (languageToDisplay.contains(" ")) {
int indexOfSecondWord = languageToDisplay.indexOf(" ") + 1;
languageToDisplay = languageToDisplay.substring(0, 1).toUpperCase(
new Locale(languageToDisplay))
+ languageToDisplay.substring(1, indexOfSecondWord)
+ languageToDisplay.substring(indexOfSecondWord,
indexOfSecondWord + 1).toUpperCase()
+ languageToDisplay.substring(indexOfSecondWord + 1);
} else {
languageToDisplay = languageToDisplay.substring(0, 1).toUpperCase()
+ languageToDisplay.substring(1);
}
return languageToDisplay;
}
public String checkTrigrams(String language) {
if (language.equals("fre")) {
language = "fra";
} else if (language.equals("sve")) {
language = "swe";
} else if (language.equals("dut") || language.equals("nla")) {
language = "nl";
} else if (language.equals("ger")) {
language = "deu";
} else if (language.equals("alb")) {
language = "sqi";
} else if (language.equals("arm")) {
language = "hye";
} else if (language.equals("baq")) {
language = "eus";
} else if (language.equals("chi")) {
language = "zho";
} else if (language.equals("cze")) {
language = "ces";
} else if (language.equals("per")) {
language = "fas";
} else if (language.equals("gae")) {
language = "gla";
} else if (language.equals("geo")) {
language = "kat";
} else if (language.equals("gre")) {
language = "ell";
} else if (language.equals("ice")) {
language = "isl";
} else if (language.equals("ice")) {
language = "isl";
} else if (language.equals("mac") || language.equals("mak")) {
language = "mk";
} else if (language.equals("may")) {
language = "msa";
} else if (language.equals("rum")) {
language = "ron";
} else if (language.equals("scr")) {
language = "sr";
} else if (language.equals("slo")) {
language = "slk";
} else if (language.equals("esl") || language.equals("esp")) {
language = "spa";
} else if (language.equals("wel")) {
language = "cym";
}
if (IWEDIAService.DEBUG) {
Log.e(LOG_TAG, "CheckTrigrams" + language);
}
Locale locale = new Locale(language);
Locale.setDefault(locale);
String languageToDisplay = Locale.getDefault().getDisplayLanguage();
if (languageToDisplay.equals("qaa")) {
languageToDisplay = "Original";
}
if (languageToDisplay.equals("mul")) {
languageToDisplay = "Multiple";
}
if (languageToDisplay.equals("und")) {
languageToDisplay = "Undefined";
}
return languageToDisplay;
}
private String checkCountries(String country) {
Locale locale;
if (country.startsWith("AUT")) {
locale = new Locale("at", "AT");
} else if (country.startsWith("DNK")) {
locale = new Locale("dk", "DK");
} else if (country.startsWith("EST")) {
locale = new Locale("ee", "EE");
} else if (country.startsWith("POL")) {
locale = new Locale("pl", "PL");
} else if (country.startsWith("PRT")) {
locale = new Locale("pt", "PT");
} else if (country.startsWith("SRB")) {
locale = new Locale("rs", "RS");
} else if (country.startsWith("SVK")) {
locale = new Locale("sk", "SK");
} else if (country.startsWith("SVN")) {
locale = new Locale("si", "SI");
} else if (country.startsWith("SWE")) {
locale = new Locale("se", "SE");
} else if (country.startsWith("TUR")) {
locale = new Locale("tr", "TR");
} else if (country.startsWith("UKR")) {
locale = new Locale("ua", "UA");
} else if (country.startsWith("CHI")) {
locale = new Locale("zh", "CN");
} else if (country.startsWith("OTH")) {
locale = new Locale("gb", "GB");
} else {
locale = new Locale(country, country.toUpperCase().substring(0, 2));
}
return locale.getDisplayCountry();
}
}