From f3270e5c1c4d8b774053993499f3b30798687ba5 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Thu, 21 Apr 2022 11:44:10 +0800 Subject: [PATCH 1/9] Recalculate view's height when tab is selected Viewpager2 created view based on the first tab height, when tab is selected, viewpager2 should recalculate height. But this solution may not suitable for App list, so we only enable for Location Settings which have different items in personal & work profile. Bug: 224521665 Test: manual Change-Id: Ib19b30cb82b8b4f13f651795906289da53ded4ed --- res/xml/location_services.xml | 11 ++--- res/xml/location_services_workprofile.xml | 11 ++--- .../ProfileSelectFragment.java | 47 +++++++++++++++++-- ...ProfileSelectLocationServicesFragment.java | 5 ++ ...edServicesForWorkPreferenceController.java | 5 +- ...nInjectedServicesPreferenceController.java | 8 +--- .../settings/location/LocationServices.java | 25 +--------- .../location/LocationServicesForWork.java | 23 +-------- 8 files changed, 61 insertions(+), 74 deletions(-) diff --git a/res/xml/location_services.xml b/res/xml/location_services.xml index 2de4e7b2446..f01e0b137f5 100644 --- a/res/xml/location_services.xml +++ b/res/xml/location_services.xml @@ -16,21 +16,20 @@ - - + android:key="location_services" + android:title="@string/location_services_preference_title" + settings:controller="com.android.settings.location.LocationInjectedServicesPreferenceController"> diff --git a/res/xml/location_services_workprofile.xml b/res/xml/location_services_workprofile.xml index 6db208367d9..a130838afec 100644 --- a/res/xml/location_services_workprofile.xml +++ b/res/xml/location_services_workprofile.xml @@ -16,12 +16,7 @@ - - - + android:title="@string/location_services_screen_title" + android:key="location_services_managed_profile" + settings:controller="com.android.settings.location.LocationInjectedServicesForWorkPreferenceController"> diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java index 30b971c0c58..9be2177524f 100644 --- a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java +++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java @@ -99,6 +99,8 @@ public abstract class ProfileSelectFragment extends DashboardFragment { private ViewGroup mContentView; + private ViewPager2 mViewPager; + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -111,12 +113,21 @@ public abstract class ProfileSelectFragment extends DashboardFragment { final int selectedTab = getTabId(activity, getArguments()); final View tabContainer = mContentView.findViewById(R.id.tab_container); - final ViewPager2 viewPager = tabContainer.findViewById(R.id.view_pager); - viewPager.setAdapter(new ProfileSelectFragment.ViewPagerAdapter(this)); + mViewPager = tabContainer.findViewById(R.id.view_pager); + mViewPager.setAdapter(new ProfileSelectFragment.ViewPagerAdapter(this)); final TabLayout tabs = tabContainer.findViewById(R.id.tabs); - new TabLayoutMediator(tabs, viewPager, + new TabLayoutMediator(tabs, mViewPager, (tab, position) -> tab.setText(getPageTitle(position)) ).attach(); + mViewPager.registerOnPageChangeCallback( + new ViewPager2.OnPageChangeCallback() { + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + updateHeight(position); + } + } + ); tabContainer.setVisibility(View.VISIBLE); final TabLayout.Tab tab = tabs.getTabAt(selectedTab); tab.select(); @@ -133,6 +144,36 @@ public abstract class ProfileSelectFragment extends DashboardFragment { return mContentView; } + protected boolean forceUpdateHeight() { + return false; + } + + private void updateHeight(int position) { + if (!forceUpdateHeight()) { + return; + } + ViewPagerAdapter adapter = (ViewPagerAdapter) mViewPager.getAdapter(); + if (adapter == null || adapter.getItemCount() <= position) { + return; + } + + Fragment fragment = adapter.createFragment(position); + View newPage = fragment.getView(); + if (newPage != null) { + int viewWidth = View.MeasureSpec.makeMeasureSpec(newPage.getWidth(), + View.MeasureSpec.EXACTLY); + int viewHeight = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + newPage.measure(viewWidth, viewHeight); + int currentHeight = mViewPager.getLayoutParams().height; + int newHeight = newPage.getMeasuredHeight(); + if (newHeight != 0 && currentHeight != newHeight) { + ViewGroup.LayoutParams layoutParams = mViewPager.getLayoutParams(); + layoutParams.height = newHeight; + mViewPager.setLayoutParams(layoutParams); + } + } + } + @Override public int getMetricsCategory() { return METRICS_CATEGORY_UNKNOWN; diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationServicesFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationServicesFragment.java index 5f25f599988..111e4ce7b86 100644 --- a/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationServicesFragment.java +++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationServicesFragment.java @@ -50,4 +50,9 @@ public class ProfileSelectLocationServicesFragment extends ProfileSelectFragment protected int getPreferenceScreenResId() { return R.xml.location_services_header; } + + @Override + protected boolean forceUpdateHeight() { + return true; + } } diff --git a/src/com/android/settings/location/LocationInjectedServicesForWorkPreferenceController.java b/src/com/android/settings/location/LocationInjectedServicesForWorkPreferenceController.java index b7e6cf2a412..a8a13b3ca76 100644 --- a/src/com/android/settings/location/LocationInjectedServicesForWorkPreferenceController.java +++ b/src/com/android/settings/location/LocationInjectedServicesForWorkPreferenceController.java @@ -20,7 +20,6 @@ import android.content.Context; import android.os.UserHandle; import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.widget.RestrictedAppPreference; @@ -41,8 +40,6 @@ public class LocationInjectedServicesForWorkPreferenceController extends @Override protected void injectLocationServices(PreferenceScreen screen) { - final PreferenceCategory categoryLocationServices = - screen.findPreference(getPreferenceKey()); final Map> prefs = getLocationServices(); for (Map.Entry> entry : prefs.entrySet()) { for (Preference pref : entry.getValue()) { @@ -51,7 +48,7 @@ public class LocationInjectedServicesForWorkPreferenceController extends } } if (entry.getKey() != UserHandle.myUserId()) { - LocationSettings.addPreferencesSorted(entry.getValue(), categoryLocationServices); + LocationSettings.addPreferencesSorted(entry.getValue(), screen); } } } diff --git a/src/com/android/settings/location/LocationInjectedServicesPreferenceController.java b/src/com/android/settings/location/LocationInjectedServicesPreferenceController.java index d623baef56c..356716d3a68 100644 --- a/src/com/android/settings/location/LocationInjectedServicesPreferenceController.java +++ b/src/com/android/settings/location/LocationInjectedServicesPreferenceController.java @@ -19,7 +19,6 @@ import android.content.Context; import android.os.UserHandle; import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.widget.RestrictedAppPreference; @@ -41,8 +40,6 @@ public class LocationInjectedServicesPreferenceController @Override protected void injectLocationServices(PreferenceScreen screen) { - final PreferenceCategory categoryLocationServices = - screen.findPreference(getPreferenceKey()); final Map> prefs = getLocationServices(); for (Map.Entry> entry : prefs.entrySet()) { for (Preference pref : entry.getValue()) { @@ -51,10 +48,7 @@ public class LocationInjectedServicesPreferenceController } } if (entry.getKey() == UserHandle.myUserId()) { - if (categoryLocationServices != null) { - LocationSettings.addPreferencesSorted(entry.getValue(), - categoryLocationServices); - } + LocationSettings.addPreferencesSorted(entry.getValue(), screen); } } } diff --git a/src/com/android/settings/location/LocationServices.java b/src/com/android/settings/location/LocationServices.java index aceb9d56583..52e958cb093 100644 --- a/src/com/android/settings/location/LocationServices.java +++ b/src/com/android/settings/location/LocationServices.java @@ -22,12 +22,8 @@ import android.content.Context; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.search.SearchIndexable; -import java.util.ArrayList; -import java.util.List; - /** * A page that configures the Location Services settings including Wi-Fi scanning, Bluetooth * scanning, and injected location services. @@ -51,11 +47,6 @@ public class LocationServices extends DashboardFragment { return TAG; } - @Override - protected List createPreferenceControllers(Context context) { - return buildPreferenceControllers(context); - } - @Override public void onAttach(Context context) { super.onAttach(context); @@ -63,23 +54,9 @@ public class LocationServices extends DashboardFragment { use(LocationInjectedServicesPreferenceController.class).init(this); } - private static List buildPreferenceControllers(Context context) { - final List controllers = new ArrayList<>(); - controllers.add(new WifiScanningPreferenceController(context)); - controllers.add(new BluetoothScanningPreferenceController(context)); - return controllers; - } - /** * For Search. */ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider(R.xml.location_services) { - - @Override - public List createPreferenceControllers(Context - context) { - return buildPreferenceControllers(context); - } - }; + new BaseSearchIndexProvider(R.xml.location_services); } diff --git a/src/com/android/settings/location/LocationServicesForWork.java b/src/com/android/settings/location/LocationServicesForWork.java index 4b3124eb129..390be101ddf 100644 --- a/src/com/android/settings/location/LocationServicesForWork.java +++ b/src/com/android/settings/location/LocationServicesForWork.java @@ -22,12 +22,8 @@ import android.content.Context; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.search.SearchIndexable; -import java.util.ArrayList; -import java.util.List; - /** * A page that configures the Location Services settings for work profile. */ @@ -50,32 +46,15 @@ public class LocationServicesForWork extends DashboardFragment { return TAG; } - @Override - protected List createPreferenceControllers(Context context) { - return buildPreferenceControllers(context); - } - @Override public void onAttach(Context context) { super.onAttach(context); use(LocationInjectedServicesForWorkPreferenceController.class).init(this); } - private static List buildPreferenceControllers(Context context) { - final List controllers = new ArrayList<>(); - return controllers; - } - /** * For Search. */ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider(R.xml.location_services_workprofile) { - - @Override - public List createPreferenceControllers(Context - context) { - return buildPreferenceControllers(context); - } - }; + new BaseSearchIndexProvider(R.xml.location_services_workprofile); } From 1f0689f73ce1e1d266a35bc3cdfaf72a442048f6 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Thu, 2 Jun 2022 04:50:33 +0800 Subject: [PATCH 2/9] Restrict network preferences settings - Show a restriction message if the malware enforces the network preference settings - Remove settings search index if the network preference settings is restricted Bug: 231987122 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=ConfigureWifiSettingsTest Change-Id: I998aa084d47d556d1eeddcec8c6bb5f1d9a8f6e7 --- .../settings/wifi/ConfigureWifiSettings.java | 71 ++++++--- .../wifi/ConfigureWifiSettingsTest.java | 149 +++++++++++++++++- 2 files changed, 195 insertions(+), 25 deletions(-) diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java index 6bb4389bddb..33f2827d7f8 100644 --- a/src/com/android/settings/wifi/ConfigureWifiSettings.java +++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java @@ -15,19 +15,21 @@ */ package com.android.settings.wifi; -import static android.content.Context.WIFI_SERVICE; - +import android.annotation.Nullable; import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.net.wifi.WifiManager; import android.os.Bundle; -import android.util.FeatureFlagUtils; +import android.os.UserManager; +import android.util.EventLog; import android.util.Log; +import android.view.View; +import android.widget.TextView; +import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; -import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -43,7 +45,8 @@ import java.util.List; public class ConfigureWifiSettings extends DashboardFragment { private static final String TAG = "ConfigureWifiSettings"; - private static final String KEY_INSTALL_CREDENTIALS = "install_credentials"; + @VisibleForTesting + static final String KEY_INSTALL_CREDENTIALS = "install_credentials"; private static final String ACTION_INSTALL_CERTS = "android.credentials.INSTALL"; private static final String PACKAGE_INSTALL_CERTS = "com.android.certinstaller"; private static final String CLASS_INSTALL_CERTS = "com.android.certinstaller.CertInstallerMain"; @@ -53,16 +56,26 @@ public class ConfigureWifiSettings extends DashboardFragment { public static final int WIFI_WAKEUP_REQUEST_CODE = 600; private WifiWakeupPreferenceController mWifiWakeupPreferenceController; - private Preference mCertinstallerPreference; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (isGuestUser(context)) return; + + mWifiWakeupPreferenceController = use(WifiWakeupPreferenceController.class); + mWifiWakeupPreferenceController.setFragment(this); + } @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); getActivity().setTitle(R.string.network_and_internet_preferences_title); - mCertinstallerPreference = findPreference(KEY_INSTALL_CREDENTIALS); - if (mCertinstallerPreference != null) { - mCertinstallerPreference.setOnPreferenceClickListener(preference -> { + if (isGuestUser(getContext())) return; + + final Preference installCredentialsPref = findPreference(KEY_INSTALL_CREDENTIALS); + if (installCredentialsPref != null) { + installCredentialsPref.setOnPreferenceClickListener(preference -> { Intent intent = new Intent(ACTION_INSTALL_CERTS); intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK); @@ -77,6 +90,23 @@ public class ConfigureWifiSettings extends DashboardFragment { } } + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (!isGuestUser(getContext())) return; + + Log.w(TAG, "Displays the restricted UI because the user is a guest."); + EventLog.writeEvent(0x534e4554, "231987122", -1 /* UID */, "User is a guest"); + + // Restricted UI + final TextView emptyView = getActivity().findViewById(android.R.id.empty); + if (emptyView != null) { + emptyView.setVisibility(View.VISIBLE); + emptyView.setText(R.string.wifi_empty_list_user_restricted); + } + getPreferenceScreen().removeAll(); + } + @Override public int getMetricsCategory() { return SettingsEnums.CONFIGURE_WIFI; @@ -94,25 +124,18 @@ public class ConfigureWifiSettings extends DashboardFragment { @Override protected List createPreferenceControllers(Context context) { - final WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); + if (isGuestUser(context)) return null; + + final WifiManager wifiManager = getSystemService(WifiManager.class); final List controllers = new ArrayList<>(); controllers.add(new WifiP2pPreferenceController(context, getSettingsLifecycle(), wifiManager)); return controllers; } - @Override - public void onAttach(Context context) { - super.onAttach(context); - - - mWifiWakeupPreferenceController = use(WifiWakeupPreferenceController.class); - mWifiWakeupPreferenceController.setFragment(this); - } - @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == WIFI_WAKEUP_REQUEST_CODE) { + if (mWifiWakeupPreferenceController != null && requestCode == WIFI_WAKEUP_REQUEST_CODE) { mWifiWakeupPreferenceController.onActivityResult(requestCode, resultCode); return; } @@ -122,8 +145,16 @@ public class ConfigureWifiSettings extends DashboardFragment { public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider(R.xml.wifi_configure_settings) { protected boolean isPageSearchEnabled(Context context) { + if (isGuestUser(context)) return false; return context.getResources() .getBoolean(R.bool.config_show_wifi_settings); } }; + + private static boolean isGuestUser(Context context) { + if (context == null) return false; + final UserManager userManager = context.getSystemService(UserManager.class); + if (userManager == null) return false; + return userManager.isGuestUser(); + } } diff --git a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java index 89df035c8d5..5e3d7150bb5 100644 --- a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java +++ b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java @@ -1,41 +1,180 @@ package com.android.settings.wifi; +import static com.android.settings.wifi.ConfigureWifiSettings.KEY_INSTALL_CREDENTIALS; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import android.annotation.Nullable; import android.content.Context; +import android.net.wifi.WifiManager; +import android.os.Bundle; +import android.os.UserManager; +import android.view.View; +import android.widget.TextView; +import androidx.fragment.app.FragmentActivity; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import androidx.test.core.app.ApplicationProvider; + +import com.android.settings.dashboard.DashboardFragment; import com.android.settings.testutils.XmlTestUtils; +import com.android.settingslib.core.AbstractPreferenceController; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; import java.util.List; @RunWith(RobolectricTestRunner.class) public class ConfigureWifiSettingsTest { - private Context mContext; + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Spy + Context mContext = ApplicationProvider.getApplicationContext(); + @Mock + UserManager mUserManager; + @Mock + WifiManager mWifiManager; + @Mock + FragmentActivity mActivity; + @Mock + WifiWakeupPreferenceController mWifiWakeupPreferenceController; + @Mock + Preference mInstallCredentialsPref; + @Mock + PreferenceScreen mPreferenceScreen; + @Mock + TextView mEmptyView; + + TestConfigureWifiSettings mSettings; @Before public void setUp() { - mContext = spy(RuntimeEnvironment.application); + when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); + when(mUserManager.isGuestUser()).thenReturn(false); + when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager); + + mSettings = spy(new TestConfigureWifiSettings()); + when(mSettings.getContext()).thenReturn(mContext); + when(mSettings.getActivity()).thenReturn(mActivity); + when(mSettings.use(WifiWakeupPreferenceController.class)) + .thenReturn(mWifiWakeupPreferenceController); + when(mSettings.findPreference(KEY_INSTALL_CREDENTIALS)).thenReturn(mInstallCredentialsPref); + } + + @Test + public void onAttach_isNotGuestUser_setupController() { + when(mUserManager.isGuestUser()).thenReturn(false); + + mSettings.onAttach(mContext); + + verify(mWifiWakeupPreferenceController).setFragment(any()); + } + + @Test + public void onAttach_isGuestUser_doNotSetupController() { + when(mUserManager.isGuestUser()).thenReturn(true); + + mSettings.onAttach(mContext); + + verify(mWifiWakeupPreferenceController, never()).setFragment(any()); + } + + @Test + @Config(shadows = ShadowDashboardFragment.class) + public void onCreate_isNotGuestUser_setupPreference() { + when(mUserManager.isGuestUser()).thenReturn(false); + + mSettings.onCreate(null); + + verify(mInstallCredentialsPref).setOnPreferenceClickListener(any()); + } + + @Test + @Config(shadows = ShadowDashboardFragment.class) + public void onCreate_isGuestUser_doNotSetupPreference() { + when(mUserManager.isGuestUser()).thenReturn(true); + + mSettings.onCreate(null); + + verify(mInstallCredentialsPref, never()).setOnPreferenceClickListener(any()); + } + + @Test + @Config(shadows = ShadowDashboardFragment.class) + public void onViewCreated_isNotGuestUser_doNotRestrictUi() { + when(mUserManager.isGuestUser()).thenReturn(false); + when(mActivity.findViewById(android.R.id.empty)).thenReturn(mEmptyView); + doReturn(mPreferenceScreen).when(mSettings).getPreferenceScreen(); + + mSettings.onViewCreated(mock(View.class), null); + + verify(mEmptyView, never()).setVisibility(View.VISIBLE); + verify(mPreferenceScreen, never()).removeAll(); + } + + @Test + @Config(shadows = ShadowDashboardFragment.class) + public void onViewCreated_isGuestUser_restrictUi() { + when(mUserManager.isGuestUser()).thenReturn(true); + when(mActivity.findViewById(android.R.id.empty)).thenReturn(mEmptyView); + doReturn(mPreferenceScreen).when(mSettings).getPreferenceScreen(); + + mSettings.onViewCreated(mock(View.class), null); + + verify(mEmptyView).setVisibility(View.VISIBLE); + verify(mPreferenceScreen).removeAll(); } @Test @Config(qualifiers = "mcc999") - public void testNonIndexableKeys_ifPageDisabled_shouldNotIndexResource() { + public void getNonIndexableKeys_ifPageDisabled_shouldNotIndexResource() { final List niks = ConfigureWifiSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext); - final int xmlId = new ConfigureWifiSettings().getPreferenceScreenResId(); + final int xmlId = mSettings.getPreferenceScreenResId(); final List keys = XmlTestUtils.getKeysFromPreferenceXml(mContext, xmlId); assertThat(keys).isNotNull(); assertThat(niks).containsAtLeastElementsIn(keys); } + + public static class TestConfigureWifiSettings extends ConfigureWifiSettings { + @Override + public T use(Class clazz) { + return super.use(clazz); + } + } + + @Implements(DashboardFragment.class) + public static class ShadowDashboardFragment { + @Implementation + public void onCreate(Bundle icicle) { + // do nothing + } + + @Implementation + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + // do nothing + } + } } From d3dc439a10420971ff199cafbf50c0db6d3ee9b1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 4 Jun 2022 00:58:31 -0700 Subject: [PATCH 3/9] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Idbd661c3b6a62971ef7ee40430437aac416cccdc --- res/values-ar/strings.xml | 6 +++--- res/values-as/strings.xml | 2 +- res/values-b+sr+Latn/strings.xml | 2 +- res/values-bg/strings.xml | 2 +- res/values-bs/strings.xml | 6 +++--- res/values-es-rUS/strings.xml | 2 +- res/values-es/strings.xml | 2 +- res/values-eu/strings.xml | 2 +- res/values-hu/strings.xml | 2 +- res/values-hy/strings.xml | 4 ++-- res/values-ja/strings.xml | 4 ++-- res/values-mk/strings.xml | 2 +- res/values-my/strings.xml | 2 +- res/values-or/strings.xml | 6 +++--- res/values-sr/strings.xml | 2 +- res/values-sv/strings.xml | 2 +- res/values-ta/strings.xml | 2 +- res/values-th/strings.xml | 2 +- res/values-tr/strings.xml | 2 +- res/values-uk/strings.xml | 2 +- res/values-vi/strings.xml | 2 +- res/values-zh-rCN/strings.xml | 4 ++-- 22 files changed, 31 insertions(+), 31 deletions(-) diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index c7b6acab6eb..0a905864482 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -229,7 +229,7 @@ "الإعداد التلقائي للنظام" "لا تتوفَّر إمكانية اختيار لغة لهذا التطبيق من الإعدادات." "قد تختلف اللغة عن اللغات المتوفّرة في التطبيق. قد لا تدعم بعض التطبيقات هذا الإعداد." - "تظهر هنا التطبيقات التي تدعم اختيار اللغة فقط." + "تظهر هنا فقط التطبيقات التي تتيح اختيار اللغة." هل تريد إزالة اللغة المحددة؟ هل تريد إزالة اللغتين المحددتين؟ @@ -604,7 +604,7 @@ "التالي" "بالإضافة إلى فتح قفل هاتفك، يمكنك أيضًا استخدام بصمة إصبعك للسماح بعمليات الشراء والوصول إلى التطبيق. ""مزيد من المعلومات" "خيار قفل الشاشة غير مفعَّل. لمزيد من المعلومات، يمكنك التواصُل مع المشرف داخل مؤسستك." - "لا يزال بإمكانك استخدام بصمة إصبعك للسماح بعمليات الشراء ومنح تطبيق الإذن بالوصول." + "لا يزال بإمكانك استخدام بصمة إصبعك للسماح بعمليات الشراء ومنح التطبيقات أذونات الوصول." "ارفع إصبعك ثم المس زر الاستشعار مرة أخرى." "لا يمكن استخدام أداة استشعار بصمة الإصبع. يُرجى التواصل مع مقدِّم خدمات إصلاح." "المزيد من إعدادات الأمان" @@ -4210,7 +4210,7 @@ "هل تسمح بوصول خدمة %1$s إلى الإشعارات؟" "‏تم إبدال الإشعارات التكيُّفية لنظام التشغيل Android في الإصدار 12 منه بالإشعارات المحسّنة. تعرض هذه الميزة إجراءات وردودًا مقترحة وتنظِّم الإشعارات. \n\nيمكن للإشعارات المحسّنة الوصول إلى محتوى الإشعارات، بما في ذلك المعلومات الشخصية، مثلاً أسماء جهات الاتصال والرسائل. يمكن لهذه الميزة أيضًا إغلاق الإشعارات أو الاستجابة لها، مثلاً الردّ على مكالمات الهاتف والتحكّم في ميزة \"عدم الإزعاج\"." "هل تسمح بوصول خدمة %1$s إلى الإشعارات؟" - "سيكون بإمكان \"%1$s\" قراءة جميع الإشعارات، بما في ذلك المعلومات الشخصية، مثلاً أسماء جهات الاتصال والصور ونصوص الرسائل التي تتلقّاها. وسيتمكن هذا التطبيق أيضًا من تأجيل الإشعارات أو إغلاقها أو اتخاذ إجراءات من خلال الأزرار في الإشعارات بما في ذلك الردّ على المكالمات الهاتفية. \n\nستتيح هذه الميزة أيضًا للتطبيق إمكانية تفعيل ميزة \"عدم الإزعاج\" أو إيقافها وتغيير الإعدادات ذات الصلة." + "سيكون بإمكان \"%1$s\" قراءة جميع الإشعارات، بما في ذلك المعلومات الشخصية، مثلاً أسماء جهات الاتصال ونصوص الرسائل التي تتلقّاها. وسيتمكّن أيضًا من إغلاق الإشعارات أو اتخاذ إجراءات من خلال الأزرار في الإشعارات بما في ذلك الردّ على المكالمات الهاتفية. \n\nستتيح هذه الميزة أيضًا للتطبيق إمكانية تفعيل ميزة \"عدم الإزعاج\" أو إيقافها وتغيير الإعدادات ذات الصلة." "سيكون بإمكان \"%1$s\" تنفيذ ما يلي:" "قراءة الإشعارات" "يمكنه قراءة الإشعارات، بما في ذلك المعلومات الشخصية، مثلاً جهات الاتصال والرسائل والصور." diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml index 586b8873d70..e993803a764 100644 --- a/res/values-as/strings.xml +++ b/res/values-as/strings.xml @@ -588,7 +588,7 @@ "পৰৱৰ্তী" "আপুনি ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰি ফ\'নটো আনলক কৰাৰ উপৰি ক্ৰয় আৰু এপ্ প্ৰৱেশৰ অনুমতি দিব পাৰিব। ""অধিক জানক" "স্ক্ৰীন লকৰ বিকল্পটো অক্ষম কৰা আছে। অধিক জানিবলৈ আপোনাৰ প্ৰতিষ্ঠানৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।" - "আপুনি তথাপি ক্ৰয় আৰু এপৰ এক্সেছৰ অনুমোদন জনাবলৈ আপোনাৰ ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰি পাৰে।" + "আপুনি তথাপি ক্ৰয় আৰু এপৰ এক্সেছৰ অনুমোদন জনাবলৈ আপোনাৰ ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰিব পাৰে।" "আঙুলিটো আঁতৰাওক আৰু ছেন্সৰটো আকৌ স্পৰ্শ কৰক" "ফিংগাৰপ্ৰিণ্ট ছেন্সৰ ব্যৱহাৰ কৰিব নোৱাৰি। মেৰামতি সেৱা প্ৰদানকাৰী কোনো প্ৰতিষ্ঠানলৈ যাওক" "সুৰক্ষা সম্পৰ্কীয় অধিক ছেটিং" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index a0f795eb65e..64b32bbf537 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -5787,7 +5787,7 @@ "Za aplikacije i usluge" "Za aplikacije i usluge. Ako je ovo podešavanje isključeno, podaci mikrofona mogu i dalje da se dele kada pozovete broj za hitne slučajeve." "Prethodna" - "Sledeća" + "Dalje" "Pregled boje" "Zahtev za pristup SIM kartici" "Uređaj želi da pristupa SIM kartici. Dodirnite za detalje." diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index fb751798c57..53e4be37be9 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -589,7 +589,7 @@ "Добавяне на друг" "Напред" "Освен за отключване на телефона си можете да използвате отпечатъка си и за упълномощаване на покупки и достъп до приложения. ""Научете повече" - "Опцията за заключване на екрана е деактивирана. За да научите повече, свържете се с администратора на организацията си." + "Опцията за заключване на екрана е деактивирана. За да научите повече, се свържете с администратора на организацията си." "Все още можете да използвате отпечатъка си, за да оторизирате плащания и да отключвате приложения." "Вдигнете пръста, след което докоснете сензора отново" "Сензорът за отпечатъци не може да се използва. Посетете оторизиран сервиз." diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 03bddc4cf09..c4773a27518 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -639,8 +639,8 @@ "Spriječite da druge osobe koriste ovaj uređaj bez vašeg odobrenja tako što ćete aktivirati funkcije za zaštitu uređaja. Odaberite koji način zaključavanja ekrana želite koristiti." "Spriječite da druge osobe koriste ovaj telefon bez vašeg odobrenja tako što ćete aktivirati funkcije za zaštitu uređaja. Odaberite koji način zaključavanja ekrana želite koristiti." "Odaberite rezervni način zaključavanja ekrana" - "Ako zaboravite lozinku za zaključavanje ekrana, vaš IT administrator je neće moći poništiti." - "Postavite zasebno zaključavanje za posao" + "Ako zaboravite radnju za zaključavanje ekrana, vaš IT administrator je neće moći poništiti." + "Postavite zasebno zaključavanje za poslovne aplikacije" "Ako zaboravite ovo zaključavanje, tražite od IT administratora da ga poništi" "Opcije zaključavanja ekrana" "Opcije zaključavanja ekrana" @@ -752,7 +752,7 @@ Mora sadržavati najmanje %d znaka Mora sadržavati najmanje %d znakova - "{count,plural, =1{Ako koristite samo brojeve, mora postojati najmanje 1 cifra}one{Ako koristite samo brojeve, mora postojati najmanje # cifra}few{Ako koristite samo brojeve, moraju postojati najmanje # cifre}other{Ako koristite samo brojeve, mora postojati najmanje # cifara}}" + "{count,plural, =1{Ako koristite samo brojeve, mora imati najmanje 1 cifru}one{Ako koristite samo brojeve, mora imati najmanje # cifru}few{Ako koristite samo brojeve, mora imati najmanje # cifre}other{Ako koristite samo brojeve, mora imati najmanje # cifara}}" PIN mora sadržavati najmanje %d cifru PIN mora sadržavati najmanje %d cifre diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 6137729908c..a25b443b577 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -590,7 +590,7 @@ "Siguiente" "Además de desbloquear el teléfono, también puedes utilizar tu huella dactilar para autorizar compras y el acceso a aplicaciones. ""Más información" "La opción de bloqueo de pantalla está inhabilitada. Para obtener más información, comunícate con el administrador de la organización." - "Todavía puedes usar tu huella dactilar para autorizar compras y acceder a apps." + "Puedes seguir usando tu huella dactilar para autorizar compras y acceder a apps." "Levanta el dedo y vuelve a tocar el sensor" "No se puede usar el sensor de huellas dactilares. Consulta a un proveedor de reparaciones." "Más parámetros de seguridad" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 13ce048bef9..ce03dec8b2d 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -4859,7 +4859,7 @@ "Ver más" "Restablecer límite de frecuencia de ShortcutManager" "Se ha restablecido el límite de frecuencia de ShortcutManager" - "Controlar los datos que aparecen en la pantalla de bloqueo" + "Controlar qué aparece en la pantalla de bloqueo" "Mostrar u ocultar contenido de las notificaciones" "Todo" "Ayuda y consejos" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index c9f0acd01c9..437e62ef9e3 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -5569,7 +5569,7 @@ "Utzi cacheko aplikazioak exekutatzeari" "Ez da inoiz iraungiko." "Ez da inoiz iraungiko lagapena." - "Eman pantailetan gainjartzeko baimena ezarpenetan" + "Eman ezarpenen pantailetan gainjartzeko baimena" "Eman ezarpenen pantailetan gainjartzeko baimena aplikazioen gainean bistara daitezkeen aplikazioei" "Eman probarako modem bat erabiltzeko baimena" "Eman probarako modemaren zerbitzua exekutatzeko baimena gailu honi, instrumentazio-probak egiteko. Ez ezazu gaitu telefonoa ohiko moduan erabili bitartean." diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index a28248741e5..152582ea942 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -3727,7 +3727,7 @@ "Automatikus feliratozás" "Telefon hangszórója" "Vezetékes fejhallgató" - "A kompatibilis médiatartalmak hangja térhatású" + "A kompatibilis médiatartalmak hangja még inkább magával ragadó lesz" "Ki" "Bekapcsolva / %1$s" "Bekapcsolva / %1$s és %2$s" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index a6acda5c386..8f46e38c676 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -635,8 +635,8 @@ "Կանխեք այս սարքի չթույլատրված օգտագործումն այլ անձանց կողմից՝ ակտիվացնելով սարքի պաշտպանության գործառույթները: Ընտրեք էկրանի կողպման ցանկալի եղանակը:" "Կանխեք այս հեռախոսի չթույլատրված օգտագործումն այլ անձանց կողմից՝ ակտիվացնելով սարքի պաշտպանության գործառույթները: Ընտրեք էկրանի կողպման ցանկալի եղանակը:" "Ընտրեք էկրանի կողպման լրացուցիչ եղանակը" - "Եթե մոռանաք էկրանի կողպումը, ՏՏ ադմինիստրատորը չի կարողանա փոխել այն։" - "Ավելացրեք աշխատանքային հավելվածների կողպում" + "Եթե մոռանաք էկրանի ապակողպման եղանակը, ՏՏ ադմինիստրատորը չի կարողանա փոխել այն։" + "Առանձին կողպում դրեք աշխատանքային պրոֆիլի համար" "Եթե մոռանաք կողպման այս եղանակը, ՏՏ ադմինիստրատորը կզրոյացնի այն" "Էկրանի կողպման տարբերակներ" "Էկրանի կողպման տարբերակներ" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 0bdffd22ec7..8cdda0d31c6 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -3030,7 +3030,7 @@ "安全ではない VPN: %d 件" "安全ではない VPN: %d 件" "接続の自動調整" - "ネットワーク接続を自動的に管理することで、バッテリーが長持ちし、デバイスのパフォーマンスが改善します" + "ネットワーク接続を自動的に管理することで、電池が長持ちし、デバイスのパフォーマンスが改善します" "ON" "OFF" "認証情報ストレージ" @@ -5542,7 +5542,7 @@ "電源ボタンと緊急通報のメニュー:\n電源ボタンと音量大ボタンを同時に押してください。" "着信音のミュート:\n音量メニューでショートカットを利用できます。" "長押しの長さ" - "電源ボタンを長押しする長さを調節します" + "長さを選択して感度を調整し、電源ボタンを長押しします。" "短い" "長い" "ウォレットを表示" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 87466a72af1..dcf136a02ac 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -749,7 +749,7 @@ Мора да содржи барем %d знак Мора да содржи барем %d знаци - "{count,plural, =1{Ако користите само бројки, мора да се долги барем 1 цифра}one{Ако користите само бројки, мора да се долги барем # цифра}other{Ако користите само бројки, мора да се долги барем # цифри}}" + "{count,plural, =1{Ако користите само бројки, мора да има барем 1 цифра}one{Ако користите само бројки, мора да има барем # цифра}other{Ако користите само бројки, мора да има барем # цифри}}" PIN-кодот мора да содржи барем %d цифра PIN-кодот мора да содржи барем %d цифри diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 34faa30721b..2c4a5e081eb 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -747,7 +747,7 @@ အနည်းဆုံး အက္ခရာ %d လုံး ပါရမည် အနည်းဆုံး အက္ခရာ %d လုံး ပါရမည် - "{count,plural, =1{နံပါတ်များသီးသန့်သုံးပါက အနည်းဆုံး ဂဏန်း 1 လုံးရှိရမည်}other{နံပါတ်များသီးသန့်သုံးပါက အနည်းဆုံး ဂဏန်း # လုံးရှိရမည်}}" + "{count,plural, =1{နံပါတ်ကိုသာ သုံးပါက အနည်းဆုံး ဂဏန်း ၁ လုံးရှိရမည်}other{နံပါတ်ကိုသာ သုံးပါက အနည်းဆုံး ဂဏန်း # လုံးရှိရမည်}}" ပင်နံပါတ်တွင် အနည်းဆုံး ဂဏန်း %d လုံး ပါရမည် ပင်နံပါတ်တွင် အနည်းဆုံး ဂဏန်း %d လုံး ပါရမည် diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index 5eff7e04f54..5507cb3f7b5 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -3727,11 +3727,11 @@ "ସ୍ବଚାଳିତ କ୍ୟାପ୍ସନ୍ ମିଡିଆ" "ଫୋନ ସ୍ପିକର" "ତାରଯୁକ୍ତ ହେଡଫୋନଗୁଡ଼ିକ" - "କମ୍ପାଟିବଲ ମିଡିଆରୁ ଆସିଥିବା ଅଡିଓ ଅଧିକ ଇମରସିଭ ହୋଇଥାଏ" + "କମ୍ପାଟିବଲ ମିଡିଆରୁ ଆସିଥିବା ଅଡିଓ ଅଧିକ ଇମର୍ସିଭ ହୋଇଥାଏ" "ବନ୍ଦ ଅଛି" "ଚାଲୁ ଅଛି / %1$s" "ଚାଲୁ ଅଛି / %1$s ଏବଂ %2$s" - "ଆପଣ ମଧ୍ୟ ବ୍ଲୁଟୁଥ ଡିଭାଇସଗୁଡ଼ିକ ପାଇଁ ସ୍ପାସିଅଲ ଅଡିଓକୁ ଚାଲୁ କରିପାରିବେ।" + "ଆପଣ ବ୍ଲୁଟୁଥ ଡିଭାଇସଗୁଡ଼ିକ ପାଇଁ ମଧ୍ୟ ସ୍ପେସିଆଲ ଅଡିଓକୁ ଚାଲୁ କରିପାରିବେ।" "କନେକ୍ଟ ହୋଇଥିବା ଡିଭାଇସଗୁଡ଼ିକର ସେଟିଂସ" "{count,plural, =0{କିଛି ନାହିଁ}=1{1ଟି ସିଡୁଲ୍ ସେଟ୍ ହୋଇଛି}other{#ଟି ସିଡୁଲ୍ ସେଟ୍ ହୋଇଛି}}" "ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ" @@ -5768,7 +5768,7 @@ "ବର୍ତ୍ତମାନ ରିବୁଟ କରନ୍ତୁ" "ପରେ ରିବୁଟ କରନ୍ତୁ" "ସ୍ପେସିଆଲ ଅଡିଓ" - "କମ୍ପାଟିବଲ ମିଡିଆରୁ ଆସିଥିବା ଅଡିଓ ଅଧିକ ଇମରସିଭ ହୋଇଥାଏ" + "କମ୍ପାଟିବଲ ମିଡିଆରୁ ଆସିଥିବା ଅଡିଓ ଅଧିକ ଇମର୍ସିଭ ହୋଇଥାଏ" "ହେଡ ଟ୍ରାକିଂ" "ସାଉଣ୍ଡକୁ ଅଧିକ ସ୍ୱାଭାବିକ କରିବା ପାଇଁ ଆପଣ ଆପଣଙ୍କ ମୁଣ୍ଡକୁ ମୁଭ କରିବା ସମୟରେ ଅଡିଓ ପରିବର୍ତ୍ତନ ହୁଏ" "ନେଟୱାର୍କ ଡାଉନଲୋଡ ରେଟ ସୀମା" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index d16ed6c881b..fbade237690 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -5787,7 +5787,7 @@ "За апликације и услуге" "За апликације и услуге. Ако је ово подешавање искључено, подаци микрофона могу и даље да се деле када позовете број за хитне случајеве." "Претходна" - "Следећа" + "Даље" "Преглед боје" "Захтев за приступ SIM картици" "Уређај жели да приступа SIM картици. Додирните за детаље." diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 6a08553bdaf..4392c1deca0 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -587,7 +587,7 @@ "Lägg till ännu ett" "Nästa" "Förutom att låsa upp mobilen kan du använda fingeravtrycket för att godkänna köp och åtkomst för appar. ""Läs mer" - "Skärmlåsalternativet är inaktiverat. Om du vill ha mer information kontaktar du din organisations administratör." + "Skärmlåsalternativet är inaktiverat. Kontakta din organisations administratör för mer information." "Du kan fortfarande använda fingeravtryck för att auktorisera köp och appåtkomster." "Lyft fingret och tryck sedan på sensorn igen" "Det går inte att använda fingeravtryckssensorn. Besök ett reparationsställe" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 3aa42ac342a..d4e7e7d5b1c 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -3731,7 +3731,7 @@ "ஆஃப்" "ஆன் / %1$s" "ஆன் / %1$s மற்றும் %2$s" - "புளூடூத் சாதனங்களுக்கு, சுற்றிலும் கேட்கும் ஆடியோவையும் நீங்கள் இயக்கலாம்." + "புளூடூத் சாதனங்களுக்கும் சுற்றிலும் கேட்கும் ஆடியோவை நீங்கள் இயக்கலாம்." "இணைக்கப்பட்டுள்ள சாதனங்களின் அமைப்புகள்" "{count,plural, =0{எதுவுமில்லை}=1{1 திட்டமிடல் அமைக்கப்பட்டுள்ளது}other{# திட்டமிடல்கள் அமைக்கப்பட்டுள்ளன}}" "தொந்தரவு செய்யாதே" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 7059332392a..7822383099c 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -636,7 +636,7 @@ "ป้องกันไม่ให้ผู้อื่นใช้โทรศัพท์เครื่องนี้โดยไม่ได้รับอนุญาตจากคุณด้วยการเปิดใช้งานฟีเจอร์การปกป้องอุปกรณ์ เลือกล็อกหน้าจอที่คุณต้องการใช้" "เลือกวิธีสำรองในการล็อกหน้าจอ" "หากคุณลืมการล็อกหน้าจอ ผู้ดูแลระบบไอทีจะรีเซ็ตให้คุณไม่ได้" - "โปรดตั้งค่าการล็อกสำหรับแอปงานแยกต่างหาก" + "ตั้งค่าล็อกงานแยกต่างหาก" "หากคุณจำการล็อกนี้ไม่ได้ โปรดขอให้ผู้ดูแลระบบไอทีรีเซ็ตการล็อก" "ตัวเลือกการล็อกหน้าจอ" "ตัวเลือกการล็อกหน้าจอ" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 0db67f15635..a0d3221e8f3 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -3731,7 +3731,7 @@ "Kapalı" "Açık/%1$s" "Açık/%1$s ve %2$s" - "Bluetooth cihazlar için üç boyutlu sesi de açabilirsiniz." + "Bluetooth cihazlar için de üç boyutlu sesi açabilirsiniz." "Bağlı cihaz ayarları" "{count,plural, =0{Yok}=1{1 program ayarlandı}other{# program ayarlandı}}" "Rahatsız Etmeyin" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 8de222c1a03..8bce70e5923 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -632,7 +632,7 @@ "Блокування екрана" "Виберіть спосіб розблокування екрана" - "Виберіть новий спосіб розблокування екрана" + "Виберіть спосіб блокування екрана" "Виберіть спосіб розблокування робочих додатків" "Виберіть новий робочий спосіб розблокування" "Захистіть свій планшет" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 3c02c29ead0..7455cfa2a33 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -225,7 +225,7 @@ "Theo chế độ mặc định của hệ thống" "Bạn chưa thể chọn ngôn ngữ cho ứng dụng này trong phần Cài đặt." "Ngôn ngữ có thể khác với ngôn ngữ có sẵn trong ứng dụng. Một số ứng dụng có thể không hỗ trợ cài đặt này." - "Chỉ những ứng dụng hỗ trợ lựa chọn ngôn ngữ mới được hiển thị." + "Chỉ những ứng dụng cho phép lựa chọn ngôn ngữ mới xuất hiện ở đây." Xóa các ngôn ngữ đã chọn? Xóa ngôn ngữ đã chọn? diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 0adac8f7922..ec7a50cd3be 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -3727,11 +3727,11 @@ "自动生成媒体字幕" "手机扬声器" "有线头戴式耳机" - "播放兼容的媒体时,音频更具沉浸感" + "播放兼容的媒体内容时,音频更具沉浸感" "关闭" "开启/%1$s" "开启/%1$s%2$s" - "您还可以针对蓝牙设备开启空间音频功能。" + "您还可以为蓝牙设备开启空间音频功能。" "已连接设备的设置" "{count,plural, =0{无}=1{已设置 1 个时间表}other{已设置 # 个时间表}}" "勿扰模式" From 96fda27ccbef482ff2584260d6e433b1e5cc5012 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 4 Jun 2022 01:23:16 -0700 Subject: [PATCH 4/9] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I7b60a0fb4183522545dcf50eae9cd8f1f38a6c1d --- res/values-vi/arrays.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-vi/arrays.xml b/res/values-vi/arrays.xml index 358fa21b01c..bda1b56c807 100644 --- a/res/values-vi/arrays.xml +++ b/res/values-vi/arrays.xml @@ -402,7 +402,7 @@ "Viền ngoài" "Bóng đổ" "Tăng" - "Giảm" + "Chìm" "25%" From 106e52ca92e3e5173bc4afa6c88c7647888a82aa Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 4 Jun 2022 01:26:51 -0700 Subject: [PATCH 5/9] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I052e09e19a9d145d401e0152346ebe7f0e7f2a36 --- res/values-ar/strings.xml | 6 +++--- res/values-b+sr+Latn/strings.xml | 2 +- res/values-ca/strings.xml | 6 +++--- res/values-de/strings.xml | 4 ++-- res/values-es-rUS/strings.xml | 2 +- res/values-es/strings.xml | 4 ++-- res/values-eu/strings.xml | 2 +- res/values-fr-rCA/strings.xml | 2 +- res/values-fr/strings.xml | 4 ++-- res/values-hi/strings.xml | 2 +- res/values-ja/strings.xml | 4 ++-- res/values-kk/strings.xml | 4 ++-- res/values-mr/strings.xml | 2 +- res/values-my/strings.xml | 2 +- res/values-nl/strings.xml | 2 +- res/values-or/strings.xml | 2 +- res/values-pl/strings.xml | 2 +- res/values-pt-rPT/strings.xml | 2 +- res/values-sr/strings.xml | 2 +- res/values-ta/strings.xml | 2 +- res/values-uk/strings.xml | 2 +- res/values-vi/strings.xml | 2 +- res/values-zh-rHK/strings.xml | 6 +++--- 23 files changed, 34 insertions(+), 34 deletions(-) diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 88dc059a402..c14a7e864d2 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -575,7 +575,7 @@ "بالإضافة إلى فتح قفل هاتفك، يمكنك أيضًا استخدام بصمة إصبعك للسماح بعمليات الشراء والوصول إلى التطبيق. ""مزيد من المعلومات" " تم إيقاف خيار قفل الشاشة. لمعرفة المزيد من المعلومات، اتصل بمشرف مؤسستك. ""مزيد من التفاصيل"\n\n"ما زال بإمكانك استخدام بصمة إصبعك للسماح بعمليات الشراء والوصول إلى التطبيقات. ""مزيد من المعلومات" "ارفع إصبعك ثم المس زر الاستشعار مرة أخرى." - "لا يمكن استخدام مستشعر بصمات الإصبع. يُرجى التواصل مع مقدِّم خدمات إصلاح." + "لا يمكن استخدام أداة استشعار بصمة الإصبع. يُرجى التواصل مع مقدِّم خدمات إصلاح." "يمكنك إضافة ما يصل إلى %d بصمات إصبع" "لقد أضفت الحد الأقصى لعدد بصمات الإصبع" "يتعذر إضافة مزيد من بصمات الإصبع" @@ -2014,7 +2014,7 @@ "أعِد إدخال كلمة المرور" "إعادة إدخال كلمة مرور ملف العمل" "أدخِل كلمة مرور العمل" - "تأكيد نقشك" + "تأكيد النقش" "أدخِل نقش العمل" "أعِد إدخال رقم التعريف الشخصي" "إعادة إدخال رقم التعريف لملف العمل" @@ -2038,7 +2038,7 @@ "استخدِم النقش الذي اخترته على جهازك للمتابعة." "أدخِل رقم التعريف الشخصي للجهاز للمتابعة." "أدخل كلمة مرور الجهاز للمتابعة." - "استخدم نقش ملفك الشخصي للعمل للمتابعة." + "استخدم نقش ملفك الشخصي الخاص بالعمل للمتابعة." "أدخل رقم التعريف الشخصي لملفك الشخصي للعمل للمتابعة." "أدخل كلمة مرور ملفك الشخصي للعمل للمتابعة." "استخدام نقش للجهاز لزيادة الأمان" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 6a9c7c04f90..05d43ba83b5 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -5660,7 +5660,7 @@ "Podešavanja igara" "Uključite prečicu za kontrolnu tablu igre itd." "Prethodna" - "Sledeća" + "Dalje" "Pregled boje" "Zahtev za pristup SIM kartici" "Uređaj želi da pristupa SIM kartici. Dodirnite za detalje." diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 074322d3fdb..c78dc6af4f6 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -622,7 +622,7 @@ "Activa les funcions de protecció del dispositiu per impedir que altres persones el facin servir sense permís. Tria el bloqueig de pantalla que vulguis utilitzar." "Activa les funcions de protecció del dispositiu per impedir que altres persones utilitzin aquest telèfon sense permís. Tria el bloqueig de pantalla que vulguis utilitzar." "Tria un mètode de bloqueig de pantalla alternatiu" - "L\'administrador de TI no pot restablir aquest bloqueig. LINK_BEGINDefineix un bloqueig diferent per al treballLINK_END." + "L\'administrador de TI no pot restablir aquest bloqueig. LINK_BEGINDefineix-ne un altre per a la feinaLINK_END." "Si t\'oblides del bloqueig, demana a l\'administrador de TI que el restableixi" "Opcions de bloqueig de pantalla" "Opcions de bloqueig de pantalla" @@ -4590,7 +4590,7 @@ "Es necessita el pare o la mare" "Dona el telèfon als pares perquè comencin a configurar-lo" "Si tens cap dubte, contacta amb l\'administrador de TI" - "Més detalls" + "Més informació" "L\'administrador pot supervisar i gestionar les aplicacions i les dades associades al teu perfil de treball, com ara la configuració, els permisos, l\'accés corporatiu, l\'activitat de xarxa i la informació d\'ubicació del dispositiu." "L\'administrador pot supervisar i gestionar les aplicacions i les dades associades a aquest usuari, com ara la configuració, els permisos, l\'accés corporatiu, l\'activitat de xarxa i la informació d\'ubicació del dispositiu." "L\'administrador pot supervisar i gestionar les aplicacions i les dades associades a aquest dispositiu, com ara la configuració, els permisos, l\'accés corporatiu, l\'activitat de xarxa i la informació d\'ubicació del dispositiu." @@ -5485,7 +5485,7 @@ "Xarxes disponibles" "Per canviar de xarxa, desconnecta la connexió Ethernet" "La Wi‑Fi està desactivada" - "Toca una xarxa per connectar-te" + "Toca una xarxa per connectar-t\'hi" "Connexions W+" "Permet que Google Fi utilitzi les xarxes W+ per millorar la velocitat i la cobertura" "Xarxa W+" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 4f44f256a08..3fb3df80f26 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -1038,7 +1038,7 @@ "Wenn du das Gerät zu „%1$s“ hinzufügen möchtest, scanne den QR-Code unten" "QR-Code scannen" "Wenn du eine Verbindung zu \"%1$s\" herstellen möchtest, scanne den QR-Code unten" - "Scanne den QR-Code, um dein Gerät mit dem WLAN zu verbinden" + "Scanne einen QR-Code, um dein Gerät mit dem WLAN zu verbinden" "WLAN teilen" "Scanne diesen QR-Code mit einem anderen Gerät, um dich mit „%1$s“ zu verbinden" "Diesen QR-Code scannen, um eine Verbindung mit „%1$s“ herzustellen" @@ -4036,7 +4036,7 @@ "Benachrichtigungen anzeigen" "Benachrichtigungen nie in der Leiste oder auf Peripheriegeräten anzeigen" "App-Benach­rich­ti­gungs­punkt erlauben" - "App-Benach­richtigungs­punkt anzeigen" + "App-Benach­richtigungs00AD­punkt anzeigen" "„Bitte nicht stören“ ignorieren" "Diese Benachrichtigungen dürfen auch dann gemeldet werden, wenn „Bitte nicht stören“ aktiviert ist" "Sperrbildschirm" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 41fcb2b4bc1..51a5724df39 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -1952,7 +1952,7 @@ "Para continuar, usa el patrón del dispositivo" "Para continuar, ingresa el PIN del dispositivo" "Para continuar, ingresa la contraseña del dispositivo" - "Para continuar, usa el patrón de tu perfil de trabajo" + "Usa tu patrón de trabajo para continuar" "Para continuar, ingresa tu PIN de trabajo" "Para continuar, ingresa la contraseña de tu perfil de trabajo" "Para mayor seguridad, usa el patrón de tu dispositivo" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 83839b1a10a..546e8835a39 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -611,7 +611,7 @@ "Elige un bloqueo de pantalla" "Elige un bloqueo de pantalla" - "Nuevo bloqueo de pantalla" + "Elige un nuevo bloqueo de pantalla" "Bloqueo de aplicaciones de trabajo" "Nuevo bloqueo de trabajo" "Protege tu tablet" @@ -4771,7 +4771,7 @@ "Borrar y convertir" "Restablecer límite de frecuencia de ShortcutManager" "Se ha restablecido el límite de frecuencia de ShortcutManager" - "Controlar los datos que aparecen en la pantalla de bloqueo" + "Controlar qué aparece en la pantalla de bloqueo" "Mostrar u ocultar contenido de las notificaciones" "Todo" "Ayuda y consejos" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 905dbcdb705..8a6991b5f84 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -5445,7 +5445,7 @@ "Bi SIM txartel darabiltzanean, tabletak 4G sarea erabili ahal izango du, gehienez. ""Lortu informazio gehiago" "Bi SIM txartel darabiltzanean, gailuak 4G sarea erabili ahal izango du, gehienez. ""Lortu informazio gehiago" "Utzi cacheko aplikazioak exekutatzeari" - "Eman pantailetan gainjartzeko baimena ezarpenetan" + "Eman ezarpenen pantailetan gainjartzeko baimena" "Eman ezarpenen pantailetan gainjartzeko baimena aplikazioen gainean bistara daitezkeen aplikazioei" "Multimedia-edukia" "Ainguratu multimedia-erreproduzigailua" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 24b210a9334..33c68ce6e64 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -1033,7 +1033,7 @@ "Adresse MAC aléatoire" "Ajouter un appareil" "Centrez le code QR ci-dessous pour ajouter l\'appareil à « %1$s »" - "Numériser le code QR" + "Numérisez le code QR" "Centrez le code QR ci-dessous pour vous connecter à « %1$s »" "Connectez-vous au Wi-Fi en numérisant un code QR" "Partager le Wi‑Fi" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 11139a503e3..dee1d8751d3 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -1947,10 +1947,10 @@ "Mot de passe oublié ?" "Schéma oublié ?" "Code oublié ?" - "Utilisez le schéma de l\'appareil pour continuer." + "Utilisez le schéma de votre appareil pour continuer." "Saisissez le code de l\'appareil pour continuer." "Saisissez le mot de passe de l\'appareil pour continuer." - "Utilisez le schéma du profil professionnel pour continuer." + "Utilisez le schéma de votre profil professionnel pour continuer." "Saisissez le code PIN de votre profil professionnel pour continuer." "Saisissez le mot de passe du profil professionnel pour continuer." "Pour plus de sécurité, utilisez le schéma de l\'appareil" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index ae0780134bc..2c44595c5d7 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -4590,7 +4590,7 @@ "माता-पिता की अनुमति ज़रूरी है" "बायोमेट्रिक्स के ज़रिए पुष्टि करने की सुविधा सेट अप करने के लिए, अपने माता-पिता की मदद लें" "अगर आपके कोई सवाल हैं, तो अपने आईटी एडमिन से संपर्क करें" - "ज़्यादा विवरण" + "ज़्यादा जानकारी" "आपका एडमिन आपकी वर्क प्रोफ़ाइल से जुड़े ऐप और डेटा की निगरानी और उनका प्रबंधन कर सकता है, जिनमें सेटिंग, अनुमतियां, कॉर्पोरेट पहुंच, नेटवर्क गतिविधि और डिवाइस के जगह की जानकारी शामिल हैं." "आपका एडमिन इस उपयोगकर्ता से जुड़े ऐप्लिकेशन और डेटा की निगरानी और उनका प्रबंधन कर सकता है, जिनमें सेटिंग, अनुमतियां, कॉर्पोरेट पहुंच, नेटवर्क गतिविधि और डिवाइस के जगह की जानकारी शामिल है." "आपका एडमिन इस उपयोगकर्ता से जुड़े ऐप्लिकेशन और डेटा की निगरानी और उनका प्रबंधन कर सकता है, जिनमें सेटिंग, अनुमतियां, कॉर्पोरेट पहुंच, नेटवर्क गतिविधि और डिवाइस के जगह की जानकारी शामिल है." diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 98d77fea473..5a72b14979a 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -2963,7 +2963,7 @@ "安全ではない VPN: %d 件" "安全ではない VPN: %d 件" "接続の自動調整" - "ネットワーク接続を自動的に管理することで、バッテリーが長持ちし、デバイスのパフォーマンスが改善します" + "ネットワーク接続を自動的に管理することで、電池が長持ちし、デバイスのパフォーマンスが改善します" "ON" "OFF" "認証情報ストレージ" @@ -5425,7 +5425,7 @@ "電源ボタンと緊急通報のメニュー:\n電源ボタンと音量大ボタンを同時に押してください。" "着信音のミュート:\n音量メニューでショートカットを利用できます。" "長押しの長さ" - "電源ボタンを長押しする長さを調節します" + "長さを選択して感度を調整し、電源ボタンを長押しします。" "短い" "長い" "ウォレットを表示" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index ddf789a2cbb..c07a56a539a 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -151,7 +151,7 @@ "Басқа құрылғылар" "Сақталған құрылғылар" "Bluetooth қосылады." - "Байланыс параметрлері" + "Жалғау параметрлері" "Бұрын жалғанған құрылғылар" "Бұрын жалғанған" "Bluetooth қосылды" @@ -2117,7 +2117,7 @@ "Бұл қолданбаны өшірсеңіз, Android жүйесі мен басқа қолданбалар тиісінше жұмыс істемеуі мүмкін. Бұл қолданба құрылғыға алдын ала орнатылатындықтан, оны жою мүмкін еместігін ескеріңіз. Өшіріп қою арқылы сіз бұл қолданбаны өшіріп, оны құрылғыда жасыра аласыз." "Хабарлар өшірілісін бе?" "Дүкен" - "Қолданба сипаттамасы" + "Қолданба туралы мәлімет" "Қолданба %1$s дүкенінен орнатылды." "Қосымша ақпарат: %1$s" "Қосылған" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index c68c3cc80b0..6cb2d0d0c00 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -1972,7 +1972,7 @@ "डिव्हाइस सुरक्षा" "अनलॉक पॅटर्न बदला" "अनलॉक पिन बदला" - "तुमचा अनलॉक पॅटर्न" + "अनलॉक पॅटर्न ड्रॉ करा" "मदतीसाठी मेनू दाबा." "पूर्ण झाल्यावर बोट सोडा" "कमीत कमी %d बिंदू कनेक्ट करा. पुन्हा प्रयत्न करा." diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 532b0e9997d..f3ced95e92e 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -465,7 +465,7 @@ "စက်ပစ္စည်းကာကွယ်ရန် ဝန်ဆောင်မှုများ ပွင့်မည်မဟုတ်ပါ။ ပျောက်ဆုံးသွားလျှင် သို့မဟုတ် အခိုးခံရလျှင် ဤစက်ပစ္စည်းကို အခြားသူများအသုံးပြုခြင်းမှ ကာကွယ်နိုင်မည်မဟုတ်ပါ။" "စက်ပစ္စည်းကာကွယ်ရန် ဝန်ဆောင်မှုများ ပွင့်မည်မဟုတ်ပါ။ ပျောက်ဆုံးသွားလျှင် သို့မဟုတ် အခိုးခံရလျှင် ဤဖုန်းကို အခြားသူများအသုံးပြုခြင်းမှ ကာကွယ်နိုင်မည်မဟုတ်ပါ။" "ကျော်လိုက်ပါ" - "နောက်သို့ သွားပါ" + "နောက်သို့" "ကျော်ရန်" "မလုပ်တော့" "အာရုံခံကိရိယာကို ထိပါ" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 1fd541fd083..89b7c43278a 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -1035,7 +1035,7 @@ "Centreer de QR-code hieronder om het apparaat toe te voegen aan %1$s" "QR-code scannen" "Centreer de onderstaande QR-code om verbinding te maken met %1$s" - "Scan een QR-code om verbinding te maken met met wifi" + "Scan een QR-code om verbinding te maken met wifi" "Wifi delen" "Scan deze QR-code met een ander apparaat om deel te nemen aan %1$s" "Scan deze QR-code om verbinding te maken met \'%1$s\'" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index a77bddd0bc5..3610fde4412 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -534,7 +534,7 @@ "ଫେସ୍ ଅନଲକ୍ ଏବଂ ଫିଙ୍ଗରପ୍ରିଣ୍ଟ ଅନଲକ୍ ସେଟ୍ ଅପ୍ କରିବା ପାଇଁ ଏକ ପାସୱାର୍ଡ ଆବଶ୍ୟକ।\n\nଯଦି ଡିଭାଇସଟି ହଜିଯାଏ କିମ୍ବା ଚୋରି ହୋଇଯାଏ, ତେବେ ଏକ ପାସୱାର୍ଡ ଏହାକୁ ସୁରକ୍ଷିତ ରଖେ।" "ଫେସ୍ ଅନଲକ୍ ଏବଂ ଫିଙ୍ଗରପ୍ରିଣ୍ଟ ଅନଲକ୍ ସେଟ୍ ଅପ୍ କରିବା ପାଇଁ ଏକ PIN ଆବଶ୍ୟକ।\n\nଯଦି ଫୋନଟି ହଜିଯାଏ କିମ୍ବା ଚୋରି ହୋଇଯାଏ, ତେବେ ଏକ PIN ଏହାକୁ ସୁରକ୍ଷିତ ରଖେ।" "ଫେସ୍ ଅନଲକ୍ ଏବଂ ଫିଙ୍ଗରପ୍ରିଣ୍ଟ ଅନଲକ୍ ସେଟ୍ ଅପ୍ କରିବା ପାଇଁ ଏକ ପାଟର୍ନ ଆବଶ୍ୟକ।\n\nଯଦି ଫୋନଟି ହଜିଯାଏ କିମ୍ବା ଚୋରି ହୋଇଯାଏ, ତେବେ ଏକ ପାଟର୍ନ ଏହାକୁ ସୁରକ୍ଷିତ ରଖେ।" - "ଫେସ୍ ଅନଲକ୍ ଏବଂ ଫିଙ୍ଗରପ୍ରିଣ୍ଟ ଅନଲକ୍ ସେଟ୍ ଅପ୍ କରିବା ପାଇଁ ଏକ ପାସୱାର୍ଡ ଆବଶ୍ୟକ।\n\nଯଦି ଫୋନଟି ହଜିଯାଏ କିମ୍ବା ଚୋରି ହୋଇଯାଏ, ତେବେ ଏକ ପାସୱାର୍ଡ ଏହାକୁ ସୁରକ୍ଷିତ ରଖେ।" + "ଫେସ ଅନଲକ ଏବଂ ଫିଙ୍ଗରପ୍ରିଣ୍ଟ ଅନଲକ ସେଟ ଅପ କରିବା ପାଇଁ ଏକ ପାସୱାର୍ଡ ଆବଶ୍ୟକ।\n\nଯଦି ଫୋନଟି ହଜିଯାଏ କିମ୍ବା ଚୋରି ହୋଇଯାଏ, ତେବେ ଏହି ପାସୱାର୍ଡ ଏହାକୁ ସୁରକ୍ଷିତ ରଖେ।" "PIN ସେଟ୍‌ଅପ୍ ବାଦ୍ ଦେବେ କି?" "PIN ଓ ଫେସ୍ ପାଇଁ ସେଟଅପ୍ ବାଦ୍ ଦେବେ?" "PIN ଓ ଟିପଚିହ୍ନ ପାଇଁ ସେଟଅପ୍ ବାଦ୍ ଦେବେ?" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 72bdc54d9ca..d57cf9639f1 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -2381,7 +2381,7 @@ "%1$s – skrót" "Przycisk ułatwień dostępu" "Gest ułatwień dostępu" - "Przesuń w górę dwoma palcami" + "Przesunięcie w górę dwoma palcami" "Przesuń w górę trzema palcami" "Kliknij przycisk ułatwień dostępu" "Użyj gestu ułatwień dostępu" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 070374bb5b8..aa1a45fb294 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -1033,7 +1033,7 @@ "MAC aleatório" "Adicione um dispositivo" "Centre o código QR abaixo para adicionar o dispositivo a \"%1$s\"" - "Ler código QR" + "Leia o código QR" "Centre o código QR abaixo para estabelecer ligação a “%1$s”" "Leia um código QR para ligar ao Wi-Fi" "Partilhar Wi‑Fi" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 3cb657b068b..1a3e9b2505e 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -5660,7 +5660,7 @@ "Подешавања игара" "Укључите пречицу за контролну таблу игре итд." "Претходна" - "Следећа" + "Даље" "Преглед боје" "Захтев за приступ SIM картици" "Уређај жели да приступа SIM картици. Додирните за детаље." diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 60298537cca..8a1db7ba56f 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -2418,7 +2418,7 @@ "அறிவிப்பு அதிர்வுகள்" "ரிங் அதிர்வுகள்" "தொட்டு கருத்து தெரிவித்தல்" - "%1$sஐப் பயன்படுத்து" + "%1$s ஐப் பயன்படுத்து" "%1$s ஆப்ஸைத் திற" "கலர் கரெக்‌ஷனைப் பயன்படுத்து" "கலர் கரெக்‌ஷனுக்கான ஷார்ட்கட்" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 111bef819d2..8118beeedd4 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -619,7 +619,7 @@ "Блокування екрана" "Виберіть спосіб розблокування екрана" - "Виберіть новий спосіб розблокування екрана" + "Виберіть спосіб блокування екрана" "Виберіть спосіб розблокування робочих додатків" "Виберіть новий робочий спосіб розблокування" "Захистіть свій планшет" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 16ebec03080..ab00dc0d34b 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -5070,7 +5070,7 @@ "Tính năng không hoạt động" "Tính năng này đã bị tắt vì sẽ khiến điện thoại chạy chậm" "Luôn hiện hộp thoại sự cố" - "Hiển thị hộp thoại mỗi khi ứng dụng gặp sự cố" + "Hiện hộp thoại mỗi khi ứng dụng gặp sự cố" "Chọn ứng dụng hỗ trợ ANGLE" "Chưa đặt ứng dụng hỗ trợ ANGLE nào" "Ứng dụng hỗ trợ ANGLE: %1$s" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 5c3c5a11721..0c52eb75129 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -1035,9 +1035,9 @@ "隨機化處理 MAC" "加入裝置" "將下方方框對準二維條碼,即可將裝置加到「%1$s」" - "掃瞄二維條碼" + "掃瞄 QR 碼" "將二維條碼置於下方中間,即可連接至「%1$s」" - "掃瞄二維條碼以加入 Wi-Fi" + "掃瞄 QR 碼加入 Wi-Fi" "分享 Wi‑Fi" "使用其他裝置掃瞄此二維條碼以加入「%1$s」" "掃描此二維條碼,即可連接「%1$s」" @@ -5488,7 +5488,7 @@ "有可用的網絡" "如要切換網絡,請中斷以太網連線" "Wi-Fi 已關閉" - "輕按網絡以連線" + "輕按要連線的網絡" "W+ 連線" "允許 Google Fi 使用 W+ 網絡來改善速度和覆蓋率" "W+ 網絡" From a09c33f49c2d8025b475f31f97684b0919cd189a Mon Sep 17 00:00:00 2001 From: Weng Su Date: Tue, 7 Jun 2022 03:30:01 +0800 Subject: [PATCH 6/9] Restrict guest user to configure WiFi access points - If the user is not allowed to configure Wi-Fi access points, close WifiDialogActivity. Bug: 226133034 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=WifiDialogActivityTest Change-Id: I32d0c5beceb8a140a98636a5a0af97790495620d --- .../settings/wifi/WifiDialogActivity.java | 19 ++++++++++++++++++ .../settings/wifi/WifiDialogActivityTest.java | 20 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/com/android/settings/wifi/WifiDialogActivity.java b/src/com/android/settings/wifi/WifiDialogActivity.java index 67f291da49d..8a46c9d18c5 100644 --- a/src/com/android/settings/wifi/WifiDialogActivity.java +++ b/src/com/android/settings/wifi/WifiDialogActivity.java @@ -17,6 +17,7 @@ package com.android.settings.wifi; import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import static android.os.UserManager.DISALLOW_CONFIG_WIFI; import android.content.DialogInterface; import android.content.Intent; @@ -31,6 +32,7 @@ import android.os.Looper; import android.os.Process; import android.os.SimpleClock; import android.os.SystemClock; +import android.os.UserManager; import android.text.TextUtils; import android.util.EventLog; import android.util.Log; @@ -115,6 +117,10 @@ public class WifiDialogActivity extends ObservableActivity implements WifiDialog } super.onCreate(savedInstanceState); + if (!isConfigWifiAllowed()) { + finish(); + return; + } mIsWifiTrackerLib = !TextUtils.isEmpty(mIntent.getStringExtra(KEY_CHOSEN_WIFIENTRY_KEY)); @@ -361,6 +367,19 @@ public class WifiDialogActivity extends ObservableActivity implements WifiDialog } } + @VisibleForTesting + boolean isConfigWifiAllowed() { + UserManager userManager = getSystemService(UserManager.class); + if (userManager == null) return true; + final boolean isConfigWifiAllowed = !userManager.hasUserRestriction(DISALLOW_CONFIG_WIFI); + if (!isConfigWifiAllowed) { + Log.e(TAG, "The user is not allowed to configure Wi-Fi."); + EventLog.writeEvent(0x534e4554, "226133034", getApplicationContext().getUserId(), + "The user is not allowed to configure Wi-Fi."); + } + return isConfigWifiAllowed; + } + private boolean hasWifiManager() { if (mWifiManager != null) return true; mWifiManager = getSystemService(WifiManager.class); diff --git a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java index 4ceb1e3b002..28b7ecbf09b 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java @@ -18,6 +18,7 @@ package com.android.settings.wifi; import static android.Manifest.permission.ACCESS_COARSE_LOCATION; import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import static android.os.UserManager.DISALLOW_CONFIG_WIFI; import static com.android.settings.wifi.WifiDialogActivity.REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER; import static com.android.settings.wifi.WifiDialogActivity.RESULT_CONNECTED; @@ -36,6 +37,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; +import android.os.UserManager; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.wifi.AccessPoint; @@ -44,6 +46,7 @@ import com.android.wifitrackerlib.WifiEntry; import com.google.android.setupcompat.util.WizardManagerHelper; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -57,6 +60,8 @@ public class WifiDialogActivityTest { static final String CALLING_PACKAGE = "calling_package"; static final int REQUEST_CODE = REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER; + @Mock + UserManager mUserManager; @Mock PackageManager mPackageManager; @Mock @@ -92,6 +97,7 @@ public class WifiDialogActivityTest { FakeFeatureFactory.setupForTest(); mActivity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); + when(mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager); when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager); } @@ -211,6 +217,20 @@ public class WifiDialogActivityTest { verify(mActivity).setResult(RESULT_CONNECTED, mResultData); } + @Test + public void isConfigWifiAllowed_hasNoUserRestriction_returnTrue() { + when(mUserManager.hasUserRestriction(DISALLOW_CONFIG_WIFI)).thenReturn(false); + + assertThat(mActivity.isConfigWifiAllowed()).isTrue(); + } + + @Test + public void isConfigWifiAllowed_hasUserRestriction_returnFalse() { + when(mUserManager.hasUserRestriction(DISALLOW_CONFIG_WIFI)).thenReturn(true); + + assertThat(mActivity.isConfigWifiAllowed()).isFalse(); + } + @Test public void hasPermissionForResult_noCallingPackage_returnFalse() { when(mActivity.getCallingPackage()).thenReturn(null); From 948b7cb959dcfa1864bf01f9a50d575f89d824de Mon Sep 17 00:00:00 2001 From: Alice Kuo Date: Wed, 25 May 2022 13:49:59 +0800 Subject: [PATCH 7/9] Add LE Audio feature switcher in the developer option menu Add a switcher to enable/disable LE audio feature. The switcher could be enabled by setprop ro.bluetooth.leaudio_offload.supported=true screenshot: https://screenshot.googleplex.com/6aGP664S9PX5EMS Bug: 233018305 Bug: 233005340 Test: make RunSettingsRoboTests ROBOTEST_FILTER=BluetoothLeAudioPreferenceControllerTest Test: switch LE audio feature, and check LE audio functionality status Change-Id: I8adcf27edd1438df445d32fca93f35ff5020a3b3 Merged-In: I8adcf27edd1438df445d32fca93f35ff5020a3b3 (cherry picked from commit 0d11fd07e7353f1c6ed7e4735d2251c4c8c8bc73) --- res/values/strings.xml | 5 + res/xml/development_settings.xml | 5 + ...oothA2dpHwOffloadPreferenceController.java | 10 +- ...hLeAudioHwOffloadPreferenceController.java | 10 +- .../BluetoothLeAudioPreferenceController.java | 114 ++++++++++++++++++ ...Dialog.java => BluetoothRebootDialog.java} | 31 ++--- .../DevelopmentSettingsDashboardFragment.java | 25 ++-- ...A2dpHwOffloadPreferenceControllerTest.java | 6 +- ...udioHwOffloadPreferenceControllerTest.java | 6 +- ...etoothLeAudioPreferenceControllerTest.java | 105 ++++++++++++++++ 10 files changed, 279 insertions(+), 38 deletions(-) create mode 100644 src/com/android/settings/development/BluetoothLeAudioPreferenceController.java rename src/com/android/settings/development/{BluetoothHwOffloadRebootDialog.java => BluetoothRebootDialog.java} (74%) create mode 100644 tests/robotests/src/com/android/settings/development/BluetoothLeAudioPreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 7b63ea0b9c9..e6b554fd809 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -353,6 +353,11 @@ Cancel + + Enable LE Audio + + Enables the Bluetooth LE Audio feature if this device supports LE audio hardware capabilities. + Media devices diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index 6319763f579..9367aec5a18 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -319,6 +319,11 @@ android:title="@string/bluetooth_disable_absolute_volume" android:summary="@string/bluetooth_disable_absolute_volume_summary" /> + + diff --git a/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java b/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java index 2ffa11b6c99..793b7fbc561 100644 --- a/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java +++ b/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java @@ -53,7 +53,7 @@ public class BluetoothA2dpHwOffloadPreferenceController extends DeveloperOptions @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - BluetoothHwOffloadRebootDialog.show(mFragment); + BluetoothRebootDialog.show(mFragment); mChanged = true; return false; } @@ -93,9 +93,9 @@ public class BluetoothA2dpHwOffloadPreferenceController extends DeveloperOptions } /** - * Called when the HwOffloadDialog confirm is clicked. + * Called when the RebootDialog confirm is clicked. */ - public void onHwOffloadDialogConfirmed() { + public void onRebootDialogConfirmed() { if (!mChanged) { return; } @@ -109,9 +109,9 @@ public class BluetoothA2dpHwOffloadPreferenceController extends DeveloperOptions } /** - * Called when the HwOffloadDialog cancel is clicked. + * Called when the RebootDialog cancel is clicked. */ - public void onHwOffloadDialogCanceled() { + public void onRebootDialogCanceled() { mChanged = false; } } diff --git a/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceController.java b/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceController.java index 911b62d6cc4..f406ae782cf 100644 --- a/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceController.java +++ b/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceController.java @@ -59,7 +59,7 @@ public class BluetoothLeAudioHwOffloadPreferenceController @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - BluetoothHwOffloadRebootDialog.show(mFragment); + BluetoothRebootDialog.show(mFragment); mChanged = true; return false; } @@ -104,9 +104,9 @@ public class BluetoothLeAudioHwOffloadPreferenceController } /** - * Called when the HwOffloadDialog confirm is clicked. + * Called when the RebootDialog confirm is clicked. */ - public void onHwOffloadDialogConfirmed() { + public void onRebootDialogConfirmed() { if (!mChanged) { return; } @@ -119,9 +119,9 @@ public class BluetoothLeAudioHwOffloadPreferenceController } /** - * Called when the HwOffloadDialog cancel is clicked. + * Called when the RebootDialog cancel is clicked. */ - public void onHwOffloadDialogCanceled() { + public void onRebootDialogCanceled() { mChanged = false; } } diff --git a/src/com/android/settings/development/BluetoothLeAudioPreferenceController.java b/src/com/android/settings/development/BluetoothLeAudioPreferenceController.java new file mode 100644 index 00000000000..00d0dd27af6 --- /dev/null +++ b/src/com/android/settings/development/BluetoothLeAudioPreferenceController.java @@ -0,0 +1,114 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.development; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothStatusCodes; +import android.content.Context; +import android.os.SystemProperties; + +import androidx.annotation.VisibleForTesting; +import androidx.preference.Preference; +import androidx.preference.SwitchPreference; + +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settingslib.development.DeveloperOptionsPreferenceController; + +/** + * Preference controller to control Bluetooth LE audio feature + */ +public class BluetoothLeAudioPreferenceController + extends DeveloperOptionsPreferenceController + implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { + + private static final String PREFERENCE_KEY = "bluetooth_enable_leaudio"; + + private static final String LE_AUDIO_DYNAMIC_SWITCH_PROPERTY = + "ro.bluetooth.leaudio_switcher.supported"; + @VisibleForTesting + static final String LE_AUDIO_DYNAMIC_ENABLED_PROPERTY = + "persist.bluetooth.leaudio_switcher.enabled"; + + private final DevelopmentSettingsDashboardFragment mFragment; + + @VisibleForTesting + BluetoothAdapter mBluetoothAdapter; + + @VisibleForTesting + boolean mChanged = false; + + public BluetoothLeAudioPreferenceController(Context context, + DevelopmentSettingsDashboardFragment fragment) { + super(context); + mFragment = fragment; + mBluetoothAdapter = context.getSystemService(BluetoothManager.class).getAdapter(); + } + + @Override + public String getPreferenceKey() { + return PREFERENCE_KEY; + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + BluetoothRebootDialog.show(mFragment); + mChanged = true; + return false; + } + + @Override + public void updateState(Preference preference) { + if (mBluetoothAdapter == null) { + return; + } + + final boolean leAudioEnabled = + (mBluetoothAdapter.isLeAudioSupported() == BluetoothStatusCodes.FEATURE_SUPPORTED); + ((SwitchPreference) mPreference).setChecked(leAudioEnabled); + + final boolean leAudioSwitchSupported = + SystemProperties.getBoolean(LE_AUDIO_DYNAMIC_SWITCH_PROPERTY, false); + if (!leAudioSwitchSupported) { + mPreference.setEnabled(false); + } else { + SystemProperties.set(LE_AUDIO_DYNAMIC_ENABLED_PROPERTY, + Boolean.toString(leAudioEnabled)); + } + } + + /** + * Called when the RebootDialog confirm is clicked. + */ + public void onRebootDialogConfirmed() { + if (!mChanged || mBluetoothAdapter == null) { + return; + } + + final boolean leAudioEnabled = + (mBluetoothAdapter.isLeAudioSupported() == BluetoothStatusCodes.FEATURE_SUPPORTED); + SystemProperties.set(LE_AUDIO_DYNAMIC_ENABLED_PROPERTY, + Boolean.toString(!leAudioEnabled)); + } + + /** + * Called when the RebootDialog cancel is clicked. + */ + public void onRebootDialogCanceled() { + mChanged = false; + } +} diff --git a/src/com/android/settings/development/BluetoothHwOffloadRebootDialog.java b/src/com/android/settings/development/BluetoothRebootDialog.java similarity index 74% rename from src/com/android/settings/development/BluetoothHwOffloadRebootDialog.java rename to src/com/android/settings/development/BluetoothRebootDialog.java index 389103e816d..90f4c0c59b4 100644 --- a/src/com/android/settings/development/BluetoothHwOffloadRebootDialog.java +++ b/src/com/android/settings/development/BluetoothRebootDialog.java @@ -29,22 +29,23 @@ import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; /** - * The a2dp and LE audio offload switch should reboot the device to take effect, the dialog is - * to ask the user to reboot the device after a2dp or LE audio offload user preference changed + * The a2dp/LE audio offload and LE audio feature switch should reboot the device to take effect, + * the dialog is to ask the user to reboot the device after a2dp/LE audio offload and LE audio + * feature user preference changed */ -public class BluetoothHwOffloadRebootDialog extends InstrumentedDialogFragment +public class BluetoothRebootDialog extends InstrumentedDialogFragment implements DialogInterface.OnClickListener { - public static final String TAG = "BluetoothHwOffloadReboot"; + public static final String TAG = "BluetoothReboot"; /** - * The function to show the HwOffloadReboot Dialog. + * The function to show the Reboot Dialog. */ public static void show(DevelopmentSettingsDashboardFragment host) { final FragmentManager manager = host.getActivity().getSupportFragmentManager(); if (manager.findFragmentByTag(TAG) == null) { - final BluetoothHwOffloadRebootDialog dialog = - new BluetoothHwOffloadRebootDialog(); + final BluetoothRebootDialog dialog = + new BluetoothRebootDialog(); dialog.setTargetFragment(host, 0 /* requestCode */); dialog.show(manager, TAG); } @@ -69,33 +70,33 @@ public class BluetoothHwOffloadRebootDialog extends InstrumentedDialogFragment @Override public void onClick(DialogInterface dialog, int which) { - final OnHwOffloadDialogListener host = - (OnHwOffloadDialogListener) getTargetFragment(); + final OnRebootDialogListener host = + (OnRebootDialogListener) getTargetFragment(); if (host == null) { return; } if (which == DialogInterface.BUTTON_POSITIVE) { - host.onHwOffloadDialogConfirmed(); + host.onRebootDialogConfirmed(); PowerManager pm = getContext().getSystemService(PowerManager.class); pm.reboot(null); } else { - host.onHwOffloadDialogCanceled(); + host.onRebootDialogCanceled(); } } /** - * The interface for the HsOffloadDialogListener to provide the action as the + * The interface for the RebootDialogListener to provide the action as the * confirmed or canceled clicked. */ - public interface OnHwOffloadDialogListener { + public interface OnRebootDialogListener { /** * Called when the user presses reboot on the warning dialog. */ - void onHwOffloadDialogConfirmed(); + void onRebootDialogConfirmed(); /** * Called when the user presses cancel on the warning dialog. */ - void onHwOffloadDialogCanceled(); + void onRebootDialogCanceled(); } } diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index 3fbea5249a0..d92fb7fd99b 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -80,7 +80,7 @@ import java.util.List; public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFragment implements OnMainSwitchChangeListener, OemUnlockDialogHost, AdbDialogHost, AdbClearKeysDialogHost, LogPersistDialogHost, - BluetoothHwOffloadRebootDialog.OnHwOffloadDialogListener, + BluetoothRebootDialog.OnRebootDialogListener, AbstractBluetoothPreferenceController.Callback { private static final String TAG = "DevSettingsDashboard"; @@ -362,27 +362,37 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra } @Override - public void onHwOffloadDialogConfirmed() { + public void onRebootDialogConfirmed() { final BluetoothA2dpHwOffloadPreferenceController a2dpController = getDevelopmentOptionsController(BluetoothA2dpHwOffloadPreferenceController.class); - a2dpController.onHwOffloadDialogConfirmed(); + a2dpController.onRebootDialogConfirmed(); final BluetoothLeAudioHwOffloadPreferenceController leAudioController = getDevelopmentOptionsController( BluetoothLeAudioHwOffloadPreferenceController.class); - leAudioController.onHwOffloadDialogConfirmed(); + leAudioController.onRebootDialogConfirmed(); + + final BluetoothLeAudioPreferenceController leAudioFeatureController = + getDevelopmentOptionsController( + BluetoothLeAudioPreferenceController.class); + leAudioFeatureController.onRebootDialogConfirmed(); } @Override - public void onHwOffloadDialogCanceled() { + public void onRebootDialogCanceled() { final BluetoothA2dpHwOffloadPreferenceController a2dpController = getDevelopmentOptionsController(BluetoothA2dpHwOffloadPreferenceController.class); - a2dpController.onHwOffloadDialogCanceled(); + a2dpController.onRebootDialogCanceled(); final BluetoothLeAudioHwOffloadPreferenceController leAudioController = getDevelopmentOptionsController( BluetoothLeAudioHwOffloadPreferenceController.class); - leAudioController.onHwOffloadDialogCanceled(); + leAudioController.onRebootDialogCanceled(); + + final BluetoothLeAudioPreferenceController leAudioFeatureController = + getDevelopmentOptionsController( + BluetoothLeAudioPreferenceController.class); + leAudioFeatureController.onRebootDialogCanceled(); } @Override @@ -540,6 +550,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra controllers.add(new BluetoothAbsoluteVolumePreferenceController(context)); controllers.add(new BluetoothAvrcpVersionPreferenceController(context)); controllers.add(new BluetoothMapVersionPreferenceController(context)); + controllers.add(new BluetoothLeAudioPreferenceController(context, fragment)); controllers.add(new BluetoothA2dpHwOffloadPreferenceController(context, fragment)); controllers.add(new BluetoothLeAudioHwOffloadPreferenceController(context, fragment)); controllers.add(new BluetoothMaxConnectedAudioDevicesPreferenceController(context)); diff --git a/tests/robotests/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceControllerTest.java index fcb3ea929a4..660c8f1bac8 100644 --- a/tests/robotests/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceControllerTest.java @@ -68,7 +68,7 @@ public class BluetoothA2dpHwOffloadPreferenceControllerTest { SystemProperties.set(A2DP_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(false)); mController.mChanged = true; - mController.onHwOffloadDialogConfirmed(); + mController.onRebootDialogConfirmed(); final boolean mode = SystemProperties.getBoolean(A2DP_OFFLOAD_DISABLED_PROPERTY, false); assertThat(mode).isTrue(); } @@ -80,7 +80,7 @@ public class BluetoothA2dpHwOffloadPreferenceControllerTest { mController.mChanged = true; - mController.onHwOffloadDialogConfirmed(); + mController.onRebootDialogConfirmed(); final boolean a2dpMode = SystemProperties.getBoolean(A2DP_OFFLOAD_DISABLED_PROPERTY, true); final boolean leAudioMode = SystemProperties .getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, true); @@ -93,7 +93,7 @@ public class BluetoothA2dpHwOffloadPreferenceControllerTest { SystemProperties.set(A2DP_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(false)); mController.mChanged = true; - mController.onHwOffloadDialogCanceled(); + mController.onRebootDialogCanceled(); final boolean mode = SystemProperties.getBoolean(A2DP_OFFLOAD_DISABLED_PROPERTY, false); assertThat(mode).isFalse(); } diff --git a/tests/robotests/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceControllerTest.java index c82df40e038..ec64fe348d9 100644 --- a/tests/robotests/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceControllerTest.java @@ -66,7 +66,7 @@ public class BluetoothLeAudioHwOffloadPreferenceControllerTest { SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(false)); mController.mChanged = true; - mController.onHwOffloadDialogConfirmed(); + mController.onRebootDialogConfirmed(); final boolean mode = SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, false); assertThat(mode).isTrue(); } @@ -76,7 +76,7 @@ public class BluetoothLeAudioHwOffloadPreferenceControllerTest { SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(true)); mController.mChanged = true; - mController.onHwOffloadDialogConfirmed(); + mController.onRebootDialogConfirmed(); final boolean mode2 = SystemProperties.getBoolean( LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, true); assertThat(mode2).isFalse(); @@ -87,7 +87,7 @@ public class BluetoothLeAudioHwOffloadPreferenceControllerTest { SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(false)); mController.mChanged = true; - mController.onHwOffloadDialogCanceled(); + mController.onRebootDialogCanceled(); final boolean mode = SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, false); assertThat(mode).isFalse(); } diff --git a/tests/robotests/src/com/android/settings/development/BluetoothLeAudioPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothLeAudioPreferenceControllerTest.java new file mode 100644 index 00000000000..527fabbc526 --- /dev/null +++ b/tests/robotests/src/com/android/settings/development/BluetoothLeAudioPreferenceControllerTest.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.development; + +import static com.android.settings.development.BluetoothLeAudioPreferenceController + .LE_AUDIO_DYNAMIC_ENABLED_PROPERTY; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothStatusCodes; +import android.content.Context; +import android.os.SystemProperties; + +import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class BluetoothLeAudioPreferenceControllerTest { + + @Mock + private PreferenceScreen mPreferenceScreen; + @Mock + private DevelopmentSettingsDashboardFragment mFragment; + + @Mock + private BluetoothAdapter mBluetoothAdapter; + + private Context mContext; + private SwitchPreference mPreference; + private BluetoothLeAudioPreferenceController mController; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; + mPreference = new SwitchPreference(mContext); + mController = spy(new BluetoothLeAudioPreferenceController(mContext, mFragment)); + when(mPreferenceScreen.findPreference(mController.getPreferenceKey())) + .thenReturn(mPreference); + mController.mBluetoothAdapter = mBluetoothAdapter; + mController.displayPreference(mPreferenceScreen); + } + + @Test + public void onRebootDialogConfirmedAsLeAudioDisabled_shouldSwitchStatus() { + when(mBluetoothAdapter.isLeAudioSupported()) + .thenReturn(BluetoothStatusCodes.FEATURE_NOT_SUPPORTED); + mController.mChanged = true; + + mController.onRebootDialogConfirmed(); + final boolean status = SystemProperties + .getBoolean(LE_AUDIO_DYNAMIC_ENABLED_PROPERTY, false); + assertThat(status).isTrue(); + } + + @Test + public void onRebootDialogConfirmedAsLeAudioEnabled_shouldSwitchStatus() { + when(mBluetoothAdapter.isLeAudioSupported()) + .thenReturn(BluetoothStatusCodes.FEATURE_SUPPORTED); + mController.mChanged = true; + + mController.onRebootDialogConfirmed(); + final boolean status = SystemProperties + .getBoolean(LE_AUDIO_DYNAMIC_ENABLED_PROPERTY, false); + assertThat(status).isFalse(); + } + + @Test + public void onRebootDialogCanceled_shouldNotSwitchStatus() { + when(mBluetoothAdapter.isLeAudioSupported()) + .thenReturn(BluetoothStatusCodes.FEATURE_NOT_SUPPORTED); + mController.mChanged = true; + + mController.onRebootDialogCanceled(); + final boolean status = SystemProperties + .getBoolean(LE_AUDIO_DYNAMIC_ENABLED_PROPERTY, false); + assertThat(status).isFalse(); + } +} From ed1a79a97ea0c4907ef3b238701b4eec2db94670 Mon Sep 17 00:00:00 2001 From: Alice Kuo Date: Thu, 2 Jun 2022 13:45:44 +0800 Subject: [PATCH 8/9] Unify the LE audio string and refine the layout to put LE audio switch together Screenshot: https://screenshot.googleplex.com/A6PwLhscRUypgYK Bug: 233018305 Bug: 233005340 Test: make RunSettingsRoboTests ROBOTEST_FILTER=BluetoothLeAudioPreferenceControllerTest Test: switch LE audio feature, and check LE audio functionality status Change-Id: I2d650eb315790c3efc7510d9e125aeaf4464cda6 Merged-In: I2d650eb315790c3efc7510d9e125aeaf4464cda6 (cherry picked from commit b13abc03dde1ea862cbb4565b679fabcaaf1c3a2) --- res/values/strings.xml | 10 +++++----- res/xml/development_settings.xml | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index e6b554fd809..f2eff886aaf 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -342,8 +342,8 @@ Disable Bluetooth A2DP hardware offload - - Disable Bluetooth LE AUDIO hardware offload + + Disable Bluetooth LE audio hardware offload Restart Device? @@ -354,9 +354,9 @@ Cancel - Enable LE Audio - - Enables the Bluetooth LE Audio feature if this device supports LE audio hardware capabilities. + Enable Bluetooth LE audio + + Enables Bluetooth LE audio feature if the device supports LE audio hardware capabilities. Media devices diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index 9367aec5a18..19c12091400 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -324,14 +324,14 @@ android:title="@string/bluetooth_enable_leaudio" android:summary="@string/bluetooth_enable_leaudio_summary" /> - - + + Date: Fri, 3 Jun 2022 09:42:15 +0800 Subject: [PATCH 9/9] Grey out LE audio offload switcher as LE audio isn't enabled/supported Screenshot: https://screenshot.googleplex.com/C6pRBzLh7CtNeXr Bug: 233018305 Bug: 233005340 Test: make RunSettingsRoboTests ROBOTEST_FILTER=BluetoothLeAudioHwOffloadPreferenceControllerTest Change-Id: I0ea498d2fa191f9b9352b37500a5d2c348b36ce0 Merged-In: I0ea498d2fa191f9b9352b37500a5d2c348b36ce0 (cherry picked from commit f71b2ea56eee2000eed820281d3e5368a4a9fc30) --- ...hLeAudioHwOffloadPreferenceController.java | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceController.java b/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceController.java index f406ae782cf..751ddce79d2 100644 --- a/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceController.java +++ b/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceController.java @@ -18,6 +18,9 @@ package com.android.settings.development; import static com.android.settings.development.BluetoothA2dpHwOffloadPreferenceController.A2DP_OFFLOAD_SUPPORTED_PROPERTY; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothStatusCodes; import android.content.Context; import android.os.SystemProperties; @@ -43,6 +46,9 @@ public class BluetoothLeAudioHwOffloadPreferenceController static final String LE_AUDIO_OFFLOAD_SUPPORTED_PROPERTY = "ro.bluetooth.leaudio_offload.supported"; + @VisibleForTesting + BluetoothAdapter mBluetoothAdapter; + @VisibleForTesting boolean mChanged = false; @@ -50,6 +56,7 @@ public class BluetoothLeAudioHwOffloadPreferenceController DevelopmentSettingsDashboardFragment fragment) { super(context); mFragment = fragment; + mBluetoothAdapter = context.getSystemService(BluetoothManager.class).getAdapter(); } @Override @@ -66,10 +73,17 @@ public class BluetoothLeAudioHwOffloadPreferenceController @Override public void updateState(Preference preference) { + if (mBluetoothAdapter == null) { + return; + } + + final boolean leAudioEnabled = + (mBluetoothAdapter.isLeAudioSupported() == BluetoothStatusCodes.FEATURE_SUPPORTED); + final boolean offloadSupported = SystemProperties.getBoolean(A2DP_OFFLOAD_SUPPORTED_PROPERTY, false) && SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_SUPPORTED_PROPERTY, false); - if (offloadSupported) { + if (leAudioEnabled && offloadSupported) { final boolean offloadDisabled = SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, true); ((SwitchPreference) mPreference).setChecked(offloadDisabled); @@ -82,12 +96,20 @@ public class BluetoothLeAudioHwOffloadPreferenceController @Override protected void onDeveloperOptionsSwitchDisabled() { super.onDeveloperOptionsSwitchDisabled(); + if (mBluetoothAdapter == null) { + return; + } + + final boolean leAudioEnabled = + (mBluetoothAdapter.isLeAudioSupported() == BluetoothStatusCodes.FEATURE_SUPPORTED); final boolean offloadSupported = SystemProperties.getBoolean(A2DP_OFFLOAD_SUPPORTED_PROPERTY, false) && SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_SUPPORTED_PROPERTY, false); - if (offloadSupported) { + if (leAudioEnabled && offloadSupported) { ((SwitchPreference) mPreference).setChecked(true); SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, "true"); + } else { + mPreference.setEnabled(false); } }