From f61bc0e0ba72974bfc41d22c34b1f0c9965c8471 Mon Sep 17 00:00:00 2001 From: Vincent Hiribarren Date: Mon, 21 Nov 2016 21:58:37 +0100 Subject: [PATCH 001/204] Call language change listeners in all updated activities --- .../akexorcist/localizationactivity/LocalizationDelegate.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java index 88e5e3f..40fbaca 100644 --- a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java +++ b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java @@ -133,8 +133,7 @@ public void run() { private void checkLocaleChange() { if (!LanguageSetting.getLanguage().toLowerCase(Locale.getDefault()) .equals(currentLanguage.toLowerCase(Locale.getDefault()))) { - callDummyActivity(); - activity.recreate(); + notifyLanguageChanged(); } } From 0c82f6f64fa9a1a8fa29f9274459ecdaa658c8e2 Mon Sep 17 00:00:00 2001 From: Pasztor Tibor Viktor Date: Wed, 4 Jan 2017 11:03:07 +0100 Subject: [PATCH 002/204] LocalizationDelegate now uses Configuration.setLocale() on appropriate API levels. --- .../localizationactivity/LocalizationDelegate.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java index 88e5e3f..351a827 100644 --- a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java +++ b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java @@ -4,6 +4,8 @@ import android.content.Context; import android.content.Intent; import android.content.res.Configuration; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.Handler; import android.util.DisplayMetrics; @@ -98,7 +100,11 @@ private void setupLocale(Locale locale) { private void updateLocaleConfiguration(Context context, Locale locale) { Configuration config = context.getResources().getConfiguration(); - config.locale = locale; + if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) { + config.setLocale(locale); + } else { + config.locale = locale; + } DisplayMetrics dm = context.getResources().getDisplayMetrics(); context.getResources().updateConfiguration(config, dm); } From baecc51a236a1e58e3fac38f4abf45a598d5cac3 Mon Sep 17 00:00:00 2001 From: Akexorcist Date: Wed, 11 Oct 2017 16:37:25 +0700 Subject: [PATCH 003/204] Update gradle and dependencies version --- app/build.gradle | 6 +++++- build.gradle | 7 +++++-- gradle.properties | 8 ++++---- gradle/wrapper/gradle-wrapper.properties | 4 ++-- localizationActivity/build.gradle | 4 ++-- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b915dbd..bd2e69b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,10 +18,14 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:25.1.1' + compile 'com.android.support:appcompat-v7:26.1.0' compile project(':localizationActivity') } diff --git a/build.gradle b/build.gradle index 54547fb..bd891ab 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,10 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:3.0.0-beta7' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -15,6 +16,7 @@ buildscript { allprojects { repositories { jcenter() + google() } } @@ -28,7 +30,8 @@ allprojects { repositories { jcenter() mavenCentral() + google() } } -apply plugin: 'android-reporting' \ No newline at end of file +apply plugin: 'android-reporting' diff --git a/gradle.properties b/gradle.properties index 9c4e37e..6465449 100644 --- a/gradle.properties +++ b/gradle.properties @@ -32,7 +32,7 @@ POM_LICENCE_DIST=repo POM_DEVELOPER_ID=Akexorcist POM_DEVELOPER_NAME=Somkiat Khitwongwattana -ANDROID_BUILD_TOOLS_VERSION=25.0.2 -ANDROID_COMPILE_SDK_VERSION=25 -ANDROID_TARGET_SDK_VERSION=25 -ANDROID_MIN_SDK=11 \ No newline at end of file +ANDROID_BUILD_TOOLS_VERSION=26.0.2 +ANDROID_COMPILE_SDK_VERSION=26 +ANDROID_TARGET_SDK_VERSION=26 +ANDROID_MIN_SDK=14 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b2de9f9..b6f3b4c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Feb 03 01:48:33 ICT 2017 +#Tue Oct 10 12:49:06 ICT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/localizationActivity/build.gradle b/localizationActivity/build.gradle index bb98197..d80538b 100644 --- a/localizationActivity/build.gradle +++ b/localizationActivity/build.gradle @@ -21,7 +21,7 @@ android { } dependencies { - compile 'com.android.support:appcompat-v7:25.1.1' + compile 'com.android.support:appcompat-v7:26.1.0' } -apply from: '../maven_push.gradle' \ No newline at end of file +apply from: '../maven_push.gradle' From 6bca2985ac7bad66777e750340f1e05e60a0a2ca Mon Sep 17 00:00:00 2001 From: Akexorcist Date: Wed, 11 Oct 2017 17:03:32 +0700 Subject: [PATCH 004/204] Add localization supported with android 7.0+ --- .../customactivity/CustomActivity.java | 14 +++++++--- localizationActivity/build.gradle | 4 +++ .../BlankDummyActivity.java | 12 +++------ .../LocalizationActivity.java | 14 +++++++--- .../LocalizationDelegate.java | 27 ++++++++++++++++--- .../OnLocaleChangedListener.java | 1 + 6 files changed, 54 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/akexorcist/localizationapp/customactivity/CustomActivity.java b/app/src/main/java/com/akexorcist/localizationapp/customactivity/CustomActivity.java index 339bff4..b483531 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/customactivity/CustomActivity.java +++ b/app/src/main/java/com/akexorcist/localizationapp/customactivity/CustomActivity.java @@ -1,6 +1,7 @@ package com.akexorcist.localizationapp.customactivity; import android.app.Activity; +import android.content.Context; import android.os.Bundle; import com.akexorcist.localizationactivity.LocalizationDelegate; @@ -11,7 +12,7 @@ /** * Created by Akexorcist on 6/23/16 AD. */ -public class CustomActivity extends Activity implements OnLocaleChangedListener { +public abstract class CustomActivity extends Activity implements OnLocaleChangedListener { private LocalizationDelegate localizationDelegate = new LocalizationDelegate(this); @@ -28,6 +29,11 @@ public void onResume() { localizationDelegate.onResume(); } + @Override + protected void attachBaseContext(Context newBase) { + super.attachBaseContext(localizationDelegate.attachBaseContext(newBase)); + } + public final void setLanguage(String language) { localizationDelegate.setLanguage(language); } @@ -54,8 +60,10 @@ public final Locale getLocale() { // Just override method locale change event @Override - public void onBeforeLocaleChanged() { } + public void onBeforeLocaleChanged() { + } @Override - public void onAfterLocaleChanged() { } + public void onAfterLocaleChanged() { + } } diff --git a/localizationActivity/build.gradle b/localizationActivity/build.gradle index d80538b..5974d83 100644 --- a/localizationActivity/build.gradle +++ b/localizationActivity/build.gradle @@ -18,6 +18,10 @@ android { res.srcDirs = ['src/main/res'] } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { diff --git a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/BlankDummyActivity.java b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/BlankDummyActivity.java index d3cbbfa..0e08513 100644 --- a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/BlankDummyActivity.java +++ b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/BlankDummyActivity.java @@ -1,7 +1,6 @@ package com.akexorcist.localizationactivity; import android.app.Activity; -import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -13,7 +12,7 @@ protected void onCreate(Bundle savedInstanceState) { R.anim.animation_localization_activity_transition_out); setContentView(R.layout.activity_blank_dummy); - dalayedFinish(); + delayedFinish(); } @Override @@ -23,12 +22,7 @@ public void finish() { R.anim.animation_localization_activity_transition_out); } - private void dalayedFinish() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - finish(); - } - }, 200); + private void delayedFinish() { + new Handler().postDelayed(this::finish, 200); } } diff --git a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationActivity.java b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationActivity.java index 3c50681..2f0f691 100644 --- a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationActivity.java +++ b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationActivity.java @@ -22,6 +22,7 @@ package com.akexorcist.localizationactivity; +import android.content.Context; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; @@ -30,7 +31,7 @@ /** * Created by Akexorcist on 7/20/15 AD. */ -public class LocalizationActivity extends AppCompatActivity implements OnLocaleChangedListener { +public abstract class LocalizationActivity extends AppCompatActivity implements OnLocaleChangedListener { private LocalizationDelegate localizationDelegate = new LocalizationDelegate(this); @@ -47,6 +48,11 @@ public void onResume() { localizationDelegate.onResume(); } + @Override + protected void attachBaseContext(Context newBase) { + super.attachBaseContext(localizationDelegate.attachBaseContext(newBase)); + } + public final void setLanguage(String language) { localizationDelegate.setLanguage(language); } @@ -73,8 +79,10 @@ public final Locale getLocale() { // Just override method locale change event @Override - public void onBeforeLocaleChanged() { } + public void onBeforeLocaleChanged() { + } @Override - public void onAfterLocaleChanged() { } + public void onAfterLocaleChanged() { + } } diff --git a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java index 0b34944..42f51b3 100644 --- a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java +++ b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java @@ -4,8 +4,10 @@ import android.content.Context; import android.content.Intent; import android.content.res.Configuration; +import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.os.LocaleList; import android.util.DisplayMetrics; import java.util.ArrayList; @@ -97,10 +99,29 @@ private void setupLocale(Locale locale) { } private void updateLocaleConfiguration(Context context, Locale locale) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { + Configuration config = context.getResources().getConfiguration(); + config.locale = locale; + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + context.getResources().updateConfiguration(config, dm); + } + } + + public Context attachBaseContext(Context context) { + Locale locale = LanguageSetting.getLocale(context); Configuration config = context.getResources().getConfiguration(); - config.locale = locale; - DisplayMetrics dm = context.getResources().getDisplayMetrics(); - context.getResources().updateConfiguration(config, dm); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + config.setLocale(locale); + LocaleList localeList = new LocaleList(locale); + LocaleList.setDefault(localeList); + config.setLocales(localeList); + return context.createConfigurationContext(config); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + config.setLocale(locale); + return context.createConfigurationContext(config); + } else { + return context; + } } // Avoid duplicated setup diff --git a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/OnLocaleChangedListener.java b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/OnLocaleChangedListener.java index 2701fdf..90ef5a4 100644 --- a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/OnLocaleChangedListener.java +++ b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/OnLocaleChangedListener.java @@ -27,5 +27,6 @@ */ public interface OnLocaleChangedListener { void onBeforeLocaleChanged(); + void onAfterLocaleChanged(); } From 32d2397e8c9ff1c760a8823cc4da01876e27f7a7 Mon Sep 17 00:00:00 2001 From: Akexorcist Date: Wed, 11 Oct 2017 17:03:40 +0700 Subject: [PATCH 005/204] Wrap up example code --- .../localizationapp/MainActivity.java | 44 +++++---- .../customactivity/SimpleCustomActivity.java | 62 +++++++------ .../simpleactivity/SimpleActivity.java | 62 +++++++------ .../simplefragment/SimpleFragment.java | 3 +- .../SimpleFragmentActivity.java | 62 +++++++------ .../stackedactivity/Stack1Activity.java | 16 +--- .../stackedactivity/Stack2Activity.java | 60 ++++++------ .../viewpager/HelloFragment.java | 3 +- .../viewpager/OneFragment.java | 3 +- .../viewpager/ThreeFragment.java | 3 +- .../viewpager/TwoFragment.java | 3 +- .../viewpager/ViewPagerActivity.java | 92 ++++++++++--------- .../viewpager/ViewPagerAdapter.java | 2 +- 13 files changed, 223 insertions(+), 192 deletions(-) diff --git a/app/src/main/java/com/akexorcist/localizationapp/MainActivity.java b/app/src/main/java/com/akexorcist/localizationapp/MainActivity.java index 30844eb..129e067 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/MainActivity.java +++ b/app/src/main/java/com/akexorcist/localizationapp/MainActivity.java @@ -11,7 +11,7 @@ import com.akexorcist.localizationapp.stackedactivity.Stack1Activity; import com.akexorcist.localizationapp.viewpager.ViewPagerActivity; -public class MainActivity extends LocalizationActivity implements View.OnClickListener { +public class MainActivity extends LocalizationActivity { @Override public void onCreate(Bundle savedInstanceState) { @@ -20,27 +20,31 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - findViewById(R.id.btn_simple_activity).setOnClickListener(this); - findViewById(R.id.btn_custom_activity).setOnClickListener(this); - findViewById(R.id.btn_stacked_activity).setOnClickListener(this); - findViewById(R.id.btn_activity_fragment).setOnClickListener(this); - findViewById(R.id.btn_activity_view_pager).setOnClickListener(this); + findViewById(R.id.btn_simple_activity).setOnClickListener(onSimpleActivityClick()); + findViewById(R.id.btn_custom_activity).setOnClickListener(onCustomActivityClick()); + findViewById(R.id.btn_stacked_activity).setOnClickListener(onStackedActivityClick()); + findViewById(R.id.btn_activity_fragment).setOnClickListener(onSimpleFragmentClick()); + findViewById(R.id.btn_activity_view_pager).setOnClickListener(onViewPagerClick()); } - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.btn_simple_activity) { - goToActivity(SimpleActivity.class); - } else if (id == R.id.btn_custom_activity) { - goToActivity(SimpleCustomActivity.class); - } else if (id == R.id.btn_stacked_activity) { - goToActivity(Stack1Activity.class); - } else if (id == R.id.btn_activity_fragment) { - goToActivity(SimpleFragmentActivity.class); - } else if (id == R.id.btn_activity_view_pager) { - goToActivity(ViewPagerActivity.class); - } + public View.OnClickListener onSimpleActivityClick() { + return view -> goToActivity(SimpleActivity.class); + } + + public View.OnClickListener onCustomActivityClick() { + return view -> goToActivity(SimpleCustomActivity.class); + } + + public View.OnClickListener onStackedActivityClick() { + return view -> goToActivity(Stack1Activity.class); + } + + public View.OnClickListener onSimpleFragmentClick() { + return view -> goToActivity(SimpleFragmentActivity.class); + } + + public View.OnClickListener onViewPagerClick() { + return view -> goToActivity(ViewPagerActivity.class); } public void goToActivity(Class activity) { diff --git a/app/src/main/java/com/akexorcist/localizationapp/customactivity/SimpleCustomActivity.java b/app/src/main/java/com/akexorcist/localizationapp/customactivity/SimpleCustomActivity.java index 39c1cb8..04ed672 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/customactivity/SimpleCustomActivity.java +++ b/app/src/main/java/com/akexorcist/localizationapp/customactivity/SimpleCustomActivity.java @@ -6,7 +6,7 @@ import com.akexorcist.localizationapp.R; -public class SimpleCustomActivity extends CustomActivity implements View.OnClickListener { +public class SimpleCustomActivity extends CustomActivity { private final String KEY_SCROLL_X = "scroll_x"; private HorizontalScrollView svLanguageChooser; @@ -19,15 +19,15 @@ public void onCreate(Bundle savedInstanceState) { // Activity title is not change the language automatically. setTitle(R.string.hello_world); - findViewById(R.id.btn_america).setOnClickListener(this); - findViewById(R.id.btn_china).setOnClickListener(this); - findViewById(R.id.btn_italy).setOnClickListener(this); - findViewById(R.id.btn_japan).setOnClickListener(this); - findViewById(R.id.btn_korea).setOnClickListener(this); - findViewById(R.id.btn_portugal).setOnClickListener(this); - findViewById(R.id.btn_thai).setOnClickListener(this); + findViewById(R.id.btn_america).setOnClickListener(onAmericaLanguageSelected()); + findViewById(R.id.btn_china).setOnClickListener(onChinaLanguageSelected()); + findViewById(R.id.btn_italy).setOnClickListener(onItalyLanguageSelected()); + findViewById(R.id.btn_japan).setOnClickListener(onJapanLanguageSelected()); + findViewById(R.id.btn_korea).setOnClickListener(onKoreaLanguageSelected()); + findViewById(R.id.btn_portugal).setOnClickListener(onPortugalLanguageSelected()); + findViewById(R.id.btn_thai).setOnClickListener(onThaiLanguageSelected()); - svLanguageChooser = (HorizontalScrollView) findViewById(R.id.sv_language_chooser); + svLanguageChooser = findViewById(R.id.sv_language_chooser); } @Override @@ -44,23 +44,31 @@ public void onRestoreInstanceState(Bundle savedInstanceState) { svLanguageChooser.scrollTo(savedInstanceState.getInt(KEY_SCROLL_X), 0); } - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.btn_america) { - setLanguage("en"); - } else if (id == R.id.btn_china) { - setLanguage("zh"); - } else if (id == R.id.btn_italy) { - setLanguage("it"); - } else if (id == R.id.btn_japan) { - setLanguage("ja"); - } else if (id == R.id.btn_korea) { - setLanguage("ko"); - } else if (id == R.id.btn_portugal) { - setLanguage("pt"); - } else if (id == R.id.btn_thai) { - setLanguage("th"); - } + private View.OnClickListener onAmericaLanguageSelected() { + return view -> setLanguage("en"); + } + + private View.OnClickListener onChinaLanguageSelected() { + return view -> setLanguage("zh"); + } + + private View.OnClickListener onItalyLanguageSelected() { + return view -> setLanguage("it"); + } + + private View.OnClickListener onJapanLanguageSelected() { + return view -> setLanguage("ja"); + } + + private View.OnClickListener onKoreaLanguageSelected() { + return view -> setLanguage("ko"); + } + + private View.OnClickListener onPortugalLanguageSelected() { + return view -> setLanguage("pt"); + } + + private View.OnClickListener onThaiLanguageSelected() { + return view -> setLanguage("th"); } } diff --git a/app/src/main/java/com/akexorcist/localizationapp/simpleactivity/SimpleActivity.java b/app/src/main/java/com/akexorcist/localizationapp/simpleactivity/SimpleActivity.java index cec58e8..a026819 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/simpleactivity/SimpleActivity.java +++ b/app/src/main/java/com/akexorcist/localizationapp/simpleactivity/SimpleActivity.java @@ -7,7 +7,7 @@ import com.akexorcist.localizationactivity.LocalizationActivity; import com.akexorcist.localizationapp.R; -public class SimpleActivity extends LocalizationActivity implements View.OnClickListener { +public class SimpleActivity extends LocalizationActivity { private final String KEY_SCROLL_X = "scroll_x"; private HorizontalScrollView svLanguageChooser; @@ -20,15 +20,15 @@ public void onCreate(Bundle savedInstanceState) { // Activity title is not change the language automatically. setTitle(R.string.hello_world); - findViewById(R.id.btn_america).setOnClickListener(this); - findViewById(R.id.btn_china).setOnClickListener(this); - findViewById(R.id.btn_italy).setOnClickListener(this); - findViewById(R.id.btn_japan).setOnClickListener(this); - findViewById(R.id.btn_korea).setOnClickListener(this); - findViewById(R.id.btn_portugal).setOnClickListener(this); - findViewById(R.id.btn_thai).setOnClickListener(this); + findViewById(R.id.btn_america).setOnClickListener(onAmericaLanguageSelected()); + findViewById(R.id.btn_china).setOnClickListener(onChinaLanguageSelected()); + findViewById(R.id.btn_italy).setOnClickListener(onItalyLanguageSelected()); + findViewById(R.id.btn_japan).setOnClickListener(onJapanLanguageSelected()); + findViewById(R.id.btn_korea).setOnClickListener(onKoreaLanguageSelected()); + findViewById(R.id.btn_portugal).setOnClickListener(onPortugalLanguageSelected()); + findViewById(R.id.btn_thai).setOnClickListener(onThaiLanguageSelected()); - svLanguageChooser = (HorizontalScrollView) findViewById(R.id.sv_language_chooser); + svLanguageChooser = findViewById(R.id.sv_language_chooser); } @Override @@ -45,23 +45,31 @@ public void onRestoreInstanceState(Bundle savedInstanceState) { svLanguageChooser.scrollTo(savedInstanceState.getInt(KEY_SCROLL_X), 0); } - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.btn_america) { - setLanguage("en"); - } else if (id == R.id.btn_china) { - setLanguage("zh"); - } else if (id == R.id.btn_italy) { - setLanguage("it"); - } else if (id == R.id.btn_japan) { - setLanguage("ja"); - } else if (id == R.id.btn_korea) { - setLanguage("ko"); - } else if (id == R.id.btn_portugal) { - setLanguage("pt"); - } else if (id == R.id.btn_thai) { - setLanguage("th"); - } + private View.OnClickListener onAmericaLanguageSelected() { + return view -> setLanguage("en"); + } + + private View.OnClickListener onChinaLanguageSelected() { + return view -> setLanguage("zh"); + } + + private View.OnClickListener onItalyLanguageSelected() { + return view -> setLanguage("it"); + } + + private View.OnClickListener onJapanLanguageSelected() { + return view -> setLanguage("ja"); + } + + private View.OnClickListener onKoreaLanguageSelected() { + return view -> setLanguage("ko"); + } + + private View.OnClickListener onPortugalLanguageSelected() { + return view -> setLanguage("pt"); + } + + private View.OnClickListener onThaiLanguageSelected() { + return view -> setLanguage("th"); } } diff --git a/app/src/main/java/com/akexorcist/localizationapp/simplefragment/SimpleFragment.java b/app/src/main/java/com/akexorcist/localizationapp/simplefragment/SimpleFragment.java index c868874..bf89583 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/simplefragment/SimpleFragment.java +++ b/app/src/main/java/com/akexorcist/localizationapp/simplefragment/SimpleFragment.java @@ -26,7 +26,7 @@ public static Fragment newInstance() { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_simple, container, false); - svAppleStory = (ScrollView) rootView.findViewById(R.id.sv_apple_story); + svAppleStory = rootView.findViewById(R.id.sv_apple_story); if (savedInstanceState != null) { // Restore y-position of scroll view. @@ -43,3 +43,4 @@ public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } } + diff --git a/app/src/main/java/com/akexorcist/localizationapp/simplefragment/SimpleFragmentActivity.java b/app/src/main/java/com/akexorcist/localizationapp/simplefragment/SimpleFragmentActivity.java index c3e59ca..802d378 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/simplefragment/SimpleFragmentActivity.java +++ b/app/src/main/java/com/akexorcist/localizationapp/simplefragment/SimpleFragmentActivity.java @@ -9,7 +9,7 @@ import com.akexorcist.localizationactivity.LocalizationActivity; import com.akexorcist.localizationapp.R; -public class SimpleFragmentActivity extends LocalizationActivity implements View.OnClickListener { +public class SimpleFragmentActivity extends LocalizationActivity { private final String KEY_SCROLL_X = "scroll_x"; private HorizontalScrollView svLanguageChooser; @@ -19,15 +19,15 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_simple_fragment); - findViewById(R.id.btn_america).setOnClickListener(this); - findViewById(R.id.btn_china).setOnClickListener(this); - findViewById(R.id.btn_italy).setOnClickListener(this); - findViewById(R.id.btn_japan).setOnClickListener(this); - findViewById(R.id.btn_korea).setOnClickListener(this); - findViewById(R.id.btn_portugal).setOnClickListener(this); - findViewById(R.id.btn_thai).setOnClickListener(this); + findViewById(R.id.btn_america).setOnClickListener(onAmericaLanguageSelected()); + findViewById(R.id.btn_china).setOnClickListener(onChinaLanguageSelected()); + findViewById(R.id.btn_italy).setOnClickListener(onItalyLanguageSelected()); + findViewById(R.id.btn_japan).setOnClickListener(onJapanLanguageSelected()); + findViewById(R.id.btn_korea).setOnClickListener(onKoreaLanguageSelected()); + findViewById(R.id.btn_portugal).setOnClickListener(onPortugalLanguageSelected()); + findViewById(R.id.btn_thai).setOnClickListener(onThaiLanguageSelected()); - svLanguageChooser = (HorizontalScrollView) findViewById(R.id.sv_language_chooser); + svLanguageChooser = findViewById(R.id.sv_language_chooser); if (savedInstanceState == null) { Fragment fragment = SimpleFragment.newInstance(); @@ -51,23 +51,31 @@ public void onRestoreInstanceState(Bundle savedInstanceState) { svLanguageChooser.scrollTo(savedInstanceState.getInt(KEY_SCROLL_X), 0); } - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.btn_america) { - setLanguage("en"); - } else if (id == R.id.btn_china) { - setLanguage("zh"); - } else if (id == R.id.btn_italy) { - setLanguage("it"); - } else if (id == R.id.btn_japan) { - setLanguage("ja"); - } else if (id == R.id.btn_korea) { - setLanguage("ko"); - } else if (id == R.id.btn_portugal) { - setLanguage("pt"); - } else if (id == R.id.btn_thai) { - setLanguage("th"); - } + private View.OnClickListener onAmericaLanguageSelected() { + return view -> setLanguage("en"); + } + + private View.OnClickListener onChinaLanguageSelected() { + return view -> setLanguage("zh"); + } + + private View.OnClickListener onItalyLanguageSelected() { + return view -> setLanguage("it"); + } + + private View.OnClickListener onJapanLanguageSelected() { + return view -> setLanguage("ja"); + } + + private View.OnClickListener onKoreaLanguageSelected() { + return view -> setLanguage("ko"); + } + + private View.OnClickListener onPortugalLanguageSelected() { + return view -> setLanguage("pt"); + } + + private View.OnClickListener onThaiLanguageSelected() { + return view -> setLanguage("th"); } } diff --git a/app/src/main/java/com/akexorcist/localizationapp/stackedactivity/Stack1Activity.java b/app/src/main/java/com/akexorcist/localizationapp/stackedactivity/Stack1Activity.java index 234eb5c..aeeff8d 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/stackedactivity/Stack1Activity.java +++ b/app/src/main/java/com/akexorcist/localizationapp/stackedactivity/Stack1Activity.java @@ -11,25 +11,17 @@ * Created by Akexorcist on 2/3/2017 AD. */ -public class Stack1Activity extends LocalizationActivity implements View.OnClickListener { +public class Stack1Activity extends LocalizationActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_stack_1); - findViewById(R.id.btn_change_language).setOnClickListener(this); + findViewById(R.id.btn_change_language).setOnClickListener(openChangeLanguageActivity()); } - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.btn_change_language) { - openChangeLanguageActivity(); - } - } - - private void openChangeLanguageActivity() { - startActivity(new Intent(this, Stack2Activity.class)); + private View.OnClickListener openChangeLanguageActivity() { + return view -> startActivity(new Intent(this, Stack2Activity.class)); } } diff --git a/app/src/main/java/com/akexorcist/localizationapp/stackedactivity/Stack2Activity.java b/app/src/main/java/com/akexorcist/localizationapp/stackedactivity/Stack2Activity.java index c267b4a..3b76742 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/stackedactivity/Stack2Activity.java +++ b/app/src/main/java/com/akexorcist/localizationapp/stackedactivity/Stack2Activity.java @@ -10,39 +10,47 @@ * Created by Akexorcist on 2/3/2017 AD. */ -public class Stack2Activity extends LocalizationActivity implements View.OnClickListener { +public class Stack2Activity extends LocalizationActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_stack_2); - findViewById(R.id.btn_america).setOnClickListener(this); - findViewById(R.id.btn_china).setOnClickListener(this); - findViewById(R.id.btn_italy).setOnClickListener(this); - findViewById(R.id.btn_japan).setOnClickListener(this); - findViewById(R.id.btn_korea).setOnClickListener(this); - findViewById(R.id.btn_portugal).setOnClickListener(this); - findViewById(R.id.btn_thai).setOnClickListener(this); + findViewById(R.id.btn_america).setOnClickListener(onAmericaLanguageSelected()); + findViewById(R.id.btn_china).setOnClickListener(onChinaLanguageSelected()); + findViewById(R.id.btn_italy).setOnClickListener(onItalyLanguageSelected()); + findViewById(R.id.btn_japan).setOnClickListener(onJapanLanguageSelected()); + findViewById(R.id.btn_korea).setOnClickListener(onKoreaLanguageSelected()); + findViewById(R.id.btn_portugal).setOnClickListener(onPortugalLanguageSelected()); + findViewById(R.id.btn_thai).setOnClickListener(onThaiLanguageSelected()); } - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.btn_america) { - setLanguage("en"); - } else if (id == R.id.btn_china) { - setLanguage("zh"); - } else if (id == R.id.btn_italy) { - setLanguage("it"); - } else if (id == R.id.btn_japan) { - setLanguage("ja"); - } else if (id == R.id.btn_korea) { - setLanguage("ko"); - } else if (id == R.id.btn_portugal) { - setLanguage("pt"); - } else if (id == R.id.btn_thai) { - setLanguage("th"); - } + private View.OnClickListener onAmericaLanguageSelected() { + return view -> setLanguage("en"); + } + + private View.OnClickListener onChinaLanguageSelected() { + return view -> setLanguage("zh"); + } + + private View.OnClickListener onItalyLanguageSelected() { + return view -> setLanguage("it"); + } + + private View.OnClickListener onJapanLanguageSelected() { + return view -> setLanguage("ja"); + } + + private View.OnClickListener onKoreaLanguageSelected() { + return view -> setLanguage("ko"); + } + + private View.OnClickListener onPortugalLanguageSelected() { + return view -> setLanguage("pt"); + } + + private View.OnClickListener onThaiLanguageSelected() { + return view -> setLanguage("th"); } } diff --git a/app/src/main/java/com/akexorcist/localizationapp/viewpager/HelloFragment.java b/app/src/main/java/com/akexorcist/localizationapp/viewpager/HelloFragment.java index 4323c52..1fa8476 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/viewpager/HelloFragment.java +++ b/app/src/main/java/com/akexorcist/localizationapp/viewpager/HelloFragment.java @@ -21,7 +21,6 @@ public static Fragment newInstance() { @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_hello, container, false); - return rootView; + return inflater.inflate(R.layout.fragment_hello, container, false); } } diff --git a/app/src/main/java/com/akexorcist/localizationapp/viewpager/OneFragment.java b/app/src/main/java/com/akexorcist/localizationapp/viewpager/OneFragment.java index 976d63a..7eaf078 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/viewpager/OneFragment.java +++ b/app/src/main/java/com/akexorcist/localizationapp/viewpager/OneFragment.java @@ -21,7 +21,6 @@ public static Fragment newInstance() { @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_one, container, false); - return rootView; + return inflater.inflate(R.layout.fragment_one, container, false); } } diff --git a/app/src/main/java/com/akexorcist/localizationapp/viewpager/ThreeFragment.java b/app/src/main/java/com/akexorcist/localizationapp/viewpager/ThreeFragment.java index a676222..bf7cb37 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/viewpager/ThreeFragment.java +++ b/app/src/main/java/com/akexorcist/localizationapp/viewpager/ThreeFragment.java @@ -21,7 +21,6 @@ public static Fragment newInstance() { @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_three, container, false); - return rootView; + return inflater.inflate(R.layout.fragment_three, container, false); } } diff --git a/app/src/main/java/com/akexorcist/localizationapp/viewpager/TwoFragment.java b/app/src/main/java/com/akexorcist/localizationapp/viewpager/TwoFragment.java index 90bfeed..5bc9d6b 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/viewpager/TwoFragment.java +++ b/app/src/main/java/com/akexorcist/localizationapp/viewpager/TwoFragment.java @@ -21,7 +21,6 @@ public static Fragment newInstance() { @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_two, container, false); - return rootView; + return inflater.inflate(R.layout.fragment_two, container, false); } } diff --git a/app/src/main/java/com/akexorcist/localizationapp/viewpager/ViewPagerActivity.java b/app/src/main/java/com/akexorcist/localizationapp/viewpager/ViewPagerActivity.java index 5bfe176..1e1d36d 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/viewpager/ViewPagerActivity.java +++ b/app/src/main/java/com/akexorcist/localizationapp/viewpager/ViewPagerActivity.java @@ -8,7 +8,7 @@ import com.akexorcist.localizationactivity.LocalizationActivity; import com.akexorcist.localizationapp.R; -public class ViewPagerActivity extends LocalizationActivity implements View.OnClickListener, ViewPager.OnPageChangeListener { +public class ViewPagerActivity extends LocalizationActivity implements ViewPager.OnPageChangeListener { private final String KEY_CURRENT_PAGE = "current_page"; private ViewPagerAdapter adapter; @@ -21,22 +21,22 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_pager); - findViewById(R.id.btn_america).setOnClickListener(this); - findViewById(R.id.btn_china).setOnClickListener(this); - findViewById(R.id.btn_italy).setOnClickListener(this); - findViewById(R.id.btn_japan).setOnClickListener(this); - findViewById(R.id.btn_korea).setOnClickListener(this); - findViewById(R.id.btn_portugal).setOnClickListener(this); - findViewById(R.id.btn_thai).setOnClickListener(this); + findViewById(R.id.btn_america).setOnClickListener(onAmericaLanguageSelected()); + findViewById(R.id.btn_china).setOnClickListener(onChinaLanguageSelected()); + findViewById(R.id.btn_italy).setOnClickListener(onItalyLanguageSelected()); + findViewById(R.id.btn_japan).setOnClickListener(onJapanLanguageSelected()); + findViewById(R.id.btn_korea).setOnClickListener(onKoreaLanguageSelected()); + findViewById(R.id.btn_portugal).setOnClickListener(onPortugalLanguageSelected()); + findViewById(R.id.btn_thai).setOnClickListener(onThaiLanguageSelected()); - btnNext = (Button) findViewById(R.id.btn_next); - btnNext.setOnClickListener(this); + btnNext = findViewById(R.id.btn_next); + btnNext.setOnClickListener(onNextPageClick()); - btnPrev = (Button) findViewById(R.id.btn_prev); - btnPrev.setOnClickListener(this); + btnPrev = findViewById(R.id.btn_prev); + btnPrev.setOnClickListener(onPreviousPageClick()); adapter = new ViewPagerAdapter(getSupportFragmentManager()); - vpGreeting = (ViewPager) findViewById(R.id.vp_greeting); + vpGreeting = findViewById(R.id.vp_greeting); vpGreeting.setAdapter(adapter); vpGreeting.addOnPageChangeListener(this); @@ -57,47 +57,53 @@ public void onRestoreInstanceState(Bundle savedInstanceState) { vpGreeting.setCurrentItem(savedInstanceState.getInt(KEY_CURRENT_PAGE)); } - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.btn_america) { - setLanguage("en"); - } else if (id == R.id.btn_china) { - setLanguage("zh"); - } else if (id == R.id.btn_italy) { - setLanguage("it"); - } else if (id == R.id.btn_japan) { - setLanguage("ja"); - } else if (id == R.id.btn_korea) { - setLanguage("ko"); - } else if (id == R.id.btn_portugal) { - setLanguage("pt"); - } else if (id == R.id.btn_thai) { - setLanguage("th"); - } else if (id == R.id.btn_next) { - nextPage(); - } else if (id == R.id.btn_prev) { - previousPage(); - } - } - @Override public void onPageSelected(int position) { setNavigationVisibility(position); } @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + } @Override - public void onPageScrollStateChanged(int state) { } + public void onPageScrollStateChanged(int state) { + } + + private View.OnClickListener onAmericaLanguageSelected() { + return view -> setLanguage("en"); + } + + private View.OnClickListener onChinaLanguageSelected() { + return view -> setLanguage("zh"); + } + + private View.OnClickListener onItalyLanguageSelected() { + return view -> setLanguage("it"); + } + + private View.OnClickListener onJapanLanguageSelected() { + return view -> setLanguage("ja"); + } + + private View.OnClickListener onKoreaLanguageSelected() { + return view -> setLanguage("ko"); + } + + private View.OnClickListener onPortugalLanguageSelected() { + return view -> setLanguage("pt"); + } + + private View.OnClickListener onThaiLanguageSelected() { + return view -> setLanguage("th"); + } - private void nextPage() { - vpGreeting.setCurrentItem(vpGreeting.getCurrentItem() + 1); + private View.OnClickListener onNextPageClick() { + return view -> vpGreeting.setCurrentItem(vpGreeting.getCurrentItem() + 1); } - private void previousPage() { - vpGreeting.setCurrentItem(vpGreeting.getCurrentItem() - 1); + private View.OnClickListener onPreviousPageClick() { + return view -> vpGreeting.setCurrentItem(vpGreeting.getCurrentItem() - 1); } private void setNavigationVisibility(int currentPosition) { diff --git a/app/src/main/java/com/akexorcist/localizationapp/viewpager/ViewPagerAdapter.java b/app/src/main/java/com/akexorcist/localizationapp/viewpager/ViewPagerAdapter.java index 63be699..ee43e2b 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/viewpager/ViewPagerAdapter.java +++ b/app/src/main/java/com/akexorcist/localizationapp/viewpager/ViewPagerAdapter.java @@ -8,7 +8,7 @@ * Created by Akexorcist on 7/22/15 AD. */ public class ViewPagerAdapter extends FragmentPagerAdapter { - private final int PAGE_COUNT = 4; + private static final int PAGE_COUNT = 4; public ViewPagerAdapter(FragmentManager fm) { super(fm); From 35a208d29c14747036d101acfac4e2db7482c922 Mon Sep 17 00:00:00 2001 From: Akexorcist Date: Wed, 11 Oct 2017 17:08:47 +0700 Subject: [PATCH 006/204] Update version to 1.2.0 --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6465449..ffd7a7f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=1.1.1 -VERSION_CODE=010101 +VERSION_NAME=1.2.0 +VERSION_CODE=010200 GROUP=com.akexorcist POM_DESCRIPTION=Language changeable activity library From 92b4c1458b91126878a33f0e50a46cf48bac89cf Mon Sep 17 00:00:00 2001 From: Akexorcist Date: Wed, 11 Oct 2017 17:55:42 +0700 Subject: [PATCH 007/204] Use lambda --- .../localizationactivity/LocalizationDelegate.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java index 42f51b3..f1af778 100644 --- a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java +++ b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java @@ -139,12 +139,9 @@ private void notifyLanguageChanged() { // If activity is run to backstack. So we have to check if this activity is resume working. public void onResume() { - new Handler().post(new Runnable() { - @Override - public void run() { - checkLocaleChange(); - checkAfterLocaleChanging(); - } + new Handler().post(() -> { + checkLocaleChange(); + checkAfterLocaleChanging(); }); } From 90b1b8161943405d5db693fc7f8eea6b7f6cfc45 Mon Sep 17 00:00:00 2001 From: Akexorcist Date: Wed, 11 Oct 2017 21:01:50 +0700 Subject: [PATCH 008/204] Add country supported --- .../customactivity/CustomActivity.java | 6 +- .../localizationactivity/LanguageSetting.java | 56 ++++++++----------- .../LocalizationActivity.java | 6 +- .../LocalizationDelegate.java | 54 ++++++++++-------- 4 files changed, 55 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/com/akexorcist/localizationapp/customactivity/CustomActivity.java b/app/src/main/java/com/akexorcist/localizationapp/customactivity/CustomActivity.java index b483531..ad351f8 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/customactivity/CustomActivity.java +++ b/app/src/main/java/com/akexorcist/localizationapp/customactivity/CustomActivity.java @@ -50,14 +50,10 @@ public final void setDefaultLanguage(Locale locale) { localizationDelegate.setDefaultLanguage(locale); } - public final String getLanguage() { + public final Locale getLanguage() { return localizationDelegate.getLanguage(); } - public final Locale getLocale() { - return localizationDelegate.getLocale(); - } - // Just override method locale change event @Override public void onBeforeLocaleChanged() { diff --git a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LanguageSetting.java b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LanguageSetting.java index 70e0606..1446cb9 100644 --- a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LanguageSetting.java +++ b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LanguageSetting.java @@ -34,54 +34,44 @@ public class LanguageSetting { private static final String PREFERENCE_LANGUAGE = "pref_language"; private static final String KEY_LANGUAGE = "key_language"; - private static String DEFAULT_LANGUAGE = Locale.ENGLISH.getLanguage(); - private static String currentLanguage = Locale.ENGLISH.getLanguage(); + private static Locale DEFAULT_LANGUAGE = Locale.ENGLISH; + private static Locale currentLanguage = Locale.ENGLISH; - public static void setDefaultLanguage(String language) { - DEFAULT_LANGUAGE = language; + public static void setDefaultLanguage(Locale locale) { + DEFAULT_LANGUAGE = locale; } - public static String getDefaultLanguage() { + public static Locale getDefaultLanguage() { return DEFAULT_LANGUAGE; } - public static void setLanguage(Context context, String language) { - currentLanguage = language; + public static void setLanguage(Context context, Locale locale) { + currentLanguage = locale; SharedPreferences.Editor editor = getLanguagePreference(context).edit(); - editor.putString(KEY_LANGUAGE, language); + editor.putString(KEY_LANGUAGE, locale.toString()); editor.apply(); } - public static void setLanguage(Context context, Locale locale) { - setLanguage(context, locale.getLanguage()); - } - - public static String getLanguage() { + public static Locale getCurrentLanguage() { return currentLanguage; } - private static String getLanguage(Context context) { - return getLanguagePreference(context).getString(KEY_LANGUAGE, DEFAULT_LANGUAGE); + public static Locale getLanguage(Context context) { + String[] language = getLanguagePreference(context) + .getString(KEY_LANGUAGE, DEFAULT_LANGUAGE.toString()) + .split("_"); + Locale locale; + if (language.length == 1) { + locale = new Locale(language[0]); + } else if (language.length == 2) { + locale = new Locale(language[0], language[1].toUpperCase()); + } else { + locale = DEFAULT_LANGUAGE; + } + return locale; } private static SharedPreferences getLanguagePreference(Context context) { return context.getSharedPreferences(PREFERENCE_LANGUAGE, Activity.MODE_PRIVATE); } - - public static void setDefaultLanguage(Locale locale) { - LanguageSetting.setDefaultLanguage(locale.getLanguage()); - } - - public static Locale getLocale() { - return getLocale(getLanguage()); - } - - public static Locale getLocale(Context context) { - return getLocale(getLanguage(context)); - } - - public static Locale getLocale(String language) { - return new Locale(language.toLowerCase(Locale.getDefault())); - } - -} \ No newline at end of file +} diff --git a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationActivity.java b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationActivity.java index 2f0f691..f78f194 100644 --- a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationActivity.java +++ b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationActivity.java @@ -69,14 +69,10 @@ public final void setDefaultLanguage(Locale locale) { localizationDelegate.setDefaultLanguage(locale); } - public final String getLanguage() { + public final Locale getCurrentLanguage() { return localizationDelegate.getLanguage(); } - public final Locale getLocale() { - return localizationDelegate.getLocale(); - } - // Just override method locale change event @Override public void onBeforeLocaleChanged() { diff --git a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java index f1af778..713c82c 100644 --- a/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java +++ b/localizationActivity/src/main/java/com/akexorcist/localizationactivity/LocalizationDelegate.java @@ -25,7 +25,7 @@ public class LocalizationDelegate { private boolean isLocalizationChanged = false; // Prepare default language. - private String currentLanguage = LanguageSetting.getDefaultLanguage(); + private Locale currentLanguage = LanguageSetting.getDefaultLanguage(); private final Activity activity; private final List localeChangedListeners = new ArrayList<>(); @@ -45,33 +45,39 @@ public void onCreate(Bundle savedInstanceState) { // Provide method to set application language by country name. public final void setLanguage(String language) { - if (!isCurrentLanguageSetting(language)) { - LanguageSetting.setLanguage(activity, language); - notifyLanguageChanged(); - } + Locale locale = new Locale(language); + setLanguage(locale); + } + + public final void setLanguage(String language, String country) { + Locale locale = new Locale(language, country); + setLanguage(locale); } - // Provide method to set application language by locale. public final void setLanguage(Locale locale) { - setLanguage(locale.getLanguage()); + if (!isCurrentLanguageSetting(locale)) { + LanguageSetting.setLanguage(activity, locale); + notifyLanguageChanged(); + } } public final void setDefaultLanguage(String language) { - LanguageSetting.setDefaultLanguage(language); + Locale locale = new Locale(language); + setDefaultLanguage(locale); } - public final void setDefaultLanguage(Locale locale) { - LanguageSetting.setDefaultLanguage(locale.getLanguage()); + public final void setDefaultLanguage(String language, String country) { + Locale locale = new Locale(language, country); + setDefaultLanguage(locale); } - // Get current language - public final String getLanguage() { - return LanguageSetting.getLanguage(); + public final void setDefaultLanguage(Locale locale) { + LanguageSetting.setDefaultLanguage(locale); } - // Get current locale - public final Locale getLocale() { - return LanguageSetting.getLocale(activity); + // Get current language + public final Locale getLanguage() { + return LanguageSetting.getCurrentLanguage(); } // Check that bundle come from locale change. @@ -87,10 +93,10 @@ private void checkBeforeLocaleChanging() { // Setup language to locale and language preference. // This method will called before onCreate. private void setupLanguage() { - Locale locale = LanguageSetting.getLocale(activity); + Locale locale = LanguageSetting.getLanguage(activity); setupLocale(locale); - currentLanguage = locale.getLanguage(); - LanguageSetting.setLanguage(activity, locale.getLanguage()); + currentLanguage = locale; + LanguageSetting.setLanguage(activity, locale); } // Set locale configuration. @@ -108,7 +114,7 @@ private void updateLocaleConfiguration(Context context, Locale locale) { } public Context attachBaseContext(Context context) { - Locale locale = LanguageSetting.getLocale(context); + Locale locale = LanguageSetting.getLanguage(context); Configuration config = context.getResources().getConfiguration(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { config.setLocale(locale); @@ -125,8 +131,8 @@ public Context attachBaseContext(Context context) { } // Avoid duplicated setup - private boolean isCurrentLanguageSetting(String language) { - return language.equals(LanguageSetting.getLanguage()); + private boolean isCurrentLanguageSetting(Locale locale) { + return locale.toString().equals(LanguageSetting.getCurrentLanguage().toString()); } // Let's take it change! (Using recreate method that available on API 11 or more. @@ -137,7 +143,7 @@ private void notifyLanguageChanged() { activity.recreate(); } - // If activity is run to backstack. So we have to check if this activity is resume working. + // If activity is run to back stack. So we have to check if this activity is resume working. public void onResume() { new Handler().post(() -> { checkLocaleChange(); @@ -145,7 +151,7 @@ public void onResume() { }); } - // Check if locale has change while this activity was run to backstack. + // Check if locale has change while this activity was run to back stack. private void checkLocaleChange() { if (!isCurrentLanguageSetting(currentLanguage)) { sendOnBeforeLocaleChangedEvent(); From 4cf50677eb768037c38f5ba8f3afca5f742fc2b6 Mon Sep 17 00:00:00 2001 From: Akexorcist Date: Wed, 11 Oct 2017 21:08:47 +0700 Subject: [PATCH 009/204] Change compile to implementation --- app/build.gradle | 6 +++--- localizationActivity/build.gradle | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bd2e69b..6492fb6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,7 +25,7 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:26.1.0' - compile project(':localizationActivity') + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:26.1.0' + implementation project(':localizationActivity') } diff --git a/localizationActivity/build.gradle b/localizationActivity/build.gradle index 5974d83..89a03d6 100644 --- a/localizationActivity/build.gradle +++ b/localizationActivity/build.gradle @@ -25,7 +25,7 @@ android { } dependencies { - compile 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support:appcompat-v7:26.1.0' } apply from: '../maven_push.gradle' From 8cb50207bf5321c117226d08114a2292b574888b Mon Sep 17 00:00:00 2001 From: Akexorcist Date: Sun, 15 Oct 2017 13:57:35 +0700 Subject: [PATCH 010/204] Add overload method --- .../localizationapp/customactivity/CustomActivity.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/com/akexorcist/localizationapp/customactivity/CustomActivity.java b/app/src/main/java/com/akexorcist/localizationapp/customactivity/CustomActivity.java index ad351f8..a7c72a3 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/customactivity/CustomActivity.java +++ b/app/src/main/java/com/akexorcist/localizationapp/customactivity/CustomActivity.java @@ -38,6 +38,10 @@ public final void setLanguage(String language) { localizationDelegate.setLanguage(language); } + public final void setLanguage(String language, String country) { + localizationDelegate.setLanguage(language, country); + } + public final void setLanguage(Locale locale) { localizationDelegate.setLanguage(locale); } @@ -46,6 +50,10 @@ public final void setDefaultLanguage(String language) { localizationDelegate.setDefaultLanguage(language); } + public final void setDefaultLanguage(String language, String country) { + localizationDelegate.setDefaultLanguage(language, country); + } + public final void setDefaultLanguage(Locale locale) { localizationDelegate.setDefaultLanguage(locale); } From 96b9740f44bc21268f325f332955559d26606836 Mon Sep 17 00:00:00 2001 From: Akexorcist Date: Sun, 15 Oct 2017 13:57:51 +0700 Subject: [PATCH 011/204] Update gradle plugin to 3.0.0 rc1 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bd891ab..db6cf40 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0-beta7' + classpath 'com.android.tools.build:gradle:3.0.0-rc1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From ef7ba970ddcebdca121be4663718bdddf80b9c90 Mon Sep 17 00:00:00 2001 From: Akexorcist Date: Sun, 15 Oct 2017 16:12:53 +0700 Subject: [PATCH 012/204] Add RTL support --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5c669b7..c069c6c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:supportsRtl="true" android:theme="@style/AppTheme"> From 6fa50686b26a5a07f51493f159c17b994b0e9a19 Mon Sep 17 00:00:00 2001 From: Akexorcist Date: Sun, 15 Oct 2017 16:37:08 +0700 Subject: [PATCH 013/204] Add nested fragment example --- app/src/main/AndroidManifest.xml | 1 + .../localizationapp/MainActivity.java | 6 ++ .../nestedfragment/ChildFragment.java | 46 ++++++++++ .../NestedFragmentActivity.java | 86 +++++++++++++++++++ .../nestedfragment/ParentFragment.java | 38 ++++++++ app/src/main/res/layout/activity_main.xml | 6 ++ .../res/layout/activity_nested_fragment.xml | 32 +++++++ .../main/res/layout/fragment_nested_child.xml | 49 +++++++++++ .../res/layout/fragment_nested_parent.xml | 26 ++++++ app/src/main/res/values/strings.xml | 3 + 10 files changed, 293 insertions(+) create mode 100644 app/src/main/java/com/akexorcist/localizationapp/nestedfragment/ChildFragment.java create mode 100644 app/src/main/java/com/akexorcist/localizationapp/nestedfragment/NestedFragmentActivity.java create mode 100644 app/src/main/java/com/akexorcist/localizationapp/nestedfragment/ParentFragment.java create mode 100644 app/src/main/res/layout/activity_nested_fragment.xml create mode 100644 app/src/main/res/layout/fragment_nested_child.xml create mode 100644 app/src/main/res/layout/fragment_nested_parent.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c069c6c..ec6678e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ + diff --git a/app/src/main/java/com/akexorcist/localizationapp/MainActivity.java b/app/src/main/java/com/akexorcist/localizationapp/MainActivity.java index 129e067..519bc24 100644 --- a/app/src/main/java/com/akexorcist/localizationapp/MainActivity.java +++ b/app/src/main/java/com/akexorcist/localizationapp/MainActivity.java @@ -6,6 +6,7 @@ import com.akexorcist.localizationactivity.LocalizationActivity; import com.akexorcist.localizationapp.customactivity.SimpleCustomActivity; +import com.akexorcist.localizationapp.nestedfragment.NestedFragmentActivity; import com.akexorcist.localizationapp.simpleactivity.SimpleActivity; import com.akexorcist.localizationapp.simplefragment.SimpleFragmentActivity; import com.akexorcist.localizationapp.stackedactivity.Stack1Activity; @@ -24,6 +25,7 @@ public void onCreate(Bundle savedInstanceState) { findViewById(R.id.btn_custom_activity).setOnClickListener(onCustomActivityClick()); findViewById(R.id.btn_stacked_activity).setOnClickListener(onStackedActivityClick()); findViewById(R.id.btn_activity_fragment).setOnClickListener(onSimpleFragmentClick()); + findViewById(R.id.btn_activity_nested_fragment).setOnClickListener(onNestedFragmentClick()); findViewById(R.id.btn_activity_view_pager).setOnClickListener(onViewPagerClick()); } @@ -43,6 +45,10 @@ public View.OnClickListener onSimpleFragmentClick() { return view -> goToActivity(SimpleFragmentActivity.class); } + private View.OnClickListener onNestedFragmentClick() { + return view -> goToActivity(NestedFragmentActivity.class); + } + public View.OnClickListener onViewPagerClick() { return view -> goToActivity(ViewPagerActivity.class); } diff --git a/app/src/main/java/com/akexorcist/localizationapp/nestedfragment/ChildFragment.java b/app/src/main/java/com/akexorcist/localizationapp/nestedfragment/ChildFragment.java new file mode 100644 index 0000000..6e0f928 --- /dev/null +++ b/app/src/main/java/com/akexorcist/localizationapp/nestedfragment/ChildFragment.java @@ -0,0 +1,46 @@ +package com.akexorcist.localizationapp.nestedfragment; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ScrollView; + +import com.akexorcist.localizationapp.R; + +/** + * Created by Akexorcist on 7/22/15 AD. + */ +public class ChildFragment extends Fragment { + private final String KEY_SCROLL_Y = "scroll_y"; + + private ScrollView svAppleStory; + + public static Fragment newInstance() { + return new ChildFragment(); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_nested_child, container, false); + svAppleStory = rootView.findViewById(R.id.sv_apple_story); + + if (savedInstanceState != null) { + // Restore y-position of scroll view. + svAppleStory.scrollTo(0, savedInstanceState.getInt(KEY_SCROLL_Y)); + } + + return rootView; + } + + @Override + public void onSaveInstanceState(Bundle outState) { + // Save y-position of scroll view. + outState.putInt(KEY_SCROLL_Y, svAppleStory.getScrollY()); + super.onSaveInstanceState(outState); + } +} + diff --git a/app/src/main/java/com/akexorcist/localizationapp/nestedfragment/NestedFragmentActivity.java b/app/src/main/java/com/akexorcist/localizationapp/nestedfragment/NestedFragmentActivity.java new file mode 100644 index 0000000..6e37bac --- /dev/null +++ b/app/src/main/java/com/akexorcist/localizationapp/nestedfragment/NestedFragmentActivity.java @@ -0,0 +1,86 @@ +package com.akexorcist.localizationapp.nestedfragment; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.view.View; +import android.widget.HorizontalScrollView; + +import com.akexorcist.localizationactivity.LocalizationActivity; +import com.akexorcist.localizationapp.R; +import com.akexorcist.localizationapp.simplefragment.SimpleFragment; + +/** + * Created by Akexorcist on 10/15/2017 AD. + */ + +public class NestedFragmentActivity extends LocalizationActivity { + private static final String KEY_SCROLL_X = "scroll_x"; + + private HorizontalScrollView svLanguageChooser; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_nested_fragment); + + findViewById(R.id.btn_america).setOnClickListener(onAmericaLanguageSelected()); + findViewById(R.id.btn_china).setOnClickListener(onChinaLanguageSelected()); + findViewById(R.id.btn_italy).setOnClickListener(onItalyLanguageSelected()); + findViewById(R.id.btn_japan).setOnClickListener(onJapanLanguageSelected()); + findViewById(R.id.btn_korea).setOnClickListener(onKoreaLanguageSelected()); + findViewById(R.id.btn_portugal).setOnClickListener(onPortugalLanguageSelected()); + findViewById(R.id.btn_thai).setOnClickListener(onThaiLanguageSelected()); + + svLanguageChooser = findViewById(R.id.sv_language_chooser); + + if (savedInstanceState == null) { + Fragment fragment = ParentFragment.newInstance(); + FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + transaction.replace(R.id.layout_fragment_container, fragment); + transaction.commit(); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + // Save x-position of horizontal scroll view. + outState.putInt(KEY_SCROLL_X, svLanguageChooser.getScrollX()); + super.onSaveInstanceState(outState); + } + + @Override + public void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + // Restore x-position of horizontal scroll view. + svLanguageChooser.scrollTo(savedInstanceState.getInt(KEY_SCROLL_X), 0); + } + + private View.OnClickListener onAmericaLanguageSelected() { + return view -> setLanguage("en"); + } + + private View.OnClickListener onChinaLanguageSelected() { + return view -> setLanguage("zh"); + } + + private View.OnClickListener onItalyLanguageSelected() { + return view -> setLanguage("it"); + } + + private View.OnClickListener onJapanLanguageSelected() { + return view -> setLanguage("ja"); + } + + private View.OnClickListener onKoreaLanguageSelected() { + return view -> setLanguage("ko"); + } + + private View.OnClickListener onPortugalLanguageSelected() { + return view -> setLanguage("pt"); + } + + private View.OnClickListener onThaiLanguageSelected() { + return view -> setLanguage("th"); + } +} diff --git a/app/src/main/java/com/akexorcist/localizationapp/nestedfragment/ParentFragment.java b/app/src/main/java/com/akexorcist/localizationapp/nestedfragment/ParentFragment.java new file mode 100644 index 0000000..44e1ecf --- /dev/null +++ b/app/src/main/java/com/akexorcist/localizationapp/nestedfragment/ParentFragment.java @@ -0,0 +1,38 @@ +package com.akexorcist.localizationapp.nestedfragment; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.akexorcist.localizationapp.R; + +/** + * Created by Akexorcist on 7/22/15 AD. + */ +public class ParentFragment extends Fragment { + public static Fragment newInstance() { + return new ParentFragment(); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_nested_parent, container, false); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (savedInstanceState == null) { + Fragment fragment = ChildFragment.newInstance(); + FragmentTransaction transaction = getFragmentManager().beginTransaction(); + transaction.replace(R.id.layout_child_fragment_container, fragment); + transaction.commit(); + } + } +} + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 80c8d80..034d23a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -50,6 +50,12 @@ android:layout_height="wrap_content" android:text="@string/fragment_activity" /> +