From 153d5ff15929467418e0b1aa8bbb1199f1ba83c3 Mon Sep 17 00:00:00 2001
From: 18401019693 <https://gitee.com/xxkp/NEWPDLIVE.git>
Date: Mon, 3 Apr 2023 15:29:21 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BF=83=E6=84=BF=E5=8D=95?=
 =?UTF-8?q?=E7=94=9F=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/src/main/AndroidManifest.xml              |   3 +
 .../java/com/shayu/phonelive/AppContext.java  |   3 +
 .../yunbao/common/activity/AbsActivity.java   |  16 +--
 .../com/yunbao/common/bean/WishModel.java     |   5 +-
 .../fragment/LiveNewWishListFragment.java     |  13 +-
 .../com/yunbao/common/utils/AppManager.java   | 130 ++++++++++++++++++
 .../common/views/LiveNewWishListPopup.java    |  12 +-
 common/src/main/res/values-en/strings.xml     |   2 +
 common/src/main/res/values/strings.xml        |   2 +
 main/src/main/AndroidManifest.xml             |   4 +
 .../activity/LanguageSettingActivity.java     |  54 ++++++++
 .../yunbao/main/activity/SettingActivity.java |   7 +
 .../com/yunbao/main/utils/LanguageUtil.java   |  95 +++++++++++++
 .../main/res/drawable/background_language.xml |   9 ++
 main/src/main/res/drawable/icon_xuanzhong.png | Bin 0 -> 1499 bytes
 .../res/layout/activity_language_sett.xml     | 107 ++++++++++++++
 main/src/main/res/layout/activity_setting.xml |  31 +++++
 17 files changed, 482 insertions(+), 11 deletions(-)
 create mode 100644 common/src/main/java/com/yunbao/common/utils/AppManager.java
 create mode 100644 main/src/main/java/com/yunbao/main/activity/LanguageSettingActivity.java
 create mode 100644 main/src/main/java/com/yunbao/main/utils/LanguageUtil.java
 create mode 100644 main/src/main/res/drawable/background_language.xml
 create mode 100644 main/src/main/res/drawable/icon_xuanzhong.png
 create mode 100644 main/src/main/res/layout/activity_language_sett.xml

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6f4878418..3fedf332c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,6 +6,8 @@
     <uses-permission
         android:name="android.permission.CALL_PHONE"
         tools:node="remove" />
+    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"
+        tools:ignore="ProtectedPermissions" />
     <uses-permission
         android:name="android.permission.READ_LOGS"
         tools:ignore="ProtectedPermissions"
@@ -92,6 +94,7 @@
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:largeHeap="true"
+        android:supportsRtl="true"
         android:preserveLegacyExternalStorage="true"
         android:requestLegacyExternalStorage="true"
         android:theme="@style/AppTheme"
diff --git a/app/src/main/java/com/shayu/phonelive/AppContext.java b/app/src/main/java/com/shayu/phonelive/AppContext.java
index 081ff74cb..31fefcb5f 100644
--- a/app/src/main/java/com/shayu/phonelive/AppContext.java
+++ b/app/src/main/java/com/shayu/phonelive/AppContext.java
@@ -39,6 +39,7 @@ import com.yunbao.common.manager.imrongcloud.InstructorSendRewardProvider;
 import com.yunbao.common.manager.imrongcloud.MessageIMManager;
 import com.yunbao.common.manager.imrongcloud.RecommendLiveRoom;
 import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
+import com.yunbao.common.utils.AppManager;
 import com.yunbao.common.utils.L;
 import com.yunbao.common.utils.SpUtil;
 import com.yunbao.live.socket.SocketRyClient;
@@ -104,12 +105,14 @@ public class AppContext extends CommonAppContext {
                     return;
                 }
             }
+            AppManager.getInstance().removeActivity(activity);
         }
 
         @Override
         public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
             activities.add(new WeakReference<>(activity));
             CrashSaveBean.getInstance().setActivitySize(activities);
+            AppManager.getInstance().addActivity(activity);
         }
 
         @Override
diff --git a/common/src/main/java/com/yunbao/common/activity/AbsActivity.java b/common/src/main/java/com/yunbao/common/activity/AbsActivity.java
index e75bf5ae6..42fa80d32 100644
--- a/common/src/main/java/com/yunbao/common/activity/AbsActivity.java
+++ b/common/src/main/java/com/yunbao/common/activity/AbsActivity.java
@@ -43,14 +43,14 @@ public abstract class AbsActivity extends AppCompatActivity {
     protected List<LifeCycleListener> mLifeCycleListeners;
     protected boolean isFullWindow;
 
-    @Override
-    public Resources getResources() {
-        Resources res = super.getResources();
-        Configuration config = new Configuration();
-        config.setToDefaults();
-        res.updateConfiguration(config, res.getDisplayMetrics());
-        return res;
-    }
+//    @Override
+//    public Resources getResources() {
+//        Resources res = super.getResources();
+//        Configuration config = new Configuration();
+//        config.setToDefaults();
+//        res.updateConfiguration(config, res.getDisplayMetrics());
+//        return res;
+//    }
 
 
     @Override
diff --git a/common/src/main/java/com/yunbao/common/bean/WishModel.java b/common/src/main/java/com/yunbao/common/bean/WishModel.java
index b1bf7e722..136fbe952 100644
--- a/common/src/main/java/com/yunbao/common/bean/WishModel.java
+++ b/common/src/main/java/com/yunbao/common/bean/WishModel.java
@@ -1,5 +1,8 @@
 package com.yunbao.common.bean;
 
+import androidx.room.Transaction;
+
+import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
 
 public class WishModel extends BaseModel {
@@ -29,7 +32,7 @@ public class WishModel extends BaseModel {
     @SerializedName("price")
     private int price;
     @SerializedName("isShow")
-    private int isShow = -1;
+    private transient int isShow = -1;
 
     public int getIsShow() {
         return isShow;
diff --git a/common/src/main/java/com/yunbao/common/fragment/LiveNewWishListFragment.java b/common/src/main/java/com/yunbao/common/fragment/LiveNewWishListFragment.java
index f7c912e08..897c19eb9 100644
--- a/common/src/main/java/com/yunbao/common/fragment/LiveNewWishListFragment.java
+++ b/common/src/main/java/com/yunbao/common/fragment/LiveNewWishListFragment.java
@@ -10,6 +10,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 import com.lxj.xpopup.XPopup;
 import com.yunbao.common.R;
 import com.yunbao.common.adapter.LiveNewWishAdapter;
@@ -23,6 +24,7 @@ import com.yunbao.common.utils.ToastUtil;
 import com.yunbao.common.views.LiveNewWishGiftPopup;
 import com.yunbao.common.views.weight.ViewClicksAntiShake;
 
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -100,8 +102,17 @@ public class LiveNewWishListFragment extends BaseFragment {
     public void saveWish() {
         List<WishModel> wishList = liveNewWishAdapter.getWishList();
         wishList.remove(wishList.size() - 1);
+        // 1. Gson构造器
+        GsonBuilder builder = new GsonBuilder();
+        // 2. 排除使用特定修饰符的字段
+        builder.excludeFieldsWithModifiers(Modifier.TRANSIENT);
+        // 3. 格式良好的输出
+        builder.setPrettyPrinting();
+        // 4. 创建Gson对象
+        Gson gson = builder.create();
+
         LiveNetManager.get(getContext()).
-                setWishlistV2(type, new Gson().toJson(wishList), new HttpCallback<String>() {
+                setWishlistV2(type, gson.toJson(wishList), new HttpCallback<String>() {
                     @Override
                     public void onSuccess(String data) {
                         ToastUtil.show(data);
diff --git a/common/src/main/java/com/yunbao/common/utils/AppManager.java b/common/src/main/java/com/yunbao/common/utils/AppManager.java
new file mode 100644
index 000000000..95f7d5a83
--- /dev/null
+++ b/common/src/main/java/com/yunbao/common/utils/AppManager.java
@@ -0,0 +1,130 @@
+package com.yunbao.common.utils;
+
+import android.app.Activity;
+
+import java.util.Stack;
+
+public class AppManager {
+
+    private static Stack<Activity> activityStack;
+
+    public AppManager() {
+    }
+
+    /**
+     * 单一实例
+     */
+    public static AppManager getInstance() {
+        return SingleApp.INSTANCE;
+    }
+
+    public static class SingleApp {
+        public static AppManager INSTANCE = new AppManager();
+    }
+
+    /**
+     * 添加Activity到堆栈
+     */
+    public void addActivity(Activity activity) {
+        if (activityStack == null) {
+            activityStack = new Stack<Activity>();
+        }
+        activityStack.add(activity);
+    }
+
+    /**
+     * 移除Activity
+     */
+    public void removeActivity(Activity activity) {
+        activityStack.remove(activity);
+    }
+
+    /**
+     * 获取指定的Activity
+     */
+    public static Activity getActivity(Class<?> cls) {
+        if (activityStack != null)
+            for (Activity activity : activityStack) {
+                if (activity.getClass().equals(cls)) {
+                    return activity;
+                }
+            }
+        return null;
+    }
+
+    /**
+     * 获取当前显示Activity(堆栈中最后一个传入的activity)
+     */
+    public Activity getLastActivity() {
+        Activity activity = activityStack.lastElement();
+        return activity;
+    }
+
+    /**
+     * 获取所有Activity
+     */
+    public Stack<Activity> getAllActivityStacks() {
+        return activityStack;
+    }
+
+    /**
+     * 结束指定的Activity
+     */
+    public void finishActivity(Activity activity) {
+        if (activity != null) {
+            if (!activity.isFinishing()) {
+                activity.finish();
+                activityStack.remove(activity);
+            }
+        }
+    }
+
+    /**
+     * 结束指定类名的Activity
+     */
+    public void finishActivity(Class<?> cls) {
+        for (Activity activity : activityStack) {
+            if (activity.getClass().equals(cls)) {
+                finishActivity(activity);
+                break;
+            }
+        }
+    }
+
+    /**
+     * 结束除当前传入以外所有Activity
+     */
+    public void finishOthersActivity(Class<?> cls) {
+        if (activityStack != null)
+            for (Activity activity : activityStack) {
+                if (!activity.getClass().equals(cls)) {
+                    activity.finish();
+                }
+            }
+    }
+
+    /**
+     * 结束所有Activity
+     */
+    public void finishAllActivity() {
+        if (activityStack != null)
+            for (Activity activity : activityStack) {
+                activity.finish();
+            }
+        activityStack.clear();
+    }
+
+
+    /**
+     * 退出应用程序
+     */
+    public void AppExit() {
+        try {
+            finishAllActivity();
+            android.os.Process.killProcess(android.os.Process.myPid());// 杀死该应用进程
+            System.exit(0);
+        } catch (Exception e) {
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/common/src/main/java/com/yunbao/common/views/LiveNewWishListPopup.java b/common/src/main/java/com/yunbao/common/views/LiveNewWishListPopup.java
index b4a636abc..a2b6f830b 100644
--- a/common/src/main/java/com/yunbao/common/views/LiveNewWishListPopup.java
+++ b/common/src/main/java/com/yunbao/common/views/LiveNewWishListPopup.java
@@ -14,6 +14,7 @@ import androidx.viewpager2.widget.ViewPager2;
 
 import com.google.android.material.tabs.TabLayout;
 import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 import com.lxj.xpopup.XPopup;
 import com.lxj.xpopup.core.BottomPopupView;
 import com.yunbao.common.R;
@@ -33,6 +34,7 @@ import com.yunbao.common.views.weight.ViewClicksAntiShake;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -286,8 +288,16 @@ public class LiveNewWishListPopup extends BottomPopupView {
                             break;
                     }
                     List<WishModel> wishList = new ArrayList<>();
+                    // 1. Gson构造器
+                    GsonBuilder builder = new GsonBuilder();
+                    // 2. 排除使用特定修饰符的字段
+                    builder.excludeFieldsWithModifiers(Modifier.TRANSIENT);
+                    // 3. 格式良好的输出
+                    builder.setPrettyPrinting();
+                    // 4. 创建Gson对象
+                    Gson gson = builder.create();
                     LiveNetManager.get(getContext()).
-                            setWishlistV2(type, new Gson().toJson(wishList), new HttpCallback<String>() {
+                            setWishlistV2(type, gson.toJson(wishList), new HttpCallback<String>() {
                                 @Override
                                 public void onSuccess(String data) {
                                     ToastUtil.show(data);
diff --git a/common/src/main/res/values-en/strings.xml b/common/src/main/res/values-en/strings.xml
index 81ad887c4..6a63d995c 100644
--- a/common/src/main/res/values-en/strings.xml
+++ b/common/src/main/res/values-en/strings.xml
@@ -1116,4 +1116,6 @@ Limited ride And limited avatar frame</string>
     <string name="live_use_discount_yes">Use</string>
     <string name="live_use_wish">wish</string>
     <string name="live_play_setting">Play setting</string>
+    <string name="live_language_setting">language setting</string>
+    <string name="traditional_chinese">Traditional Chinese</string>
 </resources>
diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml
index 3939bc3ce..d7ef14ef8 100644
--- a/common/src/main/res/values/strings.xml
+++ b/common/src/main/res/values/strings.xml
@@ -1114,5 +1114,7 @@
     <string name="live_use_discount_yes">使用</string>
     <string name="live_use_wish">心願</string>
     <string name="live_play_setting">播放設置</string>
+    <string name="live_language_setting">語言設定</string>
+    <string name="traditional_chinese">繁體中文</string>
 
 </resources>
diff --git a/main/src/main/AndroidManifest.xml b/main/src/main/AndroidManifest.xml
index e9afd0342..950e8e921 100644
--- a/main/src/main/AndroidManifest.xml
+++ b/main/src/main/AndroidManifest.xml
@@ -60,6 +60,10 @@
         <activity
             android:name=".activity.SettingActivity"
             android:screenOrientation="portrait" />
+        <activity
+            android:name=".activity.LanguageSettingActivity"
+            android:screenOrientation="portrait"
+            android:configChanges="locale|layoutDirection|keyboard"    />
         <activity
             android:name=".activity.SearchActivity"
             android:screenOrientation="portrait"
diff --git a/main/src/main/java/com/yunbao/main/activity/LanguageSettingActivity.java b/main/src/main/java/com/yunbao/main/activity/LanguageSettingActivity.java
new file mode 100644
index 000000000..39275e236
--- /dev/null
+++ b/main/src/main/java/com/yunbao/main/activity/LanguageSettingActivity.java
@@ -0,0 +1,54 @@
+package com.yunbao.main.activity;
+
+import android.app.Activity;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import com.yunbao.common.activity.AbsActivity;
+import com.yunbao.common.utils.AppManager;
+import com.yunbao.common.views.weight.ViewClicksAntiShake;
+import com.yunbao.main.R;
+import com.yunbao.main.utils.LanguageUtil;
+
+import java.util.Locale;
+import java.util.Stack;
+
+public class LanguageSettingActivity extends AbsActivity {
+    private LinearLayout traditionalChinese, english;
+    private ImageView imgTraditionalChinese, imgEnglish;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_language_sett;
+    }
+
+    @Override
+    protected void main() {
+        super.main();
+        traditionalChinese = findViewById(R.id.traditional_chinese);
+        english = findViewById(R.id.english);
+        imgEnglish = findViewById(R.id.img_english);
+        imgTraditionalChinese = findViewById(R.id.img_traditional_chinese);
+        ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.live_photo_btn_cancel), () -> onBackPressed());
+        ViewClicksAntiShake.clicksAntiShake(traditionalChinese, new ViewClicksAntiShake.ViewClicksCallBack() {
+            @Override
+            public void onViewClicks() {
+                changeAllActivitysLanguage(Locale.SIMPLIFIED_CHINESE);
+            }
+        });
+        ViewClicksAntiShake.clicksAntiShake(english, new ViewClicksAntiShake.ViewClicksCallBack() {
+            @Override
+            public void onViewClicks() {
+                changeAllActivitysLanguage(Locale.US);
+            }
+        });
+    }
+
+    private void changeAllActivitysLanguage(Locale locale) {
+        Stack<Activity> allActivityStacks = AppManager.getInstance().getAllActivityStacks();
+        for (int i = 0; i < allActivityStacks.size(); i++) {
+            LanguageUtil.shiftLanguage(locale, allActivityStacks.get(i),mContext);
+        }
+
+    }
+}
diff --git a/main/src/main/java/com/yunbao/main/activity/SettingActivity.java b/main/src/main/java/com/yunbao/main/activity/SettingActivity.java
index 1da67ee61..2acb7ded4 100644
--- a/main/src/main/java/com/yunbao/main/activity/SettingActivity.java
+++ b/main/src/main/java/com/yunbao/main/activity/SettingActivity.java
@@ -144,6 +144,13 @@ public class SettingActivity extends AbsActivity implements OnItemClickListener<
                 startActivity(new Intent(SettingActivity.this, MsgSettActivity.class));
             }
         });
+        //语言设置
+        ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.language_setting), new ViewClicksAntiShake.ViewClicksCallBack() {
+            @Override
+            public void onViewClicks() {
+                startActivity(new Intent(SettingActivity.this, LanguageSettingActivity.class));
+            }
+        });
         //屏蔽礼物特效
         ViewClicksAntiShake.clicksAntiShake(studioGiftEffects, new ViewClicksAntiShake.ViewClicksCallBack() {
             @Override
diff --git a/main/src/main/java/com/yunbao/main/utils/LanguageUtil.java b/main/src/main/java/com/yunbao/main/utils/LanguageUtil.java
new file mode 100644
index 000000000..c18836014
--- /dev/null
+++ b/main/src/main/java/com/yunbao/main/utils/LanguageUtil.java
@@ -0,0 +1,95 @@
+package com.yunbao.main.utils;
+
+import android.app.Activity;
+import android.app.backup.BackupManager;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.util.DisplayMetrics;
+
+import com.yunbao.main.activity.MainActivity;
+
+import java.lang.reflect.Method;
+import java.util.Locale;
+
+public class LanguageUtil {
+
+    /**
+     * 这个方法虽然更新了资源但是只能以后的界面生效,之前没有finish的页面还是保留原来的语言
+     *
+     * @param locale
+     * @param context
+     */
+    public static void shiftLanguage(Locale locale, Context context) {
+        Resources resources = context.getResources();
+        Configuration config = resources.getConfiguration();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+        config.locale = locale;
+        resources.updateConfiguration(config, dm);
+
+    }
+
+    /**
+     * 这个方法是为了让全部的activity都修改语言
+     *
+     * @param locale
+     * @param activity
+     * @param context
+     */
+    public static void shiftLanguage(Locale locale, Activity activity, Context context) {
+        Resources resources = context.getResources();
+        Configuration config = resources.getConfiguration();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+        config.locale = locale;
+        resources.updateConfiguration(config, dm);
+        if (!(activity instanceof MainActivity)) {
+            activity.recreate();
+        }
+
+    }
+
+    public static void updateLanguage(Locale locale) {
+        try {
+            Object objIActMag, objActMagNative;
+            Class clzIActMag = Class.forName("android.app.IActivityManager");
+
+            Class clzActMagNative = Class
+                    .forName("android.app.ActivityManagerNative");
+            //amn = ActivityManagerNative.getDefault();
+            Method mtdActMagNative$getDefault = clzActMagNative
+                    .getDeclaredMethod("getDefault");
+            objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);
+            // objIActMag = amn.getConfiguration();
+            Method mtdIActMag$getConfiguration = clzIActMag
+                    .getDeclaredMethod("getConfiguration");
+            Configuration config = (Configuration) mtdIActMag$getConfiguration.invoke(objIActMag);
+            // set the locale to the new value
+            config.locale = locale;
+
+            //持久化  config.userSetLocale = true;
+            Class clzConfig = Class
+                    .forName("android.content.res.Configuration");
+            java.lang.reflect.Field userSetLocale = clzConfig
+                    .getField("userSetLocale");
+            userSetLocale.set(config, true);
+
+            //如果有阿拉伯语,必须加上,否则阿拉伯语与其它语言切换时,布局与文字方向不会改变
+            Method setLayoutDirection = clzConfig
+                    .getDeclaredMethod("setLayoutDirection", Locale.class);
+            setLayoutDirection.invoke(config, locale);
+
+            // 此处需要声明权限:android.permission.CHANGE_CONFIGURATION
+            // 会重新调用 onCreate();
+            Class[] clzParams = {Configuration.class};
+            // objIActMag.updateConfiguration(config);
+            Method mtdIActMag$updateConfiguration = clzIActMag
+                    .getDeclaredMethod("updateConfiguration", clzParams);
+
+            mtdIActMag$updateConfiguration.invoke(objIActMag, config);
+            BackupManager.dataChanged("com.android.providers.settings");
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/main/src/main/res/drawable/background_language.xml b/main/src/main/res/drawable/background_language.xml
new file mode 100644
index 000000000..7c342c273
--- /dev/null
+++ b/main/src/main/res/drawable/background_language.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape android:shape="rectangle">
+            <corners android:radius="12dp" />
+            <solid android:color="#FFC821" />
+        </shape>
+    </item>
+</selector>
\ No newline at end of file
diff --git a/main/src/main/res/drawable/icon_xuanzhong.png b/main/src/main/res/drawable/icon_xuanzhong.png
new file mode 100644
index 0000000000000000000000000000000000000000..24b810cddcda0ca561800e9d33aea5c102005925
GIT binary patch
literal 1499
zcmb8v`#;lr0LSsqcNa4mQ#PfIJ;IX2N}aS0`x33Cv`{-Vx6|F_P$Alm4JEbIBSwlC
zu~4m(N;H=(q?B8yM2^j+Tq>HV$#FT(<NO8ZhxhySA3V>oJ()N?Q#}9xj<wCrYoS5^
zPFH8)`?F3uE(AK^#dHO-7Sad+=nR&di%)F8Xin{k<?hCfwYx0G_1&o@LCN}?DwA}0
zSu8t3j0;&__+)NT*m?1??sNt?BT(e$C*Je+cFVsfHr{LMm0&>i38tE6J;%onua&2f
zEj;Kwaq60k&QR`DjCxFaU;T*3d$gk7V-Mt&YL;YyV4I<gV3g#x@c7iQP#5-vK4{t@
zBVie$sqY4I1vrQn*D*0}ph?gA>?MN~ASSR4%*lAjdbNb)Os62&d*My|C>TWxfSh;O
z^%>d<HBivpE5y<(z!GWY0G7dI$v(^gw&&T$rs=_C!&lJWNya^t6t|jwyZ4~X0FGv#
z%#$4s%q)Q)?_h&dH>%69zgqBp+nGl*p|G5LTQ;s6$fU?9KzEVA?}(Hv;n}0`A3?>{
z+rp!qp!%UyjedRiyAl>oNd9)$rdzmk<9U;}w6kQtmvqxqHl)C?67@zCMp4V3WF*A-
zT3E$lf*Mwyq8(UPf^$VDasVU}pwydD5kLy_3AzDblFFs)(?<1o@lF%%G-a30br}ku
z@^=azdPkk_GcD>m?CwFR4kQ6{%TS8EC9g&ln;|>=cN)$FO>>VEOnz@5*>9Jw2nG|~
z6jd6@r9WDmn|ZRZKLr}TG*|9Z=hV@yByozk6pUnT?IO)JX8wCu>|+=Yzqv4{yh1&`
z;(3SdAi@YJ@9<T8^NN|Zny<XxhDTPr$MuT3X4B3viRn;Vjv6^}{?pUU($<uD6-QAi
zs_ti~5V-<xX(_#E^us!IW5#8ut+<BWsb=)Fx{NoIxAKwsQ&wroImq6m10}WHzEvVS
z5B(+T*YkC2df$2(z=9X=Mnv&iVESAK-f+c_C<_%&wT39{1C3>4(U7Wey_}b<=She*
zgg4KN&P6;J;E4}?3Pv9BX?~Ge^dxot6aVUPI(8-s6Z_*qBmqxQBaZC8wuTtdIlOp`
z+-6-l7dT~*C4Ut<qOOH@F;?lgaQWS37hc6|hyvWw1oQF$dxFSSV^K3oEDFDw)N%A+
zM`3EnCJ=E~>)nRsr#mWdOx?#RCdZm|G%X5_%>X5qDEJN;CrBuB4}jy}RBrAPaedxJ
zR)w!q)K}#jYh8vKQdQ5YvEBO34vYgk%c6SeMOXivr6jN%yU@>?dBR|P^2mF4zP!Hk
z=K6itQEv*h+d!n8a2cb_o+2uY!`!!pJxxvQ-NOfjfP&DjIu=uFsjWN-f3dK2Fp@h3
z9b1c5`F;5?$7vM~1tM!Vt{k~>i$@oi+sjKo7n==%X~X>=z9(_DEk}PJo2d2gpoj0T
zT^FD8S3SdW+9lmh-q^vaq8`iIq9gP%{VJP21`lON7OZ+E%|BFzmWDeubGOFKo55xZ
z+e%@jP4ua)mS}SOb*zbQyx8g|tT{3(-XtY2%P1Na*wGr<TJE6(5z*K?e9!VglJJbi
z`UlDX-6S<f1QTTK50^Pgf}u`zyaeMJ!}3qb4rJ=|oq+mpNtDi>?ZLS5sxMAx@~)=7
zTqEa@0?v2?$E7aE?2jc?qPqx13pRg~lH@V^we)peN5!hf7dA(Vm%OZ>F)4q|VG?A0
zGxMJt>7IxY^FbQs2R~0bB8>H)UK*lG^k{~V_{Bb&lAFz&E%-Q-NY2Mz|J>n_Tav2e
zZ-dEAM8)7hz}t(u+hf19LUH|ualie7?4!auTf5$7lPBCAR4{HxLpyE6=xn8UvCT;F
zV*Y8_?6I59`s>CVXYXg!lWBgyuUK+sB6e}Xuu>}d8GnCjz9dp%t7kq#qP-|+G&aWf
mWF?A&-N66n>^~2|K`@VK&?O3Z;qN9Fv<579PdAxsP~tymN2PxN

literal 0
HcmV?d00001

diff --git a/main/src/main/res/layout/activity_language_sett.xml b/main/src/main/res/layout/activity_language_sett.xml
new file mode 100644
index 000000000..725f459a7
--- /dev/null
+++ b/main/src/main/res/layout/activity_language_sett.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingTop="24dp">
+
+        <TextView
+            android:id="@+id/live_photo_btn_cancel"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="14dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:padding="2dp"
+            android:text="@string/live_photo_btn_cancel"
+            android:textColor="#666666"
+            android:textSize="14sp" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="11dp"
+            android:text="@string/live_language_setting"
+            android:textColor="#333333"
+            android:textSize="16sp"
+            android:textStyle="bold" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="end"
+            android:layout_marginTop="10dp"
+            android:layout_marginEnd="16dp"
+            android:background="@drawable/background_language"
+            android:paddingStart="10dp"
+            android:paddingTop="4dp"
+            android:paddingEnd="10dp"
+            android:paddingBottom="4dp"
+            android:text="@string/complete"
+            android:textColor="@color/white" />
+    </FrameLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="#E9EDF0" />
+
+    <LinearLayout
+        android:id="@+id/traditional_chinese"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <TextView
+            android:layout_width="0dp"
+            android:layout_height="48dp"
+            android:layout_weight="1"
+            android:gravity="center_vertical"
+            android:paddingStart="16dp"
+            android:text="@string/traditional_chinese"
+            android:textColor="#333333" />
+
+        <ImageView
+            android:id="@+id/img_traditional_chinese"
+            android:layout_width="24dp"
+            android:layout_height="24dp"
+            android:layout_gravity="center_vertical"
+            android:layout_marginEnd="16dp"
+            android:background="@drawable/icon_xuanzhong" />
+    </LinearLayout>
+
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:layout_marginStart="16dp"
+        android:layout_marginEnd="16dp"
+        android:background="#E9EDF0" />
+
+    <LinearLayout
+        android:id="@+id/english"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <TextView
+            android:layout_width="0dp"
+            android:layout_height="48dp"
+            android:layout_weight="1"
+            android:gravity="center_vertical"
+            android:paddingStart="16dp"
+            android:text="English"
+            android:textColor="#333333" />
+
+        <ImageView
+            android:id="@+id/img_english"
+            android:layout_width="24dp"
+            android:layout_height="24dp"
+            android:layout_gravity="center_vertical"
+            android:layout_marginEnd="16dp"
+            android:background="@drawable/icon_xuanzhong" />
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/main/src/main/res/layout/activity_setting.xml b/main/src/main/res/layout/activity_setting.xml
index b5a61cd29..4cfbcf7f5 100644
--- a/main/src/main/res/layout/activity_setting.xml
+++ b/main/src/main/res/layout/activity_setting.xml
@@ -155,6 +155,37 @@
                         android:src="@mipmap/icon_arrow_right" />
 
                 </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/language_setting"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center_vertical"
+                    android:visibility="gone"
+                    android:paddingTop="15dp"
+                    android:paddingBottom="25dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="25dp"
+                        android:text="@string/live_language_setting"
+                        android:textColor="#1E1F20"
+                        android:textSize="16sp" />
+
+
+                    <View
+                        android:layout_width="0dp"
+                        android:layout_height="1dp"
+                        android:layout_weight="1" />
+
+                    <ImageView
+                        android:layout_width="17dp"
+                        android:layout_height="30dp"
+                        android:layout_marginEnd="26.33dp"
+                        android:src="@mipmap/icon_arrow_right" />
+
+                </LinearLayout>
             </LinearLayout>
 
             <LinearLayout