diff --git a/OWNERS b/OWNERS
index 881e2c7..6d4f95f 100644
--- a/OWNERS
+++ b/OWNERS
@@ -2,21 +2,18 @@
 android-settings-core-eng+gerrit@google.com
 
 # People who can approve changes for submission
-arcwang@google.com
+cantol@google.com
 chaohuiw@google.com
 chiujason@google.com
-cyl@google.com
+dswliu@google.com
 edgarwang@google.com
-llz@google.com
 millchen@google.com
 songchenxi@google.com
-stanleytfwang@google.com
 sunnyshao@google.com
 yantingyang@google.com
 ykhung@google.com
 
 # Emergency only
-lijun@google.com
 wangqi@google.com
 yanglu@google.com
 
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index f996444..2b1a3bd 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -131,6 +131,8 @@
 
     public static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
 
+    public static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
+
     public static final String OS_PKG = "os";
 
     /**
diff --git a/src/com/android/settings/applications/AppStateOverlayBridge.java b/src/com/android/settings/applications/AppStateOverlayBridge.java
index 838ee42..022f45a 100644
--- a/src/com/android/settings/applications/AppStateOverlayBridge.java
+++ b/src/com/android/settings/applications/AppStateOverlayBridge.java
@@ -19,6 +19,7 @@
 import android.app.AppOpsManager;
 import android.content.Context;
 
+import com.android.settings.Utils;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.applications.ApplicationsState.AppFilter;
@@ -70,7 +71,7 @@
         private static final List<String> DISABLE_PACKAGE_LIST = new ArrayList<>();
 
         static {
-            DISABLE_PACKAGE_LIST.add("com.android.systemui");
+            DISABLE_PACKAGE_LIST.add(Utils.SYSTEMUI_PACKAGE_NAME);
         }
 
         public OverlayState(PermissionState permissionState) {
diff --git a/src/com/android/settings/applications/RecentAppStatsMixin.java b/src/com/android/settings/applications/RecentAppStatsMixin.java
index 4bf3864..e592fdf 100644
--- a/src/com/android/settings/applications/RecentAppStatsMixin.java
+++ b/src/com/android/settings/applications/RecentAppStatsMixin.java
@@ -17,6 +17,7 @@
 package com.android.settings.applications;
 
 import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
+import static com.android.settings.Utils.SYSTEMUI_PACKAGE_NAME;
 
 import android.app.Application;
 import android.app.usage.UsageStats;
@@ -71,7 +72,7 @@
                 "android",
                 "com.android.phone",
                 SETTINGS_PACKAGE_NAME,
-                "com.android.systemui",
+                SYSTEMUI_PACKAGE_NAME,
                 "com.android.providers.calendar",
                 "com.android.providers.media"
         ));
diff --git a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java
index d794de6..3c90bf3 100644
--- a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java
+++ b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java
@@ -38,6 +38,7 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
+import com.android.settings.Utils;
 import com.android.settings.applications.AppInfoBase;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.widget.EmptyTextSettings;
@@ -57,7 +58,7 @@
     static final List<String> IGNORE_PACKAGE_LIST = new ArrayList<>();
 
     static {
-        IGNORE_PACKAGE_LIST.add("com.android.systemui");
+        IGNORE_PACKAGE_LIST.add(Utils.SYSTEMUI_PACKAGE_NAME);
     }
 
     /**
diff --git a/src/com/android/settings/applications/specialaccess/turnscreenon/TurnScreenOnSettings.java b/src/com/android/settings/applications/specialaccess/turnscreenon/TurnScreenOnSettings.java
index 302d6b5..5f95779 100644
--- a/src/com/android/settings/applications/specialaccess/turnscreenon/TurnScreenOnSettings.java
+++ b/src/com/android/settings/applications/specialaccess/turnscreenon/TurnScreenOnSettings.java
@@ -37,6 +37,7 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
+import com.android.settings.Utils;
 import com.android.settings.applications.AppInfoBase;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.widget.EmptyTextSettings;
@@ -58,7 +59,7 @@
     static final List<String> IGNORE_PACKAGE_LIST = new ArrayList<>();
 
     static {
-        IGNORE_PACKAGE_LIST.add("com.android.systemui");
+        IGNORE_PACKAGE_LIST.add(Utils.SYSTEMUI_PACKAGE_NAME);
     }
 
     /**
diff --git a/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java b/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java
index b30aee4..66f2f1b 100644
--- a/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java
@@ -25,6 +25,7 @@
 
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.Utils;
 import com.android.settings.bluetooth.BluetoothDeviceRenamePreferenceController;
 import com.android.settings.bluetooth.BluetoothSwitchPreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
@@ -45,8 +46,6 @@
 
     private static final String TAG = "BluetoothDashboardFrag";
     private static final String KEY_BLUETOOTH_SCREEN_FOOTER = "bluetooth_screen_footer";
-    private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
-    private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
     private static final String SLICE_ACTION = "com.android.settings.SEARCH_RESULT_TRAMPOLINE";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
@@ -112,8 +111,8 @@
     @VisibleForTesting
     boolean isAlwaysDiscoverable(String callingAppPackageName, String action) {
         return TextUtils.equals(SLICE_ACTION, action) ? false
-            : TextUtils.equals(SETTINGS_PACKAGE_NAME, callingAppPackageName)
-                || TextUtils.equals(SYSTEMUI_PACKAGE_NAME, callingAppPackageName);
+            : TextUtils.equals(Utils.SETTINGS_PACKAGE_NAME, callingAppPackageName)
+                || TextUtils.equals(Utils.SYSTEMUI_PACKAGE_NAME, callingAppPackageName);
     }
 
     /**
diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
index 3c6077e..9286b81 100644
--- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
@@ -28,6 +28,7 @@
 
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.Utils;
 import com.android.settings.core.SettingsUIDeviceConfig;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -38,7 +39,6 @@
 public class ConnectedDeviceDashboardFragment extends DashboardFragment {
 
     private static final String TAG = "ConnectedDeviceFrag";
-    private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
     private static final String SLICE_ACTION = "com.android.settings.SEARCH_RESULT_TRAMPOLINE";
 
@@ -92,8 +92,8 @@
     @VisibleForTesting
     boolean isAlwaysDiscoverable(String callingAppPackageName, String action) {
         return TextUtils.equals(SLICE_ACTION, action) ? false
-                : TextUtils.equals(SETTINGS_PACKAGE_NAME, callingAppPackageName)
-                || TextUtils.equals(SYSTEMUI_PACKAGE_NAME, callingAppPackageName);
+                : TextUtils.equals(Utils.SETTINGS_PACKAGE_NAME, callingAppPackageName)
+                || TextUtils.equals(Utils.SYSTEMUI_PACKAGE_NAME, callingAppPackageName);
     }
 
     /**
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
index cc802e8..dee3812 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.fuelgauge;
 
+import static com.android.settings.Utils.SYSTEMUI_PACKAGE_NAME;
+
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -37,9 +39,8 @@
 
     private static final String PACKAGE_CALENDAR_PROVIDER = "com.android.providers.calendar";
     private static final String PACKAGE_MEDIA_PROVIDER = "com.android.providers.media";
-    private static final String PACKAGE_SYSTEMUI = "com.android.systemui";
     private static final String[] PACKAGES_SYSTEM = {PACKAGE_MEDIA_PROVIDER,
-            PACKAGE_CALENDAR_PROVIDER, PACKAGE_SYSTEMUI};
+            PACKAGE_CALENDAR_PROVIDER, SYSTEMUI_PACKAGE_NAME};
 
     protected PackageManager mPackageManager;
     protected Context mContext;
diff --git a/src/com/android/settings/localepicker/AppLocalePickerActivity.java b/src/com/android/settings/localepicker/AppLocalePickerActivity.java
index b7fef30..691344d 100644
--- a/src/com/android/settings/localepicker/AppLocalePickerActivity.java
+++ b/src/com/android/settings/localepicker/AppLocalePickerActivity.java
@@ -19,6 +19,7 @@
 import android.app.FragmentTransaction;
 import android.app.LocaleManager;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.LocaleList;
@@ -34,6 +35,7 @@
 import com.android.internal.app.LocaleStore;
 import com.android.settings.R;
 import com.android.settings.applications.AppInfoBase;
+import com.android.settings.applications.AppLocaleUtil;
 import com.android.settings.applications.appinfo.AppLocaleDetails;
 import com.android.settings.core.SettingsBaseActivity;
 
@@ -64,12 +66,17 @@
         }
         mContextAsUser = this;
         if (getIntent().hasExtra(AppInfoBase.ARG_PACKAGE_UID)) {
-            int userId = getIntent().getIntExtra(AppInfoBase.ARG_PACKAGE_UID, -1);
-            if (userId != -1) {
-                UserHandle userHandle = UserHandle.getUserHandleForUid(userId);
+            int uid = getIntent().getIntExtra(AppInfoBase.ARG_PACKAGE_UID, -1);
+            if (uid != -1) {
+                UserHandle userHandle = UserHandle.getUserHandleForUid(uid);
                 mContextAsUser = createContextAsUser(userHandle, 0);
             }
         }
+        if (!canDisplayLocaleUi() || mContextAsUser.getUserId() != UserHandle.myUserId()) {
+            Log.w(TAG, "Not allow to display Locale Settings UI.");
+            finish();
+            return;
+        }
 
         setTitle(R.string.app_locale_picker_title);
         getActionBar().setDisplayHomeAsUpEnabled(true);
@@ -160,4 +167,10 @@
                 .replace(R.id.content_frame, mLocalePickerWithRegion)
                 .commit();
     }
+
+    private boolean canDisplayLocaleUi() {
+        return AppLocaleUtil.canDisplayLocaleUi(mContextAsUser, mPackageName,
+                mContextAsUser.getPackageManager().queryIntentActivities(
+                        AppLocaleUtil.LAUNCHER_ENTRY_INTENT, PackageManager.GET_META_DATA));
+    }
 }
diff --git a/src/com/android/settings/nfc/SecureNfcEnabler.java b/src/com/android/settings/nfc/SecureNfcEnabler.java
index f31a382..ad5c4ab 100644
--- a/src/com/android/settings/nfc/SecureNfcEnabler.java
+++ b/src/com/android/settings/nfc/SecureNfcEnabler.java
@@ -61,7 +61,7 @@
     }
 
     private boolean isToggleable() {
-        if (mUserManager.isGuestUser()) {
+        if (!mUserManager.isPrimaryUser()) {
             return false;
         }
         return true;
diff --git a/src/com/android/settings/nfc/SecureNfcPreferenceController.java b/src/com/android/settings/nfc/SecureNfcPreferenceController.java
index cf43ec3..460eca3 100644
--- a/src/com/android/settings/nfc/SecureNfcPreferenceController.java
+++ b/src/com/android/settings/nfc/SecureNfcPreferenceController.java
@@ -109,7 +109,7 @@
     }
 
     private boolean isToggleable() {
-        if (mUserManager.isGuestUser()) {
+        if (!mUserManager.isPrimaryUser()) {
             return false;
         }
         return true;
diff --git a/src/com/android/settings/panel/PanelFeatureProviderImpl.java b/src/com/android/settings/panel/PanelFeatureProviderImpl.java
index 57a1ab0..71711f9 100644
--- a/src/com/android/settings/panel/PanelFeatureProviderImpl.java
+++ b/src/com/android/settings/panel/PanelFeatureProviderImpl.java
@@ -22,9 +22,9 @@
 import android.provider.Settings;
 import android.util.FeatureFlagUtils;
 
-public class PanelFeatureProviderImpl implements PanelFeatureProvider {
+import com.android.settings.Utils;
 
-    private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
+public class PanelFeatureProviderImpl implements PanelFeatureProvider {
 
     @Override
     public PanelContent getPanel(Context context, Bundle bundle) {
@@ -42,7 +42,7 @@
                 // Redirect to the internet dialog in SystemUI.
                 Intent intent = new Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY);
                 intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
-                        .setPackage(SYSTEMUI_PACKAGE_NAME);
+                        .setPackage(Utils.SYSTEMUI_PACKAGE_NAME);
                 context.sendBroadcast(intent);
                 return null;
             case Settings.Panel.ACTION_NFC:
@@ -55,7 +55,7 @@
                     // Redirect to the volume panel in SystemUI.
                     Intent volumeIntent = new Intent(Settings.Panel.ACTION_VOLUME);
                     volumeIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND).setPackage(
-                            SYSTEMUI_PACKAGE_NAME);
+                            Utils.SYSTEMUI_PACKAGE_NAME);
                     context.sendBroadcast(volumeIntent);
                     return null;
                 } else {
diff --git a/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java
index 332a39b..77b2abb 100644
--- a/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java
+++ b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java
@@ -18,25 +18,35 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.ApplicationPackageManager;
+import android.app.LocaleConfig;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.InstallSourceInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
 import android.net.Uri;
+import android.os.LocaleList;
 import android.os.Process;
 import android.os.UserHandle;
 import android.telephony.TelephonyManager;
 
+import androidx.annotation.ArrayRes;
+
 import com.android.internal.app.LocaleStore;
 import com.android.settings.applications.AppInfoBase;
 
-import java.util.Locale;
-
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -45,17 +55,26 @@
 import org.mockito.junit.MockitoRule;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
+import org.robolectric.shadows.ShadowPackageManager;
 import org.robolectric.shadows.ShadowTelephonyManager;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
 @RunWith(RobolectricTestRunner.class)
 @Config(
         shadows = {
                 AppLocalePickerActivityTest.ShadowApplicationPackageManager.class,
+                AppLocalePickerActivityTest.ShadowResources.class,
+                AppLocalePickerActivityTest.ShadowUserHandle.class,
+                AppLocalePickerActivityTest.ShadowLocaleConfig.class,
         })
 public class AppLocalePickerActivityTest {
     private static final String TEST_PACKAGE_NAME = "com.android.settings";
@@ -67,21 +86,99 @@
     @Rule
     public MockitoRule rule = MockitoJUnit.rule();
 
+    private Context mContext;
+    private ShadowPackageManager mPackageManager;
+
+    @Before
+    public void setUp() {
+        mContext = spy(RuntimeEnvironment.application);
+        mPackageManager = Shadows.shadowOf(mContext.getPackageManager());
+    }
+
+    @After
+    public void tearDown() {
+        mPackageManager.removePackage(TEST_PACKAGE_NAME);
+        ShadowResources.setDisAllowPackage(false);
+        ShadowApplicationPackageManager.setNoLaunchEntry(false);
+        ShadowUserHandle.setUserId(0);
+        ShadowLocaleConfig.setStatus(LocaleConfig.STATUS_SUCCESS);
+    }
+
     @Test
     public void launchAppLocalePickerActivity_hasPackageName_success() {
         ActivityController<TestAppLocalePickerActivity> controller =
                 initActivityController(true);
-
         controller.create();
 
         assertThat(controller.get().isFinishing()).isFalse();
     }
 
     @Test
+    public void launchAppLocalePickerActivity_appNoLocaleConfig_failed() {
+        ShadowLocaleConfig.setStatus(LocaleConfig.STATUS_NOT_SPECIFIED);
+
+        ActivityController<TestAppLocalePickerActivity> controller =
+                initActivityController(true);
+        controller.create();
+
+        assertThat(controller.get().isFinishing()).isTrue();
+    }
+
+    @Test
+    public void launchAppLocalePickerActivity_appSignPlatformKey_failed() {
+        final ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY;
+        applicationInfo.packageName = TEST_PACKAGE_NAME;
+
+        final PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = TEST_PACKAGE_NAME;
+        packageInfo.applicationInfo = applicationInfo;
+        mPackageManager.installPackage(packageInfo);
+
+        ActivityController<TestAppLocalePickerActivity> controller =
+                initActivityController(true);
+        controller.create();
+
+        assertThat(controller.get().isFinishing()).isTrue();
+    }
+
+    @Test
+    public void launchAppLocalePickerActivity_appMatchDisallowedPackage_failed() {
+        ShadowResources.setDisAllowPackage(true);
+
+        ActivityController<TestAppLocalePickerActivity> controller =
+                initActivityController(true);
+        controller.create();
+
+        assertThat(controller.get().isFinishing()).isTrue();
+    }
+
+    @Test
+    public void launchAppLocalePickerActivity_appNoLaunchEntry_failed() {
+        ShadowApplicationPackageManager.setNoLaunchEntry(true);
+
+        ActivityController<TestAppLocalePickerActivity> controller =
+                initActivityController(true);
+        controller.create();
+
+        assertThat(controller.get().isFinishing()).isTrue();
+    }
+
+    @Test
+    public void launchAppLocalePickerActivity_modifyAppLocalesOfAnotherUser_failed() {
+        ShadowUserHandle.setUserId(10);
+
+        ActivityController<TestAppLocalePickerActivity> controller =
+                initActivityController(true);
+        controller.create();
+
+        assertThat(controller.get().isFinishing()).isTrue();
+    }
+
+    @Test
     public void launchAppLocalePickerActivity_intentWithoutPackageName_failed() {
         ActivityController<TestAppLocalePickerActivity> controller =
                 initActivityController(false);
-
         controller.create();
 
         assertThat(controller.get().isFinishing()).isTrue();
@@ -125,7 +222,7 @@
         if (hasPackageName) {
             data.setData(TEST_PACKAGE_URI);
         }
-        data.putExtra(AppInfoBase.ARG_PACKAGE_UID, UserHandle.getUserId(Process.myUid()));
+        data.putExtra(AppInfoBase.ARG_PACKAGE_UID, Process.myUid());
         ActivityController<TestAppLocalePickerActivity> activityController =
                 Robolectric.buildActivity(TestAppLocalePickerActivity.class, data);
         Activity activity = activityController.get();
@@ -149,10 +246,75 @@
     @Implements(ApplicationPackageManager.class)
     public static class ShadowApplicationPackageManager extends
             org.robolectric.shadows.ShadowApplicationPackageManager {
+        private static boolean sNoLaunchEntry = false;
 
         @Implementation
         protected Object getInstallSourceInfo(String packageName) {
             return new InstallSourceInfo("", null, null, "");
         }
+
+        @Implementation
+        protected List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
+            if (sNoLaunchEntry) {
+                return new ArrayList();
+            } else {
+                return super.queryIntentActivities(intent, flags);
+            }
+        }
+
+        private static void setNoLaunchEntry(boolean noLaunchEntry) {
+            sNoLaunchEntry = noLaunchEntry;
+        }
+    }
+
+    @Implements(Resources.class)
+    public static class ShadowResources extends
+            org.robolectric.shadows.ShadowResources {
+        private static boolean sDisAllowPackage = false;
+
+        @Implementation
+        public String[] getStringArray(@ArrayRes int id) {
+            if (sDisAllowPackage) {
+                return new String[]{TEST_PACKAGE_NAME};
+            } else {
+                return new String[0];
+            }
+        }
+
+        private static void setDisAllowPackage(boolean disAllowPackage) {
+            sDisAllowPackage = disAllowPackage;
+        }
+    }
+
+    @Implements(UserHandle.class)
+    public static class ShadowUserHandle {
+        private static int sUserId = 0;
+        private static void setUserId(int userId) {
+            sUserId = userId;
+        }
+
+        @Implementation
+        public static int getUserId(int userId) {
+            return sUserId;
+        }
+    }
+
+    @Implements(LocaleConfig.class)
+    public static class ShadowLocaleConfig {
+        private static int sStatus = 0;
+
+        @Implementation
+        public @Nullable LocaleList getSupportedLocales() {
+            return LocaleList.forLanguageTags("en-US");
+        }
+
+        private static void setStatus(@LocaleConfig.Status int status) {
+            sStatus = status;
+        }
+
+        @Implementation
+        public @LocaleConfig.Status int getStatus() {
+            return sStatus;
+        }
     }
 }
