package com.fancl.iloyalty.service.impl;
import java.util.Locale;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.util.DisplayMetrics;
import com.fancl.iloyalty.Constants;
import com.fancl.iloyalty.exception.GeneralException;
import com.fancl.iloyalty.service.LocaleService;
import com.fancl.iloyalty.util.LogController;
import com.fancl.iloyalty.util.NetworkConnective;
public class LocaleServiceImpl implements LocaleService{
public final static String LANGUAGE_FOR_HTTP_EN = "en";
public final static String LANGUAGE_FOR_HTTP_TC = "tc";
public final static String LANGUAGE_FOR_HTTP_SC = "sc";
public final static String LOCALE_EN_CODE = "en";
public final static String LOCALE_TC_CODE = "zh-TW";
public final static String LOCALE_SC_CODE = "zh-CN";
public enum LANGUAGE_TYPE {
EN, TC, SC
}
public LANGUAGE_TYPE currentLanguage = LANGUAGE_TYPE.EN;
@Override
public void loadUserPreferredLanguage(Context context) {
SharedPreferences sharedPreferences = context.getSharedPreferences(
Constants.SHARED_PREFERENCE_APPLICATION_KEY,
Context.MODE_PRIVATE);
String preferredLanguage = sharedPreferences.getString(
Constants.SHARED_PREFERENCE_LANGUAGE_SETTING_KEY, null);
if (preferredLanguage == null) {
this.setLanguageByDeviceSetting(context);
} else {
if (preferredLanguage.equals(LOCALE_EN_CODE)) {
setEnglish(context, true);
} else if (preferredLanguage.equals(LOCALE_TC_CODE)) {
setTChinese(context, true);
} else if (preferredLanguage.equals(LOCALE_SC_CODE)) {
setSChinese(context, true);
} else {
setEnglish(context, true);
}
}
}
@Override
public boolean saveLanguagePrefer(Context context, String languageCode) {
SharedPreferences sharedPreferences = context.getSharedPreferences(
Constants.SHARED_PREFERENCE_APPLICATION_KEY,
Context.MODE_PRIVATE);
return sharedPreferences
.edit()
.putString(Constants.SHARED_PREFERENCE_LANGUAGE_SETTING_KEY,
languageCode).commit();
}
@Override
public void setLanguageByDeviceSetting(Context context) {
Locale userSystemPreferLanguage = Locale.getDefault();
if (userSystemPreferLanguage.equals(Locale.ENGLISH)) {
setEnglish(context, true);
} else if (userSystemPreferLanguage.equals(Locale.CHINESE)) {
setTChinese(context, true);
} else if (userSystemPreferLanguage.equals(Locale.CHINA)) {
setSChinese(context, true);
} else if (userSystemPreferLanguage.equals(Locale.TRADITIONAL_CHINESE)) {
setTChinese(context, true);
} else if (userSystemPreferLanguage.equals(Locale.TAIWAN)) {
setTChinese(context, true);
} else if (userSystemPreferLanguage.equals(Locale.SIMPLIFIED_CHINESE)) {
setSChinese(context, true);
} else {
setEnglish(context, true);
}
}
@Override
public Locale getCurrentLocale() {
if (currentLanguage.equals(LANGUAGE_TYPE.EN)) {
return Locale.ENGLISH;
} else if (currentLanguage.equals(LANGUAGE_TYPE.TC)) {
return Locale.TRADITIONAL_CHINESE;
} else if (currentLanguage.equals(LANGUAGE_TYPE.SC)) {
return Locale.SIMPLIFIED_CHINESE;
} else {
return Locale.ENGLISH;
}
}
@Override
public LANGUAGE_TYPE getCurrentLanguageType() {
if (currentLanguage.equals(LANGUAGE_TYPE.EN)) {
return LANGUAGE_TYPE.EN;
} else if (currentLanguage.equals(LANGUAGE_TYPE.TC)) {
return LANGUAGE_TYPE.TC;
} else if (currentLanguage.equals(LANGUAGE_TYPE.SC)) {
return LANGUAGE_TYPE.SC;
} else {
return LANGUAGE_TYPE.EN;
}
}
@Override
public void resetLanguage(Context context) {
Locale currentLocale = getCurrentLocale();
if (currentLocale.equals(Locale.ENGLISH)) {
setEnglish(context, false);
} else if (currentLocale.equals(Locale.TRADITIONAL_CHINESE)) {
setTChinese(context, false);
} else if (currentLocale.equals(Locale.SIMPLIFIED_CHINESE)) {
setSChinese(context, false);
} else {
setEnglish(context, false);
}
}
@Override
public void setEnglish(Context context, boolean callToServer) {
LogController.log("preferredLanguage >>>> setEnglish");
if (!(context.getResources().getConfiguration().locale.toString()
.equals(LocaleServiceImpl.LOCALE_EN_CODE))) {
Configuration config = new Configuration();
config.locale = Locale.ENGLISH;
currentLanguage = LANGUAGE_TYPE.EN;
Locale.setDefault(Locale.ENGLISH);
DisplayMetrics dm = context.getResources().getDisplayMetrics();
context.getResources().updateConfiguration(config, dm);
this.saveLanguagePrefer(context, LOCALE_EN_CODE);
if (callToServer) {
sendLanguageSettingToServer(context, LANGUAGE_TYPE.EN);
}
}
}
@Override
public void setTChinese(Context context, boolean callToServer) {
LogController.log("preferredLanguage >>>> setTChinese");
if (!(context.getResources().getConfiguration().locale.toString()
.equals(LocaleServiceImpl.LOCALE_TC_CODE))) {
Configuration config = new Configuration();
config.locale = Locale.TRADITIONAL_CHINESE;
currentLanguage = LANGUAGE_TYPE.TC;
Locale.setDefault(Locale.TRADITIONAL_CHINESE);
DisplayMetrics dm = context.getResources().getDisplayMetrics();
context.getResources().updateConfiguration(config, dm);
this.saveLanguagePrefer(context, LOCALE_TC_CODE);
if (callToServer) {
sendLanguageSettingToServer(context, LANGUAGE_TYPE.TC);
}
}
}
@Override
public void setSChinese(Context context, boolean callToServer) {
LogController.log("preferredLanguage >>>> setSChinese");
if (!(context.getResources().getConfiguration().locale.toString()
.equals(LocaleServiceImpl.LOCALE_SC_CODE))) {
Configuration config = new Configuration();
config.locale = Locale.SIMPLIFIED_CHINESE;
currentLanguage = LANGUAGE_TYPE.SC;
Locale.setDefault(Locale.SIMPLIFIED_CHINESE);
DisplayMetrics dm = context.getResources().getDisplayMetrics();
context.getResources().updateConfiguration(config, dm);
this.saveLanguagePrefer(context, LOCALE_SC_CODE);
if (callToServer) {
sendLanguageSettingToServer(context, LANGUAGE_TYPE.SC);
}
}
}
@Override
public synchronized void sendLanguageSettingToServer(Context context,
LANGUAGE_TYPE languageType) {
if (NetworkConnective.checkNetwork(context)) {
// process of send new language setting to server side
}
}
@Override
public String languageStringForHttp(LANGUAGE_TYPE languageType) {
if (languageType == null) {
return LocaleServiceImpl.LANGUAGE_FOR_HTTP_EN;
}
if (languageType.equals(LANGUAGE_TYPE.EN)) {
return LocaleServiceImpl.LANGUAGE_FOR_HTTP_EN;
} else if (languageType.equals(LANGUAGE_TYPE.TC)) {
return LocaleServiceImpl.LANGUAGE_FOR_HTTP_TC;
} else if (languageType.equals(LANGUAGE_TYPE.SC)) {
return LocaleServiceImpl.LANGUAGE_FOR_HTTP_SC;
} else {
return LocaleServiceImpl.LANGUAGE_FOR_HTTP_EN;
}
}
@Override
public LANGUAGE_TYPE languageStrForApplication(String languageStrFromHttp) {
if (languageStrFromHttp == null) {
return LANGUAGE_TYPE.EN;
}
if (languageStrFromHttp.equals(LocaleServiceImpl.LANGUAGE_FOR_HTTP_EN)) {
return LANGUAGE_TYPE.EN;
} else if (languageStrFromHttp
.equals(LocaleServiceImpl.LANGUAGE_FOR_HTTP_TC)) {
return LANGUAGE_TYPE.TC;
} else if (languageStrFromHttp
.equals(LocaleServiceImpl.LANGUAGE_FOR_HTTP_SC)) {
return LANGUAGE_TYPE.SC;
} else {
return LANGUAGE_TYPE.EN;
}
}
@Override
public String textByLangaugeChooser(Context context, String textEn,
String textTc, String textSc) {
if (this.getCurrentLanguageType().equals(LANGUAGE_TYPE.EN)) {
return textEn;
} else if (this.getCurrentLanguageType().equals(LANGUAGE_TYPE.TC)) {
return checkLangaugeTextNotNull(textEn, textTc);
} else if (this.getCurrentLanguageType().equals(LANGUAGE_TYPE.SC)) {
return checkLangaugeTextNotNull(textEn, textSc);
} else {
return textEn;
}
}
@Override
public String errorMessaeByLangaugeChooser(GeneralException generalException) {
if (generalException == null) {
return null;
}
if (this.getCurrentLanguageType().equals(LANGUAGE_TYPE.EN)) {
return generalException.getErrMsgEn();
} else if (this.getCurrentLanguageType().equals(LANGUAGE_TYPE.TC)) {
return generalException.getErrMsgTc();
} else if (this.getCurrentLanguageType().equals(LANGUAGE_TYPE.SC)) {
return generalException.getErrMsgSc();
} else {
return generalException.getErrMsgEn();
}
}
@Override
public String checkLangaugeTextNotNull(String textEN, String textUnknow) {
if (textUnknow == null || textUnknow.trim().equals(""))
return textEN;
else
return textUnknow;
}
}