From ddb65e569baa2202b8f5b416b9a1b10fee60e48e Mon Sep 17 00:00:00 2001 From: Peter Zhang Date: Sun, 7 May 2023 23:55:50 +0200 Subject: [PATCH 01/20] Expand SettingsLib ProviderTile to support non-switch type of Preferences - Added new metadata allowing to set PendingIntent onto a Tile, which will be executed on click; - Update the rendering logic to render with SwitchPreference only when Tile.hasSwitch() == true. Test: robotest, manual Bug: 281517110 Change-Id: I1253029be1e172792679f80be24bd58e368b9e73 --- .../DashboardFeatureProviderImpl.java | 39 +++++++++- .../settings/dashboard/DashboardFragment.java | 14 ++-- .../profileselector/ProfileSelectDialog.java | 59 +++++++++++++-- .../DashboardFeatureProviderImplTest.java | 72 +++++++++++++++++++ .../dashboard/DashboardFragmentTest.java | 32 +++++++++ .../ProfileSelectDialogTest.java | 24 +++++++ 6 files changed, 226 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index 4dc8f1af207..578493a47d2 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -33,6 +33,7 @@ import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SWIT import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE_URI; +import android.app.PendingIntent; import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.Context; @@ -75,6 +76,8 @@ import com.android.settingslib.drawer.TileUtils; import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.widget.AdaptiveIcon; +import com.google.common.collect.Iterables; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -152,7 +155,14 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { } bindIcon(pref, tile, forceRoundedIcon); - if (tile instanceof ActivityTile) { + if (tile.hasPendingIntent()) { + // Pending intent cannot be launched within the settings app panel, and will thus always + // be executed directly. + pref.setOnPreferenceClickListener(preference -> { + launchPendingIntentOrSelectProfile(activity, tile, fragment.getMetricsCategory()); + return true; + }); + } else if (tile instanceof ActivityTile) { final int sourceMetricsCategory = fragment.getMetricsCategory(); final Bundle metadata = tile.getMetaData(); String clsName = null; @@ -441,6 +451,33 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { preference.setIcon(iconDrawable); } + private void launchPendingIntentOrSelectProfile(FragmentActivity activity, Tile tile, + int sourceMetricCategory) { + ProfileSelectDialog.updatePendingIntentsIfNeeded(mContext, tile); + + if (tile.pendingIntentMap.isEmpty()) { + Log.w(TAG, "Cannot resolve pendingIntent, skipping. " + tile.getIntent()); + return; + } + + mMetricsFeatureProvider.logSettingsTileClick(tile.getKey(mContext), sourceMetricCategory); + + // Launch the pending intent directly if there's only one available. + if (tile.pendingIntentMap.size() == 1) { + PendingIntent pendingIntent = Iterables.getOnlyElement(tile.pendingIntentMap.values()); + try { + pendingIntent.send(); + } catch (PendingIntent.CanceledException e) { + Log.w(TAG, "Failed executing pendingIntent. " + pendingIntent.getIntent(), e); + } + return; + } + + ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile, + sourceMetricCategory, /* onShowListener= */ null, + /* onDismissListener= */ null, /* onCancelListener= */ null); + } + private void launchIntentOrSelectProfile(FragmentActivity activity, Tile tile, Intent intent, int sourceMetricCategory, TopLevelHighlightMixin highlightMixin, boolean isDuplicateClick) { diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index 6076a25ddc1..20836145cf7 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -46,8 +46,8 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.PrimarySwitchPreference; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.drawer.ActivityTile; import com.android.settingslib.drawer.DashboardCategory; -import com.android.settingslib.drawer.ProviderTile; import com.android.settingslib.drawer.Tile; import com.android.settingslib.search.Indexable; @@ -569,11 +569,13 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment } protected Preference createPreference(Tile tile) { - return tile instanceof ProviderTile - ? new SwitchPreference(getPrefContext()) - : tile.hasSwitch() - ? new PrimarySwitchPreference(getPrefContext()) - : new Preference(getPrefContext()); + if (tile.hasSwitch()) { + return (tile instanceof ActivityTile || tile.hasPendingIntent()) + ? new PrimarySwitchPreference(getPrefContext()) + : new SwitchPreference(getPrefContext()); + } else { + return new Preference(getPrefContext()); + } } @VisibleForTesting diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java index ef6ad832477..58a51cb32dc 100644 --- a/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java +++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java @@ -17,6 +17,7 @@ package com.android.settings.dashboard.profileselector; import android.app.Dialog; +import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; @@ -127,13 +128,25 @@ public class ProfileSelectDialog extends DialogFragment implements UserAdapter.O @Override public void onClick(int position) { final UserHandle user = mSelectedTile.userHandle.get(position); - // Show menu on top level items. - final Intent intent = new Intent(mSelectedTile.getIntent()); - FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider() - .logStartedIntentWithProfile(intent, mSourceMetricCategory, - position == 1 /* isWorkProfile */); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); - getActivity().startActivityAsUser(intent, user); + if (!mSelectedTile.hasPendingIntent()) { + final Intent intent = new Intent(mSelectedTile.getIntent()); + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider() + .logStartedIntentWithProfile(intent, mSourceMetricCategory, + position == 1 /* isWorkProfile */); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + getActivity().startActivityAsUser(intent, user); + } else { + PendingIntent pendingIntent = mSelectedTile.pendingIntentMap.get(user); + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider() + .logSettingsTileClickWithProfile(mSelectedTile.getKey(getContext()), + mSourceMetricCategory, + position == 1 /* isWorkProfile */); + try { + pendingIntent.send(); + } catch (PendingIntent.CanceledException e) { + Log.w(TAG, "Failed executing pendingIntent. " + pendingIntent.getIntent(), e); + } + } dismiss(); } @@ -178,4 +191,36 @@ public class ProfileSelectDialog extends DialogFragment implements UserAdapter.O } } } + + /** + * Checks the userHandle and pendingIntentMap in the provided tile, and remove the invalid + * entries if any. + */ + public static void updatePendingIntentsIfNeeded(Context context, Tile tile) { + if (tile.userHandle == null || tile.userHandle.size() <= 1 + || tile.pendingIntentMap.size() <= 1) { + return; + } + for (UserHandle userHandle : List.copyOf(tile.userHandle)) { + if (!tile.pendingIntentMap.containsKey(userHandle)) { + if (DEBUG) { + Log.d(TAG, "Delete the user without pending intent: " + + userHandle.getIdentifier()); + } + tile.userHandle.remove(userHandle); + } + } + + final UserManager userManager = UserManager.get(context); + for (UserHandle userHandle : List.copyOf(tile.pendingIntentMap.keySet())) { + UserInfo userInfo = userManager.getUserInfo(userHandle.getIdentifier()); + if (userInfo == null || userInfo.isCloneProfile()) { + if (DEBUG) { + Log.d(TAG, "Delete the user: " + userHandle.getIdentifier()); + } + tile.userHandle.remove(userHandle); + tile.pendingIntentMap.remove(userHandle); + } + } + } } diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java index 4ba6eae9b48..f7a940f4a55 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java @@ -43,6 +43,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -57,6 +58,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.Pair; +import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.preference.Preference; import androidx.preference.SwitchPreference; @@ -199,6 +201,27 @@ public class DashboardFeatureProviderImplTest { assertThat(observers.get(0).getUri().toString()).isEqualTo(SWITCH_URI); } + @Test + public void bindPreference_providerTileWithPendingIntent_shouldBindIntent() { + final Preference preference = new SwitchPreference(RuntimeEnvironment.application); + Bundle metaData = new Bundle(); + metaData.putInt(META_DATA_PREFERENCE_TITLE, R.string.settings_label); + metaData.putInt(META_DATA_PREFERENCE_SUMMARY, R.string.about_settings_summary); + metaData.putInt(META_DATA_KEY_ORDER, 10); + metaData.putString(META_DATA_PREFERENCE_KEYHINT, KEY); + final Tile tile = new ProviderTile(mProviderInfo, CategoryKey.CATEGORY_HOMEPAGE, metaData); + PendingIntent pendingIntent = + PendingIntent.getActivity(RuntimeEnvironment.application, 0, new Intent("test"), 0); + tile.pendingIntentMap.put(UserHandle.CURRENT, pendingIntent); + + mImpl.bindPreferenceToTileAndGetObservers(mActivity, mFragment, mForceRoundedIcon, + preference, tile, "123", Preference.DEFAULT_ORDER); + + assertThat(preference.getFragment()).isNull(); + assertThat(preference.getOnPreferenceClickListener()).isNotNull(); + assertThat(preference.getOrder()).isEqualTo(tile.getOrder()); + } + @Test public void bindPreference_noFragmentMetadata_shouldBindIntent() { final Preference preference = new Preference(RuntimeEnvironment.application); @@ -630,6 +653,55 @@ public class DashboardFeatureProviderImplTest { assertThat(launchIntent).isNull(); } + @Test + public void clickPreference_providerTileWithPendingIntent_singleUser_executesPendingIntent() { + final Preference preference = new SwitchPreference(RuntimeEnvironment.application); + Bundle metaData = new Bundle(); + metaData.putInt(META_DATA_PREFERENCE_TITLE, R.string.settings_label); + metaData.putInt(META_DATA_PREFERENCE_SUMMARY, R.string.about_settings_summary); + metaData.putInt(META_DATA_KEY_ORDER, 10); + metaData.putString(META_DATA_PREFERENCE_KEYHINT, KEY); + final Tile tile = new ProviderTile(mProviderInfo, CategoryKey.CATEGORY_HOMEPAGE, metaData); + PendingIntent pendingIntent = + PendingIntent.getActivity(RuntimeEnvironment.application, 0, new Intent("test"), 0); + tile.pendingIntentMap.put(UserHandle.CURRENT, pendingIntent); + + mImpl.bindPreferenceToTileAndGetObservers(mActivity, mFragment, mForceRoundedIcon, + preference, tile, "123", Preference.DEFAULT_ORDER); + preference.performClick(); + + Intent nextStartedActivity = + Shadows.shadowOf(RuntimeEnvironment.application).peekNextStartedActivity(); + assertThat(nextStartedActivity).isNotNull(); + assertThat(nextStartedActivity.getAction()).isEqualTo("test"); + } + + @Test + public void clickPreference_providerTileWithPendingIntent_multiUser_showsProfileDialog() { + final Preference preference = new SwitchPreference(RuntimeEnvironment.application); + Bundle metaData = new Bundle(); + metaData.putInt(META_DATA_PREFERENCE_TITLE, R.string.settings_label); + metaData.putInt(META_DATA_PREFERENCE_SUMMARY, R.string.about_settings_summary); + metaData.putInt(META_DATA_KEY_ORDER, 10); + metaData.putString(META_DATA_PREFERENCE_KEYHINT, KEY); + final Tile tile = new ProviderTile(mProviderInfo, CategoryKey.CATEGORY_HOMEPAGE, metaData); + PendingIntent pendingIntent = + PendingIntent.getActivity(RuntimeEnvironment.application, 0, new Intent("test"), 0); + tile.pendingIntentMap.put(UserHandle.CURRENT, pendingIntent); + tile.pendingIntentMap.put(new UserHandle(10), pendingIntent); + + mImpl.bindPreferenceToTileAndGetObservers(mActivity, mFragment, mForceRoundedIcon, + preference, tile, "123", Preference.DEFAULT_ORDER); + preference.performClick(); + + Fragment dialogFragment = + mActivity.getSupportFragmentManager().findFragmentByTag("select_profile"); + assertThat(dialogFragment).isNotNull(); + Intent nextStartedActivity = + Shadows.shadowOf(RuntimeEnvironment.application).peekNextStartedActivity(); + assertThat(nextStartedActivity).isNull(); + } + @Test public void openTileIntent_profileSelectionDialog_shouldShow() { ShadowUserManager.getShadow().addUser(10, "Someone", 0); diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java index d7ac433b497..22bf6b3f5a3 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java @@ -30,6 +30,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.PendingIntent; import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; @@ -38,6 +39,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.ProviderInfo; import android.net.Uri; import android.os.Bundle; +import android.os.UserHandle; import android.preference.PreferenceManager.OnActivityResultListener; import androidx.preference.Preference; @@ -358,6 +360,36 @@ public class DashboardFragmentTest { assertThat(pref).isInstanceOf(PrimarySwitchPreference.class); } + @Test + public void createPreference_isProviderTileWithPendingIntent_returnPreference() { + final ProviderInfo providerInfo = new ProviderInfo(); + providerInfo.packageName = "pkg"; + providerInfo.name = "provider"; + providerInfo.authority = "authority"; + final Bundle metaData = new Bundle(); + metaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_key2"); + ProviderTile providerTile = new ProviderTile(providerInfo, mDashboardCategory.key, + metaData); + providerTile.pendingIntentMap.put( + UserHandle.CURRENT, PendingIntent.getActivity(mContext, 0, new Intent(), 0)); + + final Preference pref = mTestFragment.createPreference(providerTile); + + assertThat(pref).isInstanceOf(Preference.class); + assertThat(pref).isNotInstanceOf(PrimarySwitchPreference.class); + assertThat(pref).isNotInstanceOf(SwitchPreference.class); + } + + @Test + public void createPreference_isProviderTileWithPendingIntentAndSwitch_returnPrimarySwitch() { + mProviderTile.pendingIntentMap.put( + UserHandle.CURRENT, PendingIntent.getActivity(mContext, 0, new Intent(), 0)); + + final Preference pref = mTestFragment.createPreference(mProviderTile); + + assertThat(pref).isInstanceOf(PrimarySwitchPreference.class); + } + @Test public void onActivityResult_test() { final int requestCode = 10; diff --git a/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectDialogTest.java b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectDialogTest.java index 4e81ceeb437..9a139615b84 100644 --- a/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectDialogTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectDialogTest.java @@ -24,7 +24,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Dialog; +import android.app.PendingIntent; import android.content.Context; +import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.UserInfo; import android.os.UserHandle; @@ -118,6 +120,28 @@ public class ProfileSelectDialogTest { verify(mUserManager, times(1)).getUserInfo(CLONE_USER.getIdentifier()); } + @Test + public void updatePendingIntentsIfNeeded_removesUsersWithNoPendingIntentsAndCloneProfile() { + final UserInfo userInfo = new UserInfo(CLONE_USER.getIdentifier(), "clone_user", null, + UserInfo.FLAG_PROFILE, UserManager.USER_TYPE_PROFILE_CLONE); + when(mUserManager.getUserInfo(CLONE_USER.getIdentifier())).thenReturn(userInfo); + final Tile tile = new ActivityTile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE); + tile.userHandle.add(CLONE_USER); + tile.userHandle.add(NORMAL_USER); + tile.userHandle.add(new UserHandle(10)); + PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(), 0); + tile.pendingIntentMap.put(CLONE_USER, pendingIntent); + tile.pendingIntentMap.put(NORMAL_USER, pendingIntent); + + ProfileSelectDialog.updatePendingIntentsIfNeeded(mContext, tile); + + assertThat(tile.userHandle).hasSize(1); + assertThat(tile.userHandle).containsExactly(NORMAL_USER); + assertThat(tile.pendingIntentMap).hasSize(1); + assertThat(tile.pendingIntentMap).containsKey(NORMAL_USER); + verify(mUserManager, times(1)).getUserInfo(CLONE_USER.getIdentifier()); + } + @Test public void createDialog_showsCorrectTitle() { mContext.setTheme(R.style.Theme_AppCompat); From 3e498ad30d537608acf0024f333bbe22a7a10159 Mon Sep 17 00:00:00 2001 From: Peter Zhang Date: Mon, 8 May 2023 12:13:11 +0200 Subject: [PATCH 02/20] Render an additional icon to the tappable tiles with pending intents Test: robotest, manual Bug: 281517110 Change-Id: Ia5fbae63d56a6f1e6ee8fb3ee58ae912d14b6c75 --- .../preference_external_action_icon.xml | 22 +++++++++++++++++++ .../settings/dashboard/DashboardFragment.java | 4 ++++ .../dashboard/DashboardFragmentTest.java | 15 ++++++++++++- 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 res/layout/preference_external_action_icon.xml diff --git a/res/layout/preference_external_action_icon.xml b/res/layout/preference_external_action_icon.xml new file mode 100644 index 00000000000..fcec43080dd --- /dev/null +++ b/res/layout/preference_external_action_icon.xml @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index 20836145cf7..f928d863858 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -573,6 +573,10 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment return (tile instanceof ActivityTile || tile.hasPendingIntent()) ? new PrimarySwitchPreference(getPrefContext()) : new SwitchPreference(getPrefContext()); + } else if (tile.hasPendingIntent()) { + Preference preference = new Preference(getPrefContext()); + preference.setWidgetLayoutResource(R.layout.preference_external_action_icon); + return preference; } else { return new Preference(getPrefContext()); } diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java index 22bf6b3f5a3..d7da7fe7a03 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java @@ -49,6 +49,7 @@ import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.slices.BlockingSlicePrefController; import com.android.settings.testutils.FakeFeatureFactory; @@ -351,6 +352,16 @@ public class DashboardFragmentTest { assertThat(pref).isInstanceOf(SwitchPreference.class); } + @Test + public void createPreference_isActivityTile_returnPreference() { + final Preference pref = mTestFragment.createPreference(mActivityTile); + + assertThat(pref).isInstanceOf(Preference.class); + assertThat(pref).isNotInstanceOf(PrimarySwitchPreference.class); + assertThat(pref).isNotInstanceOf(SwitchPreference.class); + assertThat(pref.getWidgetLayoutResource()).isEqualTo(0); + } + @Test public void createPreference_isActivityTileAndHasSwitch_returnPrimarySwitchPreference() { mActivityTile.getMetaData().putString(META_DATA_PREFERENCE_SWITCH_URI, "uri"); @@ -361,7 +372,7 @@ public class DashboardFragmentTest { } @Test - public void createPreference_isProviderTileWithPendingIntent_returnPreference() { + public void createPreference_isProviderTileWithPendingIntent_returnPreferenceWithIcon() { final ProviderInfo providerInfo = new ProviderInfo(); providerInfo.packageName = "pkg"; providerInfo.name = "provider"; @@ -378,6 +389,8 @@ public class DashboardFragmentTest { assertThat(pref).isInstanceOf(Preference.class); assertThat(pref).isNotInstanceOf(PrimarySwitchPreference.class); assertThat(pref).isNotInstanceOf(SwitchPreference.class); + assertThat(pref.getWidgetLayoutResource()) + .isEqualTo(R.layout.preference_external_action_icon); } @Test From 13c4c2accb4e4dd38597d1db9433b11cf9d6e3bc Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 9 May 2023 19:15:29 -0700 Subject: [PATCH 03/20] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I4df0fe515c3acf2eddfeabef5b6088f437ad1b8d --- res/values-af/strings.xml | 6 +-- res/values-ar/strings.xml | 20 ++++---- res/values-as/strings.xml | 20 ++++---- res/values-b+sr+Latn/strings.xml | 4 +- res/values-be/strings.xml | 2 +- res/values-bg/strings.xml | 2 +- res/values-bn/strings.xml | 20 ++++---- res/values-bs/strings.xml | 16 +++---- res/values-ca/strings.xml | 2 +- res/values-cs/strings.xml | 18 +++---- res/values-el/strings.xml | 4 +- res/values-es-rUS/strings.xml | 8 ++-- res/values-es/strings.xml | 16 +++---- res/values-eu/strings.xml | 36 +++++++------- res/values-fa/strings.xml | 18 +++---- res/values-fi/strings.xml | 4 +- res/values-fr-rCA/strings.xml | 42 ++++++++-------- res/values-fr/strings.xml | 12 ++--- res/values-gl/strings.xml | 14 +++--- res/values-gu/strings.xml | 2 +- res/values-hi/strings.xml | 12 ++--- res/values-hr/strings.xml | 14 +++--- res/values-hy/strings.xml | 12 ++--- res/values-in/strings.xml | 22 ++++----- res/values-is/strings.xml | 2 +- res/values-it/strings.xml | 6 +-- res/values-iw/strings.xml | 22 ++++----- res/values-ja/strings.xml | 2 +- res/values-ka/strings.xml | 2 +- res/values-kk/strings.xml | 4 +- res/values-km/strings.xml | 12 ++--- res/values-kn/strings.xml | 50 +++++++++---------- res/values-ky/strings.xml | 34 ++++++------- res/values-lt/strings.xml | 2 +- res/values-mk/strings.xml | 26 +++++----- res/values-ml/strings.xml | 6 +-- res/values-mn/strings.xml | 8 ++-- res/values-mr/strings.xml | 6 +-- res/values-ms/strings.xml | 2 +- res/values-my/strings.xml | 70 +++++++++++++-------------- res/values-ne/strings.xml | 20 ++++---- res/values-nl/strings.xml | 4 +- res/values-or/strings.xml | 82 ++++++++++++++++---------------- res/values-pa/strings.xml | 8 ++-- res/values-pl/strings.xml | 10 ++-- res/values-pt-rBR/strings.xml | 6 +-- res/values-pt-rPT/strings.xml | 8 ++-- res/values-pt/strings.xml | 6 +-- res/values-ro/strings.xml | 2 +- res/values-ru/strings.xml | 8 ++-- res/values-sk/strings.xml | 12 ++--- res/values-sl/strings.xml | 2 +- res/values-sq/strings.xml | 4 +- res/values-sr/strings.xml | 4 +- res/values-sw/strings.xml | 8 ++-- res/values-ta/strings.xml | 10 ++-- res/values-te/strings.xml | 10 ++-- res/values-th/strings.xml | 6 +-- res/values-tr/strings.xml | 4 +- res/values-uk/strings.xml | 8 ++-- res/values-ur/strings.xml | 6 +-- res/values-vi/strings.xml | 22 ++++----- res/values-zh-rCN/strings.xml | 12 ++--- res/values-zh-rHK/strings.xml | 6 +-- res/values-zh-rTW/strings.xml | 16 +++---- res/values-zu/strings.xml | 2 +- 66 files changed, 433 insertions(+), 433 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index e26d7b4900e..17bcad9d4c7 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -447,7 +447,7 @@ "Vee gesigmodel uit" "Stel Gesigslot op" "Gebruik jou gesig om jou foon te ontsluit of vir stawing in programme, soos wanneer jy aanmeld of \'n aankoop goedkeur.\n\nHou in gedagte:\nJy kan slegs een gesig op \'n slag gestel hê. Om nog \'n gesig by te voeg, moet jy die huidige een uitvee.\n\nAs jy na die foon kyk, kan dit ontsluit word wanneer jy nie bedoel om dit te doen nie.\n\nIemand anders kan jou foon ontsluit as dit voor jou gesig gehou word.\n\nIemand anders wat baie soos jy lyk, soos \'n identiese broer of suster, kan jou foon ontsluit." - "Gebruik jou gesig om jou foon te ontsluit of vir stawing in programme, soos wanneer jy aanmeld of \'n aankoop goedkeur.\n\nHou in gedagte:\nJy kan slegs een gesig op \'n slag gestel hê. Om nog \'n gesig by te voeg, moet jy die huidige een uitvee.\n\nAs jy na die foon kyk, kan dit ontsluit word wanneer jy nie bedoel om dit te doen nie.\n\nIemand anders kan jou foon ontsluit as dit voor jou gesig gehou word, selfs as jou oë toe is.\n\nIemand ander wat baie soos jy lyk, soos \'n identiese broer of suster, kan jou foon ontsluit." + "Gebruik jou gesig om jou foon te ontsluit of vir stawing in programme, soos wanneer jy aanmeld of \'n aankoop goedkeur.\n\nHou in gedagte:\nJy kan slegs een gesig op \'n slag gestel hê. Om nog \'n gesig by te voeg, moet jy die huidige een uitvee.\n\nAs jy na die foon kyk, kan dit ontsluit word wanneer jy nie bedoel om dit te doen nie.\n\nIemand anders kan jou foon ontsluit as dit voor jou gesig gehou word, selfs as jou oë toe is.\n\nIemand anders wat baie soos jy lyk, soos \'n identiese broer of suster, kan jou foon ontsluit." "Vee gesigmodel uit?" "Jou gesigmodel sal permanent en veilig uitgevee word. \n\nNadat dit uitgevee is, sal jy jou PIN, patroon of wagwoord nodig hê om jou foon te ontsluit of vir stawing in programme." "Jou gesigmodel sal permanent en veilig uitgevee word. \n\nNadat dit uitgevee is, sal jy jou PIN, patroon of wagwoord nodig hê om jou foon te ontsluit." @@ -1978,8 +1978,8 @@ "Programliggingtoestemmings" "Ligging is af" - %1$d van %2$d programme het toegang tot ligging - %1$d van %2$d programme het toegang tot ligging + %1$d van %2$d apps het toegang tot ligging + %1$d van %2$d apps het toegang tot ligging "Onlangse toegang" "Sien alles" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 0bb6137296f..d3277b3ad58 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -539,8 +539,8 @@ "يُرجى الانتقال إلى مكان تكون الإضاءة فيه أقل سطوعًا ثم إعادة المحاولة." "لقد وصلت إلى الحد الأقصى من عدد المحاولات المسموح بها." "فتح الهاتف من الساعة" - "في حال إعداد ميزتَي \"فتح الجهاز بالتعرف على الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الهاتف إدخال بصمة إصبعك عندما ترتدي كمامة أو عندما تكون في منطقة مظلمة.\n\nيمكنك فتح الهاتف من ساعتك عندما لا يتم التعرف على وجهك أو بصمة إصبعك." - "في حال إعداد ميزتَي \"فتح الجهاز بالتعرف على الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الجهاز اللوحي إدخال بصمة إصبعك عندما ترتدي كمامة أو عندما تكون في منطقة مظلمة.\n\nيمكنك فتح الجهاز اللوحي من ساعتك عندما لا يتم التعرف على وجهك أو بصمة إصبعك." + "في حال إعداد ميزتَي \"فتح الجهاز بالتعرف على الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الهاتف إدخال بصمة إصبعك عندما تكون في منطقة مظلمة أو ترتدي كمّامة.\n\nيمكنك فتح الهاتف من ساعتك عندما لا يتم التعرف على وجهك أو بصمة إصبعك." + "في حال إعداد ميزتَي \"فتح الجهاز بالتعرف على الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الجهاز اللوحي إدخال بصمة إصبعك عندما عندما تكون في منطقة مظلمة أو ترتدي كمّامة.\n\nيمكنك فتح الجهاز اللوحي من ساعتك عندما لا يتم التعرف على وجهك أو بصمة إصبعك." "يمكنك فتح الجهاز من ساعتك عندما لا يتم التعرف على بصمة إصبعك." "يمكنك فتح الجهاز من ساعتك عندما لا يتم التعرف على وجهك." "استخدام الوجه أو الساعة" @@ -564,7 +564,7 @@ "انقر للإعداد." "تمت إضافة وجه وبصمات أصابع." "تمت إضافة وجه وبصمة إصبع." - "في حال إعداد ميزتَي \"فتح الجهاز بالتعرف على الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الهاتف إدخال بصمة إصبعك عندما ترتدي قناعًا أو عندما تكون في منطقة مظلمة." + "في حال إعداد ميزتَي \"فتح الجهاز بالتعرف على الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الهاتف إدخال بصمة إصبعك عندما عندما تكون في منطقة مظلمة أو ترتدي كمّامة." "طرق فتح القفل" "فتح قفل الهاتف" "إثبات هويتك في التطبيقات" @@ -2694,7 +2694,7 @@ "الاهتزاز عند الرنين" "الاهتزاز عند تلقّي إشعارات" "الاهتزاز عند لمس الشاشة" - "استخدام ميزة %1$s" + "استخدام ميزة \"%1$s\"" "فتح %1$s" "تمت إضافة التطبيق %1$s إلى قائمة \"الإعدادات السريعة\". مرِّر سريعًا للأسفل لتفعيله أو إيقافه في أي وقت." "يمكنك أيضًا إضافة التطبيق %1$s إلى قائمة \"الإعدادات السريعة\" من أعلى الشاشة." @@ -2811,7 +2811,7 @@ "الإعدادات" "مفعّل" - "غير مفعّل" + "الميزة غير مفعّلة" "معاينة" "خيارات عادية" "اللغة" @@ -4666,8 +4666,8 @@ "غير مفعّل" "الميزة مفعّلة" "غير مفعّلة" - "مفعَّل" - "غير مفعَّل" + "الميزة مفعّلة" + "الميزة غير مفعَّلة" "تثبيت الشاشة على تطبيق معيّن" "تسمح لك ميزة \"تثبيت الشاشة على تطبيق معيّن\" بالحفاظ على التطبيق الحالي في حيز رؤيتك إلى أن تتم إزالة تثبيتها. على سبيل المثال، يمكن استخدام هذه الميزة للسماح لصديق موثوق فيه بلعب لعبة معيّنة." "عندما يتم تثبيت الشاشة على تطبيق معيّن، يمكن لهذا التطبيق فتح التطبيقات الأخرى والوصول إلى البيانات الشخصية. \n\nلاستخدام ميزة \"تثبيت الشاشة على تطبيق معيّن\"، يجب تنفيذ ما يلي: \n1- تفعيل ميزة \"تثبيت الشاشة على تطبيق معيّن\" \n2- فتح \"نظرة عامة\" \n3- النقر على رمز التطبيق في أعلى الشاشة ثم النقر على \"تثبيت\"" @@ -5241,7 +5241,7 @@ "استخدام البيانات بدون قيود" "تم إيقاف بيانات الخلفية." "قيد التفعيل" - "غير مفعّلة" + "الميزة غير مفعّلة" "استخدام أداة توفير البيانات" "الاستخدام غير المقيَّد للبيانات" "السماح بالوصول غير المقيَّد للبيانات عند تفعيل ميزة \"توفير البيانات\"" @@ -5459,8 +5459,8 @@ "للاطّلاع على الإشعارات، مرِّر إصبعك للأسفل على زر استشعار بصمات الإصبع في الجزء الخلفي من جهازك اللوحي." "للاطّلاع على الإشعارات، مرِّر إصبعك للأسفل على زر استشعار بصمات الإصبع في الجزء الخلفي من جهازك." "الاطّلاع على الإشعارات بسرعة" - "مفعّلة" - "غير مفعّل" + "الميزة مفعّلة" + "الميزة غير مفعّلة" "تم فتح قفل برنامج التحميل مسبقاً" "الاتصال بالإنترنت أولاً" "الاتصال بالإنترنت أو الاتصال بمشغِّل شبكة الجوّال" diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml index 87eda28f1c8..676fe8adbf9 100644 --- a/res/values-as/strings.xml +++ b/res/values-as/strings.xml @@ -524,7 +524,7 @@ "আপুনি প্ৰয়াস কৰিব পৰা সংখ্যাৰ সৰ্বোচ্চ সীমাত উপনীত হৈছে" "ঘড়ীৰ দ্বাৰা আনলক কৰাৰ সুবিধা" "আপুনি ফেচ আনলক আৰু ফিংগাৰপ্ৰিণ্ট আনলক ছেট আপ কৰিলে, আপুনি মুখ ঢকা বন্ধনী পিন্ধি থাকিলে অথবা কোনো অন্ধকাৰ ঠাইত থাকিলে আপোনাৰ ফ’নটোৱে আপোনাৰ ফিংগাৰপ্ৰিণ্ট বিচাৰিব।\n\nআপোনাৰ মুখাৱয়ব অথবা ফিংগাৰপ্ৰিণ্ট চিনাক্ত কৰিব নোৱাৰিলে আপুনি আপোনাৰ ঘড়ীটোৰ জৰিয়তে আনলক কৰিব পাৰিব।" - "আপুনি ফেচ আনলক আৰু ফিংগাৰপ্ৰিণ্ট আনলক ছেট আপ কৰিলে, আপুনি মুখা পিন্ধি থাকিলে অথবা কোনো অন্ধকাৰ ঠাইত থাকিলে আপোনাৰ টেবলেটটোৱে আপোনাৰ ফিংগাৰপ্ৰিণ্ট বিচাৰিব।\n\nআপোনাৰ মুখাৱয়ব অথবা ফিংগাৰপ্ৰিণ্ট চিনাক্ত কৰিব নোৱাৰিলে আপুনি আপোনাৰ ঘড়ীটোৰ জৰিয়তে আনলক কৰিব পাৰিব।" + "আপুনি ফেচ আনলক আৰু ফিংগাৰপ্ৰিণ্ট আনলক ছেট আপ কৰিলে, আপুনি মুখ ঢকা বন্ধনী পিন্ধি থাকিলে অথবা কোনো অন্ধকাৰ ঠাইত থাকিলে আপোনাৰ টেবলেটটোৱে আপোনাৰ ফিংগাৰপ্ৰিণ্ট বিচাৰিব।\n\nআপোনাৰ মুখাৱয়ব অথবা ফিংগাৰপ্ৰিণ্ট চিনাক্ত কৰিব নোৱাৰিলে আপুনি আপোনাৰ ঘড়ীটোৰ জৰিয়তে আনলক কৰিব পাৰিব।" "আপোনাৰ ফিংগাৰপ্ৰিণ্ট চিনাক্ত কৰিব নোৱাৰিলে আপুনি আপোনাৰ ঘড়ীটোৰ জৰিয়তে আনলক কৰিব পাৰিব।" "আপোনাৰ মুখাৱয়ব চিনাক্ত কৰিব নোৱাৰিলে আপুনি আপোনাৰ ঘড়ীটোৰ জৰিয়তে আনলক কৰিব পাৰিব।" "মুখাৱয়ব অথবা ঘড়ী ব্যৱহাৰ কৰি" @@ -794,40 +794,40 @@ ই আপোনাৰ ডিভাইচত ষ্ট’ৰ হৈ থকা ফিংগাৰপ্ৰিণ্টৰ ম’ডেলটোও মচে। আপুনি আপোনাৰ ফিংগাৰপ্ৰিণ্ট এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" "এটা আৰ্হিয়ে আপোনাৰ ফ’নটো হেৰালে অথবা চুৰি হ’লে তাক সুৰক্ষিত কৰে। -আপোনাৰ মুখাৱয়বৰ ম’ডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" +আপোনাৰ মুখাৱয়বৰ মডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" "এটা আৰ্হিয়ে আপোনাৰ ফ’নটো হেৰালে অথবা চুৰি হ’লে তাক সুৰক্ষিত কৰে। -ই আপোনাৰ ডিভাইচত ষ্ট’ৰ হৈ থকা ফিংগাৰপ্ৰিণ্টৰ ম’ডেলটো মচে। আপোনাৰ মুখাৱয়বৰ ম’ডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব অথবা ফিংগাৰপ্ৰিণ্ট এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" +ই আপোনাৰ ডিভাইচত ষ্ট’ৰ হৈ থকা ফিংগাৰপ্ৰিণ্টৰ মডেলটো মচে। আপোনাৰ মুখাৱয়বৰ মডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব অথবা ফিংগাৰপ্ৰিণ্ট এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" "এটা পিনে আপোনাৰ ফ’নটো হেৰালে অথবা চুৰি হ’লে তাক সুৰক্ষিত কৰে" "এটা পিনে আপোনাৰ ফ’নটো হেৰালে অথবা চুৰি হ’লে তাক সুৰক্ষিত কৰে। ই আপোনাৰ ডিভাইচত ষ্ট’ৰ হৈ থকা ফিংগাৰপ্ৰিণ্টৰ ম’ডেলটোও মচে। আপুনি আপোনাৰ ফিংগাৰপ্ৰিণ্ট এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" "এটা পিনে আপোনাৰ ফ’নটো হেৰালে অথবা চুৰি হ’লে তাক সুৰক্ষিত কৰে। -আপোনাৰ মুখাৱয়বৰ ম’ডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" +আপোনাৰ মুখাৱয়বৰ মডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" "এটা পিনে আপোনাৰ ফ’নটো হেৰালে অথবা চুৰি হ’লে তাক সুৰক্ষিত কৰে। -ই আপোনাৰ ডিভাইচত ষ্ট’ৰ হৈ থকা ফিংগাৰপ্ৰিণ্টৰ ম’ডেলটো মচে। আপোনাৰ মুখাৱয়বৰ ম’ডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব অথবা ফিংগাৰপ্ৰিণ্ট এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" +ই আপোনাৰ ডিভাইচত ষ্ট’ৰ হৈ থকা ফিংগাৰপ্ৰিণ্টৰ মডেলটো মচে। আপোনাৰ মুখাৱয়বৰ মডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব অথবা ফিংগাৰপ্ৰিণ্ট এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" "এটা পাছৱৰ্ডে আপোনাৰ ফ’নটো হেৰালে অথবা চুৰি হ’লে তাক সুৰক্ষিত কৰে" "এটা পাছৱৰ্ডে আপোনাৰ ফ’নটো হেৰালে অথবা চুৰি হ’লে তাক সুৰক্ষিত কৰে। ই আপোনাৰ ডিভাইচত ষ্ট’ৰ হৈ থকা ফিংগাৰপ্ৰিণ্টৰ ম’ডেলটোও মচে। আপুনি আপোনাৰ ফিংগাৰপ্ৰিণ্ট এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" "এটা পাছৱৰ্ডে আপোনাৰ ফ’নটো হেৰালে অথবা চুৰি হ’লে তাক সুৰক্ষিত কৰে। -আপোনাৰ মুখাৱয়বৰ ম’ডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" +আপোনাৰ মুখাৱয়বৰ মডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" "এটা পাছৱৰ্ডে আপোনাৰ ফ’নটো হেৰালে অথবা চুৰি হ’লে তাক সুৰক্ষিত কৰে। -ই আপোনাৰ ডিভাইচত ষ্ট’ৰ হৈ থকা ফিংগাৰপ্ৰিণ্টৰ ম’ডেলটো মচে। আপোনাৰ মুখাৱয়বৰ ম’ডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব অথবা ফিংগাৰপ্ৰিণ্ট এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" +ই আপোনাৰ ডিভাইচত ষ্ট’ৰ হৈ থকা ফিংগাৰপ্ৰিণ্টৰ মডেলটো মচে। আপোনাৰ মুখাৱয়বৰ মডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব অথবা ফিংগাৰপ্ৰিণ্ট এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" "আপোনাৰ স্ক্ৰীন লক অবিহনে ডিভাইচ সুৰক্ষা সুবিধাসমূহে কাম নকৰিব।" "আপোনাৰ স্ক্ৰীন লকৰ অবিহনে ডিভাইচৰ সুৰক্ষা সম্পৰ্কীয় সুবিধাসমূহে কাম নকৰিব। ই আপোনাৰ ডিভাইচত ষ্ট’ৰ হৈ থকা ফিংগাৰপ্ৰিণ্টৰ ম’ডেলটোও মচে। আপুনি আপোনাৰ ফিংগাৰপ্ৰিণ্ট এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" "আপোনাৰ স্ক্ৰীন লকৰ অবিহনে ডিভাইচৰ সুৰক্ষা সম্পৰ্কীয় সুবিধাসমূহে কাম নকৰিব। -আপোনাৰ মুখাৱয়বৰ ম’ডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" +আপোনাৰ মুখাৱয়বৰ মডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" "আপোনাৰ স্ক্ৰীন লকৰ অবিহনে ডিভাইচৰ সুৰক্ষা সম্পৰ্কীয় সুবিধাসমূহে কাম নকৰিব। -ই আপোনাৰ ডিভাইচত ষ্ট’ৰ হৈ থকা ফিংগাৰপ্ৰিণ্টৰ ম’ডেলটো মচে। আপোনাৰ মুখাৱয়বৰ ম’ডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব অথবা ফিংগাৰপ্ৰিণ্ট এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" +ই আপোনাৰ ডিভাইচত ষ্ট’ৰ হৈ থকা ফিংগাৰপ্ৰিণ্টৰ মডেলটো মচে। আপোনাৰ মুখাৱয়বৰ মডেলটোও স্থায়ী তথা সুৰক্ষিতভাৱে মচা হ’ব। আপুনি আপোনাৰ মুখাৱয়ব অথবা ফিংগাৰপ্ৰিণ্ট এপত বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিব নোৱাৰিব।" "মচক" "আনলক আৰ্হি সলনি কৰক" "আনলক পিন সলনি কৰক" @@ -1731,7 +1731,7 @@ "কেমেৰা ছফটৱেৰ ব্যৱহাৰ কৰি ফট’ স্থানান্তৰ কৰাৰ লগতে MTPৰ সুবিধা নথকা কম্পিউটাৰৰ মাজত যিকোনো ফাইল স্থানান্তৰ কৰাৰ সুবিধা দিয়ে" "এমআইডিআই" "আপোনাৰ কম্পিউটাৰত থকা এমআইডিআই ছফটৱেৰৰ লগত ইউএছবিৰ যোগেৰে এমআইডিআই-সক্ষম এপ্লিকেশ্বনক কাম কৰিবলৈ দিয়ে।" - "অন্য ব্যৱহাৰকাৰীসকল" + "অন্য ব্যৱহাৰকাৰী" "ডিভাইচৰ ষ্ট’ৰেজ" "প’ৰ্টেবল ষ্ট’ৰেজ" "^1"" ^2""" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index a960f3ca58b..8be086ea7db 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -3576,7 +3576,7 @@ "Izbriši %1$s sa uređaja" "Podešavanja zaključanog ekrana" "Dodaj korisnike sa zaključanog ekrana" - "Pređi na administratora na baznoj stanici" + "Prebaci na administratora na baznoj stanici" "Želite li da izbrišete sebe?" "Brišete ovog korisnika?" "Uklanjate ovaj profil?" @@ -4114,7 +4114,7 @@ "Uključi treperenje lampice" "Privatnost" "Preskoči zaključan ekran" - "Posle otključavanja idite direktno na poslednji ekran" + "Posle otključavanja idete direktno na poslednji ekran" "zaključani ekran, preskočiti, zaobići" "Kada je poslovni profil zaključan" "Prikazuj samo nova obaveštenja na zaključanom ekranu" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 20b8949d3cf..041b9b4bfe6 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -1064,7 +1064,7 @@ "%s хоча адключыць Wi-Fi" "Спраўдзіць байт-код праграм з адладкай" "Дазволіць ART спраўдзіць байт-код праграм з магчымасцю адладкі" - "Паказваць хуткасць" + "Паказваць хуткасць абнаўлення" "Паказваць цяперашнюю хуткасць абнаўлення дысплэя" "NFC" "Дазволіць абмен данымі пры спалучэнні планшэта з прыладай NFC" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index c05c526c1f8..bba734cbf32 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -2608,7 +2608,7 @@ "Можете също да добавите функцията за инвертиране на цветовете към бързите настройки от горната част на екрана" "Функцията за допълнително затъмняване е добавена към бързите настройки. По всяко време можете да прекарате пръст надолу, за да я включите или изключите." "Можете също да добавите функцията за допълнително затъмняване към бързите настройки от горната част на екрана" - "Режимът за работа с една ръка е добавен към бързите настройки. По всяко време можете да прекарате пръст надолу, за да го включите или изключите." + "Режимът за работа с една ръка е добавен към бързите настройки. По всяко време можете да плъзнете пръст надолу, за да го включите или изключите." "Можете също да добавите режима за работа с една ръка към бързите настройки от горната част на екрана" "Отхвърляне" "Коригирайте как цветовете се показват на телефона ви" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index 1124f06638d..b9ca55fef78 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -349,7 +349,7 @@ "ফেস সেট আপ করতে ট্যাপ করুন" "ফেস আনলক" "অফিসের জন্য \'ফেস আনলক\'" - "\'ফেস আনলক\' কীভাবে সেট আপ করবেন" + "\'ফেস আনলক\' কীভাবে সেট-আপ করবেন" "\'ফেস আনলক\' সেট আপ করুন" "যাচাইকরণ করতে আপনার ফেস ব্যবহার করুন" @@ -460,8 +460,8 @@ "আঙ্গুলের ছাপ যোগ করুন" "স্ক্রিন লক" - %1$dটি আঙ্গুলের ছাপ যোগ করা হয়েছে - %1$dটি আঙ্গুলের ছাপ যোগ করা হয়েছে + %1$dটি ফিঙ্গারপ্রিন্ট যোগ করা হয়েছে + %1$dটি ফিঙ্গারপ্রিন্ট যোগ করা হয়েছে "\'ফিঙ্গারপ্রিন্ট\' সেট আপ করুন" @@ -548,13 +548,13 @@ "সেট আপ করতে ট্যাপ করুন" "ফেস এবং আঙ্গুলের ছাপ যোগ করা হয়েছে" "ফেস এবং আঙ্গুলের ছাপ যোগ করা হয়েছে" - "\'ফেস আনলক\' ও \'ফিঙ্গারপ্রিন্ট আনলক\' সেট আপ করলে, আপনি মাস্ক পরে থাকলে বা অন্ধকার জায়গায় থাকলে, আপনার ফোন ফিঙ্গারপ্রিন্ট চাইবে" + "\'ফেস আনলক\' ও \'ফিঙ্গারপ্রিন্ট আনলক\' সেট-আপ করলে, আপনি মাস্ক পরে থাকলে বা অন্ধকার জায়গায় থাকলে, আপনার ফোন ফিঙ্গারপ্রিন্ট চাইবে" "আনলক করার বিভিন্ন উপায়" "আপনার ফোন আনলক করুন" "অ্যাপে আপনার পরিচয় যাচাই করুন" "মুখ ব্যবহার করে" "আঙুলের ছাপ ব্যবহার করে" - "মুখ বা আঙুলের ছাপ ব্যবহার করে" + "মুখ বা ফিঙ্গারপ্রিন্ট ব্যবহার করে" "ট্যাবলেট অভিভাবকের কাছে ফিরিয়ে দিন" "ডিভাইস অভিভাবকের কাছে ফিরিয়ে দিন" "ফোন অভিভাবকের কাছে ফিরিয়ে দিন" @@ -771,9 +771,9 @@ "আপনার ফেস ব্যবহার করে আপনি ফোন আনলক করতে পারবেন। নিরাপত্তার খাতিরে, এই বিকল্পটির জন্য একটি ব্যাক-আপ স্ক্রিন লকের প্রয়োজন।" "আপনার ফেস মডেল ব্যবহার করে ট্যাবলেট আনলক করতে পারবেন। নিরাপত্তার কারণে, এই বিকল্পটির জন্য একটি ব্যাক-আপ \'স্ক্রিন লক\' প্রয়োজন।" "আপনার ফেস মডেল ব্যবহার করে ডিভাইস আনলক করতে পারবেন। নিরাপত্তার কারণে, এই বিকল্পটির জন্য একটি ব্যাক-আপ \'স্ক্রিন লক\' প্রয়োজন।" - "প্যাটার্ন • মুখ • আঙ্গুলের ছাপ" - "পিন • মুখ • আঙ্গুলের ছাপ" - "পাসওয়ার্ড • মুখ • আঙ্গুলের ছাপ" + "প্যাটার্ন • মুখ • ফিঙ্গারপ্রিন্ট" + "পিন • মুখ • ফিঙ্গারপ্রিন্ট" + "পাসওয়ার্ড • মুখ • ফিঙ্গারপ্রিন্ট" "মুখ এবং আঙুলের ছাপ ছাড়া চালিয়ে যান" "আপনার মুখ বা আঙুলের ছাপ ব্যবহার করে ফোন আনলক করতে পারবেন। নিরাপত্তার খাতিরে, এই বিকল্পটির জন্য একটি ব্যাক-আপ স্ক্রিন লকের প্রয়োজন।" "আপনার ফেস বা ফিঙ্গারপ্রিন্ট মডেল ব্যবহার করে ট্যাবলেট আনলক করতে পারবেন। নিরাপত্তার কারণে, এই বিকল্পটির জন্য একটি ব্যাক-আপ \'স্ক্রিন লক\' প্রয়োজন।" @@ -2485,7 +2485,7 @@ "ইঙ্গিতের মাধ্যমে খোলা" "\'অ্যাক্সেসিবিলিটি\' জেসচার ব্যবহার করুন" "এই ফিচারটি ব্যবহার করার জন্য, স্ক্রিনের নিচের দিকের অ্যাক্সেসিবিলিটি বোতামে %s ট্যাপ করুন।\n\nএকটি ফিচার থেকে অন্যটিতে যেতে, অ্যাক্সেসিবিলিটি বোতাম টাচ করে ধরে থাকুন।" - "এই ফিচার ব্যবহার করতে, আপনার স্ক্রিনে অ্যাক্সেসিবিলিটি বোতাম ট্যাপ করুন।" + "এই ফিচার ব্যবহার করতে, আপনার স্ক্রিনে অ্যাক্সেসিবিলিটি বোতামে ট্যাপ করুন।" "এই ফিচার ব্যবহার করার জন্য, উভয় ভলিউম কী প্রেস করে ধরে থাকুন।" "ম্যাগনিফিকেশন চালু বা বন্ধ করতে, স্ক্রিনের যেকোনও জায়গায় ট্রিপল ট্যাপ করুন।" "এই ফিচার ব্যবহার করার জন্য, স্ক্রিনের নিচ থেকে উপরের দিকে ২টি আঙ্গুল দিয়ে সোয়াইপ করুন।\n\nএকটি ফিচার থেকে অন্যটিতে যেতে, ২টি আঙ্গুল দিয়ে নিচের থেকে উপরের দিকে সোয়াইপ করে ধরে থাকুন।" @@ -5108,7 +5108,7 @@ "সংবেদনশীলতা বেড়ে গেলে সেটি স্ক্রিনের প্রান্তে যেকোনও অ্যাপ জেসচার সেটিংসকে ভালভাবে কাজ করতে দেয় না।" "আগের স্ক্রিনে ফিরে যাওয়ার সংবেদনশীলতা" "জেসচার নেভিগেশনের সংবেদনশীলতা" - "\'নেভিগেশন\' বোতাম" + "বোতামের মাধ্যমে নেভিগেশন" "জেসচার নেভিগেশন, ফিরে যাওয়ার সংবেদনশীলতা, ফিরে যাওয়ার জেসচার" "\'নেভিগেশন\', \'হোম\' বোতাম" "ফোন চেক করতে ডাবল-ট্যাপ করুন" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 34ad0646ff9..db406e3acc0 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -446,13 +446,13 @@ "Traži da oči budu otvorene" "Da otključate telefon, oči vam moraju biti otvorene" "Uvijek traži potvrdu" - "Za korištenje otključavanja licem u aplikacijama uvijek tražite potvrdu" + "Za korištenje otključavanja licem u aplikacijama uvijek se traži potvrda." "Izbriši model lica" "Postavite otključavanje licem" "Koristite lice da otključate telefon ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTelefon možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTelefon može otključati i neko drugi ako ga prinese vašem licu.\n\nTelefon može otključati osoba koja mnogo liči na vas, npr. identični blizanac." "Koristite lice da otključate telefon ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTelefon možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTelefon može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nTelefon može otključati osoba koja mnogo liči na vas, npr. identični blizanac." "Izbrisati model lica?" - "Model lica će se trajno i sigurno izbrisati.\n\nNakon brisanja će vam trebati PIN, uzorak ili lozinka radi otključavanja telefona ili autentifikacije u aplikacijama." + "Model lica će se trajno i sigurno izbrisati.\n\nNakon brisanja će vam za otključavanje telefona ili autentifikaciju u aplikacijama trebati PIN, uzorak ili lozinka." "Model lica će se trajno i sigurno izbrisati.\n\nNakon brisanja će vam trebati PIN, uzorak ili lozinka radi otključavanja telefona." "Otključajte telefon pomoću otključavanja licem" "Otisak prsta" @@ -464,8 +464,8 @@ "zaključavanje ekrana" Dodan je %1$d otisak prsta - Dodana su %1$d otiska prsta - Dodano je %1$d otisaka prsta + Dodana su %1$d otiska prstiju + Dodano je %1$d otisaka prstiju "Postavite otisak prsta" @@ -619,7 +619,7 @@ "Sada pomoću otiska prsta možete otključati uređaj ili potvrditi identitet, naprimjer prilikom prijave u aplikacije ili odobravanja kupovine.\n\nDodajte drugi otisak prsta da vam je lakše otključati uređaj kada ga držite na drugi način." "Sada pomoću otiska prsta možete otključati telefon ili potvrditi identitet, naprimjer prilikom prijave u aplikacije ili odobravanja kupovine.\n\nDodajte drugi otisak prsta da vam je lakše otključati telefon kada ga držite na drugi način." "Dodirnite da otključate bilo kada" - "Dodirnite senzor da otključate, čak i kada je ekran isključen. Ovo povećava vjerovatnost slučajnog otključavanja." + "Dodirnite senzor da otključate ekran čak i kada je isključen. Ovo povećava vjerovatnost slučajnog otključavanja." "Ekran, otključavanje" "Uradit ću to kasnije" "Podignite i ponovo dodirnite" @@ -3576,7 +3576,7 @@ "Izbrišite %1$s sa uređaja" "Postavke zaključavanja ekrana" "Dodavanje korisnika sa zaključanog ekrana" - "Prebacite se na admin. kada je uređaj priključen" + "Prebaci na administratora kada je uređaj priključen" "Želite li izbrisati sebe?" "Izbrisati ovog korisnika?" "Ukloniti ovaj profil?" @@ -4358,9 +4358,9 @@ "Ove postavke nije moguće sada promijeniti. Neka aplikacija je automatski uključila način rada Ne ometaj uz prilagođene postavke." "Ove postavke nije moguće sada promijeniti. Način rada Ne ometaj je ručno uključen uz prilagođene postavke." "Vrijeme" - "Automatsko pravilo je postavljeno da se način rada Ne ometaj uključi tokom određenih perioda" + "Postavljeno je automatsko pravilo da se način rada Ne ometaj uključi tokom određenih perioda" "Događaj" - "Automatsko pravilo je postavljeno da se način rada Ne ometaj uključi tokom određenih događaja" + "Postavljeno je automatsko pravilo da se način rada Ne ometaj uključi tokom određenih događaja" "Za vrijeme događaja za" "Za vrijeme događaja za %1$s" "bilo koji kalendar" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index c86aa4223e1..a0ad15d3410 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -5739,7 +5739,7 @@ "No caduca mai." "La concessió no caduca mai." "Permet les superposicions de pantalla a Configuració" - "Permet que les aplicacions que poden mostrar-se sobre altres aplicacions se superposin sobre les pantalles de Configuració" + "Permet que les aplicacions que poden mostrar-se sobre altres aplicacions se superposin a les pantalles de Configuració" "Permet el mòdem simulat" "Permet que aquest dispositiu executi el servei del mòdem simulat per fer proves d\'instrumentalització. No activis aquesta opció durant l\'ús normal del telèfon." "Multimèdia" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index c322151264b..1e82386e8e8 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -352,7 +352,7 @@ "Zabezpečení a ochrana soukromí" "Zabezpečení aplikací, zámek zařízení, oprávnění" "Obličej přidán" - "Klepnutím nastavíte obličej" + "Po klepnutí nastavíte obličej" "Odemknutí obličejem" "Odemknutí obličejem pro práci" "Jak nastavit odemknutí obličejem" @@ -531,8 +531,8 @@ "Přesuňte se na místo s mírnějším osvětlením a zkuste to znovu" "Dosáhli jste maximálního počtu pokusů" "Odemknutí pomocí hodinek" - "Pokud budete mít při odemykání obličejem zakrytou tvář nebo bude vaše okolí tmavé, telefon bude žádat o zadání otisku prstu.\n\nPokud nerozpozná váš obličej nebo otisk, můžete ho odemknout hodinkami." - "Když nastavíte odemknutí obličejem a otiskem prstu, tablet bude žádat o zadání otisku prstu, pokud budete mít zakrytou tvář nebo bude vaše okolí tmavé.\n\nPokud váš obličej nebo otisk prstu nerozpozná, můžete ho odemknout hodinkami." + "Pokud budete mít při odemykání obličejem zakrytou tvář nebo bude vaše okolí tmavé, telefon bude žádat o nasnímání otisku prstu.\n\nPokud nerozpozná váš obličej nebo otisk, můžete ho odemknout hodinkami." + "Když nastavíte odemknutí obličejem a otiskem prstu, tablet bude žádat o nasnímání otisku prstu, pokud budete mít zakrytou tvář nebo bude vaše okolí tmavé.\n\nPokud váš obličej nebo otisk prstu nerozpozná, můžete ho odemknout hodinkami." "Telefon můžete odemknout hodinkami, pokud nerozpozná váš otisk prstu." "Telefon můžete odemknout hodinkami, pokud nerozpozná váš obličej." "Pomocí obličeje nebo hodinek" @@ -556,7 +556,7 @@ "Nastavíte klepnutím" "Byl přidán obličej a otisky prstů" "Byl přidán obličej a otisk prstu" - "Když nastavíte odemknutí obličejem a otiskem prstu, telefon bude žádat o zadání otisku prstu v případě, že budete mít zakrytou tvář nebo vaše okolí bude tmavé" + "Když nastavíte odemknutí obličejem a otiskem prstu, telefon bude žádat o nasnímání otisku prstu v případě, že budete mít zakrytou tvář nebo vaše okolí bude tmavé" "Způsoby odemykání" "Odemykat telefon" "Ověřovat v aplikacích vaši identitu" @@ -3272,7 +3272,7 @@ "Úložiště pověření nelze smazat." "Přístup k dat. o používání" "Certifikát CA" - "Certifikát uživatele VPN a aplikací" + "Certifikát pro VPN a aplikaci" "Certifikát Wi‑Fi" "Nebude zajištěno soukromí vašich dat" "Certifikáty CA slouží k šifrování na webech, v aplikacích a v sítích VPN. Instalujte pouze certifikáty CA od organizací, kterým důvěřujete. \n\nPokud nainstalujete certifikát CA, jeho vlastník může získat přístup k vašim údajům (například heslům nebo podrobnostem o platebních kartách) z webů a aplikací, které používáte – a to i když tyto informace budou šifrované." @@ -3690,7 +3690,7 @@ "Změnit PIN" "Nápověda a zpětná vazba" "Články nápovědy, telefon a chat" - "Články nápovědy, tablety a chat" + "Články nápovědy, tablet a chat" "Články nápovědy, zařízení a chat" "Účet pro obsah" "ID fotografie" @@ -4278,9 +4278,9 @@ "Číst vaše oznámení" "Může číst vaše oznámení, včetně osobních údajů, jako jsou kontakty, zprávy a fotky." "Odpovídat na zprávy" - "Může odpovědět na zprávy a místo tlačítek odložit či odmítnout oznámení nebo přijmout hovor." - "Změnit nastavení" - "Může zapnout nebo vypnout režim Nerušit a změnit související nastavení." + "Může odpovídat na zprávy a místo tlačítek odkládat či odmítat oznámení nebo přijímat hovory." + "Měnit nastavení" + "Může zapínat nebo vypínat režim Nerušit a měnit související nastavení." "Pokud aplikaci %1$s vypnete přístup k oznámením, můžete tím vypnout i přístup k režimu Nerušit." "Vypnout" "Zrušit" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 3d5ed549baa..e6917df7d17 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -356,7 +356,7 @@ - "Αρχή" + "Έναρξη" "Εάν το Ξεκλείδωμα με το πρόσωπο για υποστήριξη προσβασιμότητας απενεργοποιηθεί, ορισμένα βήματα ρύθμισης ίσως δεν λειτουργούν σωστά με το TalkBack." "Πίσω" "Συνέχιση ρύθμισης" @@ -691,7 +691,7 @@ "ασφάλεια, περισσότερες ρυθμίσεις ασφαλείας, περισσότερες ρυθμίσεις, σύνθετες ρυθμίσεις ασφαλείας" "Περισσότερες ρυθμίσεις απορρήτου" "Αυτόματη συμπλήρωση, στοιχεία ελέγχου δραστηριότητας κ.ά." - "Μπορείτε να προσθέσετε έως %d μοναδικά χαρακτηριστικά" + "Μπορείτε να προσθέσετε έως %d δακτυλικά αποτυπώματα" "Έχετε προσθέσει τον μέγιστο αριθμό δακτυλικών αποτυπωμάτων" "Δεν είναι δυνατή η προσθήκη περισσότερων δακτυλικών αποτυπωμάτων" "Κατάργηση όλων των δακτυλικών αποτυπωμάτων;" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 19b627c7045..2ff8586cdbe 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -2431,7 +2431,7 @@ "Más información sobre las preferencias de subtítulos" "Ampliación" "Acceso directo de ampliación" - "Amplía la escritura" + "Ampliar escritura" "La lupa sigue el texto a medida que escribes" "Acerca de la ampliación" "Más información sobre la ampliación" @@ -5087,7 +5087,7 @@ "Prueba el nuevo botón de inicio" "Activa el nuevo gesto para cambiar de app" "Seguridad y emergencia" - "Emergencia SOS, información médica y alertas" + "Emergencia SOS, datos médicos y alertas" "Navegación por gestos" "Para ir a la pantalla principal, desliza el dedo hacia arriba desde la parte inferior de la pantalla. Para cambiar de app, desliza el dedo hacia arriba desde la parte inferior, sostenlo y, luego, suéltalo. Para ir atrás, desliza el dedo desde el borde izquierdo o el derecho." "Navegación con 3 botones" @@ -5115,8 +5115,8 @@ "Presionar dos veces la tablet para revisarla" "Presionar dos veces el dispositivo para revisarlo" "Modo de una mano" - "Usar el modo de una mano" - "Acceso directo al modo de una mano" + "Usar el Modo de una mano" + "Acceso directo al Modo de una mano" "accesibilidad" "Deslizar hacia abajo para" "Usa la combinación de teclas para" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 27046ecd4f7..99d915e445f 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -446,8 +446,8 @@ "Al usar Desbloqueo facial en aplicaciones, solicita siempre una confirmación" "Eliminar modelo facial" "Configurar Desbloqueo facial" - "Utiliza la cara para desbloquear el teléfono o autenticarte en aplicaciones (por ejemplo, para iniciar sesión o autorizar compras).\n\nTen en cuenta lo siguiente:\nSolo puedes tener registrada una cara. Si quieres añadir otra, debes eliminar la que ya está registrada.\n\nEs posible que el teléfono se desbloquee si lo miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear el teléfono si lo pone frente a tu cara.\n\nEs posible que una persona que se parezca mucho a ti (como un gemelo) pueda desbloquear el teléfono." - "Utiliza la cara para desbloquear el teléfono o autenticarte en aplicaciones (por ejemplo, para iniciar sesión o autorizar compras).\n\nTen en cuenta lo siguiente:\nSolo puedes tener registrada una cara. Si quieres añadir otra, debes eliminar la que ya está registrada.\n\nEs posible que el teléfono se desbloquee si lo miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear el teléfono si lo pone frente a tu cara, incluso si tienes los ojos cerrados.\n\nEs posible que una persona que se parezca mucho a ti (como un gemelo) pueda desbloquear el teléfono." + "Utiliza la cara para desbloquear el teléfono o autenticarte en aplicaciones (por ejemplo, para iniciar sesión o autorizar compras).\n\nTen en cuenta lo siguiente:\nSolo puedes tener registrada una cara. Si quieres añadir otra, debes eliminar la que ya esté registrada.\n\nEs posible que el teléfono se desbloquee si lo miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear el teléfono si lo pone frente a tu cara.\n\nEs posible que una persona que se parezca mucho a ti (como un gemelo) pueda desbloquear el teléfono." + "Utiliza la cara para desbloquear el teléfono o autenticarte en aplicaciones (por ejemplo, para iniciar sesión o autorizar compras).\n\nTen en cuenta lo siguiente:\nSolo puedes tener registrada una cara. Si quieres añadir otra, debes eliminar la que ya esté registrada.\n\nEs posible que el teléfono se desbloquee si lo miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear el teléfono si lo pone frente a tu cara, incluso si tienes los ojos cerrados.\n\nEs posible que una persona que se parezca mucho a ti (como un gemelo) pueda desbloquear el teléfono." "¿Eliminar modelo facial?" "Tu modelo facial se eliminará de forma permanente y segura.\n\nUna vez eliminado, necesitarás tu PIN, patrón o contraseña para desbloquear tu teléfono o para autenticarte en aplicaciones." "Tu modelo facial se eliminará de forma permanente y segura.\n\nUna vez eliminado, necesitarás tu PIN, patrón o contraseña para desbloquear tu teléfono." @@ -676,7 +676,7 @@ "Toca el sensor situado detrás del teléfono con el dedo índice." "No se ha completado el registro" "Tiempo agotado para configurar la huella digital" - "Inténtalo otra vez ahora o configura la huella digital en otro momento desde Ajustes" + "Inténtalo otra vez ahora o registra la huella digital en otro momento desde Ajustes" "El registro de la huella digital no se ha realizado correctamente. Vuelve a intentarlo o utiliza otro dedo." "Añadir otra" "Siguiente" @@ -2505,7 +2505,7 @@ "Desde la parte inferior de la pantalla, desliza tres dedos hacia arriba.\n\nPara cambiar de una función a otra, desliza tres dedos hacia arriba y mantén pulsada la pantalla." "Más opciones" "Más información sobre %1$s" - "Pulsar teclas de volumen" + "Mantener teclas de volumen" "mantener pulsadas las teclas de volumen" "Mantén pulsadas las dos teclas de volumen" "Triple toque en la pantalla" @@ -2608,7 +2608,7 @@ "También puedes añadir la inversión de colores a los ajustes rápidos desde la parte superior de la pantalla" "Se ha añadido la atenuación extra a los ajustes rápidos. Desliza el dedo hacia abajo en cualquier momento para activarla o para desactivarla." "También puedes añadir la atenuación extra a los ajustes rápidos desde la parte superior de la pantalla" - "Se ha añadido el modo Una mano a los ajustes rápidos. Desliza el dedo hacia abajo en cualquier momento para activarlo o para desactivarlo." + "Modo Una mano añadido a los ajustes rápidos. Desliza hacia abajo en cualquier momento para activarlo o desactivarlo." "También puedes añadir el modo Una mano a los ajustes rápidos desde la parte superior de la pantalla" "Cerrar" "Ajusta cómo se muestran los colores en tu teléfono" @@ -2628,7 +2628,7 @@ "Estas preferencias de subtítulos no pueden usarse en todas las aplicaciones multimedia" "Botón de accesibilidad" "Deslizar hacia arriba con dos dedos desde la parte inferior" - "Pulsar teclas de volumen" + "Mantener teclas de volumen" "Tocar tres veces la pantalla" "Continuar" "Audífonos" @@ -3534,7 +3534,7 @@ "Eliminar a %1$s de este dispositivo" "Ajustes de pantalla de bloqueo" "Añadir usuarios desde la pantalla de bloqueo" - "Cambiar al usuario administrador al conectarse" + "Cambiar a administrador al ponerse en la base" "¿Eliminarte a ti mismo?" "¿Eliminar este usuario?" "¿Quitar este perfil?" @@ -3868,7 +3868,7 @@ "Tonos del teclado telefónico" "Sonido de bloqueo de pantalla" "Vibración y sonidos de carga" - "Sonidos al conectar" + "Sonidos al conectar a la base" "Sonidos al tocar" "Mostrar siempre el icono en el modo vibración" "Reproducciones altavoz base" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index b2fbf5c330d..b6306f07bc8 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -721,7 +721,7 @@ "Aukeratu pantailaren blokeoa" - "Aukeratu blokeo bat" + "Aukeratu blokeatzeko aukera bat" "Aukeratu beste blokeo bat" "Aukeratu laneko aplikazioetarako blokeo bat" "Aukeratu laneko beste blokeo bat" @@ -1010,7 +1010,7 @@ "Konektatuta" "Abian" "Ez dago erabilgarri" - "Bistaratze-aukerak" + "Bistaratze-ezarpenak" "Hari gabeko pantailaren aukerak" "Ahaztu" "Eginda" @@ -1909,7 +1909,7 @@ "Wifi-gune eramangarria" "Konexioa partekatzea (Bluetooth)" "Konexioa partekatzea" - "Wifi-gunea eta konexioa partekatzea" + "Wifi-gunea eta konexioa partekatzeko aukera" "Wifi-gunea aktibatuta, konexioa partekatzea" "Wifi-gunea aktibatuta" "Konexioa partekatzea" @@ -1952,11 +1952,11 @@ "Konexioa partekatzea (Ethernet)" "Partekatu telefonoaren Interneteko konexioa Ethernet bidez" "Partekatu tabletaren Interneteko konexioa Ethernet bidez" - "Erabili wifi-gunea eta konexioa partekatzea beste gailuei Interneteko konexioa emateko zure datu-konexioaren bidez. Halaber, aplikazioek wifi-guneak sor ditzakete, edukia inguruko gailuekin partekatzeko." + "Erabili wifi-gunea eta konexioa partekatzeko aukera beste gailuei Interneteko konexioa emateko zure datu-konexioaren bidez. Halaber, aplikazioek wifi-guneak sor ditzakete, edukia inguruko gailuekin partekatzeko." "Erabili wifi-guneak eta konexioa partekatzeko aukera beste gailu batzuei Interneteko konexioa emateko wifi- edo datu-konexioaren bidez. Aplikazioek ere wifi-guneak sor ditzakete edukia inguruko gailuekin partekatzeko." "Laguntza" "Sare mugikorra" - "Mugikorraren plana" + "Mugikorretarako plana" "SMSetarako aplikazioa" "SMSetarako aplikazioa aldatu nahi duzu?" "%1$s aplikazioaren ordez, %2$s erabili nahi duzu SMSetarako aplikazio gisa?" @@ -2493,7 +2493,7 @@ "Erabilerraztasun-eginbide bat erabiltzeko, pasatu bi hatz pantailaren behealdetik gorantz.\n\nEginbide batetik bestera aldatzeko, pasatu bi hatz gorantz eta eduki pantaila sakatuta." "Erabilerraztasun-eginbide bat erabiltzeko, pasatu hiru hatz pantailaren behealdetik gorantz.\n\nEginbide batetik bestera aldatzeko, pasatu hiru hatz gorantz eta eduki pantaila sakatuta." "Ados" - "%1$s zerbitzuaren lasterbidea" + "%1$s eginbidearen lasterbidea" "Erabilerraztasuna botoia" "Erabilerraztasun-keinua" "Pasatu bi hatz gora" @@ -3824,14 +3824,14 @@ "ordaindu, lehenetsia" "jasotako jakinarazpena" "usb konexioa partekatu, bluetooth bidezko konexioa partekatu, wifi-gunea" - "haptika, interakzioa, dardara" - "haptika, dardara, pantaila, sentikortasuna" - "haptika, dardara, telefonoa, deia, sentikortasuna, tonua" - "haptika, dardara, telefonoa, deia, tonua jotzea, pixkanaka" - "haptika, dardara, sentikortasuna, jakinarazpenak" - "haptika, dardara, sentikortasuna, alarma" - "haptika, dardara, sentikortasuna, multimedia" - "haptika, dar-dar egin, dardara" + "teknologia haptikoa, interakzioa, dardara" + "teknologia haptikoa, dardara, pantaila, sentikortasuna" + "teknologia haptikoa, dardara, telefonoa, deia, sentikortasuna, tonua" + "teknologia haptikoa, dardara, telefonoa, deia, tonua jotzea, pixkanaka" + "teknologia haptikoa, dardara, sentikortasuna, jakinarazpenak" + "teknologia haptikoa, dardara, sentikortasuna, alarma" + "teknologia haptikoa, dardara, sentikortasuna, multimedia" + "teknologia haptikoa, dar-dar egin, dardara" "bateria-aurreztailea, finkoa, iraunkorra, energia-aurreztailea, bateria" "ohitura, ordutegia, programazioa, programatu, bateria-aurreztailea, aurreztu bateria, bateria automatikoa, ehunekoa" "volte, deitzeko aukera aurreratuak, 4G bidezko deiak" @@ -4683,7 +4683,7 @@ "Bihurtu bideoak AVC" "Multimedia-erreproduzigailu gehiagotan erreproduzitu ahal izango dira bideoak, baina baliteke kalitatea ez izatea hain ona" "Transferitu argazkiak edo fitxategiak MTP onartzen ez bada (PTP)" - "USB bidez konexioa partekatzea" + "Konexioa USB bidez partekatzea" "MIDI modua" "Erabili gailua MIDI gisa" "Erabili USB bidezko konexioa honetarako:" @@ -4701,11 +4701,11 @@ "Gailua kargatzen" "Konektatutako gailua kargatzea" "Fitxategi-transferentzia" - "USB bidez konexioa partekatzea" + "Konexioa USB bidez partekatzea" "PTP" "MIDI" "Fitxategi-transferentzia eta energia hornitzea" - "USB bidez konexioa partekatzea eta energia hornitzea" + "Konexioa USB bidez partekatzea eta energia hornitzea" "PTP modua eta energia hornitzea" "MIDI modua eta energia hornitzea" "Atzeko planoko egiaztapena" @@ -5361,7 +5361,7 @@ "Aplikazioaren bateragarritasun-aldaketak" - "Aldatu aplikazioaren bateragarritasun-aldaketak" + "Aktibatu/Desaktibatu aplikazioaren bateragarritasun-aldaketak" "Gaitutako aldaketa lehenetsiak" "Desgaitutako aldaketa lehenetsiak" "Ez dago aplikaziorik erabilgarri" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 59d3d115214..4ad512ddb34 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -425,7 +425,7 @@ "می‌توانید حداکثر %d چهره اضافه کنید" "حداکثر تعداد چهره را اضافه کرده‌اید" "چهره بیشتری نمی‌توان اضافه کرد" - "ثبت انجام نشد" + "ثبت کامل نشد" "تأیید" "درنگ ثبت چهره به پایان رسید. دوباره امتحان کنید." "ثبت چهره کار نکرد." @@ -674,9 +674,9 @@ "تمام" "اووه، آن حسگر نیست" "با استفاده از انگشت اشاره، حسگر را در پشت تلفن لمس کنید." - "ثبت‌نام کامل نشد" + "ثبت کامل نشد" "مهلت تنظیم اثر انگشت به‌پایان رسید" - "همین‌حالا دوباره امتحان کنید یا اثر انگشتتان را بعداً در «تنظیمات» راه‌اندازی کنید" + "می‌توانید اکنون دوباره امتحان کنید یا بعداً اثر انگشتتان را در «تنظیمات» راه‌اندازی کنید" "ثبت اثر انگشت کار نمی‌کند. دوباره امتحان کنید یا از انگشت دیگری استفاده کنید." "افزودن یک انگشت دیگر" "بعدی" @@ -1534,7 +1534,7 @@ "صفحه نمایش خاموش می‌شود" "%1$s پس از غیرفعال بودن" "کاغذدیواری" - "تصویرزمینه و سبک" + "کاغذدیواری و سبک" "صفحه اصلی، صفحه قفل" "پیش‌فرض" "سفارشی" @@ -2055,8 +2055,8 @@ "تنظیم الگو برای استفاده از اثر انگشت" "برای امنیت، پین تنظیم کنید" "تنظیم پین برای استفاده از اثر انگشت" - "گذرواژه‌ خود را دوباره وارد کنید" - "دوباره وارد کردن گذرواژه کاری" + "گذرواژه‌ را دوباره وارد کنید" + "گذرواژه کاری را دوباره وارد کنید" "گذرواژه نمایه کاری را وارد کنید" "تأیید الگو" "الگوی نمایه کاری را وارد کنید" @@ -2065,7 +2065,7 @@ "پین نمایه کاری را وارد کنید" "گذرواژه‌ها مطابقت ندارند" "پین ها با یکدیگر مطابقت ندارند" - "الگویتان را دوباره بکشید" + "الگو را دوباره بکشید" "انتخاب روش بازکردن قفل" "گذرواژه تنظیم شد" "پین تنظیم شد" @@ -2075,7 +2075,7 @@ "برای استفاده از «قفل‌گشایی با چهره»، پین تنظیم کنید" "گذرواژه‌ای برای استفاده از چهره یا اثر انگشت تنظیم کنید" "الگویی برای استفاده از چهره یا اثر انگشت تنظیم کنید" - "پینی برای استفاده از چهره یا اثر انگشت تنظیم کنید" + "برای استفاده از چهره یا اثر انگشت، پین تنظیم کنید" "گذرواژه را فراموش کردید؟" "الگو را فراموش کردید؟" "پین خود را فراموش کرده‌اید؟" @@ -4088,7 +4088,7 @@ "نمایش همه محتوای اعلان" "نمایش محتوای حساس فقط درصورت باز بودن قفل صفحه" "هرگز اعلان نشان داده نشود" - "می‌خواهید در صفحه قفل چطور نمایش داده شود؟" + "می‌خواهید صفحه قفل چطور نمایش داده شود؟" "صفحه قفل" "نمایش همه محتوای اعلان کاری" "پنهان کردن محتوای کاری حساس" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index f80a5b80d49..ce2adf78b65 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -3553,7 +3553,7 @@ "Käyttäjät" "Muut käyttäjät" "Poista vierastoimintaa" - "Poista kaikki vierassovellukset ja ‑data vierailija-käyttökerrasta poistumisen yhteydessä" + "Poista kaikki vierassovellukset ja ‑data vierastilasta poistumisen yhteydessä" "Poistetaanko vierastoiminta?" "Tämän vierailija-käyttökerran sovellukset ja data poistetaan nyt. Kaikki tuleva vierastoiminta poistetaan aina, kun poistut vierailija-käyttökerrasta." "Ota puhelut käyttöön" @@ -5720,7 +5720,7 @@ "Jos haluat käyttää tätä, laita ensin päälle \"Näytä laitteiden hallinta\"" "Näytä kaksirivinen kello, kun saatavilla" "Kaksirivinen kello" - "Pikakomennot" + "Pikakuvakkeet" %1$s, %2$s %1$s diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index b375c6c0dbd..29827ce6357 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -350,7 +350,7 @@ "Déverr. par reconn. faciale" "Déverrouillage reconnaissance faciale pour travail" "Configurer le déverrouillage par reconn. faciale" - "Configurer le déverrouillage facial" + "Configurer le Déverrouillage par reconn. faciale" "Utiliser son visage pour s\'authentifier" @@ -435,7 +435,7 @@ "Reconfigurez le déverrouillage facial" "Reconfigurer déverrouillage reconnaissance faciale" "Améliorez la sécurité et les performances" - "Configurer le déverrouillage par reconnaissance faciale" + "Configurer le Déverrouillage par reconnaissance faciale" "Supprimez votre modèle facial actuel pour reconfigurer le déverrouillage par reconnaissance faciale.\n\nCelui-ci sera supprimé de façon permanente et sécurisée.\n\nPour déverrouiller votre téléphone ou pour vous authentifier dans les applis, vous aurez besoin de ce qui suit : NIP, schéma ou mot de passe." "Supprimez votre modèle facial actuel pour reconfigurer le déverrouillage facial.\n\nCelui-ci sera supprimé de façon permanente et sécurisée.\n\nPour déverrouiller votre téléphone ou vous authentifier dans les applis, vous aurez besoin de ce qui suit : empreinte digitale, NIP, schéma ou mot de passe." "Utiliser pour" @@ -443,9 +443,9 @@ "Exiger des yeux ouverts" "Pour déverrouiller le téléphone, vos yeux doivent être ouverts" "Toujours demander une confirmation" - "Toujours confirmer déverrouillage reconnaissance faciale dans applis" + "Toujours confirmer Déverrouillage reconnaissance faciale dans applis" "Supprimer le modèle facial" - "Configurer le déverrouillage facial" + "Config. le Déverr. par reconn. faciale" "Utilisez votre visage pour déverrouiller votre téléphone ou pour vous authentifier dans les applications, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nLe fait de regarder le téléphone pourrait le déverrouiller même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre téléphone en le tenant devant votre visage.\n\nVotre téléphone pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique." "Utilisez votre visage pour déverrouiller votre téléphone ou pour vous authentifier dans les applications, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nLe fait de regarder le téléphone pourrait le déverrouiller même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre téléphone en le tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre téléphone pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique." "Supprimer le modèle facial?" @@ -484,8 +484,8 @@ "Annuler" "Non merci" "J\'accepte" - "Ignorer configuration empreinte?" - "La configuration de l\'empreinte digitale ne prend qu\'une minute ou deux. Si vous ignorez cette étape, vous pouvez ajouter votre empreinte digitale plus tard dans les paramètres." + "Ignorer la configuration?" + "La configuration de l\'empreinte digitale ne prend qu\'une minute ou deux. Si vous ignorez cette étape, vous pourrez ajouter votre empreinte digitale plus tard dans les paramètres." "Si vous voyez cette icône, utilisez votre empreinte pour vous authentifier (comme pour vous connecter à des applications ou approuver un achat)" "Gardez à l\'esprit" "Déverrouiller votre téléphone avec votre empreinte digitale peut être plus risqué qu\'avec un schéma ou un NIP robuste" @@ -500,12 +500,12 @@ "Lorsque votre enfant utilise la fonctionnalité Pixel Imprint, les images sont utilisées pour mettre à jour son modèle d\'empreinte digitale. Les images utilisées pour créer le modèle d\'empreinte digitale de votre enfant ne sont jamais stockées, contrairement au modèle, qui est stocké de façon sécuritaire sur le téléphone et ne le quitte jamais. Tous les traitements sont sécurisés sur le téléphone." "Lorsque votre enfant utilise la fonctionnalité Pixel Imprint, les images sont utilisées pour mettre à jour son modèle d\'empreinte digitale. Les images utilisées pour créer le modèle d\'empreinte digitale de votre enfant ne sont jamais stockées, contrairement au modèle, qui est stocké de façon sécuritaire sur la tablette et ne la quitte jamais. Tous les traitements sont exécutés de façon sécuritaire sur la tablette." "Lorsque votre enfant utilise la fonctionnalité Pixel Imprint, les images sont utilisées pour mettre à jour son modèle d\'empreinte digitale. Les images utilisées pour créer le modèle d\'empreinte digitale de votre enfant ne sont jamais stockées, contrairement au modèle, qui est stocké de façon sécuritaire sur l\'appareil et ne le quitte jamais. Tous les traitements sont exécutés de façon sécuritaire sur l\'appareil." - "Vous pouvez supprimer les images et le modèle de votre empreinte digitale ou désactiver le déverrouillage par empreinte digitale à tout moment dans les paramètres. Les images et le modèle de l\'empreinte digitale sont stockés sur le téléphone jusqu\'à ce que vous les supprimiez." - "Vous pouvez supprimer les images et le modèle de votre empreinte digitale ou désactiver le déverrouillage par empreinte digitale à tout moment dans Paramètres. Les images et les modèles de l\'empreinte digitale sont stockés sur la tablette jusqu\'à ce que vous les supprimiez." + "Vous pouvez supprimer les images et le modèle de votre empreinte digitale ou désactiver le Déverrouillage par empreinte digitale à tout moment dans les paramètres. Les images et le modèle de l\'empreinte digitale sont stockés sur le téléphone jusqu\'à ce que vous les supprimiez." + "Vous pouvez supprimer les images et le modèle de votre empreinte digitale ou désactiver le Déverrouillage par empreinte digitale à tout moment dans Paramètres. Les images et les modèles de l\'empreinte digitale sont stockés sur la tablette jusqu\'à ce que vous les supprimiez." "Vous pouvez supprimer les images et le modèle de votre empreinte digitale ou désactiver le déverrouillage par empreinte digitale à tout moment dans Paramètres. Les images et les modèles de l\'empreinte digitale sont stockés sur l\'appareil jusqu\'à ce que vous les supprimiez." - "Vous et votre enfant pouvez supprimer les images et le modèle de son empreinte digitale ou désactiver le déverrouillage par empreinte digitale en tout temps dans Paramètres. Les images et les modèles d\'empreinte digitale sont stockés sur le téléphone jusqu\'à ce qu\'ils soient supprimés." - "Vous et votre enfant pouvez supprimer les images et le modèle de son empreinte digitale ou désactiver le déverrouillage par empreinte digitale en tout temps dans Paramètres. Les images et les modèles d\'empreinte digitale sont stockés sur la tablette jusqu\'à ce qu\'ils soient supprimés." - "Vous et votre enfant pouvez supprimer les images et le modèle de son empreinte digitale ou désactiver le déverrouillage par empreinte digitale en tout temps dans Paramètres. Les images et les modèles d\'empreinte digitale sont stockés sur l\'appareil jusqu\'à ce qu\'ils soient supprimés." + "Vous et votre enfant pouvez supprimer les images et le modèle de son empreinte digitale ou désactiver le Déverrouillage par empreinte digitale en tout temps dans Paramètres. Les images et les modèles d\'empreinte digitale sont stockés sur le téléphone jusqu\'à ce qu\'ils soient supprimés." + "Vous et votre enfant pouvez supprimer les images et le modèle de son empreinte digitale ou désactiver le Déverrouillage par empreinte digitale en tout temps dans Paramètres. Les images et les modèles d\'empreinte digitale sont stockés sur la tablette jusqu\'à ce qu\'ils soient supprimés." + "Vous et votre enfant pouvez supprimer les images et le modèle de son empreinte digitale ou désactiver le Déverrouillage par empreinte digitale en tout temps dans Paramètres. Les images et les modèles d\'empreinte digitale sont stockés sur l\'appareil jusqu\'à ce qu\'ils soient supprimés." "Votre téléphone peut être déverrouillé même si vous ne le voulez pas, par exemple si quelqu\'un le tient contre votre doigt." "Votre tablette peut être déverrouillée même lorsque vous n\'en avez pas l\'intention, par exemple si quelqu\'un la tient contre votre doigt." "Votre tablette peut être déverrouillée même lorsque vous n\'en avez pas l\'intention, par exemple si quelqu\'un la tient contre votre doigt." @@ -523,8 +523,8 @@ "Allez dans un endroit moins éclairé et réessayez" "Vous avez atteint le nombre maximal d\'essais" "Déverrouillage à l\'aide d\'une montre" - "Lorsque vous configurez le déverrouillage par reconnaissance faciale et par empreinte digitale, votre téléphone vous demandera votre empreinte digitale quand vous portez un masque ou quand vous êtes dans un endroit sombre.\n\nVous pouvez déverrouiller votre téléphone à l\'aide de votre montre lorsque votre empreinte digitale ou votre visage ne sont pas reconnus." - "Lorsque vous configurez le déverrouillage par reconnaissance faciale et par empreinte digitale, votre tablette vous demandera votre empreinte digitale quand vous portez un masque ou quand vous êtes dans un endroit sombre.\n\nVous pouvez la déverrouiller à l\'aide de votre montre lorsque votre empreinte digitale ou votre visage ne sont pas reconnus." + "Lorsque vous configurez le Déverrouillage par reconnaissance faciale et par empreinte digitale, votre téléphone vous demande votre empreinte digitale quand vous portez un masque ou quand vous êtes dans un endroit sombre.\n\nVous pouvez déverrouiller votre téléphone à l\'aide de votre montre lorsque votre empreinte digitale ou votre visage ne sont pas reconnus." + "Si vous configurez le Déverrouillage par reconnaissance faciale et par empreinte digitale, votre tablette vous demandera votre empreinte digitale quand vous portez un masque ou quand vous êtes dans un endroit sombre.\n\nVous pouvez la déverrouiller à l\'aide de votre montre lorsque votre empreinte digitale ou votre visage ne sont pas reconnus." "Vous pouvez déverrouiller votre téléphone à l\'aide de votre montre lorsque votre empreinte digitale n\'est pas reconnue." "Vous pouvez déverrouiller votre téléphone à l\'aide de votre montre lorsque votre visage n\'est pas reconnu." "Utilisation du visage ou de la montre" @@ -548,7 +548,7 @@ "Touchez pour configurer" "Empreintes digitales et visage ajoutés" "Empreinte digitale et visage ajoutés" - "Lorsque vous configurez le déverrouillage par reconnaissance faciale et par empreinte digitale, votre téléphone vous demande votre empreinte digitale quand vous portez un masque ou vous trouvez dans un endroit sombre" + "Lorsque vous configurez le Déverrouillage par reconnaissance faciale et par empreinte digitale, votre téléphone vous demande votre empreinte digitale quand vous portez un masque ou vous trouvez dans un endroit sombre" "Méthodes de déverrouillage" "Déverrouiller votre téléphone" "Vérifier votre identité dans les applications" @@ -1031,7 +1031,7 @@ "Vérif. code à octets des applis déboguables" "Autoriser ART à vérifier le code à octets pour les applications débogables" "Afficher le taux d\'actualisation" - "Afficher le taux d\'actualisation actuel" + "Affichez le taux d\'actualisation actuel" "CCP" "Autoriser l\'échange de données lorsque la tablette touche un appareil CCP" "Autoriser l\'échange de données lorsque le téléphone touche un appareil CCP" @@ -2080,7 +2080,7 @@ "Schéma oublié?" "NIP oublié?" "Entrez le schéma de l\'appareil pour continuer" - "Entrez le NIP de l\'appareil pour continuer." + "Entrez le NIP de l\'appareil pour continuer" "Entrez le mot de passe de l\'appareil pour continuer" "Entrez le schéma de votre profil professionnel pour continuer" "Entrez le NIP de votre profil professionnel pour continuer" @@ -3534,7 +3534,7 @@ "Supp. %1$s de l\'appareil" "Paramètres de l\'écran de verrouillage" "Ajouter des utilisateurs à partir de l\'écran de verrouillage" - "Activer l\'utilisateur administrateur lorsque connecté" + "Activer l\'utilisateur administrateur lorsqu\'ancrée" "Vous supprimer?" "Supprimer cet utilisateur?" "Supprimer ce profil?" @@ -3553,7 +3553,7 @@ "Utilisateurs" "Autres utilisateurs" "Supprimer l\'activité d\'invité" - "Supprimer toutes les applications et données d\'invité en quittant le mode Invité" + "Supprimez toutes les applications et données d\'invité en quittant le mode Invité" "Supprimer l\'activité d\'invité?" "Les applications et les données de cette session d\'invité seront supprimées maintenant, et toutes les activités d\'invité futures seront supprimées chaque fois que vous quitterez le mode Invité" "Activer les appels téléphoniques" @@ -5345,7 +5345,7 @@ "Aucune application compatible avec ANGLE n\'a été définie" "Application compatible avec ANGLE : %1$s" "Préférences du pilote graphique" - "Modifier les paramètres du pilote graphique" + "Modifiez les paramètres du pilote graphique" "Lorsqu\'il y a de nombreux pilotes graphiques, vous pouvez choisir d\'utiliser le pilote graphique à jour pour les applications installées sur l\'appareil." "Activer pour toutes les applications" "Sélectionner un pilote graphique" @@ -5361,7 +5361,7 @@ "Changements dans la compatibilité des applications" - "Basculer les changements de compatibilité des applications" + "Basculez les changements de compatibilité des applications" "Changements activés par défaut" "Changements désactivés par défaut" "Aucune application" @@ -5750,7 +5750,7 @@ "Afficher les recommandations relatives aux contenus multimédias" "En fonction de votre activité" "Masquer le lecteur" - "Afficher le lecteur" + "Affichez le lecteur" "commandes multimédias" "Le Bluetooth sera activé" "Activé" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 5db36df3a35..c3c868f3d52 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -347,9 +347,9 @@ "Sécurité des applis, verrouillage appareil, autorisations" "Visage ajouté" "Appuyez pour configurer un visage" - "Déverrouillage par reco. faciale" + "Déverrouillage par reconnaissance faciale" "Déverrouillage facial pour le travail" - "Configurer le déverrouillage par reconn. faciale" + "Configurer le déverrouillage par reconnaissance faciale" "Configurer le déverr. par reconnaissance faciale" "Vous authentifier avec votre visage" @@ -445,7 +445,7 @@ "Toujours demander confirmation" "Toujours confirmer le déverrouillage par reco. faciale dans applis" "Supprimer l\'empreinte faciale" - "Configurer déverr. par reconn. faciale" + "Configurer le déverrouillage par reconnaissance faciale" "Utilisez votre visage pour déverrouiller votre téléphone ou valider votre identité dans les applis (pour vous connecter ou approuver un achat, par exemple).\n\nÀ savoir :\nVous ne pouvez configurer qu\'un seul visage à la fois. Supprimez le visage actuel pour en ajouter un.\n\nVous pouvez déverrouiller votre téléphone sans le vouloir, en le regardant.\n\nUne autre personne peut le déverrouiller en le tenant devant votre visage.\n\nQuelqu\'un qui vous ressemble beaucoup, comme votre jumeau/jumelle, peut aussi déverrouiller votre téléphone." "Utilisez votre visage pour déverrouiller votre téléphone ou valider votre identité dans les applis (pour vous connecter ou approuver un achat, par exemple).\n\nÀ savoir :\nVous ne pouvez configurer qu\'un seul visage à la fois. Supprimez le visage actuel pour en ajouter un.\n\nVous pouvez déverrouiller votre téléphone sans le vouloir, en le regardant.\n\nUne autre personne peut le déverrouiller en le tenant devant votre visage, même si vous fermez les yeux.\n\nQuelqu\'un qui vous ressemble beaucoup, comme votre jumeau/jumelle, peut aussi déverrouiller votre téléphone." "Supprimer l\'empreinte faciale ?" @@ -543,7 +543,7 @@ "Déverrouillage par reconnaissance faciale et la %s ajouté" "Visage, empreinte digitale et %s ajoutés" "Visage, empreintes digitales et %s ajoutés" - "Déverrouillage par reconnaissance faciale et empreinte" + "Déverrouillage par reco. faciale et empreinte" "Déverrouillage par reconnaissance faciale/digitale pour le travail" "Appuyer pour configurer" "Visage et empreintes digitales ajoutés" @@ -3953,7 +3953,7 @@ "Le mode Ne pas déranger a été activé automatiquement par une application (%s)" "Le mode Ne pas déranger est activé pour les règles %s avec des paramètres personnalisés." " ""Afficher les paramètres personnalisés" - "Prioritaires uniquement" + "Prioritaire uniquement" "%1$s. %2$s" "Activé - %1$s" "Activé" @@ -5740,7 +5740,7 @@ "Bail à durée illimitée." "Autoriser superpositions d\'écran dans paramètres" "Autoriser les applications pouvant se superposer à d\'autres à se superposer aux écrans de paramètres" - "Autoriser modem fictif" + "Autoriser le modem fictif" "Autoriser cet appareil à exécuter le service de modem fictif pour les tests d\'instrumentation. Ne pas l\'activer lors d\'une utilisation normale du téléphone" "Multimédia" "Épingler le lecteur multimédia" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index d809054801d..a4f94a392c9 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -373,7 +373,7 @@ "Desbloquea coa túa cara" "Permitir desbloqueo facial" "Utiliza a autenticación facial" - "Utiliza a túa cara para desbloquear o teléfono, autorizar compras e iniciar sesión en aplicacións." + "Utiliza o recoñecemento facial para desbloquear o teléfono, autorizar compras e iniciar sesión en aplicacións." "Utiliza a cara para desbloquear a tableta, autorizar compras e iniciar sesión en aplicacións." "Utiliza a cara para desbloquear o dispositivo, autorizar compras e iniciar sesión en aplicacións." "Permite que o teu fillo ou filla utilice a cara para desbloquear o seu teléfono" @@ -382,8 +382,8 @@ "O desbloqueo facial do teléfono coa cara da túa filla ou fillo pode ser menos fiable que o uso dun padrón ou PIN seguro." "O desbloqueo facial da tableta coa cara da túa filla ou fillo pode ser menos fiable que o uso dun padrón ou PIN seguro." "O desbloqueo facial do dispositivo coa cara da túa filla ou fillo pode ser menos fiable que o uso dun padrón ou PIN seguro." - "Utiliza a cara para desbloquear o teléfono ou autorizar as compras.\n\nNota: Non podes utilizar a cara para desbloquear este dispositivo. Para obter máis información, ponte en contacto co administrador da túa organización." - "Utiliza a túa cara para desbloquear o teléfono, autorizar compras e iniciar sesión en aplicacións" + "Utiliza o recoñecemento facial para desbloquear o teléfono ou autorizar as compras.\n\nNota: Non podes utilizar o recoñecemento facial para desbloquear este dispositivo. Para obter máis información, ponte en contacto co administrador da túa organización." + "Utiliza o recoñecemento facial para desbloquear o teléfono, autorizar compras e iniciar sesión en aplicacións" @@ -446,8 +446,8 @@ "Ao utilizar o desbloqueo facial en aplicacións, pedir confirmación" "Eliminar modelo facial" "Configurar desbloqueo facial" - "Utiliza a cara para desbloquear o teléfono ou para autenticarte nas aplicacións (por exemplo, cando queiras iniciar sesión ou aprobar unha compra).\n\nNota:\nNon podes ter varias caras configuradas á vez. Se queres engadir outra, elimina a actual.\n\nAo mirar o teléfono, podes desbloquealo sen querer.\n\nOutra persoa pode desbloquealo se che pon o teléfono diante da cara.\n\nTamén pode desbloquealo alguén que se pareza moito a ti, como un xemelgo." - "Utiliza a cara para desbloquear o teléfono ou para autenticarte nas aplicacións (por exemplo, cando queiras iniciar sesión ou aprobar unha compra).\n\nNota:\nNon podes ter varias caras configuradas á vez. Se queres engadir outra, elimina a actual.\n\nAo mirar o teléfono, podes desbloquealo sen querer.\n\nOutra persoa pode desbloquealo se che pon o teléfono diante da cara, aínda que teñas os ollos pechados.\n\nTamén pode desbloquealo alguén que se pareza moito a ti, como un xemelgo." + "Utiliza o recoñecemento facial para desbloquear o teléfono ou para autenticarte nas aplicacións (por exemplo, cando queiras iniciar sesión ou aprobar unha compra).\n\nNota:\nNon podes ter varias caras configuradas á vez. Se queres engadir outra, elimina a actual.\n\nAo mirar o teléfono, podes desbloquealo sen querer.\n\nOutra persoa pode desbloquealo se che pon o teléfono diante da cara.\n\nTamén pode desbloquealo alguén que se pareza moito a ti, como un xemelgo." + "Utiliza o recoñecemento facial para desbloquear o teléfono ou para autenticarte nas aplicacións (por exemplo, cando queiras iniciar sesión ou aprobar unha compra).\n\nNota:\nNon podes ter varias caras configuradas á vez. Se queres engadir outra, elimina a actual.\n\nAo mirar o teléfono, podes desbloquealo sen querer.\n\nOutra persoa pode desbloquealo se che pon o teléfono diante da cara, aínda que teñas os ollos pechados.\n\nTamén pode desbloquealo alguén que se pareza moito a ti, como un xemelgo." "Queres eliminar o modelo facial?" "O teu modelo facial eliminarase de xeito seguro e permanente.\n\nUnha vez eliminado, terás que usar o PIN, o padrón ou o contrasinal para desbloquear o teléfono ou para autenticarte nas aplicacións." "O teu modelo facial eliminarase de xeito seguro e permanente.\n\nUnha vez eliminado, terás que usar o PIN, o padrón ou o contrasinal para desbloquear o teléfono." @@ -723,8 +723,8 @@ "Bloqueo de pantalla" "Escolle un bloqueo de pantalla" "Escolle un novo bloqueo" - "Escolle bloqueo de traballo" - "Escolle bloqueo do traballo" + "Escolle un bloqueo de traballo" + "Escolle un novo bloqueo do traballo" "Protexe a tableta" "Protexe o dispositivo" "Protexe o teu teléfono" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index 98d6ec83302..ea96ff6a377 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -3868,7 +3868,7 @@ "ડાયલપૅડ ટોન" "સ્ક્રીન લૉકિંગનો સાઉન્ડ" "ચાર્જિંગ સાઉન્ડ અને વાઇબ્રેશન" - "ડૉકિંગ સાઉન્ડ્સ" + "ડૉકિંગ સાઉન્ડ" "ટચ સાઉન્ડ" "વાઇબ્રેટ મોડમાં હોય ત્યારે હંમેશાં આઇકન બતાવો" "ડૉક સ્પીકર ચલાવે છે" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index ba578ab9cdf..5dd15a65fbf 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -319,7 +319,7 @@ "खाते" "जगह की जानकारी" "जगह की जानकारी वाली सुविधा का इस्तेमाल करें" - "बंद करें" + "बंद है" चालू है - %1$d ऐप्लिकेशन के पास जगह की जानकारी का ऐक्सेस है चालू है - %1$d ऐप्लिकेशन के पास जगह की जानकारी का ऐक्सेस है @@ -691,13 +691,13 @@ "सुरक्षा, सुरक्षा से जुड़ी और सेटिंग, अन्य सेटिंग, बेहतर सुरक्षा सेटिंग" "निजता से जुड़ी और सेटिंग" "ऑटोमैटिक जानकारी भरना, गतिविधि कंट्रोल वगैरह" - "%d फ़िंगरप्रिंट जोड़े जा सकते हैं" + "ज़्यादा से ज़्यादा %d फ़िंगरप्रिंट जोड़े जा सकते हैं" "आप अधिकतम संख्या में फ़िंगरप्रिंट जोड़ चुके हैं" "और ज़्यादा फ़िंगरप्रिंट नहीं जोड़े जा सकते" "सभी फ़िंगरप्रिंट हटाने हैं?" "\'%1$s\' को मिटाएं" "क्या आपको यह फ़िंगरप्रिंट मिटाना है?" - "ऐसा करने से, आपके फ़ोन पर मौजूद \'%1$s\' से जुड़ी फ़िंगरप्रिंट की इमेज और मॉडल मिट जाएंगे" + "ऐसा करने से, आपके फ़ोन पर मौजूद \'%1$s\' से जुड़े फ़िंगरप्रिंट की इमेज और मॉडल मिट जाएंगे" "ऐसा करने से, आपके टैबलेट पर मौजूद \'%1$s\' से जुड़ी फ़िंगरप्रिंट की इमेज और मॉडल मिट जाएंगे" "ऐसा करने से, आपके डिवाइस पर मौजूद %1$s से जुड़ी फ़िंगरप्रिंट की इमेज और मॉडल मिट जाएंगे" "फ़ोन अनलॉक करने या ऐप्लिकेशन में अपनी पहचान की पुष्टि करने के लिए, फ़िंगरप्रिंट का इस्तेमाल नहीं किया जा सकेगा." @@ -902,7 +902,7 @@ "अंकों के बढ़ते, घटते या दोहराए जाने वाले क्रम की अनुमति नहीं है" "पुष्टि करें" "रद्द करें" - "साफ़ करें" + "मिटाएं" "स्क्रीन लॉक पहले ही बदला जा चुका है. नए स्क्रीन लॉक के साथ फिर से कोशिश करें." "रद्द करें" "आगे बढ़ें" @@ -2608,7 +2608,7 @@ "स्क्रीन के सबसे ऊपरी हिस्से से भी, रंग बदलने की सुविधा को \'फटाफट सेटिंग\' में जोड़ा जा सकता है" "स्क्रीन की रोशनी को सामान्य लेवल से और कम करने की सुविधा को \'फटाफट सेटिंग\' में जोड़ा गया. इसे कभी भी चालू या बंद करने के लिए, स्क्रीन पर नीचे की ओर स्वाइप करें." "स्क्रीन के सबसे ऊपरी हिस्से से भी, स्क्रीन की रोशनी को सामान्य लेवल से और कम करने की सुविधा को \'फटाफट सेटिंग\' में जोड़ा जा सकता है" - "वन-हैंडेड मोड को \'फटाफट सेटिंग\' में जोड़ा गया. इसे कभी भी चालू या बंद करने के लिए, स्क्रीन पर नीचे की ओर स्वाइप करें." + "वन-हैंडेड मोड को क्विक सेटिंग में जोड़ा गया. नीचे की ओर स्वाइप करके, इसे कभी भी चालू या बंद करें." "स्क्रीन के सबसे ऊपरी हिस्से से भी, वन-हैंडेड मोड को \'फटाफट सेटिंग\' में जोड़ा जा सकता है" "खारिज करें" "अपने फ़ोन पर रंगों के दिखने का तरीका बदलें" @@ -3868,7 +3868,7 @@ "डायल पैड टोन" "स्क्रीन लॉक करने की आवाज़" "चार्जिंग की आवाज़ और वाइब्रेशन" - "डॉक करने की ध्वनियां" + "डॉक करने पर आवाज़ की सुविधा" "छूने पर आने वाली आवाज़ें" "वाइब्रेशन मोड के चालू होने का आइकॉन हमेशा दिखाएं" "डॉक स्पीकर चलेगा" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index adfb1d55ccc..3d38c29d06e 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -446,13 +446,13 @@ "Traži da oči budu otvorene" "Da biste otključali telefon, oči vam moraju biti otvorene" "Uvijek traži potvrdu" - "Za upotrebu otključavanja licem u aplikacijama uvijek tražite potvrdu" + "Za upotrebu otključavanja licem u aplikacijama uvijek se traži potvrda" "Izbriši model lica" "Postavite otključavanje licem" "Licem otključajte telefon ili provedite autentifikaciju u aplikacijama, primjerice prilikom prijave ili odobravanja kupnje.\n\nZapamtite:\nIstovremeno možete imati postavljeno samo jedno lice. Izbrišite aktualno lice da biste dodali neko drugo.\n\nGledajući telefon možete ga otključati i kad to ne namjeravate.\n\nVaš telefon može otključati i netko drugi ako ga prinese vašem licu.\n\nVaš bi telefon možda mogao otključati i netko tko vam je vrlo sličan, na primjer blizanac." "Licem otključajte telefon ili provedite autentifikaciju u aplikacijama, primjerice prilikom prijave ili odobravanja kupnje.\n\nZapamtite:\nIstovremeno možete imati postavljeno samo jedno lice. Izbrišite aktualno lice da biste dodali neko drugo.\n\nGledajući telefon možete ga otključati i kad to ne namjeravate.\n\nVaš telefon može otključati i netko drugi ako ga prinese vašem licu, čak i ako su vam oči zatvorene.\n\nVaš bi telefon možda mogao otključati i netko tko vam je vrlo sličan, na primjer blizanac." "Želite li izbrisati model lica?" - "Vaš model lica izbrisat će se trajno i sigurno.\n\nNakon brisanja trebat će vam PIN, uzorak ili zaporka da biste otključali telefon ili za autentifikaciju u aplikacijama." + "Vaš model lica trajno će se i sigurno izbrisati.\n\nNakon brisanja trebat će vam PIN, uzorak ili zaporka da biste otključali telefon ili izvršili autentifikaciju u aplikacijama." "Model lica trajno će se i sigurno izbrisati.\n\nNakon brisanja trebat će vam PIN, uzorak ili zaporka da biste otključali telefon." "Otključajte telefon licem" "Otisak prsta" @@ -2623,7 +2623,7 @@ "Vibracija obavijesti" "Reakcija na dodir" "Koristi uslugu %1$s" - "Otvori %1$s" + "Otvori uslugu %1$s" "Aplikacija %1$s dodana je u Brze postavke. Prijeđite prstom prema dolje da biste je uključili ili isključili." "%1$s također se može dodati u Brze postavke s vrha zaslona" "Korekcija boja dodana je u Brze postavke. Prijeđite prstom prema dolje da biste je uključili ili isključili." @@ -3599,8 +3599,8 @@ "Izbrisati aktivnost gosta?" "Aplikacije i podaci iz ove gostujuće sesije izbrisat će se odmah, a sve buduće aktivnosti gostujuće sesije izbrisat će se svaki put kad napustite način rada za goste." "Uključi telefonske pozive" - "Uključivanje telefonskih poziva i SMS-a" - "Brisanje korisnika" + "Uključi telefonske pozive i SMS" + "Izbriši korisnika" "Želite li uključiti telefonske pozive?" "Povijest poziva dijelit će se s tim korisnikom." "Želite li uključiti telefonske pozive i SMS?" @@ -4113,8 +4113,8 @@ "Sakrij bešumne obavijesti na traci statusa" "Trepereće svjetlo" "Privatnost" - "Preskakanje zaključanog zaslona" - "Nakon otključavanja otvori posljednji korišteni zaslon" + "Preskoči zaključani zaslon" + "Nakon otključavanja otvara se posljednji korišteni zaslon" "Zaključan zaslon, preskakanje, zaobilaženje" "Kad je poslovni profil zaključan" "Prikazuj samo nove obavijesti na zaključanom zaslonu" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 49bd1f186ce..74941b66674 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -550,11 +550,11 @@ "Դեմքի և մատնահետքի նմուշներն ավելացվեցին" "Դեմքով կամ մատնահետքով ապակողպումն օգտագործելու դեպքում, երբ դիմակ կրելիս լինեք կամ լուսավորությունը թույլ լինի, ձեր հեռախոսը կպահանջի, որ օգտագործեք ձեր մատնահետքը" "Ապակողպման եղանակներ" - "Ապակողպեք ձեր հեռախոսը" - "Հաստատեք ձեր ինքնությունը հավելվածներում" + "Հեռախոսի ապակողպում" + "Ինքնության հաստատում հավելվածներում" "Դեմքով ապակողպման օգտագործում" - "Մատնահետքով ապակողպման օգտագործում" - "Դեմքով կամ մատնահետքով ապակողպման օգտագործում" + "Մատնահետքով" + "Դեմքով կամ մատնահետքով" "Պլանշետը նորից տվեք ձեր ծնողին" "Սարքը նորից տվեք ձեր ծնողին" "Հեռախոսը նորից տվեք ձեր ծնողին" @@ -721,7 +721,7 @@ "էկրանի կողպման տեսակը" - "Ընտրեք էկրանի կողպման տեսակ" + "Ընտրեք էկրանի կողպում" "Ընտրեք էկրանի կողպման եղանակ" "Ընտրեք աշխ․ պրոֆիլի կողպում" "Ընտրեք կողպման նոր եղանակ" @@ -3869,7 +3869,7 @@ "Էկրանի կողպման ձայն" "Լիցքավորման ձայներ և թրթռոց" "Միակցման ձայներ" - "Հպում" + "Հպման ձայներ" "Թրթռոցի ռեժիմում միշտ ցույց տալ պատկերակը" "Նվագարկել միակցիչի բարձրախոսով" "Բոլոր աուդիոֆայլերը" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 61ef5c991b2..615ee80cce0 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -311,7 +311,7 @@ "Aktifkan widget" "Dinonaktifkan oleh admin" "Kunci layar saat kepercayaan hilang" - "Jika diaktifkan, perangkat akan terkunci saat perangkat dipercaya terakhir kehilangan kepercayaan" + "Jika diaktifkan, perangkat akan terkunci saat perangkat tepercaya terakhir kehilangan kepercayaan" "Tidak ada" "%1$d / %2$d" "Misalnya, Android Joko." @@ -913,12 +913,12 @@ %d aplikasi aktif %d aplikasi aktif - "Perangkat dipercaya" + "Perangkat tepercaya" "Untuk menggunakannya, setel kunci layar terlebih dahulu" "Tidak ada" - %d perangkat dipercaya aktif - 1 perangkat dipercaya aktif + %d perangkat tepercaya aktif + 1 perangkat tepercaya aktif "Bluetooth" "Hidupkan Bluetooth" @@ -1882,7 +1882,7 @@ "SIM hasil download tidak dapat dihapus karena terjadi error.\n\nMulai ulang perangkat Anda, lalu coba lagi." "Hapus semua data (reset ke setelan pabrik)" "Hapus semua data" - "Tindakan ini akan menghapus semua data dari ""penyimpanan internal"" tablet Anda, termasuk:\n\n"
  • "Akun Google Anda"
  • \n
  • "Data sistem dan aplikasi serta setelan"
  • \n
  • "Aplikasi yang didownload"
  • + "Tindakan ini akan menghapus semua data dari ""penyimpanan internal"" tablet Anda, termasuk:\n\n"
  • "Akun Google Anda"
  • \n
  • "Data dan setelan sistem dan aplikasi"
  • \n
  • "Aplikasi yang didownload"
  • "Tindakan ini akan menghapus semua data dari ""penyimpanan internal"" ponsel Anda, termasuk:\n\n"
  • "Akun Google Anda"
  • \n
  • "Data sistem dan aplikasi serta setelan"
  • \n
  • "Aplikasi yang didownload"
  • \n\n"Saat ini Anda login ke akun berikut:\n" \n\n"Ada pengguna lain yang aktif di perangkat ini.\n" @@ -3246,7 +3246,7 @@ "Nonaktifkan & uninstal" "Aplikasi admin perangkat" "Tidak ada aplikasi admin yang tersedia" - "Tidak tersedia perangkat dipercaya" + "Tidak tersedia perangkat tepercaya" "Aktifkan aplikasi admin perangkat?" "Aktifkan aplikasi admin perangkat ini" "Admin perangkat" @@ -3736,7 +3736,7 @@ "Aplikasi & notifikasi" "Aplikasi baru-baru ini, aplikasi default" "Akses notifikasi tidak tersedia untuk aplikasi di profil kerja" - "Sandi dan akun" + "Sandi & akun" "Sandi tersimpan, isi otomatis, akun yang disinkronkan" "Aplikasi default" "Bahasa, gestur, waktu, pencadangan" @@ -3868,7 +3868,7 @@ "Nada tombol nomor" "Suara penguncian layar" "Getaran & suara pengisian daya" - "Memasang suara di dok" + "Suara saat ditaruh di dok" "Suara sentuhan" "Selalu tampilkan ikon saat dalam mode getar" "Dok pemutaran speaker" @@ -4688,7 +4688,7 @@ "Menggunakan perangkat ini sebagai MIDI" "Gunakan USB untuk" "Konfigurasi USB default" - "Ketika perangkat lain terhubung dan ponsel Anda terbuka kuncinya, setelan ini akan berlaku. Hanya hubungkan ke perangkat yang dipercaya." + "Ketika perangkat lain terhubung dan ponsel Anda terbuka kuncinya, setelan ini akan berlaku. Hanya hubungkan ke perangkat tepercaya." "Opsi daya" "Opsi transfer file" "USB" @@ -5122,9 +5122,9 @@ "Gunakan pintasan untuk" "Tarik setengah layar bagian atas ke bawah agar lebih mudah dijangkau dengan satu tangan" " ""Cara menggunakan mode satu tangan"\n" • Pastikan navigasi gestur dipilih di setelan navigasi sistem\n • Geser ke bawah di dekat tepi bawah layar" - "Tarik layar agar berada dalam jangkauan" + "Menarik layar agar berada dalam jangkauan" "Bagian atas layar akan dapat dijangkau ibu jari Anda." - "Tampilkan notifikasi" + "Menampilkan notifikasi" "Notifikasi dan setelan akan muncul." "Untuk memeriksa waktu, notifikasi, dan info lainnya, ketuk dua kali layar Anda." "Angkat untuk memeriksa ponsel" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index e74b6c6d5d9..ceba09cf20b 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -5122,7 +5122,7 @@ "Nota flýtileiðina til að" "Dragðu efri hluta skjásins niður svo auðveldara sé að ná með annarri hendinni" " ""Svona notarðu einhenta stillingu"\n" • Gakktu úr skugga um að kveikt sé á bendingastjórnun í stillingum kerfisstjórnunar.\n • Strjúktu niður nálægt neðri hluta skjásins" - "Dragðu skjáinn svo til hans náist." + "Draga skjáinn svo til hans náist." "Efri hluti skjásins færist niður svo að þumallinn nái til hans." "Sýna tilkynningar" "Tilkynningar og stillingar munu birtast." diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 21c74ef9095..34624deb62a 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -278,7 +278,7 @@ "Data e ora" "Imposta data e ora" "Imposta data, ora, fuso orario e formati" - "Imposta automaticamente l\'orario" + "Imposta l\'ora automaticamente" "Imposta automaticamente il fuso orario" "Usa impostazioni internazionali predefinite" "Formato 24 ore" @@ -453,7 +453,7 @@ "Il modello del volto verrà eliminato definitivamente e in sicurezza.\n\nDopo l\'eliminazione dovrai usare il PIN, la sequenza o la password per sbloccare il telefono." "Usa lo sblocco con il volto per sbloccare il tuo telefono" "Impronta" - "Quando viene usato lo sblocco con l\'impronta" + "Quando usi lo sblocco con l\'impronta" "Impronta per lavoro" "Gestisci impronte digitali" "Utilizza l\'impronta per" @@ -1459,7 +1459,7 @@ "Non regolare per la luce disponibile" "Utilizzo elevato della batteria" "Ottimizza il livello di luminosità per la luce disponibile. Quando questa funzione è attiva, puoi comunque regolare la luminosità temporaneamente." - "La luminosità dello schermo verrà regolata automaticamente in base all\'ambiente e alle attività. Puoi spostare manualmente il dispositivo di scorrimento per far sì che la luminosità adattiva memorizzi le tue preferenze." + "La luminosità dello schermo verrà regolata automaticamente in base all\'ambiente e alle attività. Puoi spostare manualmente il cursore per far sì che la luminosità adattiva memorizzi le tue preferenze." "Bilanciamento bianco display" "Display fluido" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index e8523b84634..55f61b5dcd0 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -496,7 +496,7 @@ "יכול להיות שביטול הנעילה של הטאבלט בטביעת אצבע היא שיטה פחות בטוחה מקו ביטול נעילה או מקוד אימות חזקים" "יכול להיות שביטול הנעילה של המכשיר בטביעת אצבע היא שיטה פחות בטוחה מקו ביטול נעילה או מקוד אימות חזקים" "איך זה עובד" - "הפיצ\'ר \'ביטול הנעילה בטביעת אצבע\' יוצר תבנית ייחודית של טביעת האצבע שלך כדי לאמת את זהותך. כדי ליצור את התבנית הזו לטביעת האצבע במהלך ההגדרה, עליך לצלם תמונות של טביעת האצבע מזוויות שונות." + "הפיצ\'ר \'ביטול הנעילה בטביעת אצבע\' יוצר תבנית ייחודית של טביעת האצבע שלך כדי לאמת את זהותך. תהליך היצירה של תבנית לטביעת האצבע כולל צילום תמונות של טביעת האצבע שלך מזוויות שונות." "הפיצ\'ר \'ביטול הנעילה בטביעת אצבע\' יוצר תבנית ייחודית של טביעת האצבע של הילד או הילדה כדי לאמת את זהותם. כדי ליצור את התבנית הזו לטביעת האצבע במהלך ההגדרה, יהיה עליהם לצלם תמונות של טביעת האצבע מזוויות שונות." "‏כשמשתמשים ב-Pixel Imprint, נעשה שימוש בתמונות כדי לעדכן את התבנית של טביעת האצבע. התמונות שמשמשות ליצירת התבנית של טביעת האצבע לא נשמרות. התבנית של טביעת האצבע נשמרת בצורה מאובטחת בטלפון שלך ואף פעם לא נשלחת או מועברת ממנו. כל פעולות העיבוד מתבצעות בטלפון באופן מאובטח." "‏כשמשתמשים ב-Pixel Imprint נעשה שימוש בתמונות כדי לעדכן את התבנית של טביעת האצבע. התמונות שמשמשות ליצירת התבנית של טביעת האצבע אף פעם לא נשמרות, אבל התבנית של טביעת האצבע נשמרת באופן מאובטח בטאבלט שלך ואף פעם לא נשלחת או מועברת ממנו. כל פעולות העיבוד מתבצעות בטאבלט באופן מאובטח." @@ -575,7 +575,7 @@ "דילוג" "ביטול" "נגיעה בחיישן" - "נגיעה בלחצן ההפעלה בלי ללחוץ עליו" + "נוגעים בלחצן ההפעלה בלי ללחוץ עליו" "איך מגדירים טביעת אצבע?" "החיישן נמצא בגב הטלפון. יש להשתמש באצבע המורה." "חיישן טביעת האצבע נמצא על לחצן ההפעלה. זה הלחצן השטוח ליד הלחצן הבולט של עוצמת הקול בשולי הטאבלט." @@ -592,18 +592,18 @@ "נגיעה בחיישן" "יש להניח את האצבע על החיישן ולהרים אותה לאחר שמרגישים רטט" "צריך להחזיק את האצבע כך שטביעת האצבע תהיה על החיישן, עד שמרגישים רטט" - "בלי ללחוץ על הלחצן, משאירים את טביעת האצבע על החיישן עד שמרגישים רטט.\n\nמזיזים מעט את האצבע כל פעם. כך יתועד חלק גדול יותר מהאצבע." - "לוחצים לחיצה ארוכה על חיישן טביעות האצבע" - "מרימים את האצבע ושוב נוגעים בחיישן" + "בלי ללחוץ על הלחצן, מניחים את האצבע על החיישן עד שמרגישים רטט.\n\nמזיזים מעט את האצבע כל פעם. כך יתועד חלק גדול יותר מהאצבע." + "יש ללחוץ לחיצה ארוכה על חיישן טביעות האצבע" + "עכשיו צריך להרים את האצבע ולגעת בחיישן שוב" "ושוב…" "עוקבים אחר הסמל של טביעת האצבע" "יש להרים את האצבע ולגעת בחיישן עם חלקים שונים של האצבע לקבלת טביעת אצבע מלאה" "לוחצים לחיצה ארוכה בכל פעם שסמל טביעת האצבע זז. כך יתועד חלק גדול יותר מהאצבע." - "מניחים את קצה האצבע על החיישן" + "צריך להניח את קצה האצבע על החיישן" "יש להניח את הקצה השמאלי של האצבע" "יש להניח את הקצה הימני של האצבע" "מניחים את מרכז האצבע על החיישן" - "מניחים את קצה האצבע על החיישן" + "צריך להניח את קצה האצבע על החיישן" "מניחים את הקצה השמאלי של האצבע על החיישן" "לבסוף, מניחים את הקצה הימני של האצבע על החיישן" "מניחים צד אחד של האצבע על החיישן ומחזיקים. אחר כך עוברים לצד השני" @@ -622,7 +622,7 @@ "כשנוגעים בחיישן הנעילה מתבטלת אפילו אם המסך כבוי. חשוב לזכור שהנעילה תתבטל גם אם נגעת בחיישן בטעות." "מסך, ביטול נעילה" "לא עכשיו" - "מרימים ונוגעים בחיישן שוב" + "עכשיו צריך להרים את האצבע ולגעת בחיישן שוב" "מניחים צד אחד של האצבע על החיישן ומחזיקים. אחר כך עוברים לצד השני" "האם לדלג על הגדרת טביעת אצבע?" "בחרת להשתמש בטביעת האצבע שלך כאחת מהדרכים שבהן תהיה לך אפשרות לבטל את הנעילה בטלפון. אם החלטתך תהיה לדלג על שלב זה עכשיו, יהיה עליך לבצע את ההגדרה בהמשך. ההגדרה לוקחת רק דקה או שתיים." @@ -2082,7 +2082,7 @@ "הזנת הסיסמה של פרופיל העבודה" "אישור הקו לביטול נעילה" "הזנת קו ביטול הנעילה לעבודה" - "יש להזין שוב את קוד האימות" + "צריך להקיש שוב את קוד האימות" "הזנה מחדש של קוד האימות לעבודה" "הזנת קוד הגישה לפרופיל העבודה" "הסיסמאות לא תואמות" @@ -2102,7 +2102,7 @@ "שכחת את קו ביטול הנעילה?" "שכחת את קוד האימות?" "יש להשתמש בקו ביטול הנעילה של המכשיר כדי להמשיך" - "יש להזין את קוד הגישה של המכשיר כדי להמשיך" + "כדי להמשיך צריך להקיש את קוד הגישה למכשיר" "יש להזין את סיסמת המכשיר כדי להמשיך" "אפשר להשתמש בקו ביטול הנעילה בעבודה כדי להמשיך" "יש להזין את קוד הגישה בעבודה כדי להמשיך" @@ -5445,7 +5445,7 @@ "שינויים בתאימות האפליקציה" - "החלפת מצב השינויים בתאימות האפליקציה" + "החלפת המצב של שינויים בתאימות של אפליקציות" "השינויים מופעלים כברירת מחדל" "השינויים מושבתים כברירת מחדל" "אין אפליקציות זמינות" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 9f70dbb24f3..bab08eda7ee 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -5828,7 +5828,7 @@ "着信音ミュート用のショートカットを使用する" "Wi-Fi アクセス ポイントの使用" "アプリ固定機能を使用" - "開発者向けオプションの使用" + "開発者向けオプションを使用" "印刷サービスを使用" "複数のユーザーを許可する" "ワイヤレス デバッグの使用" diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index b3447a4b62d..51911373ef5 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -1875,7 +1875,7 @@ "გსურთ ქსელის ყველა პარამეტრის გადაყენება? ამ მოქმედებას ვერ გააუქმებთ." "გსურთ ქსელის ყველა პარამეტრის გადაყენება და ჩამოტვირთული SIM ბარათების ამოშლა? ამ მოქმედებას ვერ გააუქმებთ." "პარამეტრების ჩამოყრა" - "ჩამოვყაროთ პარამეტრები?" + "გადავაყენოთ პარამეტრები?" "ქსელის გადაყენება ამ მომხმარებლისათვის მიუწვდომელია" "ქსელის პარამეტრები ჩამოიყარა" "SIM ბარათების ამოშლა ვერ ხერხდება" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 25d80f1c206..b92ef76341d 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -543,7 +543,7 @@ "Бет тану функциясы және %s қосылды." "Бет тану функциясы, саусақ ізі және %s қосылды." "Бет тану функциясы, саусақ іздері және %s қосылды." - "Бет пен саусақ ізі арқылы құлыпты ашу" + "Бет тану, саусақ ізімен ашу" "Жұмысқа арналған бет тану және саусақ ізімен ашу функциялары" "Реттеу үшін түртіңіз." "Бет және саусақ іздері енгізілді." @@ -3868,7 +3868,7 @@ "Нөмір тергіш дыбысы" "Экранды құлыптау дыбысы" "Зарядтау кезіндегі дыбыс және діріл" - "Док-станцияға қою дыбыстары" + "Қондыру станциясының дыбыстары" "Түрту дыбысы" "Діріл режимінде белгішені әрдайым көрсету" "Док-станция динамигі ойнайды" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index 03c8b822367..4e21b4ded9a 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -443,7 +443,7 @@ "តម្រូវឱ្យ​បើកភ្នែក" "ដើម្បី​ដោះសោ​ទូរសព្ទ ភ្នែក​របស់អ្នក​ត្រូវតែបើក" "តម្រូវឱ្យមាន​ការបញ្ជាក់​ជានិច្ច" - "តម្រូវឱ្យបញ្ជាក់ជានិច្ច នៅពេលប្រើការដោះសោតាមទម្រង់មុខនៅក្នុងកម្មវិធី" + "តម្រូវឱ្យបញ្ជាក់ជានិច្ច នៅពេលប្រើការដោះសោដោយស្កេនមុខនៅក្នុងកម្មវិធី" "លុប​គំរូមុខ" "រៀបចំ​ការដោះសោ​តាមទម្រង់មុខ" "ប្រើមុខរបស់អ្នក​ដើម្បីដោះសោ​ទូរសព្ទរបស់អ្នក ឬសម្រាប់​ការផ្ទៀងផ្ទាត់​នៅក្នុងកម្មវិធី​ដូចជា នៅពេលអ្នកចូល ឬយល់ព្រម​លើការទិញជាដើម។\n\nសូមចងចាំថា៖\nអ្នកអាចរៀបចំ​មុខបានតែមួយប៉ុណ្ណោះ​ក្នុងមួយលើក។ ដើម្បីបញ្ចូល​មុខផ្សេងទៀត សូមលុប​មុខបច្ចុប្បន្ន​ចេញ។\n\nការមើល​ទៅ​ទូរសព្ទ​អាច​ដោះសោ​ទូរសព្ទបាន ទោះបីជា​អ្នក​មិនចង់​ដោះសោ​ក៏ដោយ។\n\nអ្នកផ្សេងអាច​ដោះសោទូរសព្ទ​របស់អ្នក ប្រសិនបើ​វា​ស្ថិតនៅ​ចំពី​មុខរបស់អ្នក។\n\nអ្នកដែល​មាន​មុខមាត់​ស្រដៀង​អ្នកខ្លាំង ដូចជា​បងប្អូន​បង្កើត​ដែលមានមុខមាត់​ដូចអ្នក​អាច​ដោះសោ​ទូរសព្ទ​របស់អ្នក​បាន។" @@ -531,7 +531,7 @@ "ការប្រើស្នាមម្រាមដៃ ឬនាឡិកា" "ការប្រើមុខ ស្នាមម្រាមដៃ ឬនាឡិកា" "ការប្រើនាឡិកា" - "រៀបចំការដោះសោ​ដោយប្រើស្នាមម្រាមដៃ ឬមុខជាមុនសិន" + "រៀបចំការដោះសោ​ដោយស្កេន​ស្នាមម្រាមដៃ ឬមុខជាមុនសិន" "អ្នកអាចដោះសោ​ដោយប្រើនាឡិកា​របស់អ្នកបាន នៅពេលមិនស្គាល់​ស្នាមម្រាមដៃ ឬមុខរបស់អ្នក" "រៀបចំ​ការដោះសោដោយប្រើ​ស្នាមម្រាមដៃជាមុនសិន" "អ្នកអាចដោះសោ​ដោយប្រើនាឡិកា​របស់អ្នកបាន នៅពេលមិនស្គាល់​ស្នាមម្រាមដៃរបស់អ្នក" @@ -543,8 +543,8 @@ "បានបញ្ចូលមុខ និង %s" "បានបញ្ចូលមុខ ស្នាមម្រាមដៃ និង %s" "បានបញ្ចូលមុខ ស្នាមម្រាមដៃ និង %s" - "ការដោះសោ​ដោយប្រើ​ស្នាមម្រាមដៃ និងតាមទម្រង់មុខ" - "ការដោះសោដោយប្រើ​ស្នាមម្រាមដៃ និងមុខ​សម្រាប់ការងារ" + "ការដោះសោ​ដោយស្កេន​ស្នាមម្រាមដៃ និងមុខ" + "ការដោះសោដោយស្កេន​ស្នាមម្រាមដៃ និងមុខ​សម្រាប់ការងារ" "ចុច​ដើម្បី​រៀបចំ" "បានបញ្ចូលស្នាមម្រាមដៃ និងមុខ" "បានបញ្ចូលស្នាមម្រាមដៃ និងមុខ" @@ -4307,9 +4307,9 @@ "ការ​កំណត់​ទាំង​នេះ​មិន​អាច​ប្ដូរ​ឥឡូវ​នេះ​បានទេ។ កម្មវិធី​បាន​បើក​មុខងារ​កុំរំខាន​ដោយ​ស្វ័យប្រវត្តិ​ដោយសកម្មភាពផ្ទាល់ខ្លួន។" "ការ​កំណត់​ទាំង​នេះ​មិន​អាច​ប្ដូរ​ឥឡូវ​នេះ​បានទេ។ មុខងារ​កុំរំខាន​ត្រូវបាន​បើក​ដោយផ្ទាល់​ដោយ​សកម្មភាព​ផ្ទាល់ខ្លួន។" "ពេលវេលា" - "ច្បាប់ស្វ័យប្រវត្តិបានកំណត់ដើម្បីបើក កុំរំខាន អំឡុងពេលវេលាដែលបានកំណត់" + "វិធានស្វ័យប្រវត្តិបានកំណត់ឱ្យបើកមុខងារកុំរំខាន ក្នុងអំឡុងពេលវេលាដែលបានបញ្ជាក់" "ព្រឹត្តិការណ៍" - "ច្បាប់ស្វ័យប្រវត្តិបានកំណត់ដើម្បីបើក កុំរំខាន អំឡុងពេលព្រឹត្តិការណ៍ដែលបានកំណត់" + "វិធានស្វ័យប្រវត្តិបានកំណត់ឱ្យបើកមុខងារកុំរំខាន ក្នុងអំឡុងព្រឹត្តិការណ៍ដែលបានបញ្ជាក់" "អំឡុងពេលព្រឹត្តិការណ៍សម្រាប់" "អំឡុងពេលព្រឹត្តិការណ៍សម្រាប់ %1$s" "ប្រតិទិនណាមួយ" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 07455d76d8b..f7c98bb9baa 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -280,7 +280,7 @@ "ದಿನಾಂಕ, ಸಮಯ, ಸಮಯದ ವಲಯದ, & ಸ್ವರೂಪಗಳನ್ನು ಹೊಂದಿಸಿ" "ಸಮಯವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಹೊಂದಿಸಿ" "ಸಮಯವಲಯವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಹೊಂದಿಸಿ" - "ಸ್ಥಳೀಯ ಭಾಷೆ ಡೀಫಾಲ್ಟ್ ಬಳಸಿ" + "ಭಾಷೆ ಡೀಫಾಲ್ಟ್ ಬಳಸಿ" "24‑ಗಂಟೆಯ ಸ್ವರೂಪ" "24-ಗಂಟೆ ಫಾರ್ಮ್ಯಾಟ್‌‌ ಬಳಸಿ" "ಸಮಯ" @@ -559,7 +559,7 @@ "ಸಾಧನವನ್ನು ನಿಮ್ಮ ಪೋಷಕರಿಗೆ ಹಿಂದಿರುಗಿಸಿ" "ಫೋನ್ ಅನ್ನು ನಿಮ್ಮ ಪೋಷಕರಿಗೆ ಹಿಂದಿರುಗಿಸಿ" "ಸರಿ" - "ಪರದೆಯ ಲಾಕ್ ಸ್ಕಿಪ್ ಮಾಡುವುದೇ?" + "ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಸ್ಕಿಪ್ ಮಾಡಬೇಕೆ?" "ಸಾಧನದ ರಕ್ಷಣೆ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆನ್‌ ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಈ ಸಾಧನವು ಕಳೆದು ಹೋದರೆ ಅಥವಾ ಕಳವಾದರೆ ಇತರರು ಇದನ್ನು ಬಳಸುವುದನ್ನು ನಿಮಗೆ ತಡೆಯಲು ಸಾಧ್ಯವಾಗದೆ ಇರಬಹುದು." "ಸಾಧನದ ರಕ್ಷಣೆ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆನ್‌ ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಈ ಸಾಧನವು ಕಳೆದು ಹೋದರೆ ಅಥವಾ ಕಳವಾದರೆ ಇತರರು ಇದನ್ನು ಬಳಸುವುದನ್ನು ನಿಮಗೆ ತಡೆಯಲು ಸಾಧ್ಯವಾಗದೆ ಇರಬಹುದು." "ಸಾಧನದ ರಕ್ಷಣೆ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆನ್‌ ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಈ ಫೋನ್‌ ಕಳೆದು ಹೋದರೆ ಅಥವಾ ಕಳವಾದರೆ ಇತರರು ಇದನ್ನು ಬಳಸುವುದನ್ನು ನಿಮಗೆ ತಡೆಯಲು ಸಾಧ್ಯವಾಗದೆ ಇರಬಹುದು." @@ -620,7 +620,7 @@ "ನಂತರ ಮಾಡಿ" "ಎತ್ತಿರಿ, ನಂತರ ಪುನಃ ಸ್ಪರ್ಶಿಸಿ" "ಸೆನ್ಸರ್ ಮೇಲೆ ನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌ನ ಒಂದು ಬದಿಯನ್ನು ಇರಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ, ನಂತರ ಇನ್ನೊಂದು ಬದಿಗೆ ಬದಲಿಸಿ" - "ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಮಾಡುವುದೇ?" + "ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಮಾಡಬೇಕೆ?" "ನಿಮ್ಮ ಫೋನ್ ಅನ್‌ಲಾಕ್ ಮಾಡಲು ಒಂದು ಮಾರ್ಗವಾಗಿ ನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಅನ್ನು ಬಳಸಲು ನೀವು ಆಯ್ಕೆಮಾಡಿರುವಿರಿ. ನೀವು ಇದೀಗ ಸ್ಕಿಪ್ ಮಾಡಿದರೆ, ನೀವು ಇದನ್ನು ನಂತರ ಹೊಂದಿಸುವ ಅಗತ್ಯವಿರುತ್ತದೆ. ಸೆಟಪ್ ಕೇವಲ ನಿಮಿಷದಷ್ಟು ಸಮಯವನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ." "ಟ್ಯಾಬ್ಲೆಟ್‌‌ ಕಳೆದುಹೋದರೆ ಅಥವಾ ಕಳುವಾದರೆ ಅದನ್ನು ಪಿನ್ ರಕ್ಷಿಸುತ್ತದೆ" "ಟ್ಯಾಬ್ಲೆಟ್‌‌ ಕಳೆದುಹೋದರೆ ಅಥವಾ ಕಳುವಾದರೆ ಅದನ್ನು ಪ್ಯಾಟರ್ನ್ ರಕ್ಷಿಸುತ್ತದೆ" @@ -659,17 +659,17 @@ "ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಮತ್ತು ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ಹೊಂದಿಸಲು ನಿಮಗೆ ಪ್ಯಾಟರ್ನ್ ಅಗತ್ಯವಿದೆ.\n\nಫೋನ್ ಕಳೆದುಹೋದರೆ ಅಥವಾ ಕಳುವಾದರೆ ಅದನ್ನು ಪ್ಯಾಟರ್ನ್ ರಕ್ಷಿಸುತ್ತದೆ." "ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಮತ್ತು ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ಹೊಂದಿಸಲು ನಿಮಗೆ ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿದೆ.\n\nಫೋನ್ ಕಳೆದುಹೋದರೆ ಅಥವಾ ಕಳುವಾದರೆ ಅದನ್ನು ಪಾಸ್‌ವರ್ಡ್ ರಕ್ಷಿಸುತ್ತದೆ." "ಪಿನ್ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಮಾಡಬೇಕೇ?" - "ಪಿನ್ ಮತ್ತು ಫೇಸ್‌ಗಾಗಿ ಸೆಟಪ್ ಅನ್ನು ಸ್ಕಿಪ್ ಮಾಡುವುದೇ?" + "ಪಿನ್ ಮತ್ತು ಫೇಸ್‌ಗಾಗಿ ಸೆಟಪ್ ಅನ್ನು ಸ್ಕಿಪ್ ಮಾಡಬೇಕೆ?" "ಪಿನ್ ಮತ್ತು ಫಿಂಗರ್ ಪ್ರಿಂಟ್‌ಗಾಗಿ ಸೆಟಪ್ ಅನ್ನು ಸ್ಕಿಪ್ ಮಾಡಬೇಕೆ?" "ಪಿನ್‌‌, ಫೇಸ್ ಮತ್ತು ಫಿಂಗರ್‌ ಪ್ರಿಂಟ್‌ಗಾಗಿ ಸೆಟಪ್ ಅನ್ನು ಸ್ಕಿಪ್ ಮಾಡಬೇಕೆ?" - "ಪಾಸ್‌ವರ್ಡ್ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಮಾಡುವುದೇ?" - "ಪಾಸ್‌ವರ್ಡ್ ಮತ್ತು ಫೇಸ್‌ಗೆ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಮಾಡುವುದೇ?" + "ಪಾಸ್‌ವರ್ಡ್ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಮಾಡಬೇಕೆ?" + "ಪಾಸ್‌ವರ್ಡ್ ಮತ್ತು ಫೇಸ್‌ಗೆ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಮಾಡಬೇಕೆ?" "ಪಾಸ್‌ವರ್ಡ್, ಫಿಂಗರ್‌ ಪ್ರಿಂಟ್ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಬೇಕೆ?" - "ಪಾಸ್‌ವರ್ಡ್, ಫೇಸ್ ಮತ್ತು ಫಿಂಗರ್‌ ಪ್ರಿಂಟ್‌ಗಾಗಿ ಸೆಟಪ್ ಅನ್ನು ಸ್ಕಿಪ್ ಮಾಡುವುದೇ?" - "ಪ್ಯಾಟರ್ನ್ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಮಾಡುವುದೇ?" - "ಪ್ಯಾಟರ್ನ್ ಮತ್ತು ಫೇಸ್‌ಗಾಗಿ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಮಾಡುವುದೇ?" + "ಪಾಸ್‌ವರ್ಡ್, ಫೇಸ್ ಮತ್ತು ಫಿಂಗರ್‌ ಪ್ರಿಂಟ್‌ಗಾಗಿ ಸೆಟಪ್ ಅನ್ನು ಸ್ಕಿಪ್ ಮಾಡಬೇಕೆ?" + "ಪ್ಯಾಟರ್ನ್ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಮಾಡಬೇಕೆ?" + "ಪ್ಯಾಟರ್ನ್ ಮತ್ತು ಫೇಸ್‌ಗಾಗಿ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಮಾಡಬೇಕೆ?" "ಪ್ಯಾಟರ್ನ್, ಫಿಂಗರ್‌ ಪ್ರಿಂಟ್ ಸೆಟಪ್ ಸ್ಕಿಪ್ ಮಾಡಬೇಕೆ?" - "ಪ್ಯಾಟರ್ನ್, ಫೇಸ್ ಮತ್ತು ಫಿಂಗರ್‌ ಪ್ರಿಂಟ್‌ಗಾಗಿ ಸೆಟಪ್ ಅನ್ನು ಸ್ಕಿಪ್ ಮಾಡುವುದೇ?" + "ಪ್ಯಾಟರ್ನ್, ಫೇಸ್ ಮತ್ತು ಫಿಂಗರ್‌ ಪ್ರಿಂಟ್‌ಗಾಗಿ ಸೆಟಪ್ ಅನ್ನು ಸ್ಕಿಪ್ ಮಾಡಬೇಕೆ?" "ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಹೊಂದಿಸಿ" "ಮುಗಿದಿದೆ" "ಓಹ್, ಅದು ಸೆನ್ಸರ್ ಅಲ್ಲ" @@ -948,7 +948,7 @@ "ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ" "ಕೀಬೋರ್ಡ್" "ಸಂಪರ್ಕಗಳು ಮತ್ತು ಕರೆ ಇತಿಹಾಸ" - "ಈ ಸಾಧನದ ಜೊತೆಗೆ ಜೋಡಿ ಮಾಡುವುದೇ?" + "ಈ ಸಾಧನದ ಜೊತೆಗೆ ಜೋಡಿ ಮಾಡಬೇಕೆ?" "ಫೋನ್ ಪುಸ್ತಕವನ್ನು ಹಂಚಿಕೊಳ್ಳುವುದೇ?" "%1$s ನಿಮ್ಮ ಸಂಪರ್ಕಗಳು ಮತ್ತು ಕರೆಯ ಇತಿಹಾಸವನ್ನು ಪ್ರವೇಶಿಸಲು ಬಯಸುತ್ತದೆ." "ಬ್ಲೂಟೂತ್ ಜೊತೆಗೆ ಜೋಡಿಸಲು %1$s ಬಯಸುತ್ತದೆ. ಸಂಪರ್ಕಗೊಳಿಸಿದಾಗ, ಅದು ನಿಮ್ಮ ಸಂಪರ್ಕಗಳು ಮತ್ತು ಕರೆ ಇತಿಹಾಸಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಪಡೆಯುತ್ತದೆ." @@ -971,7 +971,7 @@ "ಸಾಧನದ ಬ್ಲೂಟೂತ್ ವಿಳಾಸ:\n%1$s" "ಸಾಧನವನ್ನು ಮರೆತಿದ್ದೀರಾ?" "ಅಸೋಸಿಯೇಷನ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ" - "ಆ್ಯಪ್ ಅನ್ನು ಡಿಸ್‌ಕನೆಕ್ಟ್ ಮಾಡುವುದೇ?" + "ಆ್ಯಪ್ ಅನ್ನು ಡಿಸ್‌ಕನೆಕ್ಟ್ ಮಾಡಬೇಕೆ?" "ನಿಮ್ಮ ಫೋನ್‌ ಅನ್ನು ಇನ್ನು ಮುಂದೆ %1$s ಜೊತೆಗೆ ಜೋಡಿಸಲಾಗುವುದಿಲ್ಲ" "ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ ಅನ್ನು ಇನ್ನು ಮುಂದೆ %1$s ಜೊತೆಗೆ ಜೋಡಿಸಲಾಗುವುದಿಲ್ಲ" "ನಿಮ್ಮ ಸಾಧನವನ್ನು ಇನ್ನು ಮುಂದೆ %1$s ಜೊತೆಗೆ ಜೋಡಿಸಲಾಗುವುದಿಲ್ಲ" @@ -1207,7 +1207,7 @@ "ಇದನ್ನು ಆಫ್ ಮಾಡಲು, ಓವರ್‌ಫ್ಲೋ ಮೆನುವಿನಲ್ಲಿನ ಸುಧಾರಿತ ಗೆ ಹೋಗಿ." "ಅನುಮತಿಸಿ" "ನಿರಾಕರಿಸಿ" - "ಸಂಪರ್ಕಪಡಿಸಲು ಸೈನ್‌ ಇನ್‌ ಮಾಡುವುದೇ?" + "ಕನೆಕ್ಟ್ ಮಾಡಲು ಸೈನ್‌ ಇನ್‌ ಮಾಡಬೇಕೆ?" "ನೀವು ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸುವ ಮೊದಲು ಆನ್‌ಲೈನ್‌ನಲ್ಲಿ ಸೈನ್‌ ಇನ್‌ ಮಾಡಲು ನಿಮಗೆ %1$s ಅಗತ್ಯವಿರುತ್ತದೆ." "ಸಂಪರ್ಕಿಸಿ" "ಈ ನೆಟ್‌ವರ್ಕ್ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ. ಸಂಪರ್ಕದಲ್ಲಿರುವುದೇ?" @@ -1359,7 +1359,7 @@ "%1$s ಗಾಗಿ ವೈ-ಫೈ ಕರೆಯನ್ನು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" "%1$s ಇಂದ ಡಿಸ್ಕನೆಕ್ಟ್ ಆಗಿದೆ" "ವಾಹಕ" - "ಪ್ರದರ್ಶನ" + "ಡಿಸ್‌ಪ್ಲೇ" "ಧ್ವನಿ ಮತ್ತು ವೈಬ್ರೇಷನ್" "ವಾಲ್ಯುಮ್‌ಗಳು" "ಸಂಗೀತ ಎಫೆಕ್ಟ್" @@ -1409,7 +1409,7 @@ "ಕೆಲಸದ ಖಾತೆ - %s" "ವೈಯಕ್ತಿಕ ಖಾತೆ - %s" "ಹುಡುಕಿ" - "ಪ್ರದರ್ಶನ" + "ಡಿಸ್‌ಪ್ಲೇ" "ಸ್ಕ್ರೀನ್ ಅನ್ನು ಸ್ವಯಂ-ತಿರುಗಿಸಿ" "ಆಫ್" "ಆನ್ ಆಗಿದೆ" @@ -1794,7 +1794,7 @@ "ಫೋಟೋಗಳು, ವೀಡಿಯೊಗಳು, ಸಂಗೀತ ಮತ್ತು ಇತ್ಯಾದಿಗಳನ್ನು ಸಂಗ್ರಹಿಸಿ ಹಾಗೂ ಅವುಗಳನ್ನು ಇತರ ಸಾಧನಗಳಲ್ಲಿ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ. <a href=https://support.google.com/android/answer/12153449>SD ಕಾರ್ಡ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡುವುದರ ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</a>." "ಫಾರ್ಮ್ಯಾಟ್ ಮಾಡಿ" "ನಂತರ ಹೊಂದಿಸಿ" - "ಈ ^1 ಅನ್ನು ಫಾರ್ಮ್ಯಾಟ್‌ ಮಾಡುವುದೇ?" + "ಈ ^1 ಅನ್ನು ಫಾರ್ಮ್ಯಾಟ್‌ ಮಾಡಬೇಕೆ?" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು, ಫೈಲ್‌ಗಳನ್ನು ಮತ್ತು ಮಾಧ್ಯಮವನ್ನು ಸಂಗ್ರಹಿಸಲು ಈ ^1 ಅನ್ನು ಫಾರ್ಮ್ಯಾಟ್ ಮಾಡಬೇಕಾಗಿದೆ. \n\nಫಾರ್ಮ್ಯಾಟ್ ಮಾಡುವುದು ^2 ನಲ್ಲಿನ ಪ್ರಸ್ತುತ ವಿಷಯವನ್ನು ಅಳಿಸಿ ಹಾಕುತ್ತದೆ. ವಿಷಯವನ್ನು ಕಳೆದುಕೊಳ್ಳುವುದನ್ನು ತಪ್ಪಿಸಲು, ಇನ್ನೊಂದು ^3 ಗೆ ಅಥವಾ ಸಾಧನಕ್ಕೆ ಬ್ಯಾಕಪ್ ಮಾಡಿ." "ಫೋಟೋಗಳು, ವೀಡಿಯೊಗಳು, ಸಂಗೀತ ಮತ್ತು ಇತ್ಯಾದಿಗಳನ್ನು ಸಂಗ್ರಹಿಸುವುದಕ್ಕಾಗಿ ಈ ^1 ಅನ್ನು ಫಾರ್ಮ್ಯಾಟ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ. \n\nಫಾರ್ಮ್ಯಾಟ್ ಮಾಡುವುದರಿಂದ ^2 ನಲ್ಲಿ ಉಳಿಸಿರುವ ವಿಷಯವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ. ವಿಷಯವನ್ನು ಕಳೆದುಕೊಳ್ಳುವುದನ್ನು ತಪ್ಪಿಸಲು, ಬೇರೊಂದು ^3 ಅಥವಾ ಸಾಧನಕ್ಕೆ ಅದನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಿ." "^1 ಫಾರ್ಮ್ಯಾಟ್" @@ -2257,7 +2257,7 @@ "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ ಪ್ರಾಶಸ್ತ್ಯದ ಸ್ಥಾಪನೆ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸಿ" "ಅಪ್ಲಿಕೇಶನ್‌ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ" "ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, Android ಮತ್ತು ಇತರ ಆ್ಯಪ್‌ಗಳು ಇನ್ನು ಮುಂದೆ ಉದ್ದೇಶಿಸಿದ ಹಾಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರಬಹುದು. ಈ ಆ್ಯಪ್ ಅನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪೂರ್ವ-ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿರುವುದರಿಂದ, ನೀವು ಅದನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ ಎಂಬುದನ್ನು ನೆನಪಿನಲ್ಲಿಡಿ. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವ ಮೂಲಕ, ಈ ಆ್ಯಪ್ ಅನ್ನು ನೀವು ಆಫ್ ಮಾಡಬಹುದು ಮತ್ತು ಅದನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಮರೆ ಮಾಡಬಹುದು." - "ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್‌ ಮಾಡುವುದೇ?" + "ನೋಟಿಫಿಕೇಶನ್‍ಗಳನ್ನು ಆಫ್‌ ಮಾಡಬೇಕೆ?" "ಸ್ಟೋರ್" "ಅಪ್ಲಿಕೇಶನ್ ವಿವರಗಳು" "%1$s ನಿಂದ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಲಾಗಿದೆ" @@ -2404,7 +2404,7 @@ "ಅಪ್ಲಿಕೇಶನ್‌" "ಕಳೆದ ಬಾರಿಯ ಬಳಕೆ" "ಬಳಕೆ ಸಮಯ" - "ಪ್ರವೇಶ ಲಭ್ಯತೆ" + "ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ" "ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಡಿಸ್‌ಪ್ಲೇ, ಸಂವಹನ, ಆಡಿಯೋ" "ವಿಷನ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು" @@ -2414,7 +2414,7 @@ "ಶೀರ್ಷಿಕೆಗಳು" "ಆಡಿಯೋ" "ಸಾಮಾನ್ಯ" - "ಪ್ರದರ್ಶನ" + "ಡಿಸ್‌ಪ್ಲೇ" "ಬಣ್ಣ ಮತ್ತು ಚಲನೆ" "ಸ್ಕ್ರೀನ್ ಅನ್ನು ಇನ್ನಷ್ಟು ಡಾರ್ಕ್ ಆಗಿಸಿ" "ಸಂವಹನ ನಿಯಂತ್ರಣಗಳು" @@ -3295,7 +3295,7 @@ "ಇದೀಗ ಸಿಂಕ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…" "ಬ್ಯಾಕಪ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ನನ್ನ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬ್ಯಾಕ್‌ ಅಪ್ ಮಾಡು" - "ಈಗ ಸಿಂಕ್ ಮಾಡು" + "ಈಗ ಸಿಂಕ್ ಮಾಡಿ" "ಸಿಂಕ್ ರದ್ದುಪಡಿಸು" "ಈಗ ಸಿಂಕ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ %1$s" @@ -3379,7 +3379,7 @@ "ಸ್ವಯಂ-ಸಿಂಕ್‌ ಡೇಟಾ ಆನ್‌‌ಮಾಡುವುದೇ?" "ವೆಬ್‌ನಲ್ಲಿ ನಿಮ್ಮ ಖಾತೆಗಳಲ್ಲಿ ಮಾಡಲಾದ್ ಯಾವುದೇ ಬದಲಾವಣೆಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ಗೆ ನಕಲಿಸಲಾಗುತ್ತದೆ.\n\nಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ನೀವು ಮಾಡುವ ಯಾವುದೇ ಬದಲಾವಣೆಗಳನ್ನು ಕೆಲವು ಖಾತೆಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವೆಬ್‌ಗೆ ನಕಲಿಸುತ್ತವೆ. Google ಖಾತೆ ಕಾರ್ಯನಿರ್ವಹಿಸುವ ರೀತಿ ಇದು." "ವೆಬ್‌ನಲ್ಲಿ ನಿಮ್ಮ ಖಾತೆಗಳಲ್ಲಿ ನೀವು ಯಾವುದೇ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಿದರೆ, ಅವುಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿಮ್ಮ ಫೋನ್‌ಗೆ ನಕಲಿಸಲಾಗುತ್ತದೆ.\n\nಅದಲ್ಲದೆ ಫೋನ್‍‍ನಲ್ಲಿ ನೀವು ಮಾಡುವ ಯಾವುದೇ ಬದಲಾವಣೆಗಳನ್ನು ಕೆಲವು ಖಾತೆಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವೆಬ್‌ಗೆ ಸಹ ನಕಲಿಸಬಹುದು. Google ಖಾತೆ ಕಾರ್ಯನಿರ್ವಹಿಸುವ ರೀತಿ ಇದು." - "ಸ್ವಯಂ-ಸಿಂಕ್‌ ಡೇಟಾ ಆಫ್‌ ಮಾಡುವುದೇ?" + "ಸ್ವಯಂ-ಸಿಂಕ್‌ ಡೇಟಾ ಆಫ್‌ ಮಾಡಬೇಕೆ?" "ಇದು ಡೇಟಾ ಮತ್ತು ಬ್ಯಾಟರಿ ಪೋಲಾಗದಂತೆ ತಡೆಯುತ್ತದೆ. ಆದರೆ ಇತ್ತೀಚಿನ ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಲು ನೀವು ಪ್ರತಿ ಖಾತೆಯನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಸಿಂಕ್‌ ಮಾಡಬೇಕಾಗುತ್ತದೆ. ಜೊತೆಗೆ, ಅಪ್‌ಡೇಟ್‌ಗಳ ಸಂದರ್ಭದಲ್ಲಿ ನಿಮಗೆ ಅಧಿಸೂಚನೆ ಬರುವುದಿಲ್ಲ." "ಬಳಕೆಯ ಸುತ್ತು ಮರುಹೊಂದಿಕೆ ಡೇಟಾ" "ಪ್ರತಿ ತಿಂಗಳ ದಿನಾಂಕ:" @@ -3559,9 +3559,9 @@ "ಫೋನ್ ಕರೆಗಳನ್ನು ಆನ್ ಮಾಡಿ" "ಫೋನ್ ಕರೆಗಳು ಮತ್ತು ಎಸ್‌ಎಂಎಸ್‌ ಆನ್ ಮಾಡಿ" "ಬಳಕೆದಾರರನ್ನು ಅಳಿಸಿ" - "ಫೋನ್ ಕರೆಗಳನ್ನು ಆನ್ ಮಾಡುವುದೇ?" + "ಫೋನ್ ಕರೆಗಳನ್ನು ಆನ್ ಮಾಡಬೇಕೆ?" "ಕರೆ ಇತಿಹಾಸವನ್ನು ಈ ಬಳಕೆದಾರರ ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ." - "ಫೋನ್ ಕರೆಗಳು & SMS ಆನ್ ಮಾಡುವುದೇ?" + "ಫೋನ್ ಕರೆಗಳು & SMS ಆನ್ ಮಾಡಬೇಕೆ?" "ಕರೆ ಮತ್ತು SMS ಇತಿಹಾಸವನ್ನು ಈ ಬಳಕೆದಾರರ ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ." "ತುರ್ತು ಮಾಹಿತಿ" "%1$s ಗಾಗಿ ಮಾಹಿತಿ ಮತ್ತು ಸಂಪರ್ಕಗಳು" @@ -4613,7 +4613,7 @@ "ಸಹಾಯ & ಧ್ವನಿ ಇನ್‌ಪುಟ್" "ಡಿಜಿಟಲ್ ಅಸಿಸ್ಟೆಂಟ್ ಆ್ಯಪ್" "ಡೀಫಾಲ್ಟ್ ಡಿಜಿಟಲ್ ಅಸಿಸ್ಟೆಂಟ್ ಆ್ಯಪ್" - "%s ಅನ್ನು ನಿಮ್ಮ ಸಹಾಯಕವನ್ನಾಗಿ ಮಾಡುವುದೇ?" + "%s ಅನ್ನು ನಿಮ್ಮ ಸಹಾಯಕವನ್ನಾಗಿ ಮಾಡಬೇಕೆ?" "ನಿಮ್ಮ ಪರದೆಯಲ್ಲಿ ಗೋಚರಿಸುವ ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಲ್ಲಿಯೇ ಪ್ರವೇಶಿಸಬಹುದಾದಂತಹ ಮಾಹಿತಿ ಸೇರಿದಂತೆ ನಿಮ್ಮ ಸಿಸ್ಟಂನಲ್ಲಿ ಬಳಕೆಯಲ್ಲಿರುವ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಓದಲು ಸಹಾಯಕಕ್ಕೆ ಸಾಧ್ಯವಾಗಬಹುದು." "ಅನುಮೋದಿಸು" "ಅನುಮೋದಿಸದಿರು" @@ -5331,7 +5331,7 @@ "ಆಫ್" "ಆನ್" "ತತ್‌ಕ್ಷಣದ ಅಪ್ಲಿಕೇಶನ್" - "ಸಂಗ್ರಹಣೆ ನಿರ್ವಾಹಕವನ್ನು ಆಫ್ ಮಾಡುವುದೇ?" + "ಸಂಗ್ರಹಣೆ ನಿರ್ವಾಹಕವನ್ನು ಆಫ್ ಮಾಡಬೇಕೆ?" "ಚಲನಚಿತ್ರ ಮತ್ತು ಟಿವಿ ಆ್ಯಪ್‍‍ಗಳು" "ವಾಹಕ ಪೂರೈಕೆಯ ಮಾಹಿತಿ" "ಟ್ರಿಗ್ಗರ್ ವಾಹಕ ಪೂರೈಕೆ" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index 3ed92f12db0..748bf501415 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -227,7 +227,7 @@ "Бардык тилдер" "Системанын тили" "Системанын демейки параметрлери" - "Бул колдонмонун тилин Жөндөөлөрдөн тандоого болбойт." + "Бул колдонмонун тилин Параметрлерден тандоого болбойт." "Тил колдонмодо жеткиликтүү тилдерден айырмаланышы мүмкүн. Бул жөндөө айрым колдонмолор тарабынан колдоого алынбайт болушу мүмкүн." "Бул жерде тил тандоого мүмкүн болгон колдонмолорду гана көрөсүз." @@ -346,11 +346,11 @@ "Коопсуздук жана купуялык" "Колдонмолордун коопсуздугу, түзмөктүн кулпусу, уруксаттар" "Жүз кошулду" - "Жүзүнөн таанып ачуу функциясын тууралоо үчүн таптаңыз" + "Жүзүнөн таанып ачуу функциясын кошуу үчүн таптаңыз" "Жүзүнөн таанып ачуу" "Жумуш профили үчүн Жүзүнөн таанып ачуу функциясы" "Жүзүнөн таанып ачуу функциясын кантип койсо болот" - "Жүзүнөн таанып ачууну тууралоо" + "Жүзүнөн таанып ачууну коюу" "Жүзүңүз менен аныктыгыңызды текшертиңиз" @@ -435,7 +435,7 @@ "Жүзүнөн таанып ачуу функциясын кайрадан жөндөңүз" "Жүзүнөн таанып ачуу функциясын кайрадан жөндөңүз" "Коопсуздукту жана иштин майнаптуулугун жакшыртыңыз" - "Жүзүнөн таанып ачууну тууралоо" + "Жүзүнөн таанып ачууну коюу" "Жүзүнөн таанып ачуу функциясын кайра коюу үчүн жүзүңүздүн учурдагы үлгүсүн өчүрүңүз.\n\nЖүзүңүздүн үлгүсү биротоло өчүрүлөт.\n\nӨчүрүлгөндөн кийин телефонуңуздун кулпусун ачуу же колдонмолордо аутентификациядан өтүү үчүн PIN кодуңуз, графикалык ачкычыңыз же сырсөзүңүз керек болот." "Жүзүнөн таанып ачуу функциясын кайра коюу үчүн жүзүңүздүн учурдагы үлгүсүн өчүрүңүз.\n\nЖүзүңүздүн үлгүсү биротоло өчүрүлөт.\n\nӨчүрүлгөндөн кийин телефонуңуздун кулпусун ачуу же колдонмолордо аутентификациядан өтүү үчүн манжаңыздын изи, PIN код, графикалык ачкыч же сырсөз керек болот." "Жүзүнөн таанып ачуу:" @@ -445,7 +445,7 @@ "Ар дайым ырастоо талап кылынсын" "Жүзүнөн таанып ачуу функциясы колдонулганда, ар дайым ырастоо талап кылынат" "Жүздүн үлгүсүн өчүрүү" - "Жүзүнөн таанып ачууну тууралоо" + "Жүзүнөн таанып ачууну коюу" "Жүзүңүз менен телефонуңуздун кулпусун ачыңыз же өзүңүздү ырастаңыз (мисалы, колдонмолорго кирүү же кандайдыр бир нерсени сатып алуу үчүн).\n\nКөңүл буруңуз:\nБир убакта бир гана жүз кошо аласыз. Башка жүз кошуу үчүн учурдагыны өчүрүшүңүз керек.\n\nЭкранды карап койсоңуз эле, түзмөгүңүздүн кулпусу ачылып калышы мүмкүн.\n\nОшондой эле кимдир бирөө телефонуңузду жүзүңүзгө алып келип ачышы мүмкүн.\n\nТелефонуңуздун кулпусун сизге аябай окшош адам (мисалы, эгизиңиз) ачып алышы мүмкүн." "Жүзүңүз менен телефонуңуздун кулпусун ачыңыз же өзүңүздү ырастаңыз (мисалы, колдонмолорго кирүү же кандайдыр бир нерсени сатып алуу үчүн).\n\nКөңүл буруңуз:\nБир убакта бир гана жүз кошо аласыз. Башка жүз кошуу үчүн учурдагыны өчүрүшүңүз керек.\n\nЭкранды карап койсоңуз эле, түзмөгүңүздүн кулпусу ачылып калышы мүмкүн.\n\nОшондой эле кимдир бирөө көзүңүз жумулуп турганда да, телефонуңузду жүзүңүзгө жакын алып келип ачып алышы ыктымал.\n\nТелефонуңуздун кулпусун сизге аябай окшош адам (мисалы, эгизиңиз) ачып алышы мүмкүн." "Жүздүн үлгүсүн өчүрөсүзбү?" @@ -500,7 +500,7 @@ "Үлгүнү жаңыртуу үчүн Pixel Imprint функциясында алынган сүрөттөр колдонулат. Сүрөттөр менен үлгү түзмөктө гана иштелет. Сүрөттөр сакталбайт, ал эми манжа изинин үлгүсү түзмөгүңүздө гана сакталып, эч жакка жөнөтүлбөйт." "Ал Pixel Imprint\'ти колдонгондо манжасынын изинин үлгүсү сүрөттөр боюнча жаңыртылат. Балаңыздын манжа изинин үлгүсүн түзүү үчүн колдонулган сүрөттөр эч качан сакталбайт, ал эми манжа изинин үлгүсү планшетте гана сакталат. Сүрөттөр планшетте гана иштетилет." "Ал Pixel Imprint\'ти колдонгондо манжасынын изинин үлгүсү сүрөттөр боюнча жаңыртылат. Балаңыздын манжа изинин үлгүсүн түзүү үчүн колдонулган сүрөттөр эч качан сакталбайт, ал эми манжа изинин үлгүсү түзмөктө гана сакталат. Сүрөттөр түзмөктө гана иштетилет." - "Манжаңыздын изинин сүрөттөрүн жана үлгүсүн же \"Манжа изи менен ачуу\" функциясын Жөндөөлөрдөн каалаган убакта өчүрсөңүз болот. Манжа изинин сүрөттөрү жана үлгүлөрү өчүрүлмөйүнчө телефонуңузда сакталат." + "Манжаңыздын изинин сүрөттөрүн жана үлгүсүн же \"Манжа изи менен ачуу\" функциясын Параметрлерден каалаган убакта өчүрсөңүз болот. Манжа изинин сүрөттөрү жана үлгүлөрү өчүрүлмөйүнчө телефонуңузда сакталат." "Манжаңыздын изинин сүрөттөрүн жана үлгүсүн, же болбосо \"Манжа изи менен ачуу\" функциясын каалаган убакта Параметрлерге өтүп, өчүрсөңүз болот. Манжа изинин сүрөттөрү жана үлгүлөрү өчүрүлмөйүнчө планшетиңизде сакталат." "Манжаңыздын изинин сүрөттөрүн жана үлгүсүн, же болбосо \"Манжа изи менен ачуу\" функциясын каалаган убакта Параметрлерге өтүп, өчүрсөңүз болот. Манжа изинин сүрөттөрү жана үлгүлөрү өчүрүлмөйүнчө түзмөгүңүздө сакталат." "Манжа изинин сүрөттөрүн жана үлгүсүн, же болбосо Манжа изи менен ачуу функциясын каалаган убакта Параметрлерге өтүп, өчүрсөңүздөр болот. Манжа изинин сүрөттөрү жана үлгүлөрү өчүрүлмөйүнчө телефондо сакталат." @@ -640,15 +640,15 @@ "Манжа изи менен ачуу функциясын тууралоо үчүн PIN код талап кылынат.\n\nPIN код жоголгон же уурдалган телефондогу нерселерди коргойт." "Манжа изи менен ачуу функциясын тууралоо үчүн графикалык ачкыч талап кылынат.\n\nГрафикалык ачкыч жоголгон же уурдалган телефондогу нерселерди коргойт." "Манжа изи менен ачуу функциясын тууралоо үчүн сырсөз талап кылынат.\n\nСырсөз жоголгон же уурдалган телефонуңуздагы нерселерди коргойт." - "Жүзүнөн таанып ачуу функциясын тууралоо үчүн PIN код талап кылынат.\n\nPIN код планшет жоголсо же уурдалса, аны коргойт." - "Жүзүнөн таанып ачуу функциясын тууралоо үчүн графикалык ачкыч талап кылынат.\n\nГрафикалык ачкыч планшет жоголсо же уурдалса, аны коргойт." - "Жүзүнөн таанып ачуу функциясын тууралоо үчүн сырсөз талап кылынат.\n\nСырсөз планшет жоголсо же уурдалса, аны коргойт." - "Жүзүнөн таанып ачуу функциясын тууралоо үчүн PIN код талап кылынат.\n\nPIN код түзмөк жоголсо же уурдалса, аны коргойт." - "Жүзүнөн таанып ачуу функциясын тууралоо үчүн графикалык ачкыч талап кылынат.\n\nГрафикалык ачкыч түзмөк жоголсо же уурдалса, аны коргойт." - "Жүзүнөн таанып ачуу функциясын тууралоо үчүн сырсөз талап кылынат.\n\nСырсөз түзмөк жоголсо же уурдалса, аны коргойт." - "Жүзүнөн таанып ачуу функциясын тууралоо үчүн PIN код талап кылынат.\n\nPIN код жоголгон же уурдалган телефондогу нерселерди коргойт." - "Жүзүнөн таанып ачуу функциясын тууралоо үчүн графикалык ачкыч талап кылынат.\n\nГрафикалык ачкыч жоголгон же уурдалган телефондогу нерселерди коргойт." - "Жүзүнөн таанып ачуу функциясын тууралоо үчүн сырсөз талап кылынат.\n\nСырсөз жоголгон же уурдалган телефонуңуздагы нерселерди коргойт." + "Жүзүнөн таанып ачуу функциясын кошуу үчүн PIN код талап кылынат.\n\nPIN код планшет жоголсо же уурдалса, аны коргойт." + "Жүзүнөн таанып ачуу функциясын кошуу үчүн графикалык ачкыч талап кылынат.\n\nГрафикалык ачкыч планшет жоголсо же уурдалса, аны коргойт." + "Жүзүнөн таанып ачуу функциясын кошуу үчүн сырсөз талап кылынат.\n\nСырсөз планшет жоголсо же уурдалса, аны коргойт." + "Жүзүнөн таанып ачуу функциясын кошуу үчүн PIN код талап кылынат.\n\nPIN код түзмөк жоголсо же уурдалса, аны коргойт." + "Жүзүнөн таанып ачуу функциясын кошуу үчүн графикалык ачкыч талап кылынат.\n\nГрафикалык ачкыч түзмөк жоголсо же уурдалса, аны коргойт." + "Жүзүнөн таанып ачуу функциясын кошуу үчүн сырсөз талап кылынат.\n\nСырсөз түзмөк жоголсо же уурдалса, аны коргойт." + "Жүзүнөн таанып ачуу функциясын кошуу үчүн PIN код талап кылынат.\n\nPIN код жоголгон же уурдалган телефондогу нерселерди коргойт." + "Жүзүнөн таанып ачуу функциясын кошуу үчүн графикалык ачкыч талап кылынат.\n\nГрафикалык ачкыч жоголгон же уурдалган телефондогу нерселерди коргойт." + "Жүзүнөн таанып ачуу функциясын кошуу үчүн сырсөз талап кылынат.\n\nСырсөз жоголгон же уурдалган телефонуңуздагы нерселерди коргойт." "Жүзүнөн таанып ачуу жана манжа изи менен ачуу функцияларын коюу үчүн PIN код талап кылынат.\n\nPIN код планшет жоголсо же уурдалса, аны коргойт." "Жүзүнөн таанып ачуу жана манжа изи менен ачуу функцияларын коюу үчүн графикалык ачкыч талап кылынат.\n\nГрафикалык ачкыч планшет жоголсо же уурдалса, аны коргойт." "Жүзүнөн таанып ачуу жана манжа изи менен ачуу функцияларын коюу үчүн сырсөз талап кылынат.\n\nСырсөз планшет жоголсо же уурдалса, аны коргойт." @@ -675,7 +675,7 @@ "Ой, ал сенсор эмес" "Телефонуңуздун аркасындагы сенсорго сөөмөйүңүз менен тийиңиз." "Манжа изи кошулган жок" - "Манжа изин тууралоо убакыты бүтүп калды" + "Манжа изин коюу убакыты бүтүп калды" "Азыр аракет кылып көрүңүз же кийинчерээк тууралап алыңыз" "Манжа изи кошулбай калды. Кайра кайталап көрүңүз же башка манжаңыздын изин сактаңыз." "Дагы бирди кошуу" @@ -4015,7 +4015,7 @@ "Ыңгайлаштырылуучу билдирменин ирети" "Билдирмелерди ылайыктуулугу боюнча автоматтык түрдө иреттөө" "Ыңгайлаштырылуучу билдирмелер жөнүндө пикир билдирүү" - "Билдирмелерге киргизилген тууралоолорду жана тутумга пикир билдирүү опциясын көрсөтүү" + "Билдирмелерге киргизилген тууралоолорду жана системага пикир билдирүү опциясын көрсөтүү" "Маанилүүлүк параметрлерин баштапкы абалга келтирүү" "Колдонуучу өзгөрткөн маанилүүлүк параметрлерин баштапкы абалга келтирип, билдирмелер жардамчысына маанилүүлөрдү аныктоого уруксат бересиз" "Сунушталган аракеттер жана жооптор" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 6aaa738a67e..eb6fff7172c 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -1924,7 +1924,7 @@ "Atsisiųstų SIM kortelių negalima ištrinti dėl klaidos.\n\nIš naujo paleiskite įrenginį ir bandykite dar kartą." "Ištrinti visus duomenis (atkurti gamyklinius nustatymus)" "Ištr. duom. (atk. gam. nust.)" - "Bus ištrinti visi duomenys iš planšetinio kompiuterio ""vidinės atminties"", įskaitant:\n\n"
  • "„Google“ paskyrą;"
  • \n
  • "sistemos ir programų duomenis bei nustatymus;"
  • \n
  • "atsisiųstas programas."
  • + "Bus ištrinti visi duomenys iš planšetinio kompiuterio ""vidinės atminties"",.\n\n"
  • "„Google“ paskyra"
  • \n
  • "Sistemos ir programų duomenys bei nustatymai"
  • \n
  • "Atsisiųstos programos"
  • "Bus ištrinti visi duomenys iš telefono ""vidinės atminties"", įskaitant:\n\n"
  • "„Google“ paskyrą;"
  • \n
  • "sistemos ir programų duomenis bei nustatymus;"
  • \n
  • "atsisiųstas programas."
  • \n\n"Šiuo metu esate prisijungę prie šių paskyrų:\n" \n\n"Yra kitų šio įrenginio naudotojų.\n" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index ae7a1a8ccb3..1396cdb92c6 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -470,7 +470,7 @@ "Дознајте повеќе за „Отклучување со отпечаток“" "Користете го отпечатокот за да го отклучите таблетот или да потврдите дека сте вие, како кога се најавувате на апликации или одобрувате купување." "Користете го отпечатокот за да го отклучите уредот или да потврдите дека сте вие, како кога се најавувате на апликации или одобрувате купување." - "Користете го отпечатокот за да го отклучите телефонот или да потврдите дека сте вие, како кога се најавувате на апликации или одобрувате купување." + "Користете го отпечатокот за да го отклучувате телефонот или да потврдувате дека сте вие, како кога се најавувате на апликации или одобрувате купување." "Дозволете му на вашето дете да го користи отпечатокот за да го отклучи својот телефон или да потврди дека е тоа. Ова се случува кога се најавува во апликации, одобрува купување и друго." "Дозволете му на вашето дете да го користи отпечатокот за отклучување на таблетот или за потврдување на својот идентитет. Ова се случува кога се најавува на апликации, одобрува купување и друго." "Дозволете му на вашето дете да го користи отпечатокот за отклучување на уредот или за потврдување на својот идентитет. Ова се случува кога се најавува на апликации, одобрува купување и друго." @@ -611,9 +611,9 @@ "Сега може да го користите отпечатокот за да го отклучите таблетот или да потврдите дека сте вие, како кога се најавувате на апликации или одобрувате купување" "Сега може да го користите отпечатокот за да го отклучите уредот или да потврдите дека сте вие, како кога се најавувате на апликации или одобрувате купување" "Сега може да го користите отпечатокот за да го отклучите телефонот или да потврдите дека сте вие, како кога се најавувате на апликации или одобрувате купување" - "Сега може да го користите отпечатокот за да го отклучите таблетот или да потврдите дека сте вие, како кога се најавувате на апликации или одобрувате купување. \n\nДодајте уште еден отпечаток за да биде полесно да отклучувате кога го држите таблетот на различни начини." - "Сега може да го користите отпечатокот за да го отклучите уредот или да потврдите дека сте вие, како кога се најавувате на апликации или одобрувате купување.\n\nДодајте уште еден отпечаток за да биде полесно да отклучувате кога го држите уредот на различни начини." - "Сега може да го користите отпечатокот за да го отклучите телефонот или да потврдите дека сте вие, како кога се најавувате на апликации или одобрувате купување.\n\nДодајте уште еден отпечаток за да биде полесно да отклучувате кога го држите телефонот на различни начини." + "Сега може да го користите отпечатокот за да го отклучувате таблетот или да потврдувате дека сте вие, како кога се најавувате на апликации или одобрувате купување. \n\nДодајте уште еден отпечаток за полесно да го отклучувате таблетот кога го држите на различни начини." + "Сега може да го користите отпечатокот за да го отклучувате уредот или да потврдувате дека сте вие, како кога се најавувате на апликации или одобрувате купување.\n\nДодајте уште еден отпечаток за полесно да го отклучувате уредот кога го држите на различни начини." + "Сега може да го користите отпечатокот за да го отклучувате телефонот или да потврдувате дека сте вие, како кога се најавувате на апликации или одобрувате купување.\n\nДодајте уште еден отпечаток за полесно да го отклучувате телефонот кога го држите на различни начини." "Допрете за да отклучите во секое време" "Допрете го сензорот за да отклучите дури и кога екранот е исклучен. Вака, веројатноста за ненамерно отклучување е поголема." "Екран, отклучување" @@ -678,7 +678,7 @@ "Времето за поставување отпечаток истече" "Обидете се повторно сега или поставете отпечаток подоцна во „Поставки“" "Внесувањето отпечаток не успеа. Обидете се повторно или користете друг прст." - "Додај друг" + "Додајте уште еден" "Следно" "Освен за отклучување на телефонот, отпечатокот може да го користите и за да авторизирате купувања и да пристапувате до апликации. ""Дознајте повеќе" "Опцијата за заклучување екран е оневозможена. За да дознаете повеќе, контактирајте со администраторот на организацијата." @@ -1408,7 +1408,7 @@ "Сметки со личен профил" "Работна сметка - %s" "Лична сметка - %s" - "Пребарај" + "Пребарување" "Приказ" "Автоматско ротирање на екранот" "Исклучено" @@ -1882,7 +1882,7 @@ "Преземените SIM-картички не може да се избришат поради грешка.\n\nРестартирајте го уредот и обидете се повторно." "Избриши ги сите податоци (фабричко ресетирање)" "Избриши ги сите податоци" - "Ова ќе ги избрише сите податоци од ""внатрешната меморија""на таблетот, заедно со:\n\n"
  • "вашата сметка на Google"
  • \n
  • "податоците и поставките на системот и апликациите"
  • \n
  • "преземените апликации"
  • + "Ова ќе ги избрише сите податоци од ""внатрешната меморија"" на таблетот, заедно со:\n\n"
  • "вашата сметка на Google"
  • \n
  • "податоците и поставките на системот и апликациите"
  • \n
  • "преземените апликации"
  • "Ова ќе ги избрише сите податоци од ""внатрешната меморија"" на телефонот, заедно со:\n\n"
  • "вашата сметка на Google"
  • \n
  • "податоците и поставките на системот и апликациите"
  • \n
  • "преземените апликации"
  • \n\n"Моментално сте најавени на следниве сметки:\n" \n\n"Присутни се и други корисници на уредот.\n" @@ -2608,7 +2608,7 @@ "Може да додадете инверзија на боите во „Брзи поставки“ и од врвот на екранот" "Дополнително затемнување е додадено во „Брзи поставки“. Повлечете надолу за да ја вклучите или исклучите кога сакате." "Може да додадете дополнително затемнување во „Брзи поставки“ и од врвот на екранот" - "Режимот со една рака е додаден во „Брзи поставки“. Повлечете надолу за да ја вклучите или исклучите кога сакате." + "Функцијата „Режим со една рака“ е додадена во „Брзи поставки“. Повлечете надолу за да ја вклучите или исклучите." "Може да додадете режим со една рака во „Брзи поставки“ и од врвот на екранот" "Отфрли" "Приспособете го приказот на боите на телефонот" @@ -3868,7 +3868,7 @@ "Тонови на тастатура за бирање" "Звук при заклучување екран" "Звуци и вибрации при полнење" - "Звуци на држач со звучници" + "Звуци при приклучување на док" "Звуци при допир" "Секогаш прикажувај икона во режим на вибрации" "Држач со звучници" @@ -5042,8 +5042,8 @@ "Испробајте ја темната тема" "Батеријата трае подолго" "Програмерски плочки за брзи поставки" - "Оневозможи го времето за авторизација преку ADB" - "Оневозможи автоматско отповикување на авторизацијата преку ADB за системите што не се поврзале повторно во стандардниот рок (7 дена) или во рокот конфигуриран од корисникот (најмалку 1 ден)." + "Оневозможи истекување на авторизацијата за ADB" + "Оневозможи автоматско повлекување на авторизацијата за ADB за системите што не се поврзале повторно во стандардниот рок (7 дена) или во рокот конфигуриран од корисникот (најмалку 1 ден)." "Трага од Winscope" "Сензорите се исклучени" "Поставки за работен профил" @@ -5318,8 +5318,8 @@ "Локација" "Индикатор за локација на статусната лента" "Прикажи за сите локации, вклучително и за мрежата и поврзливоста" - "Присилување целосни мерења со GNSS" - "Следете ги сите констелации и фреквенции со GNSS без работен циклус" + "Наметни целосни мерења со GNSS" + "Постојано следи ги сите констелации и фреквенции на GNSS" "Метод за внесување" "Ракописно пишување со пенкало" "Кога е овозможено, тековниот метод за внесување добива MotionEvent од пенкалото ако е фокусиран уредувач на текст." diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index 955c4029819..b6c987dd01a 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -1031,7 +1031,7 @@ "ഡീബഗ് ചെയ്യാവുന്ന ആപ്പുകളുടെ ബൈറ്റ്‌കോഡ് പരിശോധിക്കൂ" "ഡീബഗ്ഗ് ചെയ്യാവുന്ന ആപ്പുകൾക്കായി ബൈറ്റ്‌കോഡ് പരിശോധിക്കാൻ ART-യെ അനുവദിക്കുക" "റീഫ്രഷ് റേറ്റ് കാണിക്കൂ" - "നിലവിലെ ഡിസ്‌പ്ലേ റീഫ്രഷ് റേറ്റ് കാണിക്കൂ" + "നിലവിലെ ഡിസ്‌പ്ലേ റീഫ്രഷ് നിരക്ക് കാണിക്കൂ" "NFC" "ടാബ്‌ലെറ്റ് NFC ഉപകരണത്തിൽ സ്‌പർശിക്കുമ്പോൾ ഡാറ്റ കെെമാറ്റം അനുവദിക്കുക" "ഫോൺ NFC ഉപകരണത്തിൽ സ്‌പർശിക്കുമ്പോൾ ഡാറ്റ കെെമാറ്റം അനുവദിക്കുക" @@ -1464,8 +1464,8 @@ "സ്‌മൂത്ത് ഡിസ്പ്ലേ" "ചില ഉള്ളടക്കങ്ങളുടെ പുതുക്കൽ നിരക്ക് 60 Hz-ൽ നിന്നും 90 Hz-ലേക്ക് സ്വയമേവ ഉയർത്തുന്നു. ബാറ്ററി ഉപയോഗം വർദ്ധിപ്പിക്കുന്നു." - "പരമാവധി റീഫ്രെഷ് നിരക്ക് നിർബന്ധിതമാക്കുക" - "മെച്ചപ്പെട്ട സ്‌പർശന പ്രതികരണശേഷി, ആനിമേഷൻ നിലവാരം എന്നിവയ്‌ക്കുള്ള ഉയർന്ന പുതുക്കൽ നിരക്ക്. ബാറ്ററി ഉപയോഗം വർദ്ധിപ്പിക്കുന്നു." + "പരമാവധി റീഫ്രഷ് നിരക്ക് നിർബന്ധിതമാക്കുക" + "മെച്ചപ്പെട്ട സ്‌പർശന പ്രതികരണശേഷി, ആനിമേഷൻ നിലവാരം എന്നിവയ്‌ക്കുള്ള ഉയർന്ന റീഫ്രഷ് നിരക്ക്. ബാറ്ററി ഉപയോഗം വർദ്ധിപ്പിക്കുന്നു." "സ്ക്രീൻ ശ്രദ്ധ" "ഓണാണ് / നിങ്ങൾ അതിൽ നോക്കുന്നുണ്ടെങ്കിൽ സ്ക്രീൻ ഓഫാക്കില്ല" "ഓഫാണ്" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 68c61b1c5b8..43e7db59966 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -335,7 +335,7 @@ "Утсыг шифрлээгүй байна" "Төхөөрөмж шифрлэсэн" "Төхөөрөмжийг шифрлээгүй байна" - "Түгжигдсэн дэлгэц" + "Түгжээтэй дэлгэц" "Харуулах зүйл" "Миний Байршил, дэлгэц тайлах, SIM картны түгжээ, жуухны сангийн түгжээг тохируулах" "Миний Байршил, дэлгэц тайлах, жуухын сангийн түгжээ зэргийг тохируулах" @@ -4061,7 +4061,7 @@ "Эелдэг мэдэгдэл" "Мөн дараахад харагдана" "Статус самбар" - "Түгжигдсэн дэлгэц" + "Түгжээтэй дэлгэц" "Эелдэг мэдэгдэл нь үргэлж дуугүй байх ба доош татдаг сүүдэрт харагдана" "Зөвхөн доош татдаг сүүдэрт харагдана" "Доош татдаг сүүдэрт болон түгжигдсэн дэлгэцэд харагдана" @@ -4088,8 +4088,8 @@ "Бүх мэдэгдлийн агуулгыг харуулах" "Эмзэг контентыг зөвхөн түгжээг тайлсан үед харуулах" "Огт мэдэгдэл харуулахгүй" - "Та мэдэгдлийг түгжигдсэн дэлгэцэд хэрхэн харуулах хүсэлтэй байна вэ?" - "Түгжигдсэн дэлгэц" + "Та мэдэгдлийг түгжээтэй дэлгэцэд хэрхэн харуулах хүсэлтэй байна вэ?" + "Түгжээтэй дэлгэц" "Ажлын мэдэгдлийн бүх агуулгыг харуулах" "Ажлын эмзэг, хурц агуулгыг нуух" "Таны төхөөрөмж түгжээтэй үед та профайлын мэдэгдлээ хэрхэн харахыг хүсэж байна вэ?" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index b86fb503cec..23141c49ecd 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -48,7 +48,7 @@ "USB स्टोरेज मिटवा" "SD कार्ड मिटवा" "पूर्वावलोकन" - "पृष्ठ %2$d पैकी %1$d चे पूर्वावलोकन" + "पेज %2$d पैकी %1$d चे पूर्वावलोकन" "स्क्रीन वरील मजकूर आणखी लहान किंवा आणखी मोठा करा." "आणखी लहान करा" "आणखी मोठे करा" @@ -443,7 +443,7 @@ "डोळे उघडे असणे आवश्यक आहे" "फोन अनलॉक करण्यासाठी, तुमचे डोळे उघडे असणे आवश्यक आहे" "नेहमी खात्री करणे आवश्यक आहे" - "ॲप्समध्ये फेस अनलॉक वापरताना, नेहमी खात्री करणे आवश्यक आहे" + "ॲप्समध्ये फेस अनलॉक वापरताना, त्याची कन्फर्मेशन पायरी पार करणे आवश्यक आहे" "फेस मॉडेल हटवा" "फेस अनलॉक सेट करा" "तुम्ही साइन इन करणे किंवा खरेदीला मंजुरी देणे यांसारख्या गोष्टी करताना तुमचा फोन अनलॉक करण्यासाठी किंवा ॲप्समधील ऑथेंटिकेशनसाठी तुमचा चेहरा वापरा.\n\nलक्षात ठेवा:\nतुम्ही एकावेळी एकच चेहरा सेट करू शकता. दुसरा एखादा चेहरा जोडण्यासाठी सध्याचा हटवा.\n\nतुमचा हेतू नसतानादेखील फोनकडे पाहिल्यास तो अनलॉक होऊ शकतो.\n\nएखाद्या व्यक्तीने तुमचा फोन तुमच्या चेहऱ्याकडे धरल्यास तुमचा फोन अनलॉक केला जाऊ शकतो.\n\nतुमच्यासारखी दिसणारी व्यक्ती तुमचा फोन अनलॉक करू शकते, जसे की, तुमच्यासारखे दिसणारे भावंड." @@ -548,7 +548,7 @@ "सेट करण्यासाठी टॅप करा" "चेहरा आणि फिंगरप्रिंट जोडल्या" "चेहरा आणि फिंगरप्रिंट जोडली" - "तुम्ही फेस अनलॉक आणि फिंगरप्रिंट अनलॉक सेट करता तेव्हा, तुम्ही मास्क घातल्यास किंवा एखाद्या अंधार असलेल्या भागात असल्यास, तुमचा फोन तुमची फिंगरप्रिंट वापरण्यास सांगेल" + "तुम्ही फेस अनलॉक आणि फिंगरप्रिंट अनलॉक सेट करता, तेव्हा तुम्ही मास्क घातल्यास किंवा एखाद्या अंधार असलेल्या भागात असल्यास, तुमचा फोन तुमची फिंगरप्रिंट वापरण्यास सांगेल" "अनलॉक करण्याच्या पद्धती" "तुमचा फोन अनलॉक करा" "ॲप्स वापरत असलेले तुम्हीच आहात याची पडताळणी करा" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index 96891a60a08..253dcb9510f 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -2018,7 +2018,7 @@ "Akses kepada lokasi saya" "Biarkan apl yang telah meminta kebenaran anda menggunakan maklumat lokasi anda" "Sumber lokasi" - "Mengenai tablet" + "Perihal tablet" "Perihal telefon" "Perihal peranti" "Perihal peranti dilagak" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 08c48e66d27..59086759e1d 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -699,7 +699,7 @@ "ဤလက်ဗွေကို ဖျက်လိုပါသလား။" "သင့်ဖုန်းတွင်သိုလှောင်ထားသည့် ‘%1$s’ နှင့် ဆက်စပ်သည့် လက်ဗွေပုံများနှင့် နမူနာကို ဖျက်ပါမည်" "သင့်တက်ဘလက်တွင်သိုလှောင်ထားသည့် ‘%1$s’ နှင့် ဆက်စပ်သည့် လက်ဗွေပုံများနှင့် နမူနာကို ဖျက်ပါမည်" - "၎င်းက သင့်စက်တွင်သိုလှောင်ထားသည့် \'%1$s\' နှင့် ဆက်စပ်သည့် လက်ဗွေပုံများနှင့် နမူနာကို ဖျက်သည်" + "သင့်ဖုန်းတွင်သိုလှောင်ထားသည့် ‘%1$s’ နှင့် ဆက်စပ်သည့် လက်ဗွေပုံများနှင့် နမူနာကို ဖျက်ပါမည်" "အက်ပ်များတွင် သင်ဖြစ်ကြောင်းအတည်ပြုရန်အတွက် (သို့) သင့်ဖုန်းကို လော့ခ်ဖွင့်ရန်အတွက် သင့်လက်ဗွေကို အသုံးပြု၍ရတော့မည် မဟုတ်ပါ။" "အက်ပ်များတွင် သင်ဖြစ်ကြောင်းအတည်ပြုရန်အတွက် (သို့) သင့်တက်ဘလက်ကို လော့ခ်ဖွင့်ရန်အတွက် သင့်လက်ဗွေကို အသုံးပြု၍ရတော့မည် မဟုတ်ပါ။" "အက်ပ်များတွင် သင်ဖြစ်ကြောင်းအတည်ပြုရန်အတွက် (သို့) သင့်စက်ကို လော့ခ်ဖွင့်ရန်အတွက် သင့်လက်ဗွေကို အသုံးပြု၍ရတော့မည် မဟုတ်ပါ။" @@ -1589,7 +1589,7 @@ "ပင်နံပါတ်များ မတူပါ။" "ပင်နံပါတ်ပြောင်း၍မရပါ\nပင်နံပါတ်အမှား ဖြစ်နိုင်သည်" "ဆင်းကဒ် ပင်နံပါတ် ပြောင်းခြင်းအောင်မြင်ပါသည်" - "ဆင်းမ် လော့ခ်ကျနေသည်။ \nပင် မှားနေသည်။" + "ဆင်းမ်ကတ် လော့ခ်ကျနေသည်။ \nပင် မှားနေသည်။" "ပင်နံပါတ်ကို ပိတ်၍မရပါ။" "ပင်နံပါတ်ကို ဖွင့်၍မရပါ။" "OK" @@ -1630,18 +1630,18 @@ "သိုလှောင်မှု ဆက်တင်များ" "USBသိုလှောင်မှုကိရိယာအား အထိုင်မှဖြုတ်မည် သိုလှောင်နိုင်မှုအားကြည့်မည်" "SD ကတ်ကို စနစ်မှဖြုတ်မည်။ သိုလှောင်နိုင်မှုအား ကြည့်မည်။" - "IMEI (ဆင်းမ် အထိုင် %1$d)" + "IMEI (ဆင်းမ်ကတ် အထိုင် %1$d)" "သိမ်းထားသည့် ကွန်ရက်ကို ရွေးပြီး ကြည့်နိုင်သည်" "MDNနံပါတ်" "ဖုန်းနံပါတ်" - "MDN (ဆင်းမ် အထိုင် %1$d)" - "ဖုန်း နံပါတ် (ဆင်းမ် အထိုင် %1$d)" + "MDN (ဆင်းမ်ကတ် အထိုင် %1$d)" + "ဖုန်း နံပါတ် (ဆင်းမ်ကတ် အထိုင် %1$d)" "ဆင်းမ်ထဲက MDN" "ဆင်းမ်ထဲက ဖုန်းနံပါတ်" "MINနံပါတ်" "MSIDနံပါတ်" "PRLဗားရှင်း" - "MEID (ဆင်းမ် အထိုင် %1$d)" + "MEID (ဆင်းမ်ကတ် အထိုင် %1$d)" "ဖွင့်" "ပိတ်" "Wi‑Fi နှင့် ဘလူးတုသ် ရှာဖွေမှု နှစ်ခုလုံးဖွင့်ထားသည်" @@ -1966,7 +1966,7 @@ "ကြိုးမဲ့ ကူညီပေးသူကို ပြောင်းမလား?" "သင်၏ ကွန်ရက် ချိတ်ဆက်မှုများကို စီမံကွပ်ကဲရန် %1$sကို %2$s၏အစား သုံးရမလား?" "သင်၏ ကွန်ရက် ချိတ်ဆက်မှုများကို စီမံကွပ်ကဲရန် %sကို သုံးရမလား?{" - "မသိရ ဆင်းမ် အော်ပရေတာ" + "မသိရ ဆင်းမ်ကတ် အော်ပရေတာ" "%1$s တွင် မည်သည့်ဝဘ်ဆိုက်မျှ​ ပေးထားခြင်းမရှိပါ" "ကျေးဇူးပြု၍ ဆင်းမ်ကတ်ထည့်၍ အစမှ ပြန်စပါ။" "ကျေးဇူးပြု၍ အင်တာနက်ဖြင့် ချိတ်ဆက်ပါ။" @@ -3340,7 +3340,7 @@ "အီသာနက် သုံးစွဲမှုကို ဝှက်ထားရန်" "ကွန်ရက် ကန့်သတ်ချက်များ" "ဒေတာကို အလိုအလျောက်ထပ်တူညီအောင်လုပ်ခြင်း" - "ဆင်းမ် ကဒ်များ" + "ဆင်းမ်ကတ်များ" "အကန့်အသတ်တွင် ရပ်ခဲ့၏" "ဒေတာကို အော်တိုစင့်ခ် လုပ်ရန်" "ကိုယ်ရေးဒေတာကို အော်တိုစင့်ခ်လုပ်ရန်" @@ -3648,7 +3648,7 @@ "မိုဘိုင်းဒေတာ ပိတ်ထားချိန်တွင် ပို့ရန်နှင့် လက်ခံရန်" "ဖုန်းဆက်ချိန် ဒေတာ" "ဖုန်းဆက်ချိန်တွင်သာ မိုဘိုင်းဒေတာ အသုံးပြုရန် ဤ SIM ကတ်ကို ခွင့်ပြုသည်" - "အလုပ် ဆင်းမ်" + "အလုပ် ဆင်းမ်ကတ်" "အက်ပ်& အကြောင်းအရာ ရယူသုံးရန်" "အမည်ပြောင်းပါ" "အက်ပ်ကန့်သတ်ချက်များ သတ်မှတ်ရန်" @@ -3671,15 +3671,15 @@ "နောက်တစ်နည်းဖြင့်လုပ်ရန်" "ပြီးပြီ" - "ဆင်းမ် ကဒ်များ" - "ဆင်းမ် ကဒ်များ" + "ဆင်းမ်ကတ်များ" + "ဆင်းမ်ကတ်များ" "အမည် %1$s နံပါတ်%2$s" - "ဆင်းမ် ကဒ်များ ပြောင်းလဲသွားပြီ" + "ဆင်းမ်ကတ်များ ပြောင်းလဲသွားပြီ" "လှုပ်ရှားမှုများ သတ်မှတ်ရန် တို့ပါ" "မိုဘိုင်းဒေတာ မရရှိနိုင်ပါ" "ဒေတာ SIM ရွေးချယ်ရန်တို့ပါ" "ခေါ်ဆိုမှုများ အတွက် အမြဲတမ်း ဒါကို သုံးရန်" - "မိုဘိုင်းဒေတာအတွက် ဆင်းမ် ရွေးရန်" + "မိုဘိုင်းဒေတာအတွက် ဆင်းမ်ကတ် ရွေးရန်" "SMS စာတိုစနစ်အတွက် ဆင်းမ်ကတ် ရွေးပါ" "ဒေတာ SIM ပြောင်းနေသည်၊ ၎င်းသည် တစ်မိနစ်ခန့်ကြာနိုင်သည်…" "မိုဘိုင်းဒေတာအတွက် %1$s သုံးမလား။" @@ -3687,21 +3687,21 @@ "%1$s သုံးရန်" "ဖြင့် ခေါ်ဆိုရန်" "ဆင်းမ် ကတ်ကို ရွေးရန်" - "ဆင်းမ် %1$d" - "ဆင်းမ် အမည်" + "ဆင်းမ်ကတ် %1$d" + "ဆင်းမ်ကတ် အမည်" "ဆင်းမ်အမည် ရိုက်ထည့်ပါ" - "ဆင်းမ် အထိုင် %1$d" + "ဆင်းမ်ကတ် အထိုင် %1$d" "စီမံပေးသူ" "နံပါတ်" - "ဆင်းမ် အရောင်" + "ဆင်းမ်ကတ် အရောင်" "ဆင်းမ် ကတ်ကို ရွေးရန်" "လိမ္မော်" "ခရမ်း" - "ဆင်းမ် ကဒ်များ မထည့်သွင်းရသေး" - "ဆင်းမ် အခြေအနေ" - "ဆင်းမ် အခြေအနေ (ဆင်းမ် အထိုင် %1$d)" + "ဆင်းမ်ကတ် မထည့်သွင်းရသေး" + "ဆင်းမ်ကတ် အခြေအနေ" + "ဆင်းမ်ကတ် အခြေအနေ (ဆင်းမ်ကတ် အထိုင် %1$d)" "ပုံသေ ဆင်းမ်ထံမှ ပြန်ခေါ်ဆိုမှု" - "အပြင်သို့ ခေါ်ဆိုမှု အတွက် ဆင်းမ်" + "အပြင်သို့ ခေါ်ဆိုမှု အတွက် ဆင်းမ်ကတ်" "ခေါ်ဆိုမှုဆိုင်ရာ တခြား ဆက်တင်" "ပိုနှစ်သက်သည့် ကွန်ရက် ဖြုတ်ချမှု" "ကွန်ရက် အမည် ထုတ်လွှင့်မှု ပိတ်ထားမှု" @@ -3712,7 +3712,7 @@ "တပ်ဆင်ရန်တို့ပါ" "အမြဲမေးရန်" "ရွေးချယ်ရန် လိုအပ်" - "ဆင်းမ် ရွေးချယ်ရန်" + "ဆင်းမ်ကတ် ရွေးချယ်ရန်" "ဆက်တင်များ" ဖျောက်ထားသည့် %d ခုကို ပြပါ @@ -5502,8 +5502,8 @@ "ထပ်ထည့်ရန်" "သုံးနေသော / ဆင်းမ်ကတ်" "မသုံးသော / ဆင်းမ်ကတ်" - "သုံးနေသော / ဒေါင်းလုဒ်လုပ်ထားသော ဆင်းမ်" - "မသုံးသော / ဒေါင်းလုဒ်လုပ်ထားသော ဆင်းမ်" + "သုံးနေသော / ဒေါင်းလုဒ်လုပ်ထားသော ဆင်းမ်ကတ်" + "မသုံးသော / ဒေါင်းလုဒ်လုပ်ထားသော ဆင်းမ်ကတ်" "ဆင်းမ်ကတ် အမည်နှင့် အရောင်" "အမည်" "အရောင် (တွဲသုံးနိုင်သော အက်ပ်က သုံးထား)" @@ -5544,17 +5544,17 @@ "ပိုကြည့်ရန်" "လျှော့ ကြည့်ရန်" "%1$s ကို ဖွင့်မလား။" - "ဆင်းမ်ကို ဖွင့်မလား။" + "ဆင်းမ်ကတ်ကို ဖွင့်မလား။" "%1$s သို့ ပြောင်းမလား။" "ဆင်းမ်ကတ်အသုံးပြုခြင်းသို့ ပြောင်းမလား။" "%1$s ကိုသုံးမလား။" "တစ်ကြိမ်တွင် ဆင်းမ်တစ်ကတ်သာ အသုံးပြုနိုင်ပါသည်။\n\n%1$s သို့ပြောင်းခြင်းက သင့် %2$s ဝန်ဆောင်မှုကို ပယ်ဖျက်မည်မဟုတ်ပါ။" "တစ်ကြိမ်တွင် ဒေါင်းလုဒ်လုပ်ထားသော ဆင်းမ်တစ်ကတ်သာ အသုံးပြုနိုင်ပါသည်။\n\n%1$s သို့ပြောင်းခြင်းက သင့် %2$s ဝန်ဆောင်မှုကို ပယ်ဖျက်မည်မဟုတ်ပါ။" "တစ်ကြိမ်တွင် ဆင်းမ်တစ်ကတ်သာ အသုံးပြုနိုင်ပါသည်။\n\nပြောင်းခြင်းက သင့် %1$s ဝန်ဆောင်မှုကို ပယ်ဖျက်မည်မဟုတ်ပါ။" - "ဆင်းမ် ၂ ခုကို တစ်ပြိုင်နက် အသုံးပြုနိုင်သည်။ %1$s ကိုသုံးရန် အခြားဆင်းမ်ကို ပိတ်ပါ။" + "ဆင်းမ်ကတ် ၂ ခုကို တစ်ပြိုင်နက် အသုံးပြုနိုင်သည်။ %1$s ကိုသုံးရန် အခြားဆင်းမ်ကတ်ကို ပိတ်ပါ။" "%1$s သို့ ပြောင်းရန်" "%1$s ကိုပိတ်ပါ" - "ဆင်းမ်ကို ပိတ်ခြင်းက သင့်ဝန်ဆောင်မှုကို ပယ်ဖျက်မည်မဟုတ်ပါ" + "ဆင်းမ်ကတ်ကို ပိတ်ခြင်းက သင့်ဝန်ဆောင်မှုကို ပယ်ဖျက်မည်မဟုတ်ပါ" "ကွန်ရက်သို့ ချိတ်ဆက်နေသည်…" "ဖုန်းခေါ်ဆိုမှုနှင့် မက်ဆေ့ဂျ်များအတွက် %1$s ကိုပြောင်းနေသည်…" "ဝန်ဆောင်မှုပေးသူကို ပြောင်း၍မရပါ" @@ -5564,8 +5564,8 @@ "\'ဆင်းမ်ကတ်\' ပိတ်နေသည်" "ဝန်ဆောင်မှုပေးသူကို ပိတ်၍မရပါ" "တစ်ခုခုမှားယွင်းသွားပါ၍ သင့်ဝန်ဆောင်မှုပေးသူကို ပိတ်မရခဲ့ပါ။" - "ဆင်းမ် ၂ ကတ် သုံးမလား။" - "ဤစက်တွင် ဆင်းမ် ၂ ကတ် တစ်ပြိုင်နက် စတင်နိုင်သည်။ တစ်ကြိမ်တွင် ဆင်းမ် ၁ ကတ်ဆက်သုံးရန် \"မလိုပါ\" ကိုတို့ပါ။" + "ဆင်းမ်ကတ် ၂ ကတ် သုံးမလား။" + "ဤစက်တွင် ဆင်းမ်ကတ် ၂ ကတ် တစ်ပြိုင်နက် စတင်နိုင်သည်။ တစ်ကြိမ်တွင် ဆင်းမ်ကတ် ၁ ကတ်ဆက်သုံးရန် \"မလိုပါ\" ကိုတို့ပါ။" "စက်ကို ပြန်စမလား။" "စတင်ရန်အတွက် သင့်စက်ကို ပြန်စပါ။ ထို့နောက် နောက်ဆင်းမ်ကို ထည့်နိုင်ပါသည်။" "ရှေ့ဆက်ရန်" @@ -5574,9 +5574,9 @@ "မလိုပါ" "မလုပ်တော့" "ပြောင်းရန်" - "ဆင်းမ်ကို ဖွင့်၍မရပါ" - "ဆင်းမ်ကို ဖယ်ရှားပြီး ပြန်ထည့်ကြည့်ပါ။ ပြဿနာရှိနေသေးပါက သင့်စက်ကို ပြန်လည်စတင်ပါ။" - "ဆင်းမ်ကို ပြန်ဖွင့်ကြည့်ပါ။ ပြဿနာရှိနေသေးပါက သင့်စက်ကို ပြန်လည်စတင်ပါ။" + "ဆင်းမ်ကတ်ကို ဖွင့်၍မရပါ" + "ဆင်းမ်ကတ်ကို ဖယ်ရှားပြီး ပြန်ထည့်ကြည့်ပါ။ ပြဿနာရှိနေသေးပါက သင့်စက်ကို ပြန်လည်စတင်ပါ။" + "ဆင်းမ်ကတ်ကို ပြန်ဖွင့်ကြည့်ပါ။ ပြဿနာရှိနေသေးပါက သင့်စက်ကို ပြန်လည်စတင်ပါ။" "ကွန်ရက် စတင်အသုံးပြုခြင်း" "ဝန်ဆောင်မှုပေးသူ ပြောင်းခြင်း" "%1$s ကို အသုံးပြုနေသည်" @@ -5585,7 +5585,7 @@ "အခြား ဝန်ဆောင်မှုပေးသူသို့ ပြောင်းလိုက်သည်" "သင်၏ မိုဘိုင်းကွန်ရက် ပြောင်းသွားပါပြီ" "သင့် အခြားဆင်းမ်ကတ်ကို စနစ်ထည့်သွင်းပါ" - "သင်သုံးနေသော ဆင်းမ်ကတ်ရွေးပါ သို့မဟုတ် ဆင်းမ် ၂ ကတ် တစ်ပြိုင်နက်သုံးပါ" + "သင်သုံးနေသော ဆင်းမ်ကတ်ရွေးပါ သို့မဟုတ် ဆင်းမ်ကတ် ၂ ကတ် တစ်ပြိုင်တည်းသုံးပါ" "အသုံးပြုရန် နံပါတ်ရွေးပါ" "{count,plural, =1{ဤစက်တွင် နံပါတ် 1 ခု ရနိုင်သော်လည်း တစ်ကြိမ်လျှင် တစ်ခုသာ အသုံးပြုနိုင်သည်}=2{ဤစက်တွင် နံပါတ် 2 ခု ရနိုင်သော်လည်း တစ်ကြိမ်လျှင် တစ်ခုသာ အသုံးပြုနိုင်သည်}other{ဤစက်တွင် နံပါတ် # ခု ရနိုင်သော်လည်း တစ်ကြိမ်လျှင် တစ်ခုသာ အသုံးပြုနိုင်သည်}}" " စတင်နေပါသည်" @@ -5599,8 +5599,8 @@ "ဒေါင်းလုဒ်လုပ်ထားသော ဤဆင်းမ်ကို ဖျက်လိုသလား။" "ဤဆင်းမ်ကို ဖျက်ခြင်းဖြင့် ဤစက်ပစ္စည်းမှ %1$s ဝန်ဆောင်မှုကို ဖယ်ရှားပါမည်။\n\n%1$s အတွက် ဝန်ဆောင်မှုကို ပယ်ဖျက်မည်မဟုတ်ပါ။" "ဖျက်ရန်" - "ဆင်းမ်ကို ဖျက်နေသည်…" - "ဆင်းမ်ကို ဖျက်၍မရပါ" + "ဆင်းမ်ကတ်ကို ဖျက်နေသည်…" + "ဆင်းမ်ကတ်ကို ဖျက်၍မရပါ" "အမှားအယွင်းရှိနေသောကြောင့် ဤဆင်းမ်ကို ဖျက်၍မရပါ။\n\nသင့်စက်ပစ္စည်းကို ပြန်စပြီး ထပ်စမ်းကြည့်ပါ။" "စက်နှင့် ချိတ်ဆက်ခြင်း" "သင့်စက်နှင့် ချိတ်ဆက်ရန် %1$s အက်ပ်က ယာယီ Wi‑Fi ကွန်ရက်ကို အသုံးပြုလိုသည်" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index 94af209e1b0..24d6805664d 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -440,9 +440,9 @@ "फेरि फेस अनलक सेटअप गर्न आफ्नो हालको फेस मोडेल मेटाउनुहोस्।\n\nतपाईंको फेस मोडेल सुरक्षित रूपले सदाका लागि मेटिने छ।\n\nउक्त फेस मोडेल मेटिएपछि फोन अनलक गर्न वा एपहरूमा आफ्नो पहिचान पुष्टि गर्न तपाईंले आफ्नो फिंगरप्रिन्ट, PIN, प्याटर्न वा पासवर्ड प्रयोग गर्नु पर्ने हुन्छ।" "निम्न कार्य गर्न फेस अनलक प्रयोग गर्नुहोस्" "फेस अनलक प्रयोग गर्दा" - "आँखा खुला हुनै पर्छ" + "आँखा खुला राख्न लगाइयोस्" "फोन अनलक गर्न तपाईंका आँखा खुला हुनै पर्छ" - "सधैँ पुष्टि गर्न आवश्यक पर्छ" + "सधैँ पुष्टि गर्न लगाइयोस्" "एपहरूमा फेस अनलक प्रयोग गर्दा सधैँ पुष्टि गर्नु पर्ने बनाउनुहोस्" "फेस मोडेल मेटाइयोस्" "फेस अनलक सेटअप गर्नुहोस्" @@ -460,8 +460,8 @@ "फिंगरप्रिन्ट हाल्नुहोस्" "स्क्रिन लक" - %1$d वटा फिंगरप्रिन्ट थपिए - फिंगरप्रिन्ट थपियो + %1$d वटा फिंगरप्रिन्ट हालिए + फिंगरप्रिन्ट हालियो "आफ्नो फिंगरप्रिन्ट दर्ता गर्नु…" @@ -547,7 +547,7 @@ "कार्य प्रोफाइलका लागि फेस र फिंगरप्रिन्ट अनलक" "सेटअप गर्न ट्याप गर्नुहोस्" "फेस तथा फिंगरप्रिन्टहरू थपिए" - "फेस तथा फिंगरप्रिन्ट थपिए" + "फेस तथा फिंगरप्रिन्ट हालिए" "तपाईंले फेस अनलक र फिंगरप्रिन्ट अनलक सेटअप गर्नुभयो भने तपाईंले मास्क लगाएका बेला वा तपाईं कुनै अँध्यारो ठाउँमा हुँदा तपाईंको फोनले तपाईंलाई फिंगरप्रिन्ट प्रयोग गर्न लगाउने छ" "अनलक गर्ने तरिकाहरू" "फोन अनलक गर्नुहोस्" @@ -1159,7 +1159,7 @@ "“%1$s” मा कनेक्ट गर्न अर्को डिभाइसबाट यो QR कोड स्क्यान गर्नुहोस्" "“%1$s” मा जडान गर्न QR कोड स्क्यान गर्नुहोस्" "फेरि प्रयास गर्नुहोस्। समस्या यथावत् रहिरहेमा डिभाइसका निर्मातासँग सम्पर्क गर्नुहोस्" - "केही चिज गडबड भयो" + "कुनै समस्या आयो" "यन्त्र प्लग इन गरिएको, चार्ज भएको र सक्रिय पारिएको कुरा सुनिश्चित गर्नुहोस्" "यन्त्र प्लग इन गरिएको, चार्ज भएको र सक्रिय पारिएको कुरा सुनिश्चित गर्नुहोस्। समस्या यथावत् रहिरहेमा डिभाइसका निर्मातासँग सम्पर्क गर्नुहोस्" "यस यन्त्रले “%1$s” थप्न सक्दैन" @@ -3525,7 +3525,7 @@ "सेटअप छैन" "सेट भएको छैन - सीमित प्रोफाइल" "सेट भएको छैन - कार्य प्रोफाइल" - "प्रशासक" + "एडमिन" "तपाईं (%s)" "तपाईं योभन्दा बढी प्रयोगकर्ता थप्न सक्नुहुन्न। नयाँ प्रयोगकर्ता थप्न कोही प्रयोगकर्ता हटाउनुहोस्।" "ट्याब्लेटको मालिकले मात्र प्रयोगकर्ताहरूलाई व्यवस्थापन गर्न सक्छ।" @@ -3841,7 +3841,7 @@ "सधैँ जानकारी देखाउने सुविधा" "डिफल्ट साउन्ड" "घन्टी तथा सूचनाको भोल्युम %1$s मा सेट छ" - "भोल्युम, कम्पन, बाधा नपुर्‍याउनुहोस्" + "भोल्युम, भाइब्रेसन, Do Not Disturb" "घन्टी बजाउनेलाई कम्पनमा सेट गरिएको छ" "घन्टी बजाउनेलाई मौनमा सेट गरिएको छ" "घन्टी तथा सूचनाको भोल्युम 80% मा सेट छ" @@ -5563,7 +5563,7 @@ "SIM अफ गर्ने हो?" "SIM अफ गरिँदै" "मोबाइल नेटवर्क अफ गर्न सकिएन" - "केही चिज गडबड भयो र तपाईंको मोबाइल सेवा प्रदायक असक्षम पार्न सकिएन।" + "कुनै समस्या आयो र तपाईंको मोबाइल सेवा प्रदायक असक्षम पार्न सकिएन।" "दुईवटै SIM प्रयोग गर्ने हो?" "यो डिभाइसमा एकैसाथ २ वटा SIM चलाउन सकिन्छ। एउटा मात्र SIM प्रयोग गरिरहन \"पर्दैन, धन्यवाद\" मा ट्याप गर्नुहोस्।" "डिभाइस रिस्टार्ट गर्ने हो?" @@ -5606,7 +5606,7 @@ "%1$s एप तपाईंको डिभाइसमा कनेक्ट हुन कुनै अस्थायी Wi‑Fi नेटवर्क प्रयोग गर्न चाहन्छ" "कुनै पनि यन्त्र फेला परेन। यन्त्रहरू सक्रिय हुनुका साथै जडान गर्नका लागि उपलब्ध भएको कुरा सुनिश्चित गर्नुहोस्।" "फेरि प्रयास गर्नुहोस्" - "केही चिज गडबड भयो। यो एपले कुनै यन्त्र छनौट गर्नेसम्बन्धी अनुरोध रद्द गरेको छ।" + "कुनै समस्या आयो। यो एपले कुनै यन्त्र छनौट गर्नेसम्बन्धी अनुरोध रद्द गरेको छ।" "सफलतापूर्वक जोडियो" "कनेक्ट गर्न सकिएन" "सबै देखाउनुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index f41bbff1c1d..502aa09fc45 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -2060,7 +2060,7 @@ "Geef je werkwachtwoord op" "Bevestig je patroon" "Geef je werkpatroon op" - "Voer je pincode opnieuw in" + "Pincode opnieuw invoeren" "Je werkpincode opnieuw invullen" "Geef je werkpincode op" "Wachtwoorden komen niet overeen" @@ -2080,7 +2080,7 @@ "Je patroon vergeten?" "Je pincode vergeten?" "Teken het patroon van je apparaat om door te gaan" - "Geef de pincode van het apparaat op om door te gaan" + "Voer de pincode van het apparaat in om door te gaan" "Geef het wachtwoord van je apparaat op om door te gaan" "Geef het patroon van je werkprofiel op om door te gaan" "Geef de pincode van je werkprofiel op om door te gaan" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index a533fb80c65..c2cc7f5622b 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -350,7 +350,7 @@ "ଫେସ ଅନଲକ" "କାର୍ଯ୍ୟ ପାଇଁ ଫେସ୍ ଅନଲକ୍" "ଫେସ ଅନଲକ କିପରି ସେଟ ଅପ କରିବେ" - "ଫେସ୍ ଅନଲକ୍ ସେଟ୍ ଅପ୍ କରନ୍ତୁ" + "ଫେସ ଅନଲକ ସେଟ ଅପ କରନ୍ତୁ" "ପ୍ରମାଣ ପାଇଁ ଆପଣଙ୍କର ମୁହଁକୁ ବ୍ୟବହାର କରନ୍ତୁ" @@ -435,7 +435,7 @@ "ଫେସ୍ ଅନଲକ୍ ପୁଣି ସେଟ୍ ଅପ୍ କରନ୍ତୁ" "ଫେସ୍ ଅନଲକ୍ ପୁଣି ସେଟ୍ ଅପ୍ କରନ୍ତୁ" "ସୁରକ୍ଷା ଏବଂ କାର୍ଯ୍ୟଦକ୍ଷତାରେ ଉନ୍ନତି ଆଣନ୍ତୁ" - "ଫେସ୍ ଅନଲକ୍ ସେଟ୍ ଅପ୍ କରନ୍ତୁ" + "ଫେସ ଅନଲକ ସେଟ ଅପ କରନ୍ତୁ" "ଫେସ୍ ଅନଲକ୍ ପୁଣି ସେଟ୍ ଅପ୍ କରିବା ପାଇଁ ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ଫେସ୍ ମଡେଲ୍ ଡିଲିଟ୍ କରନ୍ତୁ।\n\nଆପଣଙ୍କ ଫେସ୍ ମଡେଲକୁ ସ୍ଥାୟୀ ଏବଂ ସୁରକ୍ଷିତ ଭାବରେ ଡିଲିଟ୍ କରିଦିଆଯିବ।\n\nଡିଲିଟ୍ କରିବା ପରେ ଆପଣଙ୍କ ଫୋନକୁ ଅନଲକ୍ କରିବା କିମ୍ବା ଆପଗୁଡ଼ିକରେ ପ୍ରମାଣୀକରଣ ପାଇଁ ଆପଣ ଆପଣଙ୍କର PIN, ପାଟର୍ନ କିମ୍ବା ପାସୱାର୍ଡ ଆବଶ୍ୟକ କରିବେ।" "ଫେସ୍ ଅନଲକ୍ ପୁଣି ସେଟ୍ ଅପ୍ କରିବା ପାଇଁ ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ଫେସ୍ ମଡେଲ୍ ଡିଲିଟ୍ କରନ୍ତୁ।\n\nଆପଣଙ୍କ ଫେସ୍ ମଡେଲକୁ ସ୍ଥାୟୀ ଏବଂ ସୁରକ୍ଷିତ ଭାବରେ ଡିଲିଟ୍ କରିଦିଆଯିବ।\n\nଡିଲିଟ୍ କରିବା ପରେ ଆପଣଙ୍କ ଫୋନକୁ ଅନଲକ୍ କରିବା କିମ୍ବା ଆପଗୁଡ଼ିକରେ ପ୍ରମାଣୀକରଣ ପାଇଁ ଆପଣ ଆପଣଙ୍କର ଟିପଚିହ୍ନ, PIN, ପାଟର୍ନ କିମ୍ବା ପାସୱାର୍ଡ ଆବଶ୍ୟକ କରିବେ।" "ଏଥିପାଇଁ ଫେସ୍ ଅନଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ" @@ -444,8 +444,8 @@ "ଫୋନ୍ ଅନ୍‌ଲକ୍ କରିବା ପାଇଁ, ଆପଣଙ୍କ ଆଖି ଖୋଲା ରହିବା ଉଚିତ" "ସବୁବେଳେ ସୁନିଶ୍ଚିତକରଣ ଆବଶ୍ୟକ ହୋଇଥାଏ" "ଆପ୍ସରେ ଫେସ୍ ଅନଲକ୍ ବ୍ୟବହାର କରିବା ବେଳେ ସର୍ବଦା ସୁନିଶ୍ଚିତକରଣ ଷ୍ଟେପ୍ ଆବଶ୍ୟକ" - "ଫେସ୍ ମଡେଲ୍ ଡିଲିଟ୍ କରନ୍ତୁ" - "ଫେସ୍ ଅନଲକ୍ ସେଟ୍ ଅପ୍ କରନ୍ତୁ" + "ଫେସ ମଡେଲ ଡିଲିଟ କରନ୍ତୁ" + "ଫେସ ଅନଲକ ସେଟ ଅପ କରନ୍ତୁ" "ଆପଣ ସାଇନ୍ ଇନ୍ କରିବା କିମ୍ବା ଏକ କ୍ରୟକୁ ଅନୁମୋଦନ ଦେବା ପରି କାର୍ଯ୍ୟ କରିବା ସମୟରେ, ଆପଣଙ୍କ ଫୋନକୁ ଅନଲକ୍ କରିବା କିମ୍ବା ଆପଗୁଡ଼ିକରେ ପ୍ରମାଣୀକରଣ ପାଇଁ ଆପଣଙ୍କ ଫେସ୍ ବ୍ୟବହାର କରନ୍ତୁ।\n\nମନେ ରଖନ୍ତୁ:\nଆପଣ ଗୋଟିଏ ଥରରେ କେବଳ ଗୋଟିଏ ଫେସ୍ ସେଟ୍ ଅପ୍ କରିପାରିବେ। ଅନ୍ୟ ଏକ ଫେସ୍ ଯୋଗ କରିବା ପାଇଁ, ବର୍ତ୍ତମାନର ଫେସକୁ ଡିଲିଟ୍ କରନ୍ତୁ।\n\nଆପଣ ଅଜାଣତରେ ମଧ୍ୟ ଆପଣଙ୍କର ଫୋନକୁ ଦେଖିଲେ ଏହା ଅନଲକ୍ ହୋଇପାରିବ।\n\nଅନ୍ୟ କେହି ଜଣେ ବ୍ୟକ୍ତି ଆପଣଙ୍କ ଫୋନକୁ ଆପଣଙ୍କର ଫେସ୍ ସାମ୍ନାରେ ରଖି ଏହାକୁ ଅନଲକ୍ କରିପାରିବେ।\n\nଆପଣଙ୍କ ପରି ଦେଖାଯାଉଥିବା କେହି ଜଣେ ବ୍ୟକ୍ତି ଯେପରି ଯାଆଁଳା ଭାଇ/ଭଉଣୀଙ୍କ ଦ୍ୱାରା ଆପଣଙ୍କ ଫୋନକୁ ଅନଲକ୍ କରାଯାଇପାରିବ।" "ଆପଣ ସାଇନ୍ ଇନ୍ କରିବା କିମ୍ବା ଏକ କ୍ରୟକୁ ଅନୁମୋଦନ ଦେବା ପରି କାର୍ଯ୍ୟ କରିବା ସମୟରେ, ଆପଣଙ୍କ ଫୋନକୁ ଅନଲକ୍ କରିବା କିମ୍ବା ଆପଗୁଡ଼ିକରେ ପ୍ରମାଣୀକରଣ ପାଇଁ ଆପଣଙ୍କ ଫେସ୍ ବ୍ୟବହାର କରନ୍ତୁ।\n\nମନେ ରଖନ୍ତୁ:\nଆପଣ ଗୋଟିଏ ଥରରେ କେବଳ ଗୋଟିଏ ଫେସ୍ ସେଟ୍ ଅପ୍ କରିପାରିବେ। ଅନ୍ୟ ଏକ ଫେସ୍ ଯୋଗ କରିବା ପାଇଁ, ବର୍ତ୍ତମାନର ଫେସକୁ ଡିଲିଟ୍ କରନ୍ତୁ।\n\nଆପଣ ଅଜାଣତରେ ମଧ୍ୟ ଆପଣଙ୍କର ଫୋନକୁ ଦେଖିଲେ ଏହା ଅନଲକ୍ ହୋଇପାରିବ।\n\nଆପଣଙ୍କର ଆଖି ବନ୍ଦ ଥିବା ବେଳେ ମଧ୍ୟ ଅନ୍ୟ କେହି ଜଣେ ବ୍ୟକ୍ତି ଆପଣଙ୍କ ଫୋନକୁ ଆପଣଙ୍କର ଫେସ୍ ସାମ୍ନାରେ ରଖି ଏହାକୁ ଅନଲକ୍ କରିପାରିବେ।\n\nଆପଣଙ୍କ ପରି ଦେଖାଯାଉଥିବା କେହି ଜଣେ ବ୍ୟକ୍ତି ଯେପରି ଯାଆଁଳା ଭାଇ/ଭଉଣୀଙ୍କ ଦ୍ୱାରା ଆପଣଙ୍କ ଫୋନକୁ ଅନଲକ୍ କରାଯାଇପାରିବ।" "ଫେସ ମଡେଲ ଡିଲିଟ କରିବେ?" @@ -548,10 +548,10 @@ "ସେଟ୍ ଅପ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ" "ଚେହେରା ଏବଂ ଟିପଚିହ୍ନଗୁଡ଼ିକ ଯୋଗ କରାଯାଇଛି" "ଚେହେରା ଏବଂ ଟିପଚିହ୍ନ ଯୋଗ କରାଯାଇଛି" - "ଯେତେବେଳେ ଆପଣ ଫେସ ଅନଲକ ଏବଂ ଫିଙ୍ଗରପ୍ରିଣ୍ଟ ଅନଲକ ସେଟ ଅପ କରନ୍ତି, ସେତେବେଳେ ଆପଣ ଏକ ମାସ୍କ ପିନ୍ଧିଥିଲେ ବା ଏକ ଅନ୍ଧାର ସ୍ଥାନରେ ଥିଲେ ଆପଣଙ୍କ ଫୋନ ଆପଣଙ୍କ ଟିପଚିହ୍ନ ମାଗିବ" + "ଫେସ ଅନଲକ ଏବଂ ଫିଙ୍ଗରପ୍ରିଣ୍ଟ ଅନଲକ ଆପଣ ସେଟ ଅପ କରିବା ବେଳେ ଏକ ମାସ୍କ ପିନ୍ଧିଥିଲେ ବା ଏକ ଅନ୍ଧାର ସ୍ଥାନରେ ଥିଲେ ଆପଣଙ୍କ ଫୋନ ଆପଣଙ୍କ ଟିପଚିହ୍ନ ପାଇଁ ପଚାରିବ" "ଅନଲକ କରିବାର ଉପାୟ" "ଆପଣଙ୍କ ଫୋନ ଅନଲକ କରନ୍ତୁ" - "ଏହା ଆପଣ ଅଟନ୍ତି ବୋଲି ଆପଗୁଡ଼ିକରେ ଯାଞ୍ଚ କରନ୍ତୁ" + "ଏହା ଆପଣ ଅଟନ୍ତି ବୋଲି ଆପ୍ସରେ ଯାଞ୍ଚ କରନ୍ତୁ" "ଫେସ ବ୍ୟବହାର କରି" "ଟିପଚିହ୍ନ ବ୍ୟବହାର କରି" "ଫେସ ବା ଟିପଚିହ୍ନ ବ୍ୟବହାର କରି" @@ -610,7 +610,7 @@ "ଟିପଚିହ୍ନ ଯୋଗ କରାଯାଇଛି" "ଆପଣ ଆପ୍ସରେ ସାଇନ ଇନ କରିବା କିମ୍ବା ଏକ କ୍ରୟକୁ ଅନୁମୋଦନ ଦେବା ପରି କାର୍ଯ୍ୟ କରିବା ସମୟରେ, ଆପଣଙ୍କ ଟାବଲେଟକୁ ଅନଲକ କରିବା କିମ୍ବା ଏହା ଆପଣ ବୋଲି ଯାଞ୍ଚ କରିବା ପାଇଁ ବର୍ତ୍ତମାନ ଆପଣଙ୍କ ଟିପଚିହ୍ନକୁ ଆପଣ ବ୍ୟବହାର କରିପାରିବେ" "ଆପଣ ଆପ୍ସରେ ସାଇନ ଇନ କରିବା କିମ୍ବା ଏକ କ୍ରୟକୁ ଅନୁମୋଦନ ଦେବା ପରି କାର୍ଯ୍ୟ କରିବା ସମୟରେ, ଆପଣଙ୍କ ଡିଭାଇସକୁ ଅନଲକ କରିବା କିମ୍ବା ଏହା ଆପଣ ବୋଲି ଯାଞ୍ଚ କରିବା ପାଇଁ ବର୍ତ୍ତମାନ ଆପଣଙ୍କ ଟିପଚିହ୍ନକୁ ଆପଣ ବ୍ୟବହାର କରିପାରିବେ" - "ଆପଣ ଆପ୍ସରେ ସାଇନ ଇନ କରିବା କିମ୍ବା ଏକ କ୍ରୟକୁ ଅନୁମୋଦନ ଦେବା ପରି କାର୍ଯ୍ୟ କରିବା ସମୟରେ, ଆପଣଙ୍କ ଫୋନକୁ ଅନଲକ କରିବା କିମ୍ବା ଏହା ଆପଣ ବୋଲି ଯାଞ୍ଚ କରିବା ପାଇଁ ବର୍ତ୍ତମାନ ଆପଣଙ୍କ ଟିପଚିହ୍ନକୁ ଆପଣ ବ୍ୟବହାର କରିପାରିବେ" + "ଆପଣ ଆପ୍ସରେ ସାଇନ ଇନ କରିବା କିମ୍ବା ଏକ କ୍ରୟକୁ ଅନୁମୋଦନ ଦେବା ବେଳେ, ଆପଣଙ୍କ ଫୋନ ଅନଲକ କରିବାକୁ କିମ୍ବା ଏହା ଆପଣ ବୋଲି ଯାଞ୍ଚ କରିବାକୁ ବର୍ତ୍ତମାନ ଆପଣଙ୍କର ଟିପଚିହ୍ନ ବ୍ୟବହାର କରିପାରିବେ" "ଆପଣ ଆପ୍ସରେ ସାଇନ ଇନ କରିବା କିମ୍ବା କୌଣସି କ୍ରୟକୁ ଅନୁମୋଦନ ଦେବା ବେଳେ, ଆପଣଙ୍କ ଟାବଲେଟ ଅନଲକ କରିବାକୁ କିମ୍ବା ଏହା ଆପଣ ବୋଲି ଯାଞ୍ଚ କରିବାକୁ ବର୍ତ୍ତମାନ ଆପଣଙ୍କର ଟିପଚିହ୍ନ ବ୍ୟବହାର କରିପାରିବେ। \n\nଅନ୍ୟ ଏକ ଟିପଚିହ୍ନ ଯୋଗ କରନ୍ତୁ ଯାହା ଫଳରେ ଆପଣଙ୍କ ଟାବଲେଟକୁ ଆପଣ ବିଭିନ୍ନ ଉପାୟରେ ଧରିବା ସମୟରେ ଏହାକୁ ଅନଲକ କରିବା ସହଜ ହୋଇଥାଏ।" "ଆପଣ ଆପ୍ସରେ ସାଇନ ଇନ କରିବା କିମ୍ବା କୌଣସି କ୍ରୟକୁ ଅନୁମୋଦନ ଦେବା ବେଳେ, ଆପଣଙ୍କ ଡିଭାଇସ ଅନଲକ କରିବାକୁ କିମ୍ବା ଏହା ଆପଣ ବୋଲି ଯାଞ୍ଚ କରିବାକୁ ବର୍ତ୍ତମାନ ଆପଣଙ୍କର ଟିପଚିହ୍ନ ବ୍ୟବହାର କରିପାରିବେ।\n\nଅନ୍ୟ ଏକ ଟିପଚିହ୍ନ ଯୋଗ କରନ୍ତୁ ଯାହା ଫଳରେ ଆପଣଙ୍କ ଡିଭାଇସକୁ ଆପଣ ବିଭିନ୍ନ ଉପାୟରେ ଧରିବା ସମୟରେ ଏହାକୁ ଅନଲକ କରିବା ସହଜ ହୋଇଥାଏ।" "ଆପଣ ଆପ୍ସରେ ସାଇନ ଇନ କରିବା କିମ୍ବା କୌଣସି କ୍ରୟକୁ ଅନୁମୋଦନ ଦେବା ବେଳେ, ଆପଣଙ୍କ ଫୋନ ଅନଲକ କରିବାକୁ କିମ୍ବା ଏହା ଆପଣ ବୋଲି ଯାଞ୍ଚ କରିବାକୁ ବର୍ତ୍ତମାନ ଆପଣଙ୍କର ଟିପଚିହ୍ନ ବ୍ୟବହାର କରିପାରିବେ।\n\nଅନ୍ୟ ଏକ ଟିପଚିହ୍ନ ଯୋଗ କରନ୍ତୁ ଯାହା ଫଳରେ ଆପଣଙ୍କ ଫୋନକୁ ଆପଣ ବିଭିନ୍ନ ଉପାୟରେ ଧରିବା ସମୟରେ ଏହାକୁ ଅନଲକ କରିବା ସହଜ ହୋଇଥାଏ।" @@ -998,7 +998,7 @@ "ସ୍ପିକର୍ ଫୋନ୍‌ ଭାବେ" "ମ୍ୟୁଜିକ୍‌ ଓ ମିଡିଆ ପାଇଁ" "ସେଟିଂସକୁ ମନେରଖ" - "ସର୍ବାଧିକ ସଂଯୁକ୍ତ ହୋଇଥିବା ବ୍ଲୁଟୂଥ୍‍‌ ଅଡିଓ ଡିଭାଇସ୍‌ଗୁଡ଼ିକ" + "ସର୍ବାଧିକ କନେକ୍ଟ ହୋଇଥିବା ବ୍ଲୁଟୁଥ ଅଡିଓ ଡିଭାଇସଗୁଡ଼ିକ" "ସଂଯୁକ୍ତ ବ୍ଲୁଟୂଥ୍‍‌ ଅଡିଓ ଡିଭାଇସ୍‌ଗୁଡ଼ିକର ସର୍ବାଧିକ ସଂଖ୍ୟା ବାଛନ୍ତୁ" "NFC ଷ୍ଟାକ୍ ଡିବଗ୍ ଲଗ୍" "NFC ଷ୍ଟାକ୍ ଲଗିଂ ଲେଭେଲକୁ ବଢ଼ାନ୍ତୁ" @@ -1031,7 +1031,7 @@ "debuggable ଆପ୍‍ର bytecode ଯାଞ୍ଚ କରାନ୍ତୁ" "debuggable ଆପ୍ସ ପାଇଁ bytecode ଯାଞ୍ଚ କରିବାକୁ ART ଅନୁମତି ଦିଅନ୍ତୁ" "ରିଫ୍ରେସ୍ ରେଟ୍ ଦେଖାନ୍ତୁ" - "ବର୍ତ୍ତମାନର ଡିସ୍‌ପ୍ଲେ ରିଫ୍ରେସ୍ ରେଟ୍ ଦେଖାନ୍ତୁ" + "ବର୍ତ୍ତମାନର ଡିସପ୍ଲେ ରିଫ୍ରେସ ରେଟ ଦେଖାନ୍ତୁ" "NFC" "ଟାବଲେଟ୍ ଏକ NFC ଡିଭାଇସକୁ ଛୁଇଁଲେ ଡାଟା ବିନିମୟ ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ" "ଫୋନ୍ ଏକ NFC ଡିଭାଇସକୁ ଛୁଇଁଲେ ଡାଟା ବିନିମୟ ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ" @@ -1287,24 +1287,24 @@ "ନିମନ୍ତ୍ରଣକୁ ବାତିଲ କରିବେ?" "%1$s ସହ ସଂଯୋଗ କରିବାକୁ ନିମନ୍ତ୍ରଣକୁ ଆପଣ ବାତିଲ କରିବାକୁ ଚାହାଁନ୍ତି କି?" "ଏହି ଗ୍ରୁପ୍‌କୁ ଭୁଲିଯିବେ?" - "ୱାଇ-ଫାଇ ହଟସ୍ପଟ୍‌" - "ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକ‌ ସହ ଇଣ୍ଟରନେଟ୍‌ କିମ୍ବା ବିଷୟବସ୍ତୁ ସେୟାର୍ କରୁନାହିଁ" + "ୱାଇ-ଫାଇ ହଟସ୍ପଟ" + "ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକ‌ ସହ ଇଣ୍ଟରନେଟ କିମ୍ବା ବିଷୟବସ୍ତୁ ସେୟାର କରୁନାହିଁ" "ହଟ୍‌ସ୍ପଟ୍‌ ମାଧ୍ୟମରେ ଏହି ଟାବ୍‌ଲେଟ୍‌ର ଇଣ୍ଟର୍‌ନେଟ୍‌ ସଂଯୋଗ ସେୟାର୍‌ କରୁଛି" "ହଟସ୍ପଟ୍‌ ମାଧ୍ୟମରେ ଏହି ଫୋନ‌ର ଇଣ୍ଟର୍ନେଟ୍‌ ସଂଯୋଗ ସେୟାର୍‌ କରୁଛି" "ଆପ୍‍ କଣ୍ଟେଣ୍ଟ ଶେୟର୍ କରୁଛି। ଇଣ୍ଟରନେଟ୍‌ ସଂଯୋଜନା ଶେୟାର କରିବାକୁ, ହଟ୍‌ସ୍ପଟ୍‌ ଅଫ୍‌ କରି ଅନ୍‌ କରନ୍ତୁ" "କୌଣସି ପାସ୍‌ୱାର୍ଡ୍‌ ସେଭ୍‌ ହୋଇନାହିଁ" - "ହଟସ୍ପଟ୍‌ ନାମ" + "ହଟସ୍ପଟ ନାମ" "%1$s ଚାଲୁ କରାଯାଉଛି…" "%1$s ସହ ଅନ୍ୟ ଡିଭାଇସ୍‌ଗୁଡ଼ିକ ସଂଯୁକ୍ତ ହୋଇପାରିବ" - "ହଟସ୍ପଟ୍‌ ପାସ୍‌ୱାର୍ଡ" + "ହଟସ୍ପଟ ପାସୱାର୍ଡ" "AP ବ୍ୟାଣ୍ଡ" "ଆପଣଙ୍କର ଅନ୍ୟ ଡିଭାଇସ୍‌ଗୁଡ଼ିକ ପାଇଁ ଏକ ୱାଇ-ଫାଇ ନେଟ୍‌ୱର୍କ ତିଆରି କରିବାକୁ ହଟ୍‌ସ୍ପଟ୍‌ ବ୍ୟବହାର କରନ୍ତୁ। ଆପଣଙ୍କର ଡାଟା ସଂଯୋଗ ବ୍ୟବହାର କରି ହଟ୍‌ସ୍ପଟ୍‌, ଇଣ୍ଟରନେଟ୍‌ ପ୍ରଦାନ କରିଥାଏ। ଅତିରିକ୍ତ ମୋବାଇଲ୍‌ ଡାଟା ଚାର୍ଜ ଲାଗୁ ହୋଇପାରେ।" "ପାଖାପାଖି ଡିଭାଇସ୍‌ଗୁଡ଼ିକ ସହିତ କଣ୍ଟେଣ୍ଟ ସେୟାର୍‌ କରିବା ପାଇଁ ଆପ୍‌, ହଟ୍‌ସ୍ପଟ୍‌ ତିଆରି କରିପାରିବ।" - "ସ୍ୱଚାଳିତ ଭାବେ ହଟସ୍ପଟ୍ ବନ୍ଦ କରନ୍ତୁ" - "ଯେତେବେଳେ କୌଣସି ଡିଭାଇସ୍ ସଂଯୋଗ ହୋଇନଥାଏ" + "ସ୍ୱତଃ ହଟସ୍ପଟ ବନ୍ଦ କରନ୍ତୁ" + "ଯେତେବେଳେ କୌଣସି ଡିଭାଇସ କନେକ୍ଟ ହୋଇନଥାଏ" "କମ୍ପାଟିବିଲିଟୀ ବଢ଼ାନ୍ତୁ" "ଏହି ହଟସ୍ପଟକୁ ଖୋଜିବାରେ ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକୁ ସାହାଯ୍ୟ କରେ। ହଟସ୍ପଟ୍ ସଂଯୋଗ ସ୍ପିଡ୍ କମାଇଥାଏ।" - "ଏହି ହଟସ୍ପଟକୁ ଖୋଜିବାରେ ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକୁ ସାହାଯ୍ୟ କରେ। ବ୍ୟାଟେରୀର ବ୍ୟବହାର ବଢ଼ାଇଥାଏ।" + "ଏହି ହଟସ୍ପଟକୁ ଖୋଜିବାରେ ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକୁ ସାହାଯ୍ୟ କରେ। ବେଟେରୀର ବ୍ୟବହାର ବଢ଼ାଇଥାଏ।" "ହଟସ୍ପଟ ଅନ କରୁଛି…" "ହଟସ୍ପଟ୍‌ ଅଫ୍‌ କରାଯାଉଛି…" "ଟିଥରିଂ ଉପଲବ୍ଧ ନାହିଁ" @@ -1424,7 +1424,7 @@ "ପୂର୍ଣ୍ଣ ରିଜୋଲ୍ୟୁସନ" "1080p FHD+" "1440p QHD+" - "ପୂର୍ଣ୍ଣ ରିଜୋଲ୍ୟୁସନ ଆପଣଙ୍କ ବ୍ୟାଟେରୀକୁ ଅଧିକ ବ୍ୟବହାର କରେ। ଆପଣଙ୍କ ରିଜୋଲ୍ୟୁସନକୁ ସ୍ୱିଚ କରିବା ଫଳରେ କିଛି ଆପ୍ସ ରିଷ୍ଟାର୍ଟ ହୋଇପାରେ।" + "ପୂର୍ଣ୍ଣ ରିଜୋଲ୍ୟୁସନ ଆପଣଙ୍କ ବେଟେରୀକୁ ଅଧିକ ବ୍ୟବହାର କରେ। ଆପଣଙ୍କ ରିଜୋଲ୍ୟୁସନକୁ ସ୍ୱିଚ କରିବା ଫଳରେ କିଛି ଆପ୍ସ ରିଷ୍ଟାର୍ଟ ହୋଇପାରେ।" "ଚୟନ କରାଯାଇଛି" "ରଙ୍ଗ" "ପ୍ରାକୃତିକ" @@ -1465,7 +1465,7 @@ "ସ୍ମୁଥ୍ ଡିସପ୍ଲେ" "କିଛି ବିଷୟବସ୍ତୁ ପାଇଁ ରିଫ୍ରେସ୍ ରେଟ୍ ସ୍ୱଚାଳିତ ଭାବରେ 60ରୁ 90 Hz ପର୍ଯ୍ୟନ୍ତ ବଢ଼ାଇଥାଏ। ବ୍ୟାଟେରୀର ବ୍ୟବହାର ବଢ଼ାଇଥାଏ।" "ସର୍ବାଧିକ ରିଫ୍ରେସ୍ ହାରକୁ ଲାଗୁ କରନ୍ତୁ" - "ଉନ୍ନତ ସ୍ପର୍ଶ ପ୍ରତିକ୍ରିୟା ଓ ଆନିମେସନ୍ ଗୁଣବତ୍ତା ପାଇଁ ସର୍ବାଧିକ ରିଫ୍ରେସ୍ ରେଟ୍। ବ୍ୟାଟେରୀର ବ୍ୟବହାର ବଢ଼ାଇଥାଏ।" + "ଉନ୍ନତ ସ୍ପର୍ଶ ପ୍ରତିକ୍ରିୟା ଓ ଆନିମେସନ ଗୁଣବତ୍ତା ପାଇଁ ସର୍ବାଧିକ ରିଫ୍ରେସ ରେଟ। ବେଟେରୀର ବ୍ୟବହାର ବଢ଼ାଇଥାଏ।" "ସ୍କ୍ରିନ୍ ଆଟେନ୍‌ସନ୍" "ଯଦି ଆପଣ ଏହାକୁ ଦେଖୁଥିବେ ତେବେ ଚାଲୁ / ସ୍କ୍ରିନ୍ ବନ୍ଦ ହେବ ନାହିଁ" "ବନ୍ଦ ଅଛି" @@ -1616,7 +1616,7 @@ "ହାର୍ଡୱେର ସଂସ୍କରଣ" "ଉପକରଣ ଆଇଡି" "ବେସ୍‌ବ୍ୟାଣ୍ଡ ଭର୍ସନ୍‌" - "କର୍ନେଲ୍‌ ଭର୍ସନ୍‌" + "କର୍ଣ୍ଣେଲ ସଂସ୍କରଣ" "ବିଲ୍ଡ ନମ୍ବର" "Google Play ସିଷ୍ଟମ୍ ଅପ୍‌ଡେଟ୍" "ଉପଲବ୍ଧ ନାହିଁ" @@ -1909,7 +1909,7 @@ "ପୋର୍ଟବଲ୍‌ ହଟସ୍ପଟ୍‌" "ବ୍ଲୁଟୁଥ ଟିଥରିଂ" "ଟିଥରିଂ" - "ହଟସ୍ପଟ୍‌ ଓ ଟିଥରିଂ" + "ହଟସ୍ପଟ ଓ ଟିଥରିଂ" "ହଟସ୍ପଟ୍ ଚାଲୁ‌ ଅଛି, ଟିଥର୍‌ କରୁଛି" "ହଟସ୍ପଟ୍‌ ଅନ୍‌" "ଟିଥରିଂ" @@ -1953,7 +1953,7 @@ "ଇଥରନେଟ ମାଧ୍ୟମରେ ଫୋନର ଇଣ୍ଟରନେଟ କନେକ୍ସନ ସେୟାର କରନ୍ତୁ" "ଇଥରନେଟ ମାଧ୍ୟମରେ ଟାବଲେଟର ଇଣ୍ଟରନେଟ କନେକ୍ସନ ସେୟାର କରନ୍ତୁ" "ଆପଣଙ୍କ ମୋବାଇଲ୍‌ ଡାଟା ସଂଯୋଗ ମାଧ୍ୟମରେ ଅନ୍ୟ ଡିଭାଇସଗୁଡିକୁ ଇଣ୍ଟରନେଟ୍‌ ପ୍ରଦାନ କରିବା ପାଇଁ ହଟସ୍ପଟ୍ ଏବଂ ଟିଥରିଂ ବ୍ୟବହାର କରନ୍ତୁ। ଆଖପାଖରେ ଥିବା ଡିଭାଇସ୍‌ଗୁଡ଼ିକ ସହ ବିଷୟବସ୍ତୁ ସେୟାର୍‌ କରିବାକୁ ଆପ୍‌ଗୁଡ଼ିକ ମଧ୍ୟ ଗୋଟିଏ ହଟ୍‌ସ୍ପଟ୍‌ ତିଆରି କରିପାରିବେ।" - "ଆପଣଙ୍କ ୱାଇ-ଫାଇ ବା ମୋବାଇଲ ଡାଟା କନେକ୍ସନ ମାଧ୍ୟମରେ ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକୁ ଇଣ୍ଟରନେଟ ପ୍ରଦାନ କରିବାକୁ ହଟସ୍ପଟ ଏବଂ ଟିଥରିଂ ବ୍ୟବହାର କରନ୍ତୁ। ନିକଟସ୍ଥ ଡିଭାଇସଗୁଡ଼ିକ ସହ ବିଷୟବସ୍ତୁ ସେୟାର କରିବାକୁ ଆପଗୁଡ଼ିକ ମଧ୍ୟ ଏକ ହଟସ୍ପଟ୍ ତିଆରି କରିପାରିବ।" + "ଆପଣଙ୍କ ୱାଇ-ଫାଇ ବା ମୋବାଇଲ ଡାଟା କନେକ୍ସନ ମାଧ୍ୟମରେ ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକୁ ଇଣ୍ଟରନେଟ ପ୍ରଦାନ କରିବାକୁ ହଟସ୍ପଟ ଏବଂ ଟିଥରିଂ ବ୍ୟବହାର କରନ୍ତୁ। ଆଖପାଖର ଡିଭାଇସଗୁଡ଼ିକ ସହ ବିଷୟବସ୍ତୁ ସେୟାର କରିବାକୁ ଆପ୍ସ ଏକ ହଟସ୍ପଟ ମଧ୍ୟ ତିଆରି କରିପାରିବ।" "ସାହାଯ୍ୟ" "ମୋବାଇଲ୍‌ ନେଟ୍‌ୱାର୍କ" "ମୋବାଇଲ୍‌ ପ୍ଲାନ୍‌" @@ -2080,7 +2080,7 @@ "ପାଟର୍ନ ଭୁଲି ଯାଇଛନ୍ତି କି?" "PIN ଭୁଲି ଯାଇଛନ୍ତି କି?" "ଜାରି ରଖିବା ପାଇଁ ନିଜ ଡିଭାଇସ ପାଟର୍ନ ବ୍ୟବହାର କରନ୍ତୁ" - "ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଡିଭାଇସ୍‌ର PIN ଲେଖନ୍ତୁ" + "ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଡିଭାଇସର PIN ଲେଖନ୍ତୁ" "ଜାରି ରଖିବାକୁ ନିଜ ଡିଭାଇସ୍‌ର ପାସ୍‌ୱର୍ଡ ଲେଖନ୍ତୁ" "ଜାରି ରଖିବାକୁ ନିଜ କାର୍ଯ୍ୟ ପାଟର୍ନ ବ୍ୟବହାର କରନ୍ତୁ" "ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ୱାର୍କ PIN ଲେଖନ୍ତୁ" @@ -2426,7 +2426,7 @@ "Talkback" "ଦୃଷ୍ଟିହୀନ କିମ୍ବା କମ୍‌ ଦୃଷ୍ଟି ଶକ୍ତିଥିବା ଲୋକଙ୍କ ପାଇଁ ମୁଖ୍ୟତଃ ସ୍କ୍ରିନ୍‌ ରିଡର୍‌ ଅଟେ" "ଜୋରରେ ଶୁଣିବା ପାଇଁ ସ୍କ୍ରିନ୍‌ ଉପରେ ଥିବା ଆଇଟମଗୁଡ଼ିକ ଉପରେ ଟାପ୍‌ କରନ୍ତୁ" - "କ୍ୟାପସନ୍ ପସନ୍ଦଗୁଡ଼ିକ" + "କେପସନ ପସନ୍ଦଗୁଡ଼ିକ" "କ୍ୟାପ୍ସନ୍ ପସନ୍ଦଗୁଡ଼ିକ ବିଷୟରେ" "କ୍ୟାପ୍ସନ୍ ପସନ୍ଦଗୁଡ଼ିକ ବିଷୟରେ ଅଧିକ ଜାଣନ୍ତୁ" "ମ୍ୟାଗ୍ନିଫିକେସନ୍" @@ -2565,8 +2565,8 @@ "ସ୍ପର୍ଶକରି ଦବାଇ ରଖିବା" "କଲର ଇନଭର୍ସନ" "କଲର ଇନଭର୍ସନ ବ୍ୟବହାର କରନ୍ତୁ" - "କଲର ଇନଭର୍ସନ ପାଇଁ ସର୍ଟକଟ୍" - "ରଙ୍ଗ ଇନଭାର୍ସନ ଫିକା ସ୍କ୍ରିନଗୁଡ଼ିକୁ ଗାଢ଼ା କରିଥାଏ। ଏହା ଗାଢ଼ା ସ୍କ୍ରିନଗୁଡ଼ିକୁ ମଧ୍ୟ ଫିକା କରିଥାଏ।" + "କଲର ଇନଭର୍ସନ ପାଇଁ ସର୍ଟକଟ" + "କଲର ଇନଭର୍ସନ ଫିକା ସ୍କ୍ରିନଗୁଡ଼ିକୁ ଗାଢ଼ା କରିଥାଏ। ଏହା ଗାଢ଼ା ସ୍କ୍ରିନଗୁଡ଼ିକୁ ମଧ୍ୟ ଫିକା କରିଥାଏ।" "<b>ମନେ ରଖନ୍ତୁ</b><br/> <ol> <li> ମିଡିଆ ଏବଂ ଇମେଜଗୁଡ଼ିକରେ ରଙ୍ଗଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ ହେବ</li> <li> କଲର ଇନଭର୍ସନ ସମସ୍ତ ଆପରେ କାମ କରେ</li> <li> ଏକ ଗାଢ଼ା ପୃଷ୍ଠପଟ ଡିସପ୍ଲେ କରିବାକୁ, ଏହା ପରିବର୍ତ୍ତେ ଡାର୍କ ଥିମକୁ ବ୍ୟବହାର କରାଯାଇପାରିବ</li> </ol>" "ଅଟୋକ୍ଲିକ୍ (ଡ୍ୱେଲ୍ ଟାଇମିଂ)" "ଅଟୋକ୍ଲିକ୍ ବିଷୟରେ (ଡ୍ୱେଲ୍ ଟାଇମିଂ)" @@ -2605,7 +2605,7 @@ "କ୍ୱିକ ସେଟିଂସରେ ରଙ୍ଗ ସଂଶୋଧନ ଯୋଗ କରାଯାଇଛି। ଯେ କୌଣସି ସମୟରେ ଏହାକୁ ଚାଲୁ କିମ୍ବା ବନ୍ଦ କରିବା ପାଇଁ ତଳକୁ ସ୍ୱାଇପ କରନ୍ତୁ।" "ଆପଣ ଆପଣଙ୍କ ସ୍କ୍ରିନର ଶୀର୍ଷରୁ କ୍ୱିକ ସେଟିଂସରେ ରଙ୍ଗ ସଂଶୋଧନ ମଧ୍ୟ ଯୋଗ କରିପାରିବେ" "କ୍ୱିକ ସେଟିଂସରେ କଲର ଇନଭର୍ସନ ଯୋଗ କରାଯାଇଛି। ଯେ କୌଣସି ସମୟରେ ଏହାକୁ ଚାଲୁ କିମ୍ବା ବନ୍ଦ କରିବା ପାଇଁ ତଳକୁ ସ୍ୱାଇପ କରନ୍ତୁ।" - "ଆପଣ ଆପଣଙ୍କ ସ୍କ୍ରିନର ଶୀର୍ଷରୁ କ୍ୱିକ ସେଟିଂସରେ କଲର ଇନଭର୍ସନ ମଧ୍ୟ ଯୋଗ କରିପାରିବେ" + "ଆପଣଙ୍କ ସ୍କ୍ରିନର ଶୀର୍ଷରୁ ମଧ୍ୟ ଆପଣ କ୍ୱିକ ସେଟିଂସରେ କଲର ଇନଭର୍ସନ ଯୋଗ କରିପାରିବେ" "କ୍ୱିକ ସେଟିଂସରେ ଅତିରିକ୍ତ ଡିମ ଯୋଗ କରାଯାଇଛି। ଯେ କୌଣସି ସମୟରେ ଏହାକୁ ଚାଲୁ କିମ୍ବା ବନ୍ଦ କରିବା ପାଇଁ ତଳକୁ ସ୍ୱାଇପ କରନ୍ତୁ।" "ଆପଣ ଆପଣଙ୍କ ସ୍କ୍ରିନର ଶୀର୍ଷରୁ କ୍ୱିକ ସେଟିଂସରେ ଅତିରିକ୍ତ ଡିମ ମଧ୍ୟ ଯୋଗ କରିପାରିବେ" "କ୍ୱିକ ସେଟିଂସରେ ୱାନ-ହେଣ୍ଡେଡ ମୋଡ ଯୋଗ କରାଯାଇଛି। ଯେ କୌଣସି ସମୟରେ ଏହାକୁ ଚାଲୁ କିମ୍ବା ବନ୍ଦ କରିବା ପାଇଁ ତଳକୁ ସ୍ୱାଇପ କରନ୍ତୁ।" @@ -2614,7 +2614,7 @@ "ଆପଣଙ୍କ ଫୋନରେ ରଙ୍ଗଗୁଡ଼ିକ କିପରି ଡିସପ୍ଲେ ହୁଏ ତାହା ଆଡଜଷ୍ଟ କରନ୍ତୁ" "ଆପଣଙ୍କ ଟାବଲେଟରେ ରଙ୍ଗଗୁଡ଼ିକ କିପରି ଡିସପ୍ଲେ ହୁଏ ତାହା ଆଡଜଷ୍ଟ କରନ୍ତୁ" "ରଙ୍ଗ ସଂଶୋଧନ ବ୍ୟବହାର କରନ୍ତୁ" - "ରଙ୍ଗ ସଂଶୋଧନ ପାଇଁ ସର୍ଟକଟ୍" + "ରଙ୍ଗ ସଂଶୋଧନ ପାଇଁ ସର୍ଟକଟ" "ରଙ୍ଗ ସଂଶୋଧନ ବିଷୟରେ" "ରଙ୍ଗ ସଂଶୋଧନ ବିଷୟରେ ଅଧିକ ଜାଣନ୍ତୁ" "କଲର ଇନଭର୍ସନ ବିଷୟରେ" @@ -2632,7 +2632,7 @@ "ଟ୍ରିପଲ୍ ଟାପ୍ ସ୍କ୍ରିନ୍" "ଜାରି ରଖନ୍ତୁ" "ଶ୍ରବଣ ଯନ୍ତ୍ର" - "କୌଣସି ଶ୍ରବଣ ଯନ୍ତ୍ର ସଂଯୋଗ ହୋଇନାହିଁ" + "କୌଣସି ଶ୍ରବଣ ଯନ୍ତ୍ର କନେକ୍ଟ ହୋଇନାହିଁ" "ଶ୍ରବଣ ଯନ୍ତ୍ର ଯୋଗ କରନ୍ତୁ" "ଶ୍ରବଣ ଯନ୍ତ୍ରକୁ ପେୟାର କର" "ପରବର୍ତ୍ତୀ ସ୍କ୍ରିନରେ, ଆପଣଙ୍କ ଶ୍ରବଣ ଯନ୍ତ୍ରରେ ଟାପ କରନ୍ତୁ। ଆପଣଙ୍କୁ ବାମ ଏବଂ ଡାହାଣ କାନକୁ ପୃଥକ ଭାବେ ପେୟାର କରିବା ପାଇଁ ଆବଶ୍ୟକ ହୋଇପାରେ।\n\nଆପଣଙ୍କ ଶ୍ରବଣ ଯନ୍ତ୍ର ଚାଲୁ ଥିବା ଏବଂ ପେୟାର କରିବାକୁ ପ୍ରସ୍ତୁତ ଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ।" @@ -2764,7 +2764,7 @@ "କମ୍ ଶୁଣୁଥିବା, ଶ୍ରବଣଶକ୍ତିରେ ହ୍ରାସ" "କମ୍ ଶୁଣୁଥିବା, ଶ୍ରବଣଶକ୍ତିରେ ହ୍ରାସ, କ୍ୟାପସନ୍, ଟେଲିଟାଇପ୍, TTY" - "ପ୍ରିଣ୍ଟିଙ୍ଗ" + "ପ୍ରିଣ୍ଟିଂ" "ବନ୍ଦ" %1$dଟି ପ୍ରିଣ୍ଟ ସେବା ଚାଲୁ ଅଛି @@ -3438,7 +3438,7 @@ "ଏଣ୍ଟର୍‌ କରାଯାଇଥିବା ସୂଚନା ସର୍ବଦା-ଅନ୍‌ VPNକୁ ସପୋର୍ଟ କରେ ନାହିଁ" "ବାତିଲ କରନ୍ତୁ" "ଖାରଜ" - "ସେଭ୍‌ କରନ୍ତୁ" + "ସେଭ କରନ୍ତୁ" "କନେକ୍ଟ କରନ୍ତୁ" "ପରିବର୍ତ୍ତନ" "VPN ପ୍ରୋଫାଇଲ ଏଡିଟ କରନ୍ତୁ" @@ -3868,7 +3868,7 @@ "ଡାଏଲ୍‌ ପ୍ୟାଡ୍‌ ଟୋନ୍‍" "ସ୍କ୍ରିନ୍ ଲକ୍ କରିବା ସାଉଣ୍ଡ" "ସାଉଣ୍ଡ ଓ ଭାଇବ୍ରେସନ୍ ଚାର୍ଜ ହେଉଛି" - "ଡକ୍‌ କରିବା ଧ୍ୱନୀ" + "ଡକିଂ ସାଉଣ୍ଡ" "ସ୍ପର୍ଶ ଶବ୍ଦ" "ଭାଇବ୍ରେଟ ମୋଡରେ ଥିଲେ ସର୍ବଦା ଆଇକନ ଦେଖାନ୍ତୁ" "ଡକ୍‌ ସ୍ପିକର୍‌ ବାଜିବ" @@ -3956,7 +3956,7 @@ "କେବଳ ପ୍ରାଥମିକତା" "%1$s. %2$s" "ଅନ୍/%1$s" - "ଚାଲୁ" + "ଚାଲୁ ଅଛି" "ପ୍ରତ୍ୟେକ ଥର ପଚାରନ୍ତୁ" "ଯେପର୍ଯ୍ୟନ୍ତ ଆପଣ ବନ୍ଦ କରି ନାହାଁନ୍ତି" "{count,plural, =1{1 ଘଣ୍ଟା}other{# ଘଣ୍ଟା}}" @@ -5010,7 +5010,7 @@ "ର‍୍ୟାଙ୍କିଙ୍ଗର ବସ୍ତୁ ଉପଲବ୍ଧ ନାହିଁ।" "ମୂଲ୍ୟାୟନ ଅବଜେକ୍ଟରେ ଏହି କୀ ନଥାଏ।" "ଡିଭାଇସ୍‌ ଡିଫଲ୍ଟ" - "ପ୍ରଦର୍ଶନ ଫଳକ" + "ଡିସପ୍ଲେ କଟଆଉଟ" "ଡିସ୍‌ପ୍ଲେ କଟଆଉଟ୍, ନଚ୍" "ଡିଭାଇସ୍‌ ଡିଫଲ୍ଟ" "ଓଭର୍‌ଲେ ଲାଗୁ କରିବାରେ ବିଫଳ" @@ -5020,7 +5020,7 @@ 1ଟି ଆପ୍‌, ଅପ୍ରତିବନ୍ଧିତ ଡାଟା ବ୍ୟବହାର କରିପାରେ "ଅଧିକ ଦେଖନ୍ତୁ" - "ShortcutManager ରେଟ୍‌-ଲିମିଟିଙ୍ଗ ରିସେଟ୍‌ କରନ୍ତୁ" + "ShortcutManager ରେଟ-ଲିମିଟିଂକୁ ରିସେଟ କରନ୍ତୁ" "ShortcutManager ର ହାର-ସୀମିତକରଣ ରିସେଟ୍‌ କରିଦିଆଗଲା" "ଲକ୍‌ ସ୍କ୍ରୀନ୍‌ ଉପରେ ନିୟନ୍ତ୍ରଣ ସମ୍ପର୍କିତ ବିଜ୍ଞପ୍ତି" "ବିଜ୍ଞପ୍ତି କଣ୍ଟେଣ୍ଟକୁ ଦେଖାନ୍ତୁ କିମ୍ୱା ଲୁଚାନ୍ତୁ" @@ -5043,7 +5043,7 @@ "ବ୍ୟାଟେରୀ ଲାଇଫ୍ ବଢ଼ାଇବାରେ ସାହାଯ୍ୟ କରେ" "କ୍ୱିକ୍ ସେଟିଂସ ଡେଭେଲପର ଟାଇଲ୍ସ" "adb ଅଧିକାର ସମାପ୍ତ ହେବା ଅକ୍ଷମ କରନ୍ତୁ" - "ଡିଫଲ୍ଟ (7 ଦିନ) କିମ୍ବା ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା କନଫିଗର୍ କରାଯାଇଥିବା (ସର୍ବନିମ୍ନ 1 ଦିନ) ସମୟ ଭିତରେ ପୁଣି ସଂଯୋଗ କରାଯାଇନଥିବା ସିଷ୍ଟମଗୁଡ଼ିକ ପାଇଁ adb ଅଧିକାରଗୁଡ଼ିକର ସ୍ୱଚାଳିତ ବାତିଲକରଣ ସୁବିଧା ଅକ୍ଷମ କରନ୍ତୁ।" + "ଡିଫଲ୍ଟ (7 ଦିନ) କିମ୍ବା ୟୁଜରଙ୍କ ଦ୍ୱାରା କନଫିଗର କରାଯାଇଥିବା (ସର୍ବନିମ୍ନ 1 ଦିନ) ସମୟ ଭିତରେ ପୁଣି କନେକ୍ଟ କରାଯାଇନଥିବା ସିଷ୍ଟମଗୁଡ଼ିକ ପାଇଁ adb ଅଧିକାରଗୁଡ଼ିକର ସ୍ୱତଃ ବାତିଲକରଣକୁ ଅକ୍ଷମ କରନ୍ତୁ।" "Winscope ଟ୍ରେସ୍" "ସେନ୍ସର୍‍ଗୁଡ଼ିକ ବନ୍ଦ ଅଛି" "ୱାର୍କ ପ୍ରୋଫାଇଲ ସେଟିଂସ" @@ -5106,7 +5106,7 @@ "ବାମ ଧାର" "ଡାହାଣ ଧାର" "ଉଚ୍ଚ ସମ୍ବେଦନଶୀଳତା, ସ୍କ୍ରିନ୍‌ର ଧାର ସମେତ ଯେ କୌଣସି ଆପ୍ ଜେଶ୍ଚର୍‌ରେ ପ୍ରଭାବ ପକାଇପାରେ।" - "ବ୍ୟାକ୍ ସମ୍ୱେଦନଶୀଳତା" + "ବେକ ସମ୍ୱେଦନଶୀଳତା" "ଜେଶ୍ଚର ନାଭିଗେସନ ସମ୍ବେଦନଶୀଳତା" "ବଟନ ନାଭିଗେସନ" "ଜେଶ୍ଚର୍ ନାଭିଗେସନ୍, ବ୍ୟାକ୍ ସେନ୍‌ସିଟିଭିଟି, ବ୍ୟାକ୍ ଜେଶ୍ଚର୍" @@ -5344,7 +5344,7 @@ "ANGLE ସକ୍ଷମ ଥିବା ଆପ୍ ଚୟନ କରନ୍ତୁ" "କୌଣସି ANGLE ସକ୍ଷମ ଥିବା ଆପ୍ଲିକେଶନ୍ ସେଟ୍ କରାଯାଇନାହିଁ" "ANGLE ସକ୍ଷମ ଆପ୍ଲିକେଶନ୍: %1$s" - "ଗ୍ରାଫିକ୍ସ ଡ୍ରାଇଭର୍ ଅଗ୍ରାଧିକାର" + "ଗ୍ରାଫିକ୍ସ ଡ୍ରାଇଭର ପସନ୍ଦଗୁଡ଼ିକ" "ଗ୍ରାଫିକ୍ସ ଡ୍ରାଇଭର ସେଟିଂସ ବଦଳାନ୍ତୁ" "ଏକାଧିକ ଗ୍ରାଫିକ୍ସ ଡ୍ରାଇଭର୍ ଥିବା ବେଳେ, ଡିଭାଇସରେ ଇନଷ୍ଟଲ୍ ଥିବା ଆପ୍ସ ପାଇଁ ବ୍ୟବହାର କରିବାକୁ ଅପଡେଟ୍ ହୋଇଥିବା ଗ୍ରାଫିକ୍ସ ଡ୍ରାଇଭର୍ ବାଛିପାରିବେ।" "ସମସ୍ତ ଆପ୍ ପାଇଁ ସକ୍ଷମ କରନ୍ତୁ" @@ -5361,7 +5361,7 @@ "ଆପ୍ କମ୍ପାଟିବିଲିଟୀ ପରିବର୍ତ୍ତନଗୁଡ଼ିକ" - "ଆପ୍ କମ୍ପାଟିବିଲିଟୀ ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ଟୋଗଲ୍ କରନ୍ତୁ" + "ଆପ କମ୍ପାଟିବିଲିଟୀ ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ଟୋଗଲ କରନ୍ତୁ" "ଡିଫଲ୍ଟ ଭାବେ ସକ୍ଷମ କରାଯାଇଥିବା ପରିବର୍ତ୍ତନଗୁଡ଼ିକ" "ଡିଫଲ୍ଟ ଭାବେ ଅକ୍ଷମ କରାଯାଇଥିବା ପରିବର୍ତ୍ତନଗୁଡ଼ିକ" "ଆପ୍ ଉପଲବ୍ଧ ନାହିଁ" @@ -5687,7 +5687,7 @@ "ଆପଣଙ୍କ କାର୍ଯ୍ୟ ନୀତି ସୂଚନା" "ଆପଣଙ୍କ IT ଆଡମିନଙ୍କ ଦ୍ୱାରା ସେଟିଂସ ପରିଚାଳିତ କରାଯାଇଛି।" "GPU" - "ବଗ୍ ରିପୋର୍ଟ ହ୍ୟାଣ୍ଡଲର୍" + "ବଗ ରିପୋର୍ଟ ହେଣ୍ଡଲର" "ଆପଣଙ୍କ ଡିଭାଇସ୍‌ରେ କେଉଁ ଆପ୍ ବଗ୍ ରିପୋର୍ଟ ସର୍ଟକର୍ଟ ପରିଚାଳନା କରେ, ତାହା ନିର୍ଦ୍ଧାରଣ କରେ।" "ବ୍ୟକ୍ତିଗତ" "ୱାର୍କ ପ୍ରୋଫାଇଲ୍" @@ -5735,7 +5735,7 @@ "2ଟି ସିମ୍ ବ୍ୟବହାର କରାଯାଉଥିବା ସମୟରେ, ଏହି ଫୋନ୍ 4Gରେ ସୀମିତ ରହିବ। ""ଅଧିକ ଜାଣନ୍ତୁ" "2ଟି ସିମ୍ ବ୍ୟବହାର କରାଯାଉଥିବା ସମୟରେ, ଏହି ଟାବଲେଟ୍ 4Gରେ ସୀମିତ ରହିବ। ""ଅଧିକ ଜାଣନ୍ତୁ" "2ଟି ସିମ୍ ବ୍ୟବହାର କରାଯାଉଥିବା ସମୟରେ, ଏହି ଡିଭାଇସ୍ 4Gରେ ସୀମିତ ରହିବ। ""ଅଧିକ ଜାଣନ୍ତୁ" - "କ୍ୟାଶ୍ ହୋଇଥିବା ଆପ୍ସ ପାଇଁ ଏକଜିକ୍ୟୁସନ ସସପେଣ୍ଡ କରନ୍ତୁ" + "କେଶେ ହୋଇଥିବା ଆପ୍ସ ପାଇଁ ଏକଜିକ୍ୟୁସନକୁ ସସପେଣ୍ଡ କରନ୍ତୁ" "ମିଆଦ କେବେ ବି ଶେଷ ହେବ ନାହିଁ।" "ଲିଜର ମିଆଦ କେବେ ବି ଶେଷ ହେବ ନାହିଁ।" "ସେଟିଂସରେ ସ୍କ୍ରିନ ଓଭରଲେକୁ ଅନୁମତି ଦିଅନ୍ତୁ" @@ -5826,7 +5826,7 @@ "ଗାଢ଼ା ଥିମ୍ ବ୍ୟବହାର କରନ୍ତୁ" "ବ୍ଲୁଟୁଥ୍ ବ୍ୟବହାର କରନ୍ତୁ" "\"ରିଂ ହେବା ବନ୍ଦ କରନ୍ତୁ\"କୁ ବ୍ୟବହାର କରନ୍ତୁ" - "ୱାଇ-ଫାଇ ହଟସ୍ପଟ୍ ବ୍ୟବହାର କରନ୍ତୁ" + "ୱାଇ-ଫାଇ ହଟସ୍ପଟ ବ୍ୟବହାର କରନ୍ତୁ" "ଆପ୍ ପିନିଂ ବ୍ୟବହାର କରନ୍ତୁ" "ଡେଭଲପରଙ୍କ ପାଇଁ ବିକଳ୍ପଗୁଡ଼ିକୁ ବ୍ୟବହାର କରନ୍ତୁ" "ପ୍ରିଣ୍ଟ ସେବା ବ୍ୟବହାର କରନ୍ତୁ" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 8d3a721b255..073b5a1a168 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -771,9 +771,9 @@ "ਤੁਸੀਂ ਆਪਣੇ ਚਿਹਰੇ ਦੀ ਵਰਤੋਂ ਨਾਲ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਅਣਲਾਕ ਕਰ ਸਕਦੇ ਹੋ। ਸੁਰੱਖਿਆ ਲਈ, ਇਸ ਵਿਕਲਪ ਨੂੰ ਇੱਕ ਬੈਕਅੱਪ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਲੋੜ ਹੈ।" "ਤੁਸੀਂ ਆਪਣੇ ਚਿਹਰੇ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਆਪਣੇ ਟੈਬਲੈੱਟ ਨੂੰ ਅਣਲਾਕ ਕਰ ਸਕਦੇ ਹੋ। ਸੁਰੱਖਿਆ ਲਈ, ਇਸ ਵਿਕਲਪ ਨੂੰ ਇੱਕ ਬੈਕਅੱਪ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਲੋੜ ਹੈ।" "ਤੁਸੀਂ ਆਪਣੇ ਚਿਹਰੇ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਅਣਲਾਕ ਕਰ ਸਕਦੇ ਹੋ। ਸੁਰੱਖਿਆ ਲਈ, ਇਸ ਵਿਕਲਪ ਨੂੰ ਇੱਕ ਬੈਕਅੱਪ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਲੋੜ ਹੈ।" - "ਪੈਟਰਨ • ਚਿਹਰਾ • ਫਿੰਗਰਪ੍ਰਿੰਟ" - "ਪਿੰਨ • ਚਿਹਰਾ • ਫਿੰਗਰਪ੍ਰਿੰਟ" - "ਪਾਸਵਰਡ • ਚਿਹਰਾ • ਫਿੰਗਰਪ੍ਰਿੰਟ" + "ਪੈਟਰਨ • ਫ਼ੇਸ • ਫਿੰਗਰਪ੍ਰਿੰਟ" + "ਪਿੰਨ • ਫ਼ੇਸ • ਫਿੰਗਰਪ੍ਰਿੰਟ" + "ਪਾਸਵਰਡ • ਫ਼ੇਸ • ਫਿੰਗਰਪ੍ਰਿੰਟ" "ਫ਼ੇਸ ਜਾਂ ਫਿੰਗਰਪ੍ਰਿੰਟ ਤੋਂ ਬਿਨਾਂ ਜਾਰੀ ਰੱਖੋ" "ਤੁਸੀਂ ਆਪਣੇ ਚਿਹਰੇ ਜਾਂ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਅਣਲਾਕ ਕਰ ਸਕਦੇ ਹੋ। ਸੁਰੱਖਿਆ ਲਈ, ਇਸ ਵਿਕਲਪ ਨੂੰ ਇੱਕ ਬੈਕਅੱਪ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਲੋੜ ਹੈ।" "ਤੁਸੀਂ ਆਪਣੇ ਚਿਹਰੇ ਜਾਂ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਆਪਣੇ ਟੈਬਲੈੱਟ ਨੂੰ ਅਣਲਾਕ ਕਰ ਸਕਦੇ ਹੋ। ਸੁਰੱਖਿਆ ਲਈ, ਇਸ ਵਿਕਲਪ ਨੂੰ ਇੱਕ ਬੈਕਅੱਪ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਲੋੜ ਹੈ।" @@ -1731,7 +1731,7 @@ "ਤੁਹਾਨੂੰ ਕੈਮਰਾ ਸਾਫ਼ਟਵੇਅਰ ਵਰਤਦੇ ਹੋਏ ਫ਼ੋਟੋਆਂ ਅਤੇ ਕੰਪਿਊਟਰ ਤੇ ਕੋਈ ਵੀ ਫ਼ਾਈਲਾਂ ਟ੍ਰਾਂਸਫਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ ਜੋ MTP ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੇ" "MIDI" "MIDI ਸਮਰਥਿਤ ਐਪਲੀਕੇਸ਼ਨਾਂ ਨੂੰ ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਤੇ MIDI ਸਾਫ਼ਟਵੇਅਰ ਨਾਲ USB ਤੇ ਕੰਮ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।" - "ਹੋਰ ਉਪਭੋਗਤਾ" + "ਹੋਰ ਵਰਤੋਂਕਾਰ" "ਡੀਵਾਈਸ ਸਟੋਰੇਜ" "ਪੋਰਟੇਬਲ ਸਟੋਰੇਜ" "^1"" ^2""" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index a1443a978e1..9044611a7be 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -449,11 +449,11 @@ "Wymagaj otwartych oczu" "Aby odblokować telefon, musisz mieć otwarte oczy" "Zawsze wymagaj potwierdzenia" - "Zawsze wymagaj potwierdzenia, gdy używasz rozpoznawania twarzy w aplikacjach" + "Zawsze wymagaj potwierdzenia, gdy używasz rozpoznawania twarzy w aplikacjach." "Usuń model twarzy" "Skonfiguruj rozpoznawanie twarzy" - "Używaj rozpoznawania twarzy do odblokowywania telefonu i uwierzytelniania w aplikacjach, na przykład podczas logowania lub zatwierdzania zakupów.\n\nPamiętaj:\nNie można mieć kilku skonfigurowanych modeli twarzy jednocześnie. Jeśli chcesz dodać inny model twarzy, usuń bieżący.\n\nPatrząc na telefon, możesz go przypadkowo odblokować.\n\nInna osoba może odblokować Twój telefon, zbliżając go do Twojej twarzy.\n\nIstnieje możliwość, że ktoś bardzo podobny do Ciebie (np. rodzeństwo), odblokuje Twój telefon." - "Używaj rozpoznawania twarzy do odblokowywania telefonu i uwierzytelniania w aplikacjach, na przykład podczas logowania lub zatwierdzania zakupów.\n\nPamiętaj:\nNie można mieć kilku skonfigurowanych modeli twarzy jednocześnie. Jeśli chcesz dodać inny model twarzy, usuń bieżący.\n\nPatrząc na telefon, możesz go przypadkowo odblokować.\n\nInna osoba może odblokować Twój telefon, zbliżając go do Twojej twarzy (nawet przy zamkniętych oczach).\n\nIstnieje możliwość, że ktoś bardzo podobny do Ciebie (np. rodzeństwo), odblokuje Twój telefon." + "Używaj rozpoznawania twarzy do odblokowywania telefonu i uwierzytelniania w aplikacjach, na przykład podczas logowania lub zatwierdzania zakupów.\n\nPamiętaj:\nNie można mieć kilku skonfigurowanych modeli twarzy jednocześnie. Jeśli chcesz dodać inny model twarzy, usuń bieżący.\n\nPatrząc na telefon, możesz go przypadkowo odblokować.\n\nInna osoba może odblokować Twój telefon, zbliżając go do Twojej twarzy.\n\nIstnieje możliwość, że ktoś bardzo podobny do Ciebie (np. rodzeństwo) odblokuje Twój telefon." + "Używaj rozpoznawania twarzy do odblokowywania telefonu i uwierzytelniania w aplikacjach, na przykład podczas logowania lub zatwierdzania zakupów.\n\nPamiętaj:\nNie można mieć kilku skonfigurowanych modeli twarzy jednocześnie. Jeśli chcesz dodać inny model twarzy, usuń bieżący.\n\nPatrząc na telefon, możesz go przypadkowo odblokować.\n\nInna osoba może odblokować Twój telefon, zbliżając go do Twojej twarzy (nawet przy zamkniętych oczach).\n\nIstnieje możliwość, że ktoś bardzo podobny do Ciebie (np. rodzeństwo) odblokuje Twój telefon." "Usunąć model twarzy?" "Model twarzy zostanie trwale i w bezpieczny sposób usunięty.\n\nPo usunięciu tych danych do odblokowywania telefonu i uwierzytelniania się w aplikacjach trzeba będzie używać kodu PIN, wzoru lub hasła." "Model twarzy zostanie trwale i bezpiecznie usunięty.\n\nPo usunięciu tych danych będziesz potrzebować kodu PIN, wzoru lub hasła do odblokowywania telefonu." @@ -967,10 +967,10 @@ "Musi składać się z 16 cyfr" "Może być również konieczne wpisanie tego kodu PIN na drugim urządzeniu." "Może być również konieczne wpisanie tego klucza na drugim urządzeniu." - "Aby sparować z urządzeniem:<br><b>%1$s</b><br><br>Upewnij się, że jest na nim wyświetlony następujący klucz:<br><b>%2$s</b>" + "Aby sparować z urządzeniem:<br><b>%1$s</b><br><br>Upewnij się, że jest na nim wyświetlony następujący klucz dostępu:<br><b>%2$s</b>" "Potwierdź, aby sparować ze skoordynowanym zestawem" "Od:<br><b>%1$s</b><br><br>Sparować z tym urządzeniem?" - "Aby sparować z urządzeniem <br><b>%1$s</b><br><br>, wpisz na nim klucz <br><b>%2$s</b>, a następnie naciśnij klawisz zatwierdzania." + "Aby sparować z urządzeniem <br><b>%1$s</b><br><br>, wpisz na nim klucz dostępu <br><b>%2$s</b>, a następnie naciśnij klawisz zatwierdzania." "Zezwól na dostęp do kontaktów i historii połączeń" "Nie udało się nawiązać połączenia z %1$s." diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index af7bca3590e..43105cd89fe 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -282,7 +282,7 @@ "Definir fuso horário automaticamente" "Usar o padrão do local" "Formato de 24 horas" - "Formato de 24 horas" + "Usar formato de 24 horas" "Horário" "Formato de hora" "Fuso horário" @@ -446,8 +446,8 @@ "Sempre exigir etapa de confirmação ao usar Desbloqueio facial em apps" "Excluir modelo de rosto" "Configurar o Desbloqueio facial" - "Use seu rosto para desbloquear o smartphone ou fazer a autenticação em apps, da mesma forma que você faz login ou aprovações de compras.\n\nLembre-se:\nSó é possível configurar um rosto por vez. Para adicionar outro rosto, exclua o registrado atualmente.\n\nOlhar para o smartphone pode desbloquear o dispositivo mesmo que você não tenha intenção de fazer isso.\n\nO smartphone pode ser desbloqueado por outra pessoa se ele for apontado para seu rosto.\n\nO smartphone pode ser desbloqueado por alguém que se pareça muito com você, como, por exemplo, um gêmeo idêntico." - "Use seu rosto para desbloquear o smartphone ou fazer a autenticação em apps, da mesma forma que você faz login ou aprovações de compras.\n\nLembre-se:\nSó é possível configurar um rosto por vez. Para adicionar outro rosto, exclua o registrado atualmente.\n\nOlhar para o smartphone pode desbloquear o dispositivo mesmo que você não tenha intenção de fazer isso.\n\nO smartphone pode ser desbloqueado por outra pessoa se ele for apontado para seu rosto.\n\nO smartphone pode ser desbloqueado por alguém que se pareça muito com você, como, por exemplo, um gêmeo idêntico." + "Use seu rosto para desbloquear o smartphone, fazer login em apps ou finalizar compras.\n\nLembre-se:\nSó é possível configurar um rosto por vez. Para adicionar outro, exclua o registrado atualmente.\n\nOOlhar para o smartphone pode desbloquear o dispositivo, mesmo sem intenção.\n\nEle pode ser desbloqueado por outra pessoa se for direcionado para seu rosto.\n\nO desbloqueio também pode ser feito por alguém que se pareça muito com você, como um gêmeo idêntico." + "Use seu rosto para desbloquear o smartphone, fazer login em apps ou finalizar compras.\n\nLembre-se:\nSó é possível configurar um rosto por vez. Para adicionar outro, exclua o registrado atualmente.\n\nOlhar para o smartphone pode desbloquear o dispositivo, mesmo sem intenção.\n\nEle pode ser desbloqueado por outra pessoa se for direcionado para seu rosto.\n\nO desbloqueio também pode ser feito por alguém que se pareça muito com você, como um gêmeo idêntico." "Excluir modelo de rosto?" "Seu modelo de rosto será excluído de maneira permanente e segura.\n\nApós a exclusão, seu PIN, padrão ou senha serão necessários para desbloquear o smartphone ou fazer a autenticação em apps." "Seu modelo de rosto será excluído de maneira permanente e segura.\n\nApós a exclusão, seu PIN, padrão ou senha serão necessários para desbloquear o smartphone." diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 147f1577ef3..273a0a554d0 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -1719,7 +1719,7 @@ "Esquecer" "Configurar" "Libertar espaço" - "Gerir o armazenamento" + "Gerir armazenamento" "limpar, armazenamento" "Libertar espaço" "Aceda à app Files para gerir e libertar espaço" @@ -3534,7 +3534,7 @@ "Eliminar %1$s deste dispositivo" "Definições do ecrã de bloqueio" "Adicionar utilizadores a partir do ecrã de bloqueio" - "Mudar p/ utilizador administrador quando ancorado" + "Mudar para utilizador administrador quando ancorado" "Eliminar-se a si próprio?" "Eliminar este utilizador?" "Remover este perfil?" @@ -4788,7 +4788,7 @@ "Abrir a aplicação de câmara ao torcer o dispositivo no seu pulso" "Premir ligar/desligar 2 vezes p/ câmara" "Abrir rapidamente a câmara sem desbloquear o ecrã" - "Tamanho da visualização" + "Tamanho do ecrã" "Aumente ou diminua o tamanho de todos os itens" "densidade de apresentação, zoom do ecrã, escala, dimensionamento" "Aumente ou diminua os itens no ecrã. Algumas apps no ecrã podem mudar de posição." @@ -5063,7 +5063,7 @@ %s segundos 1 segundo - "Gerir o armazenamento" + "Gerir armazenamento" "Para ajudar a libertar espaço de armazenamento, o gestor de armazenamento remove cópias de segurança de fotos e vídeos do dispositivo." "Remover fotos e vídeos" "Gestor de armazenamento" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index af7bca3590e..43105cd89fe 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -282,7 +282,7 @@ "Definir fuso horário automaticamente" "Usar o padrão do local" "Formato de 24 horas" - "Formato de 24 horas" + "Usar formato de 24 horas" "Horário" "Formato de hora" "Fuso horário" @@ -446,8 +446,8 @@ "Sempre exigir etapa de confirmação ao usar Desbloqueio facial em apps" "Excluir modelo de rosto" "Configurar o Desbloqueio facial" - "Use seu rosto para desbloquear o smartphone ou fazer a autenticação em apps, da mesma forma que você faz login ou aprovações de compras.\n\nLembre-se:\nSó é possível configurar um rosto por vez. Para adicionar outro rosto, exclua o registrado atualmente.\n\nOlhar para o smartphone pode desbloquear o dispositivo mesmo que você não tenha intenção de fazer isso.\n\nO smartphone pode ser desbloqueado por outra pessoa se ele for apontado para seu rosto.\n\nO smartphone pode ser desbloqueado por alguém que se pareça muito com você, como, por exemplo, um gêmeo idêntico." - "Use seu rosto para desbloquear o smartphone ou fazer a autenticação em apps, da mesma forma que você faz login ou aprovações de compras.\n\nLembre-se:\nSó é possível configurar um rosto por vez. Para adicionar outro rosto, exclua o registrado atualmente.\n\nOlhar para o smartphone pode desbloquear o dispositivo mesmo que você não tenha intenção de fazer isso.\n\nO smartphone pode ser desbloqueado por outra pessoa se ele for apontado para seu rosto.\n\nO smartphone pode ser desbloqueado por alguém que se pareça muito com você, como, por exemplo, um gêmeo idêntico." + "Use seu rosto para desbloquear o smartphone, fazer login em apps ou finalizar compras.\n\nLembre-se:\nSó é possível configurar um rosto por vez. Para adicionar outro, exclua o registrado atualmente.\n\nOOlhar para o smartphone pode desbloquear o dispositivo, mesmo sem intenção.\n\nEle pode ser desbloqueado por outra pessoa se for direcionado para seu rosto.\n\nO desbloqueio também pode ser feito por alguém que se pareça muito com você, como um gêmeo idêntico." + "Use seu rosto para desbloquear o smartphone, fazer login em apps ou finalizar compras.\n\nLembre-se:\nSó é possível configurar um rosto por vez. Para adicionar outro, exclua o registrado atualmente.\n\nOlhar para o smartphone pode desbloquear o dispositivo, mesmo sem intenção.\n\nEle pode ser desbloqueado por outra pessoa se for direcionado para seu rosto.\n\nO desbloqueio também pode ser feito por alguém que se pareça muito com você, como um gêmeo idêntico." "Excluir modelo de rosto?" "Seu modelo de rosto será excluído de maneira permanente e segura.\n\nApós a exclusão, seu PIN, padrão ou senha serão necessários para desbloquear o smartphone ou fazer a autenticação em apps." "Seu modelo de rosto será excluído de maneira permanente e segura.\n\nApós a exclusão, seu PIN, padrão ou senha serão necessários para desbloquear o smartphone." diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index bfc1035a571..57cadbf222b 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -675,7 +675,7 @@ "Omiți configurarea modelului și a amprentei?" "Omiți configurarea modelului, a chipului și a amprentei?" "Configurează blocarea ecranului" - "Terminat" + "Gata" "Hopa, acela nu este senzorul" "Atinge senzorul de pe spatele telefonului. Folosește degetul arătător." "Înregistrarea nu a fost finalizată" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 53b3ee0a01b..0b30a8e3375 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -490,7 +490,7 @@ "Ваши новые отпечатки пальца будут время от времени использоваться для создания улучшенных моделей." "Разблокируйте телефон и подтверждайте покупки, используя отпечатки пальцев.\n\nВнимание! Для разблокировки этого устройства сканер отпечатков использовать нельзя. За подробной информацией обратитесь к администратору." "Отмена" - "Нет" + "Нет, спасибо" "Принять" "Не настраивать отпечатки?" "Ввод отпечатков пальцев занимает 1–2 минуты. Вы можете добавить их позже в настройках устройства." @@ -2647,7 +2647,7 @@ "Вибрация при уведомлении" "Вибрация при касании" "%1$s" - "Открыть %1$s" + "Открыть приложение \"%1$s\"" "Приложение \"%1$s\" добавлено в Быстрые настройки. Чтобы включить или отключить его, проведите вниз по экрану." "Вы также можете добавить приложение \"%1$s\" в меню быстрых настроек в верхней части экрана" "Коррекция цвета добавлена в Быстрые настройки. Чтобы включить или отключить ее, проведите вниз по экрану." @@ -2752,8 +2752,8 @@ %1$s секунды
    "Настройки" - "Включено" - "Отключено" + "Вкл." + "Откл." "Предпросмотр" "Стандартные настройки" "Язык" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index a243ef5b34b..f3b94e0ee37 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -298,7 +298,7 @@ "%1$s sa začína %2$s." "%1$s (%2$s)" "%2$s (%1$s)" - "Používa %1$s, %2$s sa začína %3$s." + "Používa %1$s, %2$s sa začína %3$s." "Používa %1$s. Nepoužíva letný čas." "Letný čas" "Štandardný čas" @@ -449,7 +449,7 @@ "Vyžadovať otvorené oči" "Pri odomykaní telefónu vyžadovať otvorené oči" "Vždy vyžadovať potvrdenie" - "Pri používaní odomknutia tvárou v aplikáciách vždy vyžad. potvrdenie" + "Pri používaní odomknutia tvárou v aplikáciách vždy vyžadovať potvrdenie" "Odstrániť model tváre" "Nastaviť odomknutie tvárou" "Pomocou tváre odomykajte telefón alebo overujte svoju totožnosť v aplikáciách, napríklad pri prihlasovaní alebo schvaľovaní nákupu.\n\nUpozorňujeme:\nNaraz môžete mať nastavenú iba jednu tvár. Ak chcete pridať ďalšiu tvár, odstráňte aktuálnu.\n\nTelefón môžete neúmyselne odomknúť pohľadom.\n\nMôže ho odomknúť iná osoba, ak vám ho pridrží pred tvárou.\n\nMôže ho odomknúť aj niekto, kto sa na vás veľmi podobá, napríklad dvojča." @@ -2158,7 +2158,7 @@ "Na záver zdvihnite prst z obrazovky" "Spojte aspoň %d body. Skúste to znova." "Vzor bol zaznamenaný" - "Znovu nakreslite pre potvrdenie" + "Znova nakreslite vzor pre potvrdenie" "Váš nový bezpečnostný vzor" "Potvrdiť" "Nakresliť znova" @@ -3618,7 +3618,7 @@ "Odstrániť zo zariadenia (%1$s)" "Nastavenia uzamknutej obrazovky" "Pridávať používateľov z uzamknutej obrazovky" - "V doku prepnúť na používateľa s oprávnen. správcu" + "V doku prepnúť na správcu" "Chcete odstrániť svoj profil?" "Chcete odobrať tohto používateľa?" "Odstrániť tento profil?" @@ -5268,9 +5268,9 @@ "Zariadenie skontrolujete dvojitým klepnutím" "Režim jednej ruky" "Použiť režim jednej ruky" - "Skratka režimu jednej ruky" + "Skratka Režim jednej ruky" "dosiahnuteľnosť" - "Potiahnutím nadol" + "Potiahnutím nadol:" "Použitie tejto skratky" "Potiahnite nadol hornú polovicu obrazovky, aby ste na ňu ľahšie dosiahli jednou rukou" " ""Ako používať režim jednej ruky"\n" • Nezabudnite v nastaveniach navigácie systému vybrať navigáciu gestami.\n • Potiahnite nadol popri dolnom okraji obrazovky." diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 88a9306f780..e77791a389f 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -4174,7 +4174,7 @@ "Prikaži vso vsebino obvestil" "Prikaži občutljivo vsebino samo na odklenjenem zaslonu." "Sploh ne prikazuj obvestil" - "Kaj želite, da je prikazano na zaklenjenem zaslonu?" + "Kaj naj bo prikazano na zaklenjenem zaslonu?" "Zaklenjen zaslon" "Pokaži vso vsebino obvestil za delovni profil." "Skrivanje občutljive vsebine za delovni profil" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index 9595534db51..c2860ca239b 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -282,7 +282,7 @@ "Cakto automatikisht brezin orar" "Përdor parazgjedhjen e lokalitetit" "Formati \"24 orë\"" - "Përdor formatin 24 orë" + "Përdor formatin 24-orësh" "Ora" "Formati i orës" "Brezi orar" @@ -771,7 +771,7 @@ "Mund ta shkyçësh telefonin duke përdorur fytyrën. Për siguri, ky opsion kërkon një kyçje rezervë të ekranit." "Mund ta shkyçësh tabletin tënd duke përdorur fytyrën. Për siguri, ky opsion kërkon një kyçje rezervë të ekranit." "Mund ta shkyçësh pajisjen tënde duke përdorur fytyrën. Për siguri, ky opsion kërkon një kyçje rezervë të ekranit." - "Motivi • Fytyra • Gjurma e gishtit" + "Motiv • Fytyrë • Gjurmë gishti" "PIN • Fytyra • Gjurma e gishtit" "Fjalëkalimet • Fytyra • Gjurma e gishtit" "Vazhdo pa fytyrë apo gjurmë gishti" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index ead6bebbf7a..fd5ec24246d 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -3576,7 +3576,7 @@ "Избриши %1$s са уређаја" "Подешавања закључаног екрана" "Додај кориснике са закључаног екрана" - "Пређи на администратора на базној станици" + "Пребаци на администратора на базној станици" "Желите ли да избришете себе?" "Бришете овог корисника?" "Уклањате овај профил?" @@ -4114,7 +4114,7 @@ "Укључи треперење лампице" "Приватност" "Прескочи закључан екран" - "После откључавања идите директно на последњи екран" + "После откључавања идете директно на последњи екран" "закључани екран, прескочити, заобићи" "Када је пословни профил закључан" "Приказуј само нова обавештења на закључаном екрану" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 93dedae61a4..6408401687b 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -548,7 +548,7 @@ "Gusa ili uweke mipangilio" "Uso na alama za vidole zimeongezwa" "Uso na alama ya kidole imeongezwa" - "Unapoweka mbinu ya Kufungua kwa uso na Kufungua kwa alama ya kidole, simu yako itakuomba alama ya kidole chako unapovaa barakoa au unapokuwa katika eneo lenye giza" + "Ukiweka mbinu ya Kufungua kwa uso na Kufungua kwa alama ya kidole, simu yako itakuomba alama ya kidole wakati umevaa barakoa au ukiwa katika eneo lenye giza" "Mbinu za kufungua" "Kufungua simu yako" "Kuthibitisha ni wewe katika programu" @@ -691,7 +691,7 @@ "usalama, mipangilio zaidi ya usalama, mipangilio zaidi, mipangilio ya kina ya usalama" "Mipangilio zaidi ya faragha" "Kujaza kiotomatiki, vidhibiti vya shughuli na zaidi" - "Unaweza kuongeza hadi vitambulisho %d" + "Unaweza kuongeza hadi alama za vidole %d" "Umeongeza idadi ya juu inayoruhusiwa ya alama za kidole" "Haiwezi kuongeza alama zaidi za kidole" "Unataka kuondoa alama zako zote za vidole?" @@ -3534,7 +3534,7 @@ "Futa %1$s kutoka kwenye kifaa hiki" "Mipangilio ya kufunga skrini" "Ongeza watumiaji skrini ikiwa imefungwa" - "Rudisha kwa mtumiaji msimamizi wakati kimeambatishwa" + "Tumia hali ya msimamizi wakati kimepachikwa" "Ungependa kujifuta?" "Ungependa kumfuta mtumiaji huyu?" "Ungependa kuondoa wasifu?" @@ -3868,7 +3868,7 @@ "Sauti za vitufe vya kupiga simu" "Sauti ya kufunga skrini" "Sauti za kuchaji na mtetemo" - "Kuambatisha sauti" + "Sauti ikiwa imepachikwa" "Sauti inapoguswa" "Onyesha aikoni kila wakati ikiwa katika hali ya mtetemo" "Cheza kutumia spika ya kituo" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index e1414f32313..2e499a5f948 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -280,7 +280,7 @@ "தேதி, நேரம், நேரமண்டலம் & வடிவமைப்புகளை அமை" "தானாக நேரத்தை அமை" "தானாக நேர மண்டலத்தை அமை" - "இயல்பாகத் தேர்ந்தெடுத்துள்ள மொழியைப் பயன்படுத்தவும்" + "உள்ளூர் நேர வடிவத்தைப் பயன்படுத்து" "24 மணிநேர வடிவம்" "24-மணிநேர வடிவமைப்பில்" "நேரம்" @@ -3534,7 +3534,7 @@ "சாதனத்திலிருந்து %1$s ஐ நீக்கு" "லாக் ஸ்கிரீன் அமைப்புகள்" "லாக் ஸ்கிரீனிலிருந்து பயனர்களைச் சேர்" - "இணைந்திருக்கும்போது நிர்வாகப் பயனருக்கு மாறும்" + "இணைந்திருக்கும்போது நிர்வாகப் பயனருக்கு மாறு" "உங்களை நீக்கவா?" "இந்தப் பயனரை நீக்கவா?" "இதை அகற்றவா?" @@ -5096,9 +5096,9 @@ "உங்களின் இயல்பான முகப்பு ஆப்ஸ் %s இதை ஆதரிக்கவில்லை" "இயல்பான முகப்பு ஆப்ஸை மாற்று" "டிஜிட்டல் அசிஸ்டண்ட்" - "அசிஸ்டண்ட்டைத் துவக்க ஸ்வைப் செய்யுங்கள்" + "அசிஸ்டண்ட்டைத் துவக்க ஸ்வைப் செய்தல்" "டிஜிட்டல் அசிஸ்டண்ட் ஆப்ஸைத் துவக்க, கீழ் மூலையிலிருந்து மேல்நோக்கி ஸ்வைப் செய்யலாம்." - "Assistantடுக்காக முகப்பு பட்டனை அழுத்திப் பிடியுங்கள்" + "Assistantடை இயக்க முகப்பு பட்டனை அழுத்திப் பிடித்தல்" "டிஜிட்டல் அசிஸ்டண்ட் ஆப்ஸைத் துவக்க, முகப்புப் பட்டனை அழுத்திப் பிடிக்கவும்." "தகவல் ஐகான்" "குறைவு" @@ -5624,7 +5624,7 @@ "அளவு மாற்ற இயலாதவற்றைப் பல சாளரத்தில் இயக்கு" "அளவு மாற்ற இயலாத ஆப்ஸைப் பல சாளரத்தில் இயக்க அனுமதிக்கும்" "force-dark அம்சத்தை மீறிச் செயல்படுதல்" - "எப்போதும் இயக்கத்தில் இருக்குமாறு force-dark அம்சத்தை மேலெழுதுகிறது" + "force-dark எப்போதும் இயக்கத்தில் இருப்பதை மீறும்" "தனியுரிமை" "அனுமதிகள், கணக்குச் செயல்பாடு, தனிப்பட்ட தரவு" "கட்டுப்பாடுகள்" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 9b3d5c9b641..3301a04f25c 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -280,7 +280,7 @@ "తేదీ, సమయం, టైమ్ జోన్, & ఫార్మాట్‌లను సెట్ చేయండి" "ఆటోమేటిక్‌గా టైమ్‌ను సెట్ చేయండి" "ఆటోమేటిక్‌గా టైమ్ జోన్‌ను సెట్ చేయండి" - "ఆ భాష‌లో వాడే ఫార్మాట్‌ను ఉప‌యోగించండి" + "ఆ భాష‌లో వాడే ఫార్మాట్‌ను ఆటోమేటిక్‌ సెట్టింగ్‌గా ఉప‌యోగించండి" "24‑గంటల ఫార్మాట్" "24-గంటల ఫార్మాట్‌ను ఉప‌యోగించండి" "సమయం" @@ -515,7 +515,7 @@ "ఉత్తమ ఫలితాల కోసం, Google చేత సర్టిఫైడ్ చేయబడి తయారు చేయబడిన స్క్రీన్ ప్రొటెక్టర్‌ను ఉపయోగించండి. ఇతర స్క్రీన్ ప్రొటెక్టర్‌లతో, మీ వేలిముద్ర పని చేయకపోవచ్చు." "ఉత్తమ ఫలితాల కోసం, Google చేత సర్టిఫైడ్ చేయబడి తయారు చేయబడిన స్క్రీన్ ప్రొటెక్టర్‌ను ఉపయోగించండి. ఇతర స్క్రీన్ ప్రొటెక్టర్‌లతో, మీ పిల్లల వేలిముద్ర పని చేయకపోవచ్చు." - "ప్రతిసారీ మీ వేళ్ల స్థానాన్ని కొద్దిగా మార్చండి" + "ప్రతిసారీ మీ వేలి స్థానాన్ని కొద్దిగా మార్చండి" "మీ వేలిముద్ర మధ్యభాగంతో చిహ్నాన్ని కప్పండి" "ఈ వేలిముద్ర ఇప్పటికే జోడించబడింది" "సెన్సార్‌కు సమీపంలో ఉన్న మీ స్క్రీన్‌ను శుభ్రం చేసుకుని, మళ్లీ ట్రై చేయండి" @@ -751,7 +751,7 @@ "సెక్యూరిటీ వద్దు" "ఆకృతి" "మధ్యస్థ సెక్యూరిటీ" - "పిన్‌" + "PIN" "మధ్యస్థం నుండి అధిక సెక్యూరిటీ" "పాస్‌వర్డ్" "అధిక సెక్యూరిటీ" @@ -782,7 +782,7 @@ "ఏదీ వద్దు" "స్వైప్" "ఆకృతి" - "పిన్‌" + "PIN" "పాస్‌వర్డ్" "మీరు స్క్రీన్ లాక్‌ను సెటప్ చేసిన తర్వాత, సెట్టింగ్‌లు > సెక్యూరిటీలో మీ వేలిముద్రను కూడా సెటప్ చేయవచ్చు." "స్క్రీన్ లాక్‌ను ఆఫ్ చేయి" @@ -3534,7 +3534,7 @@ "ఈ పరికరం నుండి %1$sని తొలగించండి" "లాక్ స్క్రీన్ సెట్టింగ్‌లు" "లాక్ స్క్రీన్ నుండి యూజ‌ర్‌ల‌ను జోడించండి" - "డాక్ చేసినప్పుడు అడ్మిన్ యూజర్‌కు స్విచ్ అవ్వండి" + "డాక్ చేసినప్పుడు అడ్మిన్ యూజర్‌కు మారండి" "మిమ్మల్ని తొలగించాలా?" "ఈ యూజర్‌ను తొలగించాలా?" "ఈ ప్రొఫైల్‌ను తీసివేయాలా?" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 43cffd9d018..4ff8cbfe939 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -1912,7 +1912,7 @@ "ฮอตสปอตและการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ" "ฮอตสปอตเปิดอยู่ กำลังเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ" "ฮอตสปอตเปิดอยู่" - "การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ" + "กำลังเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ" "ไม่สามารถเชื่อมต่ออินเทอร์เน็ตผ่านมือถือหรือใช้โหมดฮอตสปอตแบบพกพาขณะที่การประหยัดอินเทอร์เน็ตเปิดอยู่" "ฮอตสปอตเท่านั้น" "USB เท่านั้น" @@ -2476,7 +2476,7 @@ "แตะ 3 ครั้งเพื่อซูม" "แตะปุ่มเพื่อซูม" "ซูมเข้าอย่างรวดเร็วบนหน้าจอเพื่อทำให้เนื้อหาใหญ่ขึ้น" - "<b>วิธีซูมเข้า</b><br/> {0,number,integer} ใช้ทางลัดเพื่อเริ่มการขยาย<br/> {1,number,integer} แตะหน้าจอ<br/> {2,number,integer} ใช้ 2 นิ้วลากเพื่อย้ายไปรอบๆ หน้าจอ<br/> {3,number,integer} บีบ 2 นิ้วเพื่อปรับการซูม<br/> {4,number,integer} ใช้ทางลัดเพื่อหยุดการขยาย<br/><br/> <b>วิธีซูมเข้าชั่วคราว</b><br/> {0,number,integer} ตรวจสอบว่าตั้งค่าประเภทการขยายเป็นแบบเต็มหน้าจอ<br/> {1,number,integer} ใช้ทางลัดเพื่อเริ่มการขยาย<br/> {2,number,integer} แตะที่ใดก็ได้บนหน้าจอค้างไว้<br/> {3,number,integer} ลากนิ้วเพื่อย้ายไปรอบๆ หน้าจอ<br/> {4,number,integer} ยกนิ้วขึ้นเพื่อหยุดการขยาย" + "<b>วิธีซูมเข้า</b><br/> {0,number,integer}. ใช้ทางลัดเพื่อเริ่มการขยาย<br/> {1,number,integer}. แตะหน้าจอ<br/> {2,number,integer}. ใช้ 2 นิ้วลากเพื่อย้ายไปรอบๆ หน้าจอ<br/> {3,number,integer}. บีบ 2 นิ้วเพื่อปรับการซูม<br/> {4,number,integer}. ใช้ทางลัดเพื่อหยุดการขยาย<br/><br/> <b>วิธีซูมเข้าชั่วคราว</b><br/> {0,number,integer}. ตรวจสอบว่าตั้งค่าประเภทการขยายเป็นแบบเต็มหน้าจอ<br/> {1,number,integer}. ใช้ทางลัดเพื่อเริ่มการขยาย<br/> {2,number,integer}. แตะที่ใดก็ได้บนหน้าจอค้างไว้<br/> {3,number,integer}. ลากนิ้วเพื่อย้ายไปรอบๆ หน้าจอ<br/> {4,number,integer}. ยกนิ้วขึ้นเพื่อหยุดการขยาย" "คุณจะซูมหน้าจอเข้าได้เมื่อเปิดการขยาย\n\n""วิธีซูมคือ"" เริ่มการขยาย จากนั้นแตะบริเวณที่ต้องการซูมในหน้าจอ\n"
    • "ลากนิ้วอย่างน้อย 2 นิ้วเพื่อเลื่อน"
    • \n
    • "บีบนิ้วอย่างน้อย 2 นิ้วเพื่อปรับการซูม"
    \n\n"วิธีซูมชั่วคราวคือ"" เริ่มการขยาย จากนั้นแตะบริเวณที่ต้องการซูมในหน้าจอค้างไว้\n"
    • "ลากเพื่อไปยังส่วนต่างๆ ในหน้าจอ"
    • \n
    • "ยกนิ้วขึ้นเพื่อซูมออก"
    \n\n"คุณซูมเข้าโดยใช้แป้นพิมพ์หรือแถบนำทางไม่ได้"
    "หน้า %1$d จาก %2$d" "ใช้ปุ่มการช่วยเหลือพิเศษเพื่อเปิด" @@ -3868,7 +3868,7 @@ "เสียงแป้นหมายเลข" "เสียงการล็อกหน้าจอ" "เสียงชาร์จและการสั่น" - "เสียงเชื่อมต่อแท่นลำโพง" + "เสียงเชื่อมต่อแท่นชาร์จ" "เสียงแตะ" "แสดงไอคอนเสมอเมื่ออยู่ในโหมดสั่น" "เล่นเสียงจากแท่นลำโพง" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 9866ade94ff..d18d568f3b6 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -350,7 +350,7 @@ "Yüz Tanıma Kilidi" "İş için Yüz Tanıma Kilidi" "Yüz Tanıma Kilidi\'ni ayarlama" - "Yüz Tanıma Kilidi\'ni kurma" + "Yüz Tanıma Kilidi\'ni kur" "Kimlik doğrulama için yüzünüzü kullanın" @@ -1882,7 +1882,7 @@ "İndirilen SIM\'ler bir hata nedeniyle silinemiyor.\n\nCihazınızı yeniden başlatın ve tekrar deneyin." "Tüm verileri sil (fabrika ayarlarına sıfırla)" "Tüm verileri sil (fabrika ayarlarına sıfırla)" - "Bu işlem, tabletinizin ""dahili depolama alanından""şu verilerin tümünü siler:\n\n"
  • "Google hesabınız"
  • \n
  • "Sistem ve uygulama verileri ile ayarları"
  • \n
  • "İndirilen uygulamalar"
  • + "Bu işlem, tabletinizin ""dahili depolama alanından"" şu verilerin tümünü siler:\n\n"
  • "Google Hesabınız"
  • \n
  • "Sistem ve uygulama verileri ile ayarları"
  • \n
  • "İndirilen uygulamalar"
  • "Bu işlem, aşağıdakiler dahil olmak üzere telefonunuzun ""dahili depolama alanındaki"" verilerin tümünü siler:\n\n"
  • "Google hesabınız"
  • \n
  • "Sistem ve uygulama verileri ile ayarları"
  • \n
  • "İndirilen uygulamalar"
  • \n\n"Şu anda aşağıdaki hesaplarda oturum açmış durumdasınız:\n" \n\n"Bu cihazda başka kullanıcılar da var.\n" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 042c4e004a5..52d6eeb651d 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -677,7 +677,7 @@ "Не налаштовувати ключ?" "Пропустити ключ і фейсконтроль?" "Пропустити налаштування ключа й відбитка?" - "Пропустити ключ, фейсконтроль і відбиток пальця?" + "Пропустити ключ, фейс-контроль і відбиток пальця?" "Налаштувати блокування екрана" "Готово" "Це не датчик" @@ -779,9 +779,9 @@ "Ви можете розблоковувати свій телефон за допомогою розпізнавання облич. З міркувань безпеки для цього методу потрібно налаштувати резервний спосіб блокування екрана." "Ви можете розблоковувати планшет за допомогою фейс-контролю. З міркувань безпеки для цієї функції потрібно налаштувати резервний спосіб розблокування." "Ви можете розблоковувати пристрій за допомогою фейс-контролю. З міркувань безпеки для цієї функції потрібно налаштувати резервний спосіб розблокування." - "Ключ • Фейсконтроль • Відбиток пальця" - "PIN-код • Фейсконтроль • Відбиток пальця" - "Пароль • Фейсконтроль • Відбиток пальця" + "Ключ • Фейс-контроль • Відбиток пальця" + "PIN-код • Фейс-контроль • Відбиток пальця" + "Пароль • Фейс-контроль • Відбиток пальця" "Продовжити без фейсконтролю чи відбитка пальця" "Телефон можна розблокувати за допомогою фейсконтролю чи відбитка пальця. З міркувань безпеки для цих функцій потрібно налаштувати резервний спосіб розблокування." "Ви можете розблоковувати планшет за допомогою фейс-контролю чи відбитка пальця. З міркувань безпеки для цих функцій потрібно налаштувати резервний спосіб розблокування." diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index 7a33fd2d96b..2f23c97dc0e 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -551,7 +551,7 @@ "جب آپ فیس اَنلاک اور فنگر پرنٹ اَن لاک کی خصوصیت سیٹ اپ کرتے ہیں تو آپ کے ماسک پہننے یا کسی تاریک جگہ پر موجود ہونے کی صورت میں آپ کا فون آپ کے فنگر پرنٹ کے لیے پوچھے گا" "غیر مقفل کرنے کے طریقے" "اپنا فون غیر مقفل کریں" - "تصدیق کریں کہ آپ ایپس میں ہیں" + "تصدیق کریں کہ ایپس میں آپ ہی ہیں" "چہرہ استعمال کر کے" "فنگر پرنٹ استعمال کر کے" "چہرہ یا فنگر پرنٹ کا استعمال کر کے" @@ -691,7 +691,7 @@ "سیکیورٹی، مزید سیکیورٹی کی ترتیبات، مزید ترتیبات، جدید ترین سیکیورٹی ترتیبات" "مزید رازداری کی ترتیبات" "آٹو فل، سرگرمی کنٹرولز اور مزید" - "آپ %d تک فنگر پرنٹس کا اضافہ کر سکتے ہیں" + "آپ %d فنگر پرنٹس شامل کر سکتے ہیں" "آپ فنگر پرنٹس کی زیادہ سے زیادہ تعداد شامل کر چکے ہیں" "مزید فنگر پرنٹس شامل نہیں کر سکتے" "تمام فنگر پرنٹس ہٹائیں؟" @@ -5738,7 +5738,7 @@ "کیشڈ ایپس کے ليے ایگزیکیوشن معطل کریں" "میعاد کبھی ختم نہیں ہوتی ہے۔" "لیز کی میعاد کبھی ختم نہیں ہوتی ہے۔" - "ترتیبات پر اسکرین اوورلیز کو اجازت دیتا ہے" + "ترتیبات پر اسکرین اوورلیز کو اجازت دیں" "ایسی ایپس کو اجازت دیں جو ترتیبات کی اسکرینز کو ایک دوسرے پر چڑھانے کے لیے دوسرے ایپس پر ڈسپلے کر سکتی ہیں" "موک موڈیم کی اجازت دیں" "اس آلے کو آلات کی جانچ کرنے کے لیے موک موڈیم سروس چلانے کی اجازت دیں۔ فون کے عام استعمال کے دوران اسے فعال نہ کریں" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 804ba57c6ee..b936ffea98b 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -610,7 +610,7 @@ "Đã thêm vân tay" "Giờ đây, bạn có thể dùng vân tay để mở khoá máy tính bảng hoặc xác minh danh tính, chẳng hạn như khi bạn đăng nhập vào ứng dụng hoặc phê duyệt giao dịch mua" "Giờ đây, bạn có thể dùng vân tay để mở khoá thiết bị hoặc xác minh danh tính, chẳng hạn như khi bạn đăng nhập vào ứng dụng hoặc phê duyệt giao dịch mua" - "Giờ đây, bạn có thể dùng vân tay để mở khoá điện thoại hoặc xác minh danh tính, chẳng hạn như khi bạn đăng nhập vào ứng dụng hoặc phê duyệt giao dịch mua" + "Giờ đây, bạn có thể dùng vân tay để mở khoá điện thoại hoặc xác minh danh tính, chẳng hạn như khi bạn đăng nhập vào các ứng dụng hoặc phê duyệt một giao dịch mua" "Giờ đây, bạn có thể dùng vân tay để mở khoá máy tính bảng hoặc xác minh danh tính, chẳng hạn như khi đăng nhập vào ứng dụng hoặc phê duyệt giao dịch mua. \n\nHãy thêm một dấu vân tay khác để luôn có thể mở khoá dù bạn cầm máy tính bảng theo cách nào đi nữa." "Giờ đây, bạn có thể dùng vân tay để mở khoá thiết bị hoặc xác minh danh tính, chẳng hạn như khi đăng nhập vào ứng dụng hoặc phê duyệt giao dịch mua.\n\nHãy thêm một dấu vân tay khác để luôn có thể mở khoá dù bạn cầm thiết bị theo cách nào đi nữa." "Giờ đây, bạn có thể dùng vân tay để mở khoá điện thoại hoặc xác minh danh tính, chẳng hạn như khi đăng nhập vào ứng dụng hoặc phê duyệt giao dịch mua.\n\nHãy thêm một dấu vân tay khác để luôn có thể mở khoá dù bạn cầm điện thoại theo cách nào đi nữa." @@ -1565,7 +1565,7 @@ "Luôn hiện giờ và thông tin" "Làm tăng mức sử dụng pin" "Văn bản in đậm" - "Kích thước phông chữ" + "Cỡ chữ" "Phóng to hoặc thu nhỏ văn bản" "Cài đặt cách khóa thẻ SIM" "Khóa thẻ SIM" @@ -2430,7 +2430,7 @@ "Giới thiệu các tuỳ chọn phụ đề" "Tìm hiểu thêm các tuỳ chọn phụ đề" "Phóng to" - "Phím tắt phóng to" + "Phím tắt dành cho tính năng phóng to" "Phóng to nội dung nhập" "Kính lúp di chuyển theo văn bản khi bạn nhập" "Giới thiệu về tính năng phóng to" @@ -3606,7 +3606,7 @@ "Thay đổi PIN" "Trợ giúp và phản hồi" "Bài viết trợ giúp, điện thoại và cuộc trò chuyện" - "Các bài viết trợ giúp, máy tính bảng & trò chuyện" + "Các bài viết trợ giúp, máy tính bảng và trò chuyện" "Các bài viết trợ giúp, thiết bị & trò chuyện" "Tài khoản dành cho nội dung" "ID ảnh" @@ -3868,7 +3868,7 @@ "Âm bàn phím số" "Âm thanh khóa màn hình" "Âm thanh và rung khi sạc" - "Âm đế kết nối" + "Âm thanh khi kết nối với đế sạc" "Âm thanh khi chạm" "Luôn hiện biểu tượng khi ở chế độ rung" "Phát âm đế kết nối" @@ -3953,7 +3953,7 @@ "Chế độ Không làm phiền đã được một ứng dụng (%s) bật tự động" "Chế độ Không làm phiền đang bật đối với %s với các mục cài đặt tùy chỉnh." " ""Xem chế độ cài đặt tùy chỉnh" - "Chỉ cho các mục ưu tiên" + "Các mục ưu tiên có thể tiếp tục hoạt động" "%1$s. %2$s" "Đang bật / %1$s" "Đang bật" @@ -5116,7 +5116,7 @@ "Nhấn đúp để kiểm tra thiết bị" "Chế độ một tay" "Sử dụng chế độ một tay" - "Phím tắt chế độ một tay" + "Phím tắt cho chế độ một tay" "tầm với" "Vuốt xuống để" "Dùng phím tắt để" @@ -5344,8 +5344,8 @@ "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" - "Các tùy chọn của trình điều khiển đồ họa" - "Sửa đổi tùy chọn cài đặt trình điều khiển đồ họa" + "Các lựa chọn ưu tiên về trình điều khiển đồ hoạ" + "Sửa đổi các chế độ cài đặt về trình điều khiển đồ hoạ" "Khi có nhiều trình điều khiển đồ họa, bạn có thể chọn sử dụng trình điều khiển đồ họa đã cập nhật cho Ứng dụng được cài đặt trên thiết bị." "Bật cho tất cả các ứng dụng" "Chọn trình điều khiển đồ họa" @@ -5361,7 +5361,7 @@ "Các thay đổi về khả năng tương thích của ứng dụng" - "Bật/tắt chế độ thay đổi về khả năng tương thích của ứng dụng" + "Bật/tắt các thay đổi về khả năng tương thích của ứng dụng" "Các thay đổi được bật theo mặc định" "Các thay đổi bị tắt theo mặc định" "Không có ứng dụng" @@ -5832,7 +5832,7 @@ "Dùng dịch vụ in" "Cho phép nhiều người dùng" "Sử dụng tính năng gỡ lỗi qua Wi-Fi" - "Dùng lựa chọn ưu tiên của trình điều khiển đồ họa" + "Dùng các lựa chọn ưu tiên về trình điều khiển đồ hoạ" "Sử dụng trình tiết kiệm pin" "Tắt ngay" "Bật ngay" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index aa15c1f34a1..ddee7e1c81f 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -446,7 +446,7 @@ "在应用中使用人脸解锁时,一律需确认" "删除脸部模型" "设置人脸解锁" - "您可以通过刷脸来解锁手机或在应用内验证自己的身份,例如在登录帐号或批准购买交易时。\n\n注意:\n一次只能设置一张面孔。如需添加另一张面孔,请删除当前的面孔。\n\n目视手机可能会让手机意外解锁。\n\n如果有人将手机对准您的脸,手机可能会解锁。\n\n此外,长相与您非常相似的人,例如您的孪生兄弟姐妹,可能也能解锁您的手机。" + "您可以通过刷脸来解锁手机或在应用内验证自己的身份,例如在登录帐号或批准购买交易时。\n\n注意:\n一次只能设置一张面孔。如需添加另一张面孔,请先删除当前的面孔。\n\n目视手机可能会让手机意外解锁。\n\n如果有人将手机对准您的脸,手机可能会解锁。\n\n此外,长相与您非常相似的人,例如您的孪生兄弟姐妹,可能也能解锁您的手机。" "您可以通过刷脸来解锁手机或在应用内验证自己的身份,例如在登录帐号或批准购买交易时。\n\n注意:\n一次只能设置一张面孔。如需添加另一张面孔,请删除当前的面孔。\n\n目视手机可能会让手机意外解锁。\n\n如果有人将手机对准您的脸,即使您闭上眼睛,手机可能也会解锁。\n\n此外,长相与您非常相似的人,例如您的孪生兄弟姐妹,可能也能解锁您的手机。" "要删除脸部模型吗?" "系统会安全地永久删除您的脸部模型。\n\n脸部模型删除后,如需解锁手机或在应用内进行身份验证,您将需要使用 PIN 码、解锁图案或密码。" @@ -470,7 +470,7 @@ "详细了解“指纹解锁”" "您可以使用指纹解锁平板电脑或验证自己的身份,例如登录应用或批准购买交易。" "指纹可用于解锁设备或验证您的身份,例如在登录应用或批准购买交易时。" - "您可以使用指纹解锁手机或验证自己的身份,例如在登录应用或批准购买交易时。" + "您可以使用指纹解锁手机或验证自己的身份,例如在登录应用或批准购买交易时进行验证。" "允许您的孩子使用指纹来解锁手机或验证自己的身份,例如在他们登录应用、批准购买交易以及执行其他操作时。" "允许您的孩子使用指纹来解锁平板电脑或验证自己的身份,例如在孩子登录应用、批准购买交易以及执行其他操作时。" "允许您的孩子使用指纹来解锁设备或验证自己的身份,例如在孩子登录应用、批准购买交易以及执行其他操作时。" @@ -615,7 +615,7 @@ "现在,您就可以用指纹来解锁设备或验证自己的身份了,例如在登录应用或批准购买交易时进行验证。\n\n如果希望在采用其他方式握持设备时也能更轻松地解锁,可以再添加一个指纹。" "现在,您就可以用指纹来解锁手机或验证自己的身份了,例如在登录应用或批准购买交易时进行验证。\n\n如果希望在采用其他方式握持手机时也能更轻松地解锁,可以再添加一个指纹。" "无论何时,轻触即可解锁" - "轻触传感器即可解锁,即使屏幕关闭也可以。这样会提高意外解锁的概率。" + "轻触传感器即可解锁,即使屏幕关闭也可以,但这样会提高意外解锁的概率。" "屏幕, 解锁, Screen, Unlock" "以后再说" "移开手指,然后再次触摸传感器" @@ -1534,7 +1534,7 @@ "屏幕关闭" "闲置 %1$s后" "壁纸" - "壁纸和样式" + "壁纸与个性化" "主屏幕、锁定屏幕" "默认" "自定义" @@ -2601,7 +2601,7 @@ "使用“%1$s”" "打开“%1$s”" "“%1$s”已添加到“快捷设置”中。向下滑动即可随时开启或关闭此功能。" - "您还可以将“%1$s”添加到屏幕顶部的“快捷设置”中" + "您还可以从屏幕顶部将“%1$s”添加到“快捷设置”中" "“色彩校正”已添加到“快捷设置”中。向下滑动即可随时开启或关闭此功能。" "您还可以将“色彩校正”添加到屏幕顶部的“快捷设置”中" "“颜色反转”已添加到“快捷设置”中。向下滑动即可随时开启或关闭此功能。" @@ -3554,7 +3554,7 @@ "其他用户" "删除访客活动记录" "退出访客模式时删除所有访客应用和数据" - "要删除访客活动记录吗?" + "要删除访客活动吗?" "此访客会话中的应用和数据将会立即删除;日后您每次退出访客模式时,系统都会删除访客活动记录" "开启通话功能" "开启通话和短信功能" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 7b40a550223..8559f8adf48 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -449,7 +449,7 @@ "使用面孔解鎖手機或在應用程式中驗證身分,例如登入帳戶或核准購買交易。\n\n注意事項:\n你每次只可設定一張面孔。如要新增其他面孔,請刪除目前設定的面孔。\n\n即使你不想解鎖手機,但查看手機仍會解鎖。\n\n如果其他人將手機舉到你面前,將可解鎖你的手機。\n\n跟你樣貌很相似的人 (例如孿生兄弟姊妹) 或許能夠解鎖你的手機。" "使用面孔解鎖手機或在應用程式中驗證身分,例如登入帳戶或核准購買交易。\n\n注意事項:\n你每次只可設定一張面孔。如要新增其他面孔,請刪除目前設定的面孔。\n\n即使你不想解鎖手機,但查看手機仍會解鎖。\n\n如果其他人將手機舉到你面前,即使你閉上雙眼,手機亦會解鎖。\n\n跟你樣貌很相似的人 (例如孿生兄弟姊妹) 或許能夠解鎖你的手機。" "要刪除面部模型嗎?" - "系統會安全地將你的面部模型永久刪除。\n\n面部模型刪除後,你需要使用 PIN、圖案或密碼,才能解鎖手機或在應用程式內驗證身分。" + "系統會將你的面部模型安全地永久刪除。\n\n刪除後,你需要使用 PIN、圖案或密碼解鎖手機,或在應用程式內驗證身分。" "系統會妥善地將你的面部模型永久刪除。面部模型刪除後,你便需要使用\n\n面部模型刪除後,你便需要使用 PIN、圖案或密碼來解鎖手機。" "使用「面孔解鎖」解鎖手機" "指紋" @@ -548,7 +548,7 @@ "輕按即可設定" "已新增面孔和指紋" "已新增面孔和指紋" - "設定「面孔解鎖」和「指紋解鎖」時,如果你戴著口罩或人在昏暗的地方,手機就會要求你註冊指紋" + "設定「面孔解鎖」和「指紋解鎖」時,如果你戴著口罩或身處昏暗地方,手機就會要求你使用指紋" "解鎖方法" "解鎖手機" "在應用程式中驗證你的身分" @@ -615,7 +615,7 @@ "你現可使用指紋解鎖裝置或驗證身分,例如用來登入應用程式或核准購買交易。\n\n新增其他指紋,讓你以不同方式拿著裝置時亦能輕鬆解鎖。" "你現可使用指紋解鎖手機或驗證身分,例如用來登入應用程式或核准購買交易。\n\n新增其他指紋,讓你以不同方式拿著手機時亦能輕鬆解鎖。" "隨時輕觸解鎖" - "即使螢幕關閉,亦可隨時輕觸感應器解鎖,但這樣較容易意外解鎖裝置。" + "即使螢幕關閉,亦可隨時輕觸感應器解鎖,但會更容易意外解鎖裝置。" "螢幕解鎖" "稍後才做" "移開手指,然後再次輕觸感應器" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 0ab5d17ad26..665b010023f 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -349,7 +349,7 @@ "輕觸即可設定臉孔" "人臉解鎖" "工作資料夾的人臉解鎖功能" - "如何設定人臉解鎖功能" + "如何設定人臉解鎖" "設定人臉解鎖功能" "使用你的臉孔進行驗證" @@ -469,8 +469,8 @@ "使用指紋" "進一步瞭解指紋解鎖" "指紋可用於解鎖平板電腦或驗證身分,以便執行特定操作,例如登入應用程式或核准購買交易。" - "指紋可用於解鎖裝置或驗證身分,以便執行特定操作,例如登入應用程式或核准購物交易。" - "指紋可用於解鎖手機或驗證身分,以便執行特定操作,例如登入應用程式或核准購物交易。" + "指紋可用於解鎖裝置或驗證身分,方便你登入應用程式、核准購物交易或其他用途。" + "指紋可用於解鎖手機或驗證身分,方便你登入應用程式、核准購物交易或其他用途。" "允許孩子使用指紋解鎖手機或驗證身分,以便執行特定操作,例如登入應用程式、核准購買交易等。" "允許孩子使用指紋解鎖平板電腦或驗證身分,以便執行特定操作,例如登入應用程式、核准購買交易等。" "允許孩子使用指紋解鎖裝置或驗證身分,以便執行特定操作,例如登入應用程式、核准購買交易等。" @@ -610,12 +610,12 @@ "指紋新增成功" "現在只要使用自己的指紋就能解鎖平板電腦或驗證身分,以便執行某些特定操作,例如登入應用程式或核准購買交易" "現在只要使用自己的指紋就能解鎖裝置或驗證身分,以便執行某些特定操作,例如登入應用程式或核准購買交易" - "現在只要使用自己的指紋就能解鎖手機或驗證身分,以便執行某些特定操作,例如登入應用程式或核准購買交易" + "現在可以使用指紋解鎖手機或驗證身分,方便你登入應用程式、核准購物交易或其他用途" "現在使用指紋就能解鎖平板電腦或驗證身分,以便執行某些特定操作,例如登入應用程式或核准購買交易。\n\n新增其他指紋,讓你用其他方式拿平板電腦時也能輕鬆解鎖。" "現在使用指紋就能解鎖裝置或驗證身分,以便執行某些特定操作,例如登入應用程式或核准購買交易。\n\n新增其他指紋,讓你用其他方式拿裝置時也能輕鬆解鎖。" - "現在使用指紋就能解鎖手機或驗證身分,以便執行某些特定操作,例如登入應用程式或核准購買交易。\n\n新增其他指紋,讓你用其他方式拿手機時也能輕鬆解鎖。" + "現在可以使用指紋解鎖手機或驗證身分,方便你登入應用程式、核准購物交易或其他用途。\n\n新增其他指紋,讓你用其他方式拿手機時也能輕鬆解鎖。" "隨時輕觸解鎖" - "輕觸感應器就能解鎖,即使螢幕關閉也能進行這項操作。這樣可能會提高意外解鎖的機率。" + "輕觸感應器進行解鎖,即使螢幕關閉也能解鎖。這樣可能會提高意外解鎖的機率。" "螢幕解鎖" "稍後再說" "移開手指,然後再次輕觸感應器" @@ -4563,7 +4563,7 @@
    "未取得任何授權" "未要求任何權限" - "控管哪些應用程式可存取你的資料" + "控管可存取資料的應用程式" "隱私資訊主頁" "顯示最近曾使用權限的應用程式" "未使用的應用程式" @@ -5869,7 +5869,7 @@ "麥克風存取權" "位置資訊存取權" "應用程式和服務" - "用於應用程式和服務。如果關閉這項設定,系統仍會在你撥打緊急電話號碼時提供麥克風的資料。" + "適用於應用程式和服務。即使關閉這項設定,系統仍可能會在你撥打緊急電話號碼時,分享麥克風資料。" "返回" "繼續" "顏色預覽" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index c18cb11926c..2428b7bc99d 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -908,7 +908,7 @@ "Okulandelayo" "Ukusetha kuphelile." "Ama-app omlawuli wedivayisi" - "Azikho izinhlelo zokusebenza ezisebenzayo" + "Awekho ama-app asebenzayo" %d izinhlelo zokusebenza ezisebenzayo %d izinhlelo zokusebenza ezisebenzayo From bc297b9f3cf4e5f7f81437b714fc55502b3d27bf Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Thu, 11 May 2023 16:29:07 +0800 Subject: [PATCH 04/20] =?UTF-8?q?Make=20=E2=80=9CReset=20app=20preferences?= =?UTF-8?q?=E2=80=9D=20restricted=20by=20DISALLOW=5FAPPS=5FCONTROL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When DISALLOW_APPS_CONTROL restriction is enabled, users should not be able to enable/disable apps, clear app caches and clear app data. “System >Reset options > Reset app preferences” can take the above actions which should be restricted by DISALLOW_APPS_CONTROL to fix the security vulnerability. Bug: 278559731 Test: Verify change by turning on/off DISALLOW_APPS_CONTROL with TestDPC. Change-Id: I387a95aa7f54fe04d5ed92372e43a88d5fe3e79a --- res/xml/reset_dashboard_fragment.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/res/xml/reset_dashboard_fragment.xml b/res/xml/reset_dashboard_fragment.xml index 98f6c02a8f2..3bd7a136760 100644 --- a/res/xml/reset_dashboard_fragment.xml +++ b/res/xml/reset_dashboard_fragment.xml @@ -38,9 +38,10 @@ settings:controller="com.android.settings.network.BluetoothWiFiResetPreferenceController" /> - + android:title="@string/reset_app_preferences" + settings:userRestriction="no_control_apps" /> Date: Thu, 11 May 2023 17:24:32 +0800 Subject: [PATCH 05/20] Update string for touch sounds Bug: 274081150 Test: visual verify Change-Id: I953f108884cafc91e2a3a76bd1292ea30386d862 --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 261829b56ef..b342e8af3a4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7162,7 +7162,7 @@ Docking sounds - Touch sounds + Tap & click sounds Always show icon when in vibrate mode From 08b4973f8edcefab421b0e119ff69f79c7a1421c Mon Sep 17 00:00:00 2001 From: Oli Thompson Date: Fri, 24 Mar 2023 13:01:37 +0000 Subject: [PATCH 06/20] Update Work profile settings Change work apps toggle to a primary toggle make Xprofile contact search toggle disable/enable when work profile is turned off Add footer and change strings Add tests Test: atest ContactSearchPreferenceControllerTest, atest WorkModePreferenceControllerTest Bug: 253009702 275538029 Change-Id: I3b2044a5fe3f2aff0748d66e701a3f0d7667ab7a --- res/values/strings.xml | 10 +- res/xml/managed_profile_settings.xml | 8 +- .../ContactSearchPreferenceController.java | 79 ++++++--- .../ManagedProfileQuietModeEnabler.java | 122 +++++++++++++ .../WorkModePreferenceController.java | 161 +++++------------- ...ContactSearchPreferenceControllerTest.java | 110 ++++++++++-- .../ManagedProfileQuietModeEnablerTest.java | 126 ++++++++++++++ .../WorkModePreferenceControllerTest.java | 66 ++++--- 8 files changed, 482 insertions(+), 200 deletions(-) create mode 100644 src/com/android/settings/accounts/ManagedProfileQuietModeEnabler.java create mode 100644 tests/robotests/src/com/android/settings/accounts/ManagedProfileQuietModeEnablerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 793a9397e36..2f0b10f0b79 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5873,12 +5873,8 @@ Add account Work profile isn\u2019t available yet - - Work profile - - Managed by your organization - - Apps and notifications are off + + Work apps Remove work profile @@ -9779,6 +9775,8 @@ Cross-profile calendar Show work events on your personal calendar + + When work apps are off, they’re paused and can’t be accessed or send you notifications Manage storage diff --git a/res/xml/managed_profile_settings.xml b/res/xml/managed_profile_settings.xml index 20f6d3dc3f3..ddfb86987ca 100644 --- a/res/xml/managed_profile_settings.xml +++ b/res/xml/managed_profile_settings.xml @@ -19,10 +19,9 @@ android:key="managed_profile_settings_screen" android:title="@string/managed_profile_settings_title"> - + + \ No newline at end of file diff --git a/src/com/android/settings/accounts/ContactSearchPreferenceController.java b/src/com/android/settings/accounts/ContactSearchPreferenceController.java index 5e4ef48d7c2..87dabd8d9a4 100644 --- a/src/com/android/settings/accounts/ContactSearchPreferenceController.java +++ b/src/com/android/settings/accounts/ContactSearchPreferenceController.java @@ -20,37 +20,38 @@ import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; -import androidx.annotation.VisibleForTesting; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import com.android.settings.R; import com.android.settings.Utils; -import com.android.settings.core.BasePreferenceController; +import com.android.settings.core.TogglePreferenceController; import com.android.settings.slices.SliceData; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedSwitchPreference; -public class ContactSearchPreferenceController extends BasePreferenceController implements - Preference.OnPreferenceChangeListener { +import org.jetbrains.annotations.NotNull; - private UserHandle mManagedUser; +public class ContactSearchPreferenceController extends TogglePreferenceController implements + Preference.OnPreferenceChangeListener, DefaultLifecycleObserver, + ManagedProfileQuietModeEnabler.QuietModeChangeListener { + + private final ManagedProfileQuietModeEnabler mQuietModeEnabler; + private final UserHandle mManagedUser; + private Preference mPreference; public ContactSearchPreferenceController(Context context, String key) { super(context, key); - // Set default managed profile for the current user, otherwise isAvailable will be false and - // the setting won't be searchable. - UserManager userManager = context.getSystemService(UserManager.class); - mManagedUser = Utils.getManagedProfile(userManager); - } - - @VisibleForTesting - void setManagedUser(UserHandle managedUser) { - mManagedUser = managedUser; + mManagedUser = Utils.getManagedProfile(context.getSystemService(UserManager.class)); + mQuietModeEnabler = new ManagedProfileQuietModeEnabler(context, this); } @Override public int getAvailabilityStatus() { - return (mManagedUser != null) ? AVAILABLE : DISABLED_FOR_USER; + return mQuietModeEnabler.isAvailable() ? AVAILABLE : DISABLED_FOR_USER; } @Override @@ -59,6 +60,7 @@ public class ContactSearchPreferenceController extends BasePreferenceController if (preference instanceof RestrictedSwitchPreference) { final RestrictedSwitchPreference pref = (RestrictedSwitchPreference) preference; pref.setChecked(isChecked()); + pref.setEnabled(!mQuietModeEnabler.isQuietModeEnabled()); if (mManagedUser != null) { final RestrictedLockUtils.EnforcedAdmin enforcedAdmin = RestrictedLockUtilsInternal.checkIfRemoteContactSearchDisallowed( @@ -68,26 +70,48 @@ public class ContactSearchPreferenceController extends BasePreferenceController } } - private boolean isChecked() { - if (mManagedUser == null) { + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + updateState(mPreference); + } + + @Override + public void onStart(@NotNull LifecycleOwner lifecycleOwner) { + lifecycleOwner.getLifecycle().addObserver(mQuietModeEnabler); + } + + @Override + public void onStop(@NotNull LifecycleOwner lifecycleOwner) { + lifecycleOwner.getLifecycle().removeObserver(mQuietModeEnabler); + } + + @Override + public boolean isChecked() { + if (mManagedUser == null || mQuietModeEnabler.isQuietModeEnabled()) { return false; } return 0 != Settings.Secure.getIntForUser(mContext.getContentResolver(), MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 0, mManagedUser.getIdentifier()); } - private boolean setChecked(boolean isChecked) { - if (mManagedUser != null) { - final int value = isChecked ? 1 : 0; - Settings.Secure.putIntForUser(mContext.getContentResolver(), - MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, value, mManagedUser.getIdentifier()); + @Override + public boolean setChecked(boolean isChecked) { + if (mManagedUser == null || mQuietModeEnabler.isQuietModeEnabled()) { + return false; } + final int value = isChecked ? 1 : 0; + Settings.Secure.putIntForUser(mContext.getContentResolver(), + MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, value, mManagedUser.getIdentifier()); return true; } @Override - public final boolean onPreferenceChange(Preference preference, Object newValue) { - return setChecked((boolean) newValue); + public void onQuietModeChanged() { + if (mPreference != null) { + updateState(mPreference); + } } @Override @@ -95,4 +119,9 @@ public class ContactSearchPreferenceController extends BasePreferenceController public int getSliceType() { return SliceData.SliceType.SWITCH; } -} \ No newline at end of file + + @Override + public int getSliceHighlightMenuRes() { + return R.string.menu_key_accounts; + } +} diff --git a/src/com/android/settings/accounts/ManagedProfileQuietModeEnabler.java b/src/com/android/settings/accounts/ManagedProfileQuietModeEnabler.java new file mode 100644 index 00000000000..989be09565c --- /dev/null +++ b/src/com/android/settings/accounts/ManagedProfileQuietModeEnabler.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2023 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.accounts; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; + +import com.android.settings.Utils; + +import javax.annotation.Nullable; + +/** + * A class that controls the managed profile's quiet mode, listens to quiet mode changes and + * modifies managed profile settings. The user facing term for quiet mode is "work apps". + */ +final class ManagedProfileQuietModeEnabler implements DefaultLifecycleObserver { + + private static final String TAG = "QuietModeEnabler"; + private final Context mContext; + private final QuietModeChangeListener mListener; + @Nullable private final UserHandle mManagedProfile; + private final UserManager mUserManager; + + public interface QuietModeChangeListener { + /** Called when quiet mode has changed. */ + void onQuietModeChanged(); + } + + ManagedProfileQuietModeEnabler(Context context, QuietModeChangeListener listener) { + mContext = context; + mListener = listener; + mUserManager = context.getSystemService(UserManager.class); + mManagedProfile = Utils.getManagedProfile(mUserManager); + } + + public void setQuietModeEnabled(boolean enabled) { + if (mManagedProfile != null) { + mUserManager.requestQuietModeEnabled(enabled, mManagedProfile); + } + } + + public boolean isQuietModeEnabled() { + return mManagedProfile != null && mUserManager.isQuietModeEnabled(mManagedProfile); + } + + @Override + public void onStart(@NonNull LifecycleOwner owner) { + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); + intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); + mContext.registerReceiver(mReceiver, intentFilter, Context.RECEIVER_NOT_EXPORTED); + } + + @Override + public void onStop(@NonNull LifecycleOwner owner) { + mContext.unregisterReceiver(mReceiver); + } + + public boolean isAvailable() { + return (mManagedProfile != null); + } + + private void refreshQuietMode() { + if (mListener != null) { + mListener.onQuietModeChanged(); + } + } + + /** + * Receiver that listens to {@link Intent#ACTION_MANAGED_PROFILE_AVAILABLE} and + * {@link Intent#ACTION_MANAGED_PROFILE_UNAVAILABLE}, and updates the work mode + */ + @VisibleForTesting + final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent == null) { + return; + } + String action = intent.getAction(); + Log.v(TAG, "Received broadcast: " + action); + + if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action) + || Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)) { + int intentUserIdentifier = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, + UserHandle.USER_NULL); + if (intentUserIdentifier == mManagedProfile.getIdentifier()) { + refreshQuietMode(); + } else { + Log.w(TAG, "Managed profile broadcast ID: " + intentUserIdentifier + + " does not match managed user: " + mManagedProfile); + } + } else { + Log.w(TAG, "Cannot handle received broadcast: " + intent.getAction()); + } + } + }; +} diff --git a/src/com/android/settings/accounts/WorkModePreferenceController.java b/src/com/android/settings/accounts/WorkModePreferenceController.java index 1941de45c4d..a261afccaa6 100644 --- a/src/com/android/settings/accounts/WorkModePreferenceController.java +++ b/src/com/android/settings/accounts/WorkModePreferenceController.java @@ -1,165 +1,90 @@ /* * Copyright (C) 2018 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 + * 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. + * 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.accounts; -import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SETTING_OFF_SUMMARY; -import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SETTING_ON_SUMMARY; - -import android.app.admin.DevicePolicyManager; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.UserHandle; -import android.os.UserManager; -import android.util.Log; -import androidx.annotation.VisibleForTesting; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; -import androidx.preference.PreferenceScreen; -import androidx.preference.TwoStatePreference; +import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; -import com.android.settings.Utils; -import com.android.settings.core.BasePreferenceController; import com.android.settings.slices.SliceData; -import com.android.settingslib.core.lifecycle.LifecycleObserver; -import com.android.settingslib.core.lifecycle.events.OnStart; -import com.android.settingslib.core.lifecycle.events.OnStop; +import com.android.settings.widget.SettingsMainSwitchPreferenceController; +import com.android.settingslib.widget.MainSwitchPreference; -public class WorkModePreferenceController extends BasePreferenceController implements - Preference.OnPreferenceChangeListener, LifecycleObserver, OnStart, OnStop { +import org.jetbrains.annotations.NotNull; - private static final String TAG = "WorkModeController"; - private UserManager mUserManager; - private UserHandle mManagedUser; - private DevicePolicyManager mDevicePolicyManager; +public class WorkModePreferenceController extends SettingsMainSwitchPreferenceController + implements Preference.OnPreferenceChangeListener, DefaultLifecycleObserver, + ManagedProfileQuietModeEnabler.QuietModeChangeListener { - private Preference mPreference; - private IntentFilter mIntentFilter; + private final ManagedProfileQuietModeEnabler mQuietModeEnabler; public WorkModePreferenceController(Context context, String key) { super(context, key); - mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); - mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class); - mIntentFilter = new IntentFilter(); - mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); - mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); - // Set default managed profile for the current user, otherwise isAvailable will be false and - // the setting won't be searchable. - mManagedUser = Utils.getManagedProfile(mUserManager); - } - - @VisibleForTesting - void setManagedUser(UserHandle managedUser) { - mManagedUser = managedUser; - } - - @Override - public void onStart() { - mContext.registerReceiver(mReceiver, mIntentFilter, - Context.RECEIVER_EXPORTED_UNAUDITED); - } - - @Override - public void onStop() { - mContext.unregisterReceiver(mReceiver); + mQuietModeEnabler = new ManagedProfileQuietModeEnabler(context, this); } @Override public int getAvailabilityStatus() { - return (mManagedUser != null) ? AVAILABLE : DISABLED_FOR_USER; + return (mQuietModeEnabler.isAvailable()) ? AVAILABLE : DISABLED_FOR_USER; } @Override - public void displayPreference(PreferenceScreen screen) { - super.displayPreference(screen); - mPreference = screen.findPreference(getPreferenceKey()); + public void onStart(@NotNull LifecycleOwner lifecycleOwner) { + lifecycleOwner.getLifecycle().addObserver(mQuietModeEnabler); } @Override - public CharSequence getSummary() { - if (isChecked()) { - return mDevicePolicyManager.getResources().getString( - WORK_PROFILE_SETTING_ON_SUMMARY, - () -> mContext.getString(R.string.work_mode_on_summary)); - } - - return mDevicePolicyManager.getResources().getString( - WORK_PROFILE_SETTING_OFF_SUMMARY, - () -> mContext.getString(R.string.work_mode_off_summary)); + public void onStop(@NotNull LifecycleOwner lifecycleOwner) { + lifecycleOwner.getLifecycle().removeObserver(mQuietModeEnabler); } - private boolean isChecked() { - boolean isWorkModeOn = false; - if (mUserManager != null && mManagedUser != null) { - isWorkModeOn = !mUserManager.isQuietModeEnabled(mManagedUser); - } - return isWorkModeOn; + @Override + public boolean isChecked() { + return !mQuietModeEnabler.isQuietModeEnabled(); } - private boolean setChecked(boolean isChecked) { - if (mUserManager != null && mManagedUser != null) { - final boolean quietModeEnabled = !isChecked; - mUserManager.requestQuietModeEnabled(quietModeEnabled, mManagedUser); - } + @Override + public boolean setChecked(boolean isChecked) { + mQuietModeEnabler.setQuietModeEnabled(!isChecked); return true; } @Override - public void updateState(Preference preference) { - super.updateState(preference); - if (preference instanceof TwoStatePreference) { - ((TwoStatePreference) preference).setChecked(isChecked()); - } + public void onQuietModeChanged() { + updateState(mSwitchPreference); } - @Override - public final boolean onPreferenceChange(Preference preference, Object newValue) { - return setChecked((boolean) newValue); - } - - /** - * Receiver that listens to {@link Intent#ACTION_MANAGED_PROFILE_AVAILABLE} and - * {@link Intent#ACTION_MANAGED_PROFILE_UNAVAILABLE}, and updates the work mode - */ - @VisibleForTesting - final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent == null) { - return; - } - final String action = intent.getAction(); - Log.v(TAG, "Received broadcast: " + action); - - if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action) - || Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)) { - if (intent.getIntExtra(Intent.EXTRA_USER_HANDLE, - UserHandle.USER_NULL) == mManagedUser.getIdentifier()) { - updateState(mPreference); - } - return; - } - Log.w(TAG, "Cannot handle received broadcast: " + intent.getAction()); - } - }; - @Override @SliceData.SliceType public int getSliceType() { return SliceData.SliceType.SWITCH; } -} \ No newline at end of file + + @Override + public int getSliceHighlightMenuRes() { + return R.string.menu_key_accounts; + } + + @VisibleForTesting + void setPreference(MainSwitchPreference preference) { + mSwitchPreference = preference; + } +} diff --git a/tests/robotests/src/com/android/settings/accounts/ContactSearchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/ContactSearchPreferenceControllerTest.java index c8606e134a5..bc65563650f 100644 --- a/tests/robotests/src/com/android/settings/accounts/ContactSearchPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/ContactSearchPreferenceControllerTest.java @@ -20,13 +20,19 @@ import static android.provider.Settings.Secure.MANAGED_PROFILE_CONTACT_REMOTE_SE import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.Context; +import android.content.pm.UserInfo; import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings; +import androidx.test.core.app.ApplicationProvider; + import com.android.settingslib.RestrictedSwitchPreference; import org.junit.Before; @@ -35,39 +41,51 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; + +import java.util.Collections; @RunWith(RobolectricTestRunner.class) public class ContactSearchPreferenceControllerTest { private static final String PREF_KEY = "contacts_search"; - - @Mock - private UserHandle mManagedUser; + private static final int MANAGED_USER_ID = 10; private Context mContext; private ContactSearchPreferenceController mController; private RestrictedSwitchPreference mPreference; + @Mock + private UserHandle mManagedUser; + @Mock + private UserManager mUserManager; + @Mock + private UserInfo mUserInfo; + @Before public void setUp() { MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; - mController = new ContactSearchPreferenceController(mContext, PREF_KEY); - mController.setManagedUser(mManagedUser); + mContext = spy(ApplicationProvider.getApplicationContext()); + when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); mPreference = spy(new RestrictedSwitchPreference(mContext)); + when(mUserInfo.isManagedProfile()).thenReturn(true); + when(mUserManager.getUserInfo(anyInt())).thenReturn(mUserInfo); + when(mUserManager.getProcessUserId()).thenReturn(0); + when(mUserManager.getUserProfiles()).thenReturn(Collections.singletonList(mManagedUser)); + when(mManagedUser.getIdentifier()).thenReturn(MANAGED_USER_ID); + mController = new ContactSearchPreferenceController(mContext, PREF_KEY); } @Test public void getAvailabilityStatus_noManagedUser_DISABLED() { - mController.setManagedUser(null); + when(mUserManager.getProcessUserId()).thenReturn(MANAGED_USER_ID); + mController = new ContactSearchPreferenceController(mContext, PREF_KEY); + assertThat(mController.getAvailabilityStatus()) .isNotEqualTo(ContactSearchPreferenceController.AVAILABLE); } @Test public void getAvailabilityStatus_hasManagedUser_AVAILABLE() { - mController.setManagedUser(mManagedUser); assertThat(mController.getAvailabilityStatus()) .isEqualTo(ContactSearchPreferenceController.AVAILABLE); } @@ -75,32 +93,96 @@ public class ContactSearchPreferenceControllerTest { @Test public void updateState_shouldRefreshContent() { Settings.Secure.putIntForUser(mContext.getContentResolver(), - MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 0, mManagedUser.getIdentifier()); + MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 0, MANAGED_USER_ID); + mController.updateState(mPreference); + assertThat(mPreference.isChecked()).isFalse(); Settings.Secure.putIntForUser(mContext.getContentResolver(), - MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 1, mManagedUser.getIdentifier()); + MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 1, MANAGED_USER_ID); + mController.updateState(mPreference); + assertThat(mPreference.isChecked()).isTrue(); } @Test public void updateState_preferenceShouldBeDisabled() { mController.updateState(mPreference); + verify(mPreference).setDisabledByAdmin(any()); } @Test public void onPreferenceChange_shouldUpdateProviderValue() { mController.onPreferenceChange(mPreference, false); + assertThat(Settings.Secure.getIntForUser(mContext.getContentResolver(), - MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 1, mManagedUser.getIdentifier())) + MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 1, MANAGED_USER_ID)) .isEqualTo(0); mController.onPreferenceChange(mPreference, true); + assertThat(Settings.Secure.getIntForUser(mContext.getContentResolver(), - MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 0, mManagedUser.getIdentifier())) + MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 0, MANAGED_USER_ID)) .isEqualTo(1); } -} \ No newline at end of file + + @Test + public void onQuietModeDisabled_preferenceEnabled() { + when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); + + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isTrue(); + } + + @Test + public void onQuietModeEnabled_preferenceDisabledAndUnchecked() { + when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(true); + + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isFalse(); + assertThat(mPreference.isChecked()).isFalse(); + } + + @Test + public void afterQuietModeTurnedOnAndOffWhenPreferenceChecked_toggleCheckedAndEnabled() { + Settings.Secure.putIntForUser(mContext.getContentResolver(), + MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 1, MANAGED_USER_ID); + when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(true); + + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isFalse(); + assertThat(mPreference.isChecked()).isFalse(); + + when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); + + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isTrue(); + assertThat(mPreference.isChecked()).isTrue(); + } + + @Test + public void afterQuietModeTurnedOnAndOffWhenPreferenceUnchecked_toggleUncheckedAndEnabled() { + Settings.Secure.putIntForUser(mContext.getContentResolver(), + MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 0, MANAGED_USER_ID); + when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(true); + + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isFalse(); + assertThat(mPreference.isChecked()).isFalse(); + + when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); + + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isTrue(); + assertThat(mPreference.isChecked()).isFalse(); + } +} diff --git a/tests/robotests/src/com/android/settings/accounts/ManagedProfileQuietModeEnablerTest.java b/tests/robotests/src/com/android/settings/accounts/ManagedProfileQuietModeEnablerTest.java new file mode 100644 index 00000000000..2698efa4bd8 --- /dev/null +++ b/tests/robotests/src/com/android/settings/accounts/ManagedProfileQuietModeEnablerTest.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2023 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.accounts; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.UserInfo; +import android.os.UserHandle; +import android.os.UserManager; + +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.LifecycleRegistry; +import androidx.test.core.app.ApplicationProvider; + +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 java.util.Collections; + + +@RunWith(RobolectricTestRunner.class) +public class ManagedProfileQuietModeEnablerTest { + private static final int MANAGED_USER_ID = 10; + private Context mContext; + private ManagedProfileQuietModeEnabler mQuietModeEnabler; + private LifecycleOwner mLifecycleOwner = new LifecycleOwner() { + public LifecycleRegistry registry = new LifecycleRegistry(this); + + @Override + public Lifecycle getLifecycle() { + return registry; + } + }; + + @Mock + private ManagedProfileQuietModeEnabler.QuietModeChangeListener mOnQuietModeChangeListener; + @Mock + private UserManager mUserManager; + @Mock + private UserHandle mManagedUser; + @Mock + private UserInfo mUserInfo; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = spy(ApplicationProvider.getApplicationContext()); + when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); + when(mUserInfo.isManagedProfile()).thenReturn(true); + when(mUserManager.getUserInfo(anyInt())).thenReturn(mUserInfo); + when(mUserManager.getProcessUserId()).thenReturn(0); + when(mManagedUser.getIdentifier()).thenReturn(MANAGED_USER_ID); + when(mUserManager.getUserProfiles()).thenReturn(Collections.singletonList(mManagedUser)); + mQuietModeEnabler = new ManagedProfileQuietModeEnabler(mContext, + mOnQuietModeChangeListener); + } + + @Test + public void onSetQuietMode_shouldRequestQuietModeEnabled() { + mQuietModeEnabler.setQuietModeEnabled(false); + verify(mUserManager).requestQuietModeEnabled(false, mManagedUser); + mQuietModeEnabler.setQuietModeEnabled(true); + verify(mUserManager).requestQuietModeEnabled(true, mManagedUser); + } + + @Test + public void onIsQuietModeEnabled_shouldCallIsQuietModeEnabled() { + assertThat(mQuietModeEnabler.isQuietModeEnabled()).isEqualTo( + verify(mUserManager).isQuietModeEnabled(any())); + } + + @Test + public void onQuietModeChanged_listenerNotified() { + mQuietModeEnabler.onStart(mLifecycleOwner); + mContext.sendBroadcast(new Intent(Intent.ACTION_MANAGED_PROFILE_AVAILABLE).putExtra( + Intent.EXTRA_USER_HANDLE, MANAGED_USER_ID)); + mContext.sendBroadcast(new Intent(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE).putExtra( + Intent.EXTRA_USER_HANDLE, MANAGED_USER_ID)); + verify(mOnQuietModeChangeListener, times(2)).onQuietModeChanged(); + } + + @Test + public void onStart_shouldRegisterReceiver() { + mQuietModeEnabler.onStart(mLifecycleOwner); + verify(mContext).registerReceiver(eq(mQuietModeEnabler.mReceiver), any(), anyInt()); + } + + @Test + public void onStop_shouldUnregisterReceiver() { + // register it first + mContext.registerReceiver(mQuietModeEnabler.mReceiver, null, + Context.RECEIVER_EXPORTED/*UNAUDITED*/); + + mQuietModeEnabler.onStop(mLifecycleOwner); + verify(mContext).unregisterReceiver(mQuietModeEnabler.mReceiver); + } +} diff --git a/tests/robotests/src/com/android/settings/accounts/WorkModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/WorkModePreferenceControllerTest.java index 2a283181b1c..e862d108c7c 100644 --- a/tests/robotests/src/com/android/settings/accounts/WorkModePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/WorkModePreferenceControllerTest.java @@ -19,18 +19,18 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.pm.UserInfo; import android.os.UserHandle; import android.os.UserManager; -import androidx.preference.SwitchPreference; +import androidx.test.core.app.ApplicationProvider; -import com.android.settings.R; +import com.android.settingslib.widget.MainSwitchPreference; import org.junit.Before; import org.junit.Test; @@ -38,43 +38,51 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; + +import java.util.Collections; @RunWith(RobolectricTestRunner.class) public class WorkModePreferenceControllerTest { private static final String PREF_KEY = "work_mode"; + private static final int MANAGED_USER_ID = 10; + + private Context mContext; + private WorkModePreferenceController mController; + private MainSwitchPreference mPreference; @Mock private UserManager mUserManager; @Mock private UserHandle mManagedUser; - - private Context mContext; - private WorkModePreferenceController mController; - private SwitchPreference mPreference; + @Mock + private UserInfo mUserInfo; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mContext = spy(RuntimeEnvironment.application); - when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); - + mContext = spy(ApplicationProvider.getApplicationContext()); + when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); + mPreference = new MainSwitchPreference(mContext); + when(mUserInfo.isManagedProfile()).thenReturn(true); + when(mUserManager.getUserInfo(anyInt())).thenReturn(mUserInfo); + when(mUserManager.getProcessUserId()).thenReturn(0); + when(mUserManager.getUserProfiles()).thenReturn(Collections.singletonList(mManagedUser)); + when(mManagedUser.getIdentifier()).thenReturn(MANAGED_USER_ID); mController = new WorkModePreferenceController(mContext, PREF_KEY); - mController.setManagedUser(mManagedUser); - mPreference = new SwitchPreference(mContext); } @Test public void getAvailabilityStatus_noManagedUser_DISABLED() { - mController.setManagedUser(null); + when(mUserManager.getProcessUserId()).thenReturn(MANAGED_USER_ID); + mController = new WorkModePreferenceController(mContext, PREF_KEY); + assertThat(mController.getAvailabilityStatus()) .isNotEqualTo(WorkModePreferenceController.AVAILABLE); } @Test public void getAvailabilityStatus_hasManagedUser_AVAILABLE() { - mController.setManagedUser(mManagedUser); assertThat(mController.getAvailabilityStatus()) .isEqualTo(WorkModePreferenceController.AVAILABLE); } @@ -83,41 +91,29 @@ public class WorkModePreferenceControllerTest { public void updateState_shouldRefreshContent() { when(mUserManager.isQuietModeEnabled(any(UserHandle.class))) .thenReturn(false); + mController.updateState(mPreference); + assertThat(mPreference.isChecked()).isTrue(); - assertThat(mPreference.getSummary()) - .isEqualTo(mContext.getText(R.string.work_mode_on_summary)); when(mUserManager.isQuietModeEnabled(any(UserHandle.class))) .thenReturn(true); + mController.updateState(mPreference); + assertThat(mPreference.isChecked()).isFalse(); - assertThat(mPreference.getSummary()) - .isEqualTo(mContext.getText(R.string.work_mode_off_summary)); } @Test public void onPreferenceChange_shouldRequestQuietModeEnabled() { + mController.setPreference(mPreference); + mController.onPreferenceChange(mPreference, true); + verify(mUserManager).requestQuietModeEnabled(false, mManagedUser); mController.onPreferenceChange(mPreference, false); + verify(mUserManager).requestQuietModeEnabled(true, mManagedUser); } - - @Test - public void onStart_shouldRegisterReceiver() { - mController.onStart(); - verify(mContext).registerReceiver(eq(mController.mReceiver), any(), anyInt()); - } - - @Test - public void onStop_shouldUnregisterReceiver() { - // register it first - mContext.registerReceiver(mController.mReceiver, null, - Context.RECEIVER_EXPORTED/*UNAUDITED*/); - - mController.onStop(); - verify(mContext).unregisterReceiver(mController.mReceiver); - } } \ No newline at end of file From 5656caecd01493679db68ea1937b9aa0f65b5233 Mon Sep 17 00:00:00 2001 From: jasonwshsu Date: Thu, 11 May 2023 22:23:16 +0800 Subject: [PATCH 07/20] Correct shortcut summary to have different software types of shortcut result Root Cause: Did not consider different software types shortcut in AccessibilityShortcutPreferenceFragment Solution: Add support for different software shortcut types Bug: 263451053 Test: manual change shortcut type and check Change-Id: Ic425fdab790d4bbf1de6418ada382e420a9860fc --- ...ccessibilityShortcutPreferenceFragment.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java index 01158bf1e5b..b414addc41f 100644 --- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java @@ -322,6 +322,18 @@ public abstract class AccessibilityShortcutPreferenceFragment extends Restricted getComponentName()); }; + private static CharSequence getSoftwareShortcutTypeSummary(Context context) { + int resId; + if (AccessibilityUtil.isFloatingMenuEnabled(context)) { + resId = R.string.accessibility_shortcut_edit_summary_software; + } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) { + resId = R.string.accessibility_shortcut_edit_summary_software_gesture; + } else { + resId = R.string.accessibility_shortcut_edit_summary_software; + } + return context.getText(resId); + } + /** * This method will be invoked when a button in the tutorial dialog is clicked. * @@ -429,11 +441,9 @@ public abstract class AccessibilityShortcutPreferenceFragment extends Restricted getComponentName().flattenToString(), AccessibilityUtil.UserShortcutType.SOFTWARE); final List list = new ArrayList<>(); - final CharSequence softwareTitle = context.getText( - R.string.accessibility_shortcut_edit_summary_software); if (hasShortcutType(shortcutTypes, AccessibilityUtil.UserShortcutType.SOFTWARE)) { - list.add(softwareTitle); + list.add(getSoftwareShortcutTypeSummary(context)); } if (hasShortcutType(shortcutTypes, AccessibilityUtil.UserShortcutType.HARDWARE)) { final CharSequence hardwareTitle = context.getText( @@ -443,7 +453,7 @@ public abstract class AccessibilityShortcutPreferenceFragment extends Restricted // Show software shortcut if first time to use. if (list.isEmpty()) { - list.add(softwareTitle); + list.add(getSoftwareShortcutTypeSummary(context)); } return CaseMap.toTitle().wholeString().noLowercase().apply(Locale.getDefault(), /* iter= */ From 5e2862f2e37c8fc561580ec41c4022df55520582 Mon Sep 17 00:00:00 2001 From: tom hsu Date: Fri, 12 May 2023 01:10:19 +0800 Subject: [PATCH 08/20] [Settings] Avoid to unregister wrong observer Bug: 262345047 Test: atest passed. Change-Id: If324e8f35c15053b48320f86ff22759a6a68a62f --- .../slices/SlicePreferenceController.java | 17 +++++++++---- .../slices/SlicePreferenceControllerTest.java | 24 ++++++++++++++++++- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/slices/SlicePreferenceController.java b/src/com/android/settings/slices/SlicePreferenceController.java index df28304f738..eb10bd42be1 100644 --- a/src/com/android/settings/slices/SlicePreferenceController.java +++ b/src/com/android/settings/slices/SlicePreferenceController.java @@ -44,6 +44,7 @@ public class SlicePreferenceController extends BasePreferenceController implemen LiveData mLiveData; @VisibleForTesting SlicePreference mSlicePreference; + private boolean mIsObservering = false; private Uri mUri; public SlicePreferenceController(Context context, String preferenceKey) { @@ -68,25 +69,31 @@ public class SlicePreferenceController extends BasePreferenceController implemen }); //TODO(b/120803703): figure out why we need to remove observer first - mLiveData.removeObserver(this); + removeLiveDataObserver(); } @Override public void onStart() { - if (mLiveData != null) { + if (mLiveData != null && !mIsObservering) { + mIsObservering = true; mLiveData.observeForever(this); } } @Override public void onStop() { - if (mLiveData != null) { - mLiveData.removeObserver(this); - } + removeLiveDataObserver(); } @Override public void onChanged(Slice slice) { mSlicePreference.onSliceUpdated(slice); } + + private void removeLiveDataObserver() { + if (mLiveData != null && mIsObservering && mLiveData.hasActiveObservers()) { + mIsObservering = false; + mLiveData.removeObserver(this); + } + } } diff --git a/tests/robotests/src/com/android/settings/slices/SlicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/slices/SlicePreferenceControllerTest.java index 65eaddd50ab..e8bd27d97e6 100644 --- a/tests/robotests/src/com/android/settings/slices/SlicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/slices/SlicePreferenceControllerTest.java @@ -18,8 +18,10 @@ package com.android.settings.slices; import static com.google.common.truth.Truth.assertThat; +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.content.Context; import android.net.Uri; @@ -43,11 +45,11 @@ public class SlicePreferenceControllerTest { private LiveData mLiveData; @Mock private SlicePreference mSlicePreference; + private Context mContext; private SlicePreferenceController mController; private Uri mUri; - @Before public void setUp() { MockitoAnnotations.initMocks(this); @@ -78,10 +80,30 @@ public class SlicePreferenceControllerTest { @Test public void onStop_unregisterObserver() { + when(mLiveData.hasActiveObservers()).thenReturn(true); + mController.onStart(); + mController.onStop(); verify(mLiveData).removeObserver(mController); } + @Test + public void onStop_noActiveObservers_notUnregisterObserver() { + when(mLiveData.hasActiveObservers()).thenReturn(false); + mController.onStart(); + + mController.onStop(); + verify(mLiveData, never()).removeObserver(mController); + } + + @Test + public void onStop_notRegisterObserver_notUnregisterObserver() { + when(mLiveData.hasActiveObservers()).thenReturn(true); + + mController.onStop(); + verify(mLiveData, never()).removeObserver(mController); + } + @Test public void onChanged_nullSlice_updateSlice() { mController.onChanged(null); From fb6b6b0bcccd7e47a37aea01a76a597aef0176d9 Mon Sep 17 00:00:00 2001 From: Zoey Chen Date: Tue, 2 May 2023 08:47:51 +0000 Subject: [PATCH 09/20] [Panlingual] Do not show dialog in recycle. Set LocaleEditor as the parent fragment and control the dialog. Keep the dialog and the locale list after rotation Bug: 279527362 Change-Id: I349fd9d0fea5b43a8bbb2a23fa60fc4c5436c5cf Test: make RunSettingsRoboTests -j128 ROBOTEST_FILTER=LocaleListEditorTest Test: atest LocaleDialogFragmentTest --- .../localepicker/LocaleDialogFragment.java | 107 +++++++++--------- .../LocaleDragAndDropAdapter.java | 95 +++++++--------- .../localepicker/LocaleListEditor.java | 64 ++++++++++- .../localepicker/LocaleRecyclerView.java | 11 -- .../localepicker/LocaleListEditorTest.java | 100 +++++++++++++++- .../LocaleDialogFragmentTest.java | 57 +++------- 6 files changed, 266 insertions(+), 168 deletions(-) diff --git a/src/com/android/settings/localepicker/LocaleDialogFragment.java b/src/com/android/settings/localepicker/LocaleDialogFragment.java index 2dc09bd9ee0..ad9e10f19ed 100644 --- a/src/com/android/settings/localepicker/LocaleDialogFragment.java +++ b/src/com/android/settings/localepicker/LocaleDialogFragment.java @@ -21,8 +21,8 @@ import android.app.Dialog; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.os.Bundle; -import android.os.ResultReceiver; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -35,7 +35,6 @@ import androidx.fragment.app.FragmentManager; import com.android.internal.app.LocaleStore; import com.android.settings.R; -import com.android.settings.RestrictedSettingsFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; @@ -46,49 +45,19 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; public class LocaleDialogFragment extends InstrumentedDialogFragment { private static final String TAG = LocaleDialogFragment.class.getSimpleName(); - static final int DIALOG_CONFIRM_SYSTEM_DEFAULT = 0; - static final int DIALOG_NOT_AVAILABLE_LOCALE = 1; + static final int DIALOG_CONFIRM_SYSTEM_DEFAULT = 1; + static final int DIALOG_NOT_AVAILABLE_LOCALE = 2; static final String ARG_DIALOG_TYPE = "arg_dialog_type"; static final String ARG_TARGET_LOCALE = "arg_target_locale"; - static final String ARG_RESULT_RECEIVER = "arg_result_receiver"; + static final String ARG_SHOW_DIALOG = "arg_show_dialog"; + + private boolean mShouldKeepDialog; public static LocaleDialogFragment newInstance() { return new LocaleDialogFragment(); } - /** - * Show dialog - */ - public void show( - @NonNull RestrictedSettingsFragment fragment, - int dialogType, - LocaleStore.LocaleInfo localeInfo) { - if (!isAdded()) { - return; - } - show(fragment, dialogType, localeInfo, null); - } - - /** - * Show dialog - */ - public void show( - @NonNull RestrictedSettingsFragment fragment, - int dialogType, - LocaleStore.LocaleInfo localeInfo, - ResultReceiver resultReceiver) { - FragmentManager manager = fragment.getChildFragmentManager(); - Bundle args = new Bundle(); - args.putInt(ARG_DIALOG_TYPE, dialogType); - args.putSerializable(ARG_TARGET_LOCALE, localeInfo); - args.putParcelable(ARG_RESULT_RECEIVER, resultReceiver); - - LocaleDialogFragment localeDialogFragment = new LocaleDialogFragment(); - localeDialogFragment.setArguments(args); - localeDialogFragment.show(manager, TAG); - } - @Override public int getMetricsCategory() { int dialogType = getArguments().getInt(ARG_DIALOG_TYPE); @@ -102,9 +71,29 @@ public class LocaleDialogFragment extends InstrumentedDialogFragment { } } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(ARG_SHOW_DIALOG, mShouldKeepDialog); + } + @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - LocaleDialogController controller = new LocaleDialogController(this); + if (savedInstanceState != null) { + Bundle arguments = getArguments(); + int type = arguments.getInt(ARG_DIALOG_TYPE); + mShouldKeepDialog = savedInstanceState.getBoolean(ARG_SHOW_DIALOG, false); + // Keep the dialog if user rotates the device, otherwise close the confirm system + // default dialog only when user changes the locale. + if (type == DIALOG_CONFIRM_SYSTEM_DEFAULT && !mShouldKeepDialog) { + dismiss(); + } + } + + mShouldKeepDialog = true; + LocaleListEditor parentFragment = (LocaleListEditor) getParentFragment(); + LocaleDialogController controller = getLocaleDialogController(getContext(), this, + parentFragment); LocaleDialogController.DialogContent dialogContent = controller.getDialogContent(); ViewGroup viewGroup = (ViewGroup) LayoutInflater.from(getContext()).inflate( R.layout.locale_dialog, null); @@ -140,47 +129,57 @@ public class LocaleDialogFragment extends InstrumentedDialogFragment { textView.setText(content); } - static class LocaleDialogController implements DialogInterface.OnClickListener { + @VisibleForTesting + LocaleDialogController getLocaleDialogController(Context context, + LocaleDialogFragment dialogFragment, LocaleListEditor parentFragment) { + return new LocaleDialogController(context, dialogFragment, parentFragment); + } + + class LocaleDialogController implements DialogInterface.OnClickListener { private final Context mContext; private final int mDialogType; private final LocaleStore.LocaleInfo mLocaleInfo; - private final ResultReceiver mResultReceiver; private final MetricsFeatureProvider mMetricsFeatureProvider; + private LocaleListEditor mParent; + LocaleDialogController( - @NonNull Context context, @NonNull LocaleDialogFragment dialogFragment) { + @NonNull Context context, @NonNull LocaleDialogFragment dialogFragment, + LocaleListEditor parentFragment) { mContext = context; Bundle arguments = dialogFragment.getArguments(); mDialogType = arguments.getInt(ARG_DIALOG_TYPE); - mLocaleInfo = (LocaleStore.LocaleInfo) arguments.getSerializable( - ARG_TARGET_LOCALE); - mResultReceiver = (ResultReceiver) arguments.getParcelable(ARG_RESULT_RECEIVER); + mLocaleInfo = (LocaleStore.LocaleInfo) arguments.getSerializable(ARG_TARGET_LOCALE); mMetricsFeatureProvider = FeatureFactory.getFactory( mContext).getMetricsFeatureProvider(); + mParent = parentFragment; } - LocaleDialogController(@NonNull LocaleDialogFragment dialogFragment) { - this(dialogFragment.getContext(), dialogFragment); + LocaleDialogController(@NonNull LocaleDialogFragment dialogFragment, + LocaleListEditor parent) { + this(dialogFragment.getContext(), dialogFragment, parent); } @Override public void onClick(DialogInterface dialog, int which) { - if (mResultReceiver != null && mDialogType == DIALOG_CONFIRM_SYSTEM_DEFAULT) { + if (mDialogType == DIALOG_CONFIRM_SYSTEM_DEFAULT) { + int result = Activity.RESULT_CANCELED; + if (which == DialogInterface.BUTTON_POSITIVE) { + result = Activity.RESULT_OK; + } + Intent intent = new Intent(); Bundle bundle = new Bundle(); bundle.putInt(ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT); - if (which == DialogInterface.BUTTON_POSITIVE) { - mResultReceiver.send(Activity.RESULT_OK, bundle); - } else if (which == DialogInterface.BUTTON_NEGATIVE) { - mResultReceiver.send(Activity.RESULT_CANCELED, bundle); - } + intent.putExtras(bundle); + mParent.onActivityResult(DIALOG_CONFIRM_SYSTEM_DEFAULT, result, intent); mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_CHANGE_LANGUAGE); } + mShouldKeepDialog = false; } @VisibleForTesting DialogContent getDialogContent() { - DialogContent - dialogContent = new DialogContent(); + DialogContent dialogContent = new DialogContent(); switch (mDialogType) { case DIALOG_CONFIRM_SYSTEM_DEFAULT: dialogContent.mTitle = String.format(mContext.getString( diff --git a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java index 2223db06562..edd302645e2 100644 --- a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java +++ b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java @@ -16,14 +16,11 @@ package com.android.settings.localepicker; -import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.os.Bundle; -import android.os.Handler; import android.os.LocaleList; -import android.os.Looper; -import android.os.ResultReceiver; +import android.text.TextUtils; import android.util.Log; import android.util.TypedValue; import android.view.LayoutInflater; @@ -52,15 +49,20 @@ class LocaleDragAndDropAdapter private static final String TAG = "LocaleDragAndDropAdapter"; private static final String CFGKEY_SELECTED_LOCALES = "selectedLocales"; + private static final String CFGKEY_DRAG_LOCALE = "dragLocales"; + private static final String CFGKEY_DRAG_LOCALES_TO_POSITION = "dragLocales_end"; + private final Context mContext; + private final ItemTouchHelper mItemTouchHelper; + private List mFeedItemList; private List mCacheItemList; - private final ItemTouchHelper mItemTouchHelper; private RecyclerView mParentView = null; private LocaleListEditor mParent; private boolean mRemoveMode = false; private boolean mDragEnabled = true; private NumberFormat mNumberFormatter = NumberFormat.getNumberInstance(); + private LocaleStore.LocaleInfo mDragLocale; class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnTouchListener { private final LocaleDragCell mLocaleDragCell; @@ -87,8 +89,7 @@ class LocaleDragAndDropAdapter } } - LocaleDragAndDropAdapter(LocaleListEditor parent, - List feedItemList) { + LocaleDragAndDropAdapter(LocaleListEditor parent, List feedItemList) { mFeedItemList = feedItemList; mParent = parent; mCacheItemList = new ArrayList<>(feedItemList); @@ -202,6 +203,7 @@ class LocaleDragAndDropAdapter final LocaleStore.LocaleInfo saved = mFeedItemList.get(fromPosition); mFeedItemList.remove(fromPosition); mFeedItemList.add(toPosition, saved); + mDragLocale = saved; } else { // TODO: It looks like sometimes the RecycleView tries to swap item -1 // I did not see it in a while, but if it happens, investigate and file a bug. @@ -317,43 +319,20 @@ class LocaleDragAndDropAdapter }); } - public void doTheUpdateWithMovingLocaleItem() { - LocaleStore.LocaleInfo localeInfo = mFeedItemList.get(0); - final LocaleDialogFragment fragment = LocaleDialogFragment.newInstance(); - if (!localeInfo.getLocale().equals(LocalePicker.getLocales().get(0))) { - fragment.show(mParent, - LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT, - localeInfo, - new ResultReceiver(new Handler(Looper.getMainLooper())) { - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - super.onReceiveResult(resultCode, resultData); - int type = resultData.getInt(LocaleDialogFragment.ARG_DIALOG_TYPE); - if (type == LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT) { - if (resultCode == Activity.RESULT_OK) { - doTheUpdate(); - if (!localeInfo.isTranslated()) { - fragment.show(mParent, - LocaleDialogFragment - .DIALOG_NOT_AVAILABLE_LOCALE, - localeInfo); - } - } else { - if (!localeInfo.getLocale() - .equals(mCacheItemList.get(0).getLocale())) { - mFeedItemList = new ArrayList<>(mCacheItemList); - notifyDataSetChanged(); - } - } - mCacheItemList = new ArrayList<>(mFeedItemList); - } - } - }); - } else { - doTheUpdate(); + public void notifyListChanged(LocaleStore.LocaleInfo localeInfo) { + if (!localeInfo.getLocale().equals(mCacheItemList.get(0).getLocale())) { + mFeedItemList = new ArrayList<>(mCacheItemList); + notifyDataSetChanged(); } } + public void setCacheItemList() { + mCacheItemList = new ArrayList<>(mFeedItemList); + } + + public List getFeedItemList() { + return mFeedItemList; + } private void setDragEnabled(boolean enabled) { mDragEnabled = enabled; } @@ -373,6 +352,8 @@ class LocaleDragAndDropAdapter } } outInstanceState.putStringArrayList(CFGKEY_SELECTED_LOCALES, selectedLocales); + // Save the dragged locale before rotation + outInstanceState.putSerializable(CFGKEY_DRAG_LOCALE, mDragLocale); } } @@ -381,18 +362,30 @@ class LocaleDragAndDropAdapter * (for instance when the device is rotated) * * @param savedInstanceState Bundle with the data saved by {@link #saveState(Bundle)} + * @param isDialogShowing A flag indicating whether the dialog is showing or not. */ - public void restoreState(Bundle savedInstanceState) { - if (savedInstanceState != null && mRemoveMode) { - final ArrayList selectedLocales = - savedInstanceState.getStringArrayList(CFGKEY_SELECTED_LOCALES); - if (selectedLocales == null || selectedLocales.isEmpty()) { - return; + public void restoreState(Bundle savedInstanceState, boolean isDialogShowing) { + if (savedInstanceState != null) { + if (mRemoveMode) { + final ArrayList selectedLocales = + savedInstanceState.getStringArrayList(CFGKEY_SELECTED_LOCALES); + if (selectedLocales == null || selectedLocales.isEmpty()) { + return; + } + for (LocaleStore.LocaleInfo li : mFeedItemList) { + li.setChecked(selectedLocales.contains(li.getId())); + } + notifyItemRangeChanged(0, mFeedItemList.size()); + } else if (isDialogShowing) { + // After rotation, the dragged position will be restored to original. Restore the + // drag locale's original position to the top. + mDragLocale = (LocaleStore.LocaleInfo) savedInstanceState.getSerializable( + CFGKEY_DRAG_LOCALE); + mFeedItemList.removeIf( + localeInfo -> TextUtils.equals(localeInfo.getId(), mDragLocale.getId())); + mFeedItemList.add(0, mDragLocale); + notifyItemRangeChanged(0, mFeedItemList.size()); } - for (LocaleStore.LocaleInfo li : mFeedItemList) { - li.setChecked(selectedLocales.contains(li.getId())); - } - notifyItemRangeChanged(0, mFeedItemList.size()); } } } diff --git a/src/com/android/settings/localepicker/LocaleListEditor.java b/src/com/android/settings/localepicker/LocaleListEditor.java index 6317f24a304..7ec08f7300e 100644 --- a/src/com/android/settings/localepicker/LocaleListEditor.java +++ b/src/com/android/settings/localepicker/LocaleListEditor.java @@ -18,6 +18,8 @@ package com.android.settings.localepicker; import static android.os.UserManager.DISALLOW_CONFIG_LOCALE; +import static com.android.settings.localepicker.LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT; + import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Context; @@ -32,12 +34,14 @@ import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentManager; import androidx.preference.PreferenceScreen; import androidx.recyclerview.widget.RecyclerView; @@ -60,7 +64,7 @@ import java.util.Locale; * Drag-and-drop editor for the user-ordered locale lists. */ @SearchIndexable -public class LocaleListEditor extends RestrictedSettingsFragment { +public class LocaleListEditor extends RestrictedSettingsFragment implements View.OnTouchListener { protected static final String INTENT_LOCALE_KEY = "localeInfo"; private static final String CFGKEY_REMOVE_MODE = "localeRemoveMode"; @@ -70,6 +74,8 @@ public class LocaleListEditor extends RestrictedSettingsFragment { private static final String INDEX_KEY_ADD_LANGUAGE = "add_language"; private static final String KEY_LANGUAGES_PICKER = "languages_picker"; + private static final String TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT = "dialog_confirm_system_default"; + private static final String TAG_DIALOG_NOT_AVAILABLE = "dialog_not_available_locale"; private LocaleDragAndDropAdapter mAdapter; private Menu mMenu; @@ -80,6 +86,7 @@ public class LocaleListEditor extends RestrictedSettingsFragment { private LayoutPreference mLocalePickerPreference; private LocaleHelperPreferenceController mLocaleHelperPreferenceController; + private FragmentManager mFragmentManager; public LocaleListEditor() { super(DISALLOW_CONFIG_LOCALE); @@ -106,6 +113,7 @@ public class LocaleListEditor extends RestrictedSettingsFragment { LocaleStore.fillCache(this.getContext()); final List feedsList = getUserLocaleList(); mAdapter = new LocaleDragAndDropAdapter(this, feedsList); + mFragmentManager = getChildFragmentManager(); } @Override @@ -141,7 +149,15 @@ public class LocaleListEditor extends RestrictedSettingsFragment { mShowingRemoveDialog = savedInstanceState.getBoolean(CFGKEY_REMOVE_DIALOG, false); } setRemoveMode(mRemoveMode); - mAdapter.restoreState(savedInstanceState); + + final LocaleDialogFragment dialogFragment = + (LocaleDialogFragment) mFragmentManager.findFragmentByTag( + TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT); + boolean isDialogShowing = false; + if (dialogFragment != null && dialogFragment.isAdded()) { + isDialogShowing = true; + } + mAdapter.restoreState(savedInstanceState, isDialogShowing); if (mShowingRemoveDialog) { showRemoveLocaleWarningDialog(); @@ -178,17 +194,32 @@ public class LocaleListEditor extends RestrictedSettingsFragment { @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { + LocaleStore.LocaleInfo localeInfo; if (requestCode == REQUEST_LOCALE_PICKER && resultCode == Activity.RESULT_OK && data != null) { - final LocaleStore.LocaleInfo localeInfo = - (LocaleStore.LocaleInfo) data.getSerializableExtra( - INTENT_LOCALE_KEY); - + localeInfo = (LocaleStore.LocaleInfo) data.getSerializableExtra(INTENT_LOCALE_KEY); String preferencesTags = Settings.System.getString( getContext().getContentResolver(), Settings.System.LOCALE_PREFERENCES); mAdapter.addLocale(mayAppendUnicodeTags(localeInfo, preferencesTags)); updateVisibilityOfRemoveMenu(); + } else if (requestCode == DIALOG_CONFIRM_SYSTEM_DEFAULT) { + localeInfo = mAdapter.getFeedItemList().get(0); + if (resultCode == Activity.RESULT_OK) { + mAdapter.doTheUpdate(); + if (!localeInfo.isTranslated()) { + Bundle args = new Bundle(); + args.putInt(LocaleDialogFragment.ARG_DIALOG_TYPE, + LocaleDialogFragment.DIALOG_NOT_AVAILABLE_LOCALE); + args.putSerializable(LocaleDialogFragment.ARG_TARGET_LOCALE, localeInfo); + LocaleDialogFragment localeDialogFragment = LocaleDialogFragment.newInstance(); + localeDialogFragment.setArguments(args); + localeDialogFragment.show(mFragmentManager, TAG_DIALOG_NOT_AVAILABLE); + } + } else { + mAdapter.notifyListChanged(localeInfo); + } + mAdapter.setCacheItemList(); } super.onActivityResult(requestCode, resultCode, data); } @@ -332,6 +363,7 @@ public class LocaleListEditor extends RestrictedSettingsFragment { list.setNestedScrollingEnabled(false); mAdapter.setRecyclerView(list); list.setAdapter(mAdapter); + list.setOnTouchListener(this); mAddLanguage = layout.findViewById(R.id.add_language); mAddLanguage.setOnClickListener(new View.OnClickListener() { @@ -348,6 +380,26 @@ public class LocaleListEditor extends RestrictedSettingsFragment { }); } + @Override + public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_UP + || event.getAction() == MotionEvent.ACTION_CANCEL) { + LocaleStore.LocaleInfo localeInfo = mAdapter.getFeedItemList().get(0); + if (!localeInfo.getLocale().equals(LocalePicker.getLocales().get(0))) { + final LocaleDialogFragment localeDialogFragment = + LocaleDialogFragment.newInstance(); + Bundle args = new Bundle(); + args.putInt(LocaleDialogFragment.ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT); + args.putSerializable(LocaleDialogFragment.ARG_TARGET_LOCALE, localeInfo); + localeDialogFragment.setArguments(args); + localeDialogFragment.show(mFragmentManager, TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT); + } else { + mAdapter.doTheUpdate(); + } + } + return false; + } + // Hide the "Remove" menu if there is only one locale in the list, show it otherwise // This is called when the menu is first created, and then one add / remove locale private void updateVisibilityOfRemoveMenu() { diff --git a/src/com/android/settings/localepicker/LocaleRecyclerView.java b/src/com/android/settings/localepicker/LocaleRecyclerView.java index 5d469bf7f10..4a5f28b8855 100644 --- a/src/com/android/settings/localepicker/LocaleRecyclerView.java +++ b/src/com/android/settings/localepicker/LocaleRecyclerView.java @@ -34,15 +34,4 @@ class LocaleRecyclerView extends RecyclerView { public LocaleRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } - - @Override - public boolean onTouchEvent(MotionEvent e) { - if (e.getAction() == MotionEvent.ACTION_UP || e.getAction() == MotionEvent.ACTION_CANCEL) { - LocaleDragAndDropAdapter adapter = (LocaleDragAndDropAdapter) this.getAdapter(); - if (adapter != null) { - adapter.doTheUpdateWithMovingLocaleItem(); - } - } - return super.onTouchEvent(e); - } } diff --git a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java index 111ee5a7571..16d51beca64 100644 --- a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java +++ b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java @@ -18,19 +18,32 @@ package com.android.settings.localepicker; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.Activity; +import android.app.IActivityManager; import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import android.os.LocaleList; +import android.view.MotionEvent; import android.view.View; import android.widget.TextView; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; import com.android.internal.app.LocaleStore; import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.shadow.ShadowActivityManager; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import org.junit.After; @@ -45,22 +58,42 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; +import java.util.ArrayList; +import java.util.List; import java.util.Locale; @RunWith(RobolectricTestRunner.class) -@Config(shadows = ShadowAlertDialogCompat.class) +@Config(shadows = {ShadowAlertDialogCompat.class, ShadowActivityManager.class}) public class LocaleListEditorTest { + private static final String ARG_DIALOG_TYPE = "arg_dialog_type"; + private static final String TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT = "dialog_confirm_system_default"; + private static final String TAG_DIALOG_NOT_AVAILABLE = "dialog_not_available_locale"; + private static final int DIALOG_CONFIRM_SYSTEM_DEFAULT = 1; + private static final int REQUEST_CONFIRM_SYSTEM_DEFAULT = 1; + private LocaleListEditor mLocaleListEditor; private Context mContext; private FragmentActivity mActivity; + private List mLocaleList; + private Intent mIntent = new Intent(); @Mock private LocaleDragAndDropAdapter mAdapter; + @Mock + private LocaleStore.LocaleInfo mLocaleInfo; + @Mock + private FragmentManager mFragmentManager; + @Mock + private FragmentTransaction mFragmentTransaction; + @Mock + private View mView; + @Mock + private IActivityManager mActivityService; @Before - public void setUp() { + public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; mLocaleListEditor = spy(new LocaleListEditor()); @@ -74,6 +107,8 @@ public class LocaleListEditorTest { ReflectionHelpers.setField(mLocaleListEditor, "mUserManager", RuntimeEnvironment.application.getSystemService(Context.USER_SERVICE)); ReflectionHelpers.setField(mLocaleListEditor, "mAdapter", mAdapter); + ReflectionHelpers.setField(mLocaleListEditor, "mFragmentManager", mFragmentManager); + when(mFragmentManager.beginTransaction()).thenReturn(mFragmentTransaction); FakeFeatureFactory.setupForTest(); } @@ -174,4 +209,65 @@ public class LocaleListEditorTest { assertThat(result.getLocale().getUnicodeLocaleType("fw")).isEqualTo("wed"); assertThat(result.getLocale().getUnicodeLocaleType("mu")).isEqualTo("celsius"); } + + @Test + public void onActivityResult_ResultCodeIsOk_showNotAvailableDialog() { + Bundle bundle = new Bundle(); + bundle.putInt(ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT); + mIntent.putExtras(bundle); + setUpLocaleConditions(); + mLocaleListEditor.onActivityResult(REQUEST_CONFIRM_SYSTEM_DEFAULT, Activity.RESULT_OK, + mIntent); + + verify(mFragmentTransaction).add(any(LocaleDialogFragment.class), + eq(TAG_DIALOG_NOT_AVAILABLE)); + } + + @Test + public void onActivityResult_ResultCodeIsCancel_notifyAdapterListChanged() { + Bundle bundle = new Bundle(); + bundle.putInt(ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT); + mIntent.putExtras(bundle); + setUpLocaleConditions(); + mLocaleListEditor.onActivityResult(REQUEST_CONFIRM_SYSTEM_DEFAULT, Activity.RESULT_CANCELED, + mIntent); + + verify(mAdapter).notifyListChanged(mLocaleInfo); + } + + @Test + public void onTouch_dragDifferentLocaleToTop_showConfirmDialog() throws Exception { + MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0.0f, 0.0f, 0); + setUpLocaleConditions(); + final Configuration config = new Configuration(); + config.setLocales((LocaleList.forLanguageTags("zh-TW,en-US"))); + when(mActivityService.getConfiguration()).thenReturn(config); + when(mAdapter.getFeedItemList()).thenReturn(mLocaleList); + mLocaleListEditor.onTouch(mView, event); + + verify(mFragmentTransaction).add(any(LocaleDialogFragment.class), + eq(TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT)); + } + + @Test + public void onTouch_dragSameLocaleToTop_updateAdapter() throws Exception { + MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0.0f, 0.0f, 0); + setUpLocaleConditions(); + final Configuration config = new Configuration(); + config.setLocales((LocaleList.forLanguageTags("en-US,zh-TW"))); + when(mActivityService.getConfiguration()).thenReturn(config); + when(mAdapter.getFeedItemList()).thenReturn(mLocaleList); + mLocaleListEditor.onTouch(mView, event); + + verify(mAdapter).doTheUpdate(); + } + + private void setUpLocaleConditions() { + ShadowActivityManager.setService(mActivityService); + mLocaleList = new ArrayList<>(); + mLocaleList.add(mLocaleInfo); + when(mLocaleInfo.getFullNameNative()).thenReturn("English"); + when(mLocaleInfo.getLocale()).thenReturn(LocaleList.forLanguageTags("en-US").get(0)); + when(mAdapter.getFeedItemList()).thenReturn(mLocaleList); + } } diff --git a/tests/unit/src/com/android/settings/localepicker/LocaleDialogFragmentTest.java b/tests/unit/src/com/android/settings/localepicker/LocaleDialogFragmentTest.java index b0998c023a6..824954da52d 100644 --- a/tests/unit/src/com/android/settings/localepicker/LocaleDialogFragmentTest.java +++ b/tests/unit/src/com/android/settings/localepicker/LocaleDialogFragmentTest.java @@ -17,8 +17,8 @@ package com.android.settings.localepicker; import static com.android.settings.localepicker.LocaleDialogFragment.ARG_DIALOG_TYPE; -import static com.android.settings.localepicker.LocaleDialogFragment.ARG_RESULT_RECEIVER; import static com.android.settings.localepicker.LocaleDialogFragment.ARG_TARGET_LOCALE; +import static com.android.settings.localepicker.LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -27,12 +27,9 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Context; -import android.content.DialogInterface; import android.os.Bundle; -import android.os.ResultReceiver; import androidx.test.annotation.UiThreadTest; import androidx.test.core.app.ApplicationProvider; @@ -55,6 +52,7 @@ public class LocaleDialogFragmentTest { public final MockitoRule mockito = MockitoJUnit.rule(); private Context mContext; + private LocaleListEditor mLocaleListEditor; private LocaleDialogFragment mDialogFragment; private FakeFeatureFactory mFeatureFactory; @@ -62,30 +60,30 @@ public class LocaleDialogFragmentTest { public void setUp() throws Exception { mContext = ApplicationProvider.getApplicationContext(); mDialogFragment = new LocaleDialogFragment(); + mLocaleListEditor = spy(new LocaleListEditor()); mFeatureFactory = FakeFeatureFactory.setupForTest(); } - private void setArgument( - int type, ResultReceiver receiver) { + private void setArgument(int type) { LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(Locale.ENGLISH); Bundle args = new Bundle(); args.putInt(ARG_DIALOG_TYPE, type); args.putSerializable(ARG_TARGET_LOCALE, localeInfo); - args.putParcelable(ARG_RESULT_RECEIVER, receiver); mDialogFragment.setArguments(args); } @Test public void getDialogContent_confirmSystemDefault_has2ButtonText() { - setArgument(LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT, null); + setArgument(DIALOG_CONFIRM_SYSTEM_DEFAULT); LocaleDialogFragment.LocaleDialogController controller = - new LocaleDialogFragment.LocaleDialogController(mContext, mDialogFragment); + mDialogFragment.getLocaleDialogController(mContext, mDialogFragment, + mLocaleListEditor); LocaleDialogFragment.LocaleDialogController.DialogContent dialogContent = controller.getDialogContent(); assertEquals(ResourcesUtils.getResourcesString( - mContext, "button_label_confirmation_of_system_locale_change"), + mContext, "button_label_confirmation_of_system_locale_change"), dialogContent.mPositiveButton); assertEquals(ResourcesUtils.getResourcesString(mContext, "cancel"), dialogContent.mNegativeButton); @@ -93,9 +91,10 @@ public class LocaleDialogFragmentTest { @Test public void getDialogContent_unavailableLocale_has1ButtonText() { - setArgument(LocaleDialogFragment.DIALOG_NOT_AVAILABLE_LOCALE, null); + setArgument(LocaleDialogFragment.DIALOG_NOT_AVAILABLE_LOCALE); LocaleDialogFragment.LocaleDialogController controller = - new LocaleDialogFragment.LocaleDialogController(mContext, mDialogFragment); + mDialogFragment.getLocaleDialogController(mContext, mDialogFragment, + mLocaleListEditor); LocaleDialogFragment.LocaleDialogController.DialogContent dialogContent = controller.getDialogContent(); @@ -105,38 +104,9 @@ public class LocaleDialogFragmentTest { assertTrue(dialogContent.mNegativeButton.isEmpty()); } - @Test - public void onClick_clickPositiveButton_sendOK() { - ResultReceiver resultReceiver = spy(new ResultReceiver(null)); - setArgument(LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT, resultReceiver); - LocaleDialogFragment.LocaleDialogController controller = - new LocaleDialogFragment.LocaleDialogController(mContext, mDialogFragment); - - controller.onClick(null, DialogInterface.BUTTON_POSITIVE); - - verify(resultReceiver).send(eq(Activity.RESULT_OK), any()); - verify(mFeatureFactory.metricsFeatureProvider).action( - mContext, SettingsEnums.ACTION_CHANGE_LANGUAGE, true); - } - - @Test - public void onClick_clickNegativeButton_sendCancel() { - ResultReceiver resultReceiver = spy(new ResultReceiver(null)); - setArgument(LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT, resultReceiver); - LocaleDialogFragment.LocaleDialogController controller = - new LocaleDialogFragment.LocaleDialogController(mContext, mDialogFragment); - - controller.onClick(null, DialogInterface.BUTTON_NEGATIVE); - - verify(resultReceiver).send(eq(Activity.RESULT_CANCELED), any()); - verify(mFeatureFactory.metricsFeatureProvider).action( - mContext, SettingsEnums.ACTION_CHANGE_LANGUAGE, false); - } - @Test public void getMetricsCategory_systemLocaleChange() { - setArgument(LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT, null); - + setArgument(DIALOG_CONFIRM_SYSTEM_DEFAULT); int result = mDialogFragment.getMetricsCategory(); assertEquals(SettingsEnums.DIALOG_SYSTEM_LOCALE_CHANGE, result); @@ -144,8 +114,7 @@ public class LocaleDialogFragmentTest { @Test public void getMetricsCategory_unavailableLocale() { - setArgument(LocaleDialogFragment.DIALOG_NOT_AVAILABLE_LOCALE, null); - + setArgument(LocaleDialogFragment.DIALOG_NOT_AVAILABLE_LOCALE); int result = mDialogFragment.getMetricsCategory(); assertEquals(SettingsEnums.DIALOG_SYSTEM_LOCALE_UNAVAILABLE, result); From 8e93ac66709d611c8d8a2e5cb7d27fe28849248c Mon Sep 17 00:00:00 2001 From: Chris Antol Date: Fri, 12 May 2023 03:01:24 +0000 Subject: [PATCH 10/20] Remove SPA gating from App Cloning click ingress Bug: 277002988 Test: existing tests. flag on by default, no-op unless disabled, which now has access to this otherwise accessible feature Change-Id: Ic37e4c76d379133f1dbda3c65930ae44afc24f70 --- .../applications/manageapplications/ManageApplications.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index a6e6ac47673..e0f1b5f702d 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -16,8 +16,6 @@ package com.android.settings.applications.manageapplications; -import static android.util.FeatureFlagUtils.SETTINGS_ENABLE_SPA; - import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_DRAGGING; import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE; @@ -67,7 +65,6 @@ import android.provider.DeviceConfig; import android.provider.Settings; import android.text.TextUtils; import android.util.ArraySet; -import android.util.FeatureFlagUtils; import android.util.IconDrawableFactory; import android.util.Log; import android.view.LayoutInflater; @@ -728,9 +725,6 @@ public class ManageApplications extends InstrumentedFragment R.string.long_background_tasks_label); break; case LIST_TYPE_CLONED_APPS: - if (!FeatureFlagUtils.isEnabled(getContext(), SETTINGS_ENABLE_SPA)) { - return; - } int userId = UserHandle.getUserId(mCurrentUid); UserInfo userInfo = mUserManager.getUserInfo(userId); if (userInfo != null && !userInfo.isCloneProfile()) { From 212470d0a69c9cc659e03ae2e7f4270f08158ee0 Mon Sep 17 00:00:00 2001 From: jasonwshsu Date: Thu, 11 May 2023 20:25:10 +0800 Subject: [PATCH 11/20] Move 'Audio Output' to Accessibility hearing device page * Extract the common part into HearingAidHelper. * Remove abstract getHearingDevice(). Change to get the hearing device when needed. * Move several classes from Bluetooth into Accessibility Bug: 281783079 Test: make RunSettingsRoboTests ROBOTEST_FILTER="(HearingDeviceAudioRoutingBasePreferenceControllerTest|AccessibilityHearingAidPreferenceControllerTest|HearingAidHelperTest|HearingAidAudioRoutingPreferenceControllerTest|HearingDeviceCallRoutingPreferenceControllerTest)" Change-Id: I79049107409b7086c6dcc8d48a6323e171ed1535 --- res/values/strings.xml | 4 +- ... accessibility_audio_routing_fragment.xml} | 8 +- res/xml/accessibility_hearing_aids.xml | 9 + res/xml/bluetooth_device_details_fragment.xml | 7 +- .../AccessibilityAudioRoutingFragment.java | 52 ++++++ ...ibilityHearingAidPreferenceController.java | 74 +------- .../AccessibilityHearingAidsFragment.java | 4 +- ...ngAidAudioRoutingPreferenceController.java | 38 ++++ .../accessibility/HearingAidHelper.java | 114 ++++++++++++ ...eAudioRoutingBasePreferenceController.java | 39 ++-- ...DeviceCallRoutingPreferenceController.java | 16 +- ...eviceMediaRoutingPreferenceController.java | 16 +- ...ceRingtoneRoutingPreferenceController.java | 16 +- ...stemSoundsRoutingPreferenceController.java | 16 +- ...luetoothDetailsAudioRoutingController.java | 86 --------- .../BluetoothDetailsAudioRoutingFragment.java | 87 --------- ...etailsHearingDeviceControlsController.java | 3 +- .../BluetoothDeviceDetailsFragment.java | 2 - ...ityHearingAidPreferenceControllerTest.java | 81 ++------- ...dAudioRoutingPreferenceControllerTest.java | 67 +++++++ .../accessibility/HearingAidHelperTest.java | 167 ++++++++++++++++++ ...ioRoutingBasePreferenceControllerTest.java | 65 ++++--- ...ceCallRoutingPreferenceControllerTest.java | 2 +- ...oothDetailsAudioRoutingControllerTest.java | 92 ---------- ...etoothDetailsAudioRoutingFragmentTest.java | 96 ---------- 25 files changed, 542 insertions(+), 619 deletions(-) rename res/xml/{bluetooth_audio_routing_fragment.xml => accessibility_audio_routing_fragment.xml} (85%) create mode 100644 src/com/android/settings/accessibility/AccessibilityAudioRoutingFragment.java create mode 100644 src/com/android/settings/accessibility/HearingAidAudioRoutingPreferenceController.java create mode 100644 src/com/android/settings/accessibility/HearingAidHelper.java rename src/com/android/settings/{bluetooth => accessibility}/HearingDeviceAudioRoutingBasePreferenceController.java (79%) rename src/com/android/settings/{bluetooth => accessibility}/HearingDeviceCallRoutingPreferenceController.java (81%) rename src/com/android/settings/{bluetooth => accessibility}/HearingDeviceMediaRoutingPreferenceController.java (79%) rename src/com/android/settings/{bluetooth => accessibility}/HearingDeviceRingtoneRoutingPreferenceController.java (80%) rename src/com/android/settings/{bluetooth => accessibility}/HearingDeviceSystemSoundsRoutingPreferenceController.java (80%) delete mode 100644 src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingController.java delete mode 100644 src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingFragment.java create mode 100644 tests/robotests/src/com/android/settings/accessibility/HearingAidAudioRoutingPreferenceControllerTest.java create mode 100644 tests/robotests/src/com/android/settings/accessibility/HearingAidHelperTest.java rename tests/robotests/src/com/android/settings/{bluetooth => accessibility}/HearingDeviceAudioRoutingBasePreferenceControllerTest.java (70%) rename tests/robotests/src/com/android/settings/{bluetooth => accessibility}/HearingDeviceCallRoutingPreferenceControllerTest.java (98%) delete mode 100644 tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingControllerTest.java delete mode 100644 tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingFragmentTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index dd9746610ae..fad70361b06 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -129,7 +129,9 @@ For all available hearing devices - Shortcuts & hearing aid compatibility + Hearing device settings + + Audio output, shortcut, hearing aid compatibility For this device diff --git a/res/xml/bluetooth_audio_routing_fragment.xml b/res/xml/accessibility_audio_routing_fragment.xml similarity index 85% rename from res/xml/bluetooth_audio_routing_fragment.xml rename to res/xml/accessibility_audio_routing_fragment.xml index 5edf6cdca41..12e75f22ab1 100644 --- a/res/xml/bluetooth_audio_routing_fragment.xml +++ b/res/xml/accessibility_audio_routing_fragment.xml @@ -31,7 +31,7 @@ android:key="audio_routing_ringtone" android:persistent="false" android:title="@string/bluetooth_ringtone_title" - settings:controller="com.android.settings.bluetooth.HearingDeviceRingtoneRoutingPreferenceController" /> + settings:controller="com.android.settings.accessibility.HearingDeviceRingtoneRoutingPreferenceController" /> + settings:controller="com.android.settings.accessibility.HearingDeviceCallRoutingPreferenceController" /> + settings:controller="com.android.settings.accessibility.HearingDeviceMediaRoutingPreferenceController" /> + settings:controller="com.android.settings.accessibility.HearingDeviceSystemSoundsRoutingPreferenceController" /> + + + - - + android:key="device_controls_general" /> diff --git a/src/com/android/settings/accessibility/AccessibilityAudioRoutingFragment.java b/src/com/android/settings/accessibility/AccessibilityAudioRoutingFragment.java new file mode 100644 index 00000000000..6eb2112d294 --- /dev/null +++ b/src/com/android/settings/accessibility/AccessibilityAudioRoutingFragment.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2023 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.accessibility; + +import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH; + +import android.app.settings.SettingsEnums; + +import com.android.settings.R; +import com.android.settings.dashboard.RestrictedDashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; + +/** Settings fragment containing bluetooth audio routing. */ +public class AccessibilityAudioRoutingFragment extends RestrictedDashboardFragment { + private static final String TAG = "AccessibilityAudioRoutingFragment"; + + public AccessibilityAudioRoutingFragment() { + super(DISALLOW_CONFIG_BLUETOOTH); + } + + @Override + public int getMetricsCategory() { + return SettingsEnums.HEARING_AID_AUDIO_ROUTING; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.accessibility_audio_routing_fragment; + } + + @Override + protected String getLogTag() { + return TAG; + } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.accessibility_audio_routing_fragment); +} diff --git a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java index cd76b47c22b..e4611fe97b3 100644 --- a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java +++ b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java @@ -17,7 +17,6 @@ package com.android.settings.accessibility; import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHapClient; import android.bluetooth.BluetoothHearingAid; import android.bluetooth.BluetoothLeAudio; @@ -41,20 +40,14 @@ import com.android.settings.core.BasePreferenceController; import com.android.settings.core.SubSettingLauncher; import com.android.settingslib.bluetooth.BluetoothCallback; import com.android.settingslib.bluetooth.CachedBluetoothDevice; -import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; -import com.android.settingslib.bluetooth.HapClientProfile; import com.android.settingslib.bluetooth.HearingAidInfo; -import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; -import java.util.ArrayList; -import java.util.List; import java.util.Set; -import java.util.stream.Collectors; /** * Controller that shows and updates the bluetooth device name @@ -73,10 +66,8 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC }; private final LocalBluetoothManager mLocalBluetoothManager; - private final BluetoothAdapter mBluetoothAdapter; private final LocalBluetoothProfileManager mProfileManager; - private final CachedBluetoothDeviceManager mCachedDeviceManager; - + private final HearingAidHelper mHelper; private FragmentManager mFragmentManager; public AccessibilityHearingAidPreferenceController(Context context, String preferenceKey) { @@ -84,8 +75,7 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC mLocalBluetoothManager = com.android.settings.bluetooth.Utils.getLocalBluetoothManager( context); mProfileManager = mLocalBluetoothManager.getProfileManager(); - mCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager(); - mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + mHelper = new HearingAidHelper(context); } @Override @@ -96,7 +86,7 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC @Override public int getAvailabilityStatus() { - return isHearingAidSupported() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return mHelper.isHearingAidSupported() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } @Override @@ -111,7 +101,7 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC // Can't get connected hearing aids when hearing aids related profiles are not ready. The // profiles will be ready after the services are connected. Needs to add listener and // updates the information when all hearing aids related services are connected. - if (isAnyHearingAidRelatedProfilesNotReady()) { + if (!mHelper.isAllHearingAidRelatedProfilesReady()) { mProfileManager.addServiceListener(this); } } @@ -126,7 +116,7 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC @Override public boolean handlePreferenceTreeClick(Preference preference) { if (TextUtils.equals(preference.getKey(), getPreferenceKey())) { - final CachedBluetoothDevice device = getConnectedHearingAidDevice(); + final CachedBluetoothDevice device = mHelper.getConnectedHearingAidDevice(); if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_ACCESSIBILITY_HEARING_AID_PAGE)) { launchHearingAidPage(); @@ -144,10 +134,7 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC @Override public CharSequence getSummary() { - if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { - return mContext.getText(R.string.accessibility_hearingaid_not_connected_summary); - } - final CachedBluetoothDevice device = getConnectedHearingAidDevice(); + final CachedBluetoothDevice device = mHelper.getConnectedHearingAidDevice(); if (device == null) { return mContext.getText(R.string.accessibility_hearingaid_not_connected_summary); } @@ -203,7 +190,7 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC @Override public void onServiceConnected() { - if (!isAnyHearingAidRelatedProfilesNotReady()) { + if (mHelper.isAllHearingAidRelatedProfilesReady()) { updateState(mHearingAidPreference); mProfileManager.removeServiceListener(this); } @@ -218,53 +205,8 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC mFragmentManager = fragmentManager; } - @VisibleForTesting - CachedBluetoothDevice getConnectedHearingAidDevice() { - final List deviceList = getConnectedHearingAidDeviceList(); - return deviceList.isEmpty() ? null : mCachedDeviceManager.findDevice(deviceList.get(0)); - } - private int getConnectedHearingAidDeviceNum() { - return getConnectedHearingAidDeviceList().size(); - } - - private List getConnectedHearingAidDeviceList() { - if (!isHearingAidSupported()) { - return new ArrayList<>(); - } - final List deviceList = new ArrayList<>(); - final HapClientProfile hapClientProfile = mProfileManager.getHapClientProfile(); - if (hapClientProfile != null) { - deviceList.addAll(hapClientProfile.getConnectedDevices()); - } - final HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile(); - if (hearingAidProfile != null) { - deviceList.addAll(hearingAidProfile.getConnectedDevices()); - } - return deviceList.stream() - .distinct() - .filter(d -> !mCachedDeviceManager.isSubDevice(d)).collect(Collectors.toList()); - } - - private boolean isHearingAidSupported() { - if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { - return false; - } - final List supportedList = mBluetoothAdapter.getSupportedProfiles(); - return supportedList.contains(BluetoothProfile.HEARING_AID) - || supportedList.contains(BluetoothProfile.HAP_CLIENT); - } - - private boolean isAnyHearingAidRelatedProfilesNotReady() { - HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile(); - if (hearingAidProfile != null && !hearingAidProfile.isProfileReady()) { - return true; - } - HapClientProfile hapClientProfile = mProfileManager.getHapClientProfile(); - if (hapClientProfile != null && !hapClientProfile.isProfileReady()) { - return true; - } - return false; + return mHelper.getConnectedHearingAidDeviceList().size(); } @VisibleForTesting(otherwise = VisibleForTesting.NONE) diff --git a/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java b/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java index 547c4568991..33fef62f205 100644 --- a/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java @@ -39,7 +39,7 @@ public class AccessibilityHearingAidsFragment extends AccessibilityShortcutPrefe private static final String TAG = "AccessibilityHearingAidsFragment"; private static final String KEY_HEARING_OPTIONS_CATEGORY = "hearing_options_category"; - private static final int FIRST_PREFERENCE_IN_CATEGORY_INDEX = -1; + private static final int SHORTCUT_PREFERENCE_IN_CATEGORY_INDEX = 20; private String mFeatureName; public AccessibilityHearingAidsFragment() { @@ -65,7 +65,7 @@ public class AccessibilityHearingAidsFragment extends AccessibilityShortcutPrefe final View view = super.onCreateView(inflater, container, savedInstanceState); final PreferenceCategory controlCategory = findPreference(KEY_HEARING_OPTIONS_CATEGORY); // To move the shortcut preference under controlCategory need to remove the original added. - mShortcutPreference.setOrder(FIRST_PREFERENCE_IN_CATEGORY_INDEX); + mShortcutPreference.setOrder(SHORTCUT_PREFERENCE_IN_CATEGORY_INDEX); getPreferenceScreen().removePreference(mShortcutPreference); controlCategory.addPreference(mShortcutPreference); return view; diff --git a/src/com/android/settings/accessibility/HearingAidAudioRoutingPreferenceController.java b/src/com/android/settings/accessibility/HearingAidAudioRoutingPreferenceController.java new file mode 100644 index 00000000000..54022ef7f9e --- /dev/null +++ b/src/com/android/settings/accessibility/HearingAidAudioRoutingPreferenceController.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2023 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.accessibility; + +import android.content.Context; +import android.util.FeatureFlagUtils; + +import com.android.settings.core.BasePreferenceController; + +/** + * The controller of the audio routing. + */ +public class HearingAidAudioRoutingPreferenceController extends BasePreferenceController { + public HearingAidAudioRoutingPreferenceController(Context context, + String preferenceKey) { + super(context, preferenceKey); + } + + @Override + public int getAvailabilityStatus() { + return FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_AUDIO_ROUTING) + ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + } +} diff --git a/src/com/android/settings/accessibility/HearingAidHelper.java b/src/com/android/settings/accessibility/HearingAidHelper.java new file mode 100644 index 00000000000..66a37f8dd58 --- /dev/null +++ b/src/com/android/settings/accessibility/HearingAidHelper.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2023 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.accessibility; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothProfile; +import android.content.Context; + +import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; +import com.android.settingslib.bluetooth.HapClientProfile; +import com.android.settingslib.bluetooth.HearingAidProfile; +import com.android.settingslib.bluetooth.LocalBluetoothManager; +import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * A helper class to get and check hearing aids and its status. + */ +public class HearingAidHelper { + + private final BluetoothAdapter mBluetoothAdapter; + private final LocalBluetoothProfileManager mProfileManager; + private final CachedBluetoothDeviceManager mCachedDeviceManager; + + public HearingAidHelper(Context context) { + final LocalBluetoothManager localBluetoothManager = + com.android.settings.bluetooth.Utils.getLocalBluetoothManager(context); + mProfileManager = localBluetoothManager.getProfileManager(); + mCachedDeviceManager = localBluetoothManager.getCachedDeviceManager(); + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + } + + /** + * Gets the connected hearing aids device whose profiles are + * {@link BluetoothProfile#HEARING_AID} or {@link BluetoothProfile#HAP_CLIENT}. + * + * @return a list of hearing aids {@link BluetoothDevice} objects + */ + public List getConnectedHearingAidDeviceList() { + if (!isHearingAidSupported()) { + return new ArrayList<>(); + } + final List deviceList = new ArrayList<>(); + final HapClientProfile hapClientProfile = mProfileManager.getHapClientProfile(); + if (hapClientProfile != null) { + deviceList.addAll(hapClientProfile.getConnectedDevices()); + } + final HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile(); + if (hearingAidProfile != null) { + deviceList.addAll(hearingAidProfile.getConnectedDevices()); + } + return deviceList.stream() + .distinct() + .filter(d -> !mCachedDeviceManager.isSubDevice(d)).collect(Collectors.toList()); + } + + /** + * Gets the first connected hearing aids device. + * + * @return a {@link CachedBluetoothDevice} that is hearing aids device + */ + public CachedBluetoothDevice getConnectedHearingAidDevice() { + final List deviceList = getConnectedHearingAidDeviceList(); + return deviceList.isEmpty() ? null : mCachedDeviceManager.findDevice(deviceList.get(0)); + } + + /** + * Checks if {@link BluetoothProfile#HEARING_AID} or {@link BluetoothProfile#HAP_CLIENT} + * supported. + */ + public boolean isHearingAidSupported() { + if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { + return false; + } + final List supportedList = mBluetoothAdapter.getSupportedProfiles(); + return supportedList.contains(BluetoothProfile.HEARING_AID) + || supportedList.contains(BluetoothProfile.HAP_CLIENT); + } + + /** + * Checks if {@link BluetoothProfile#HEARING_AID} or {@link BluetoothProfile#HAP_CLIENT} + * profiles all ready. + */ + public boolean isAllHearingAidRelatedProfilesReady() { + HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile(); + if (hearingAidProfile != null && !hearingAidProfile.isProfileReady()) { + return false; + } + HapClientProfile hapClientProfile = mProfileManager.getHapClientProfile(); + if (hapClientProfile != null && !hapClientProfile.isProfileReady()) { + return false; + } + return true; + } +} diff --git a/src/com/android/settings/bluetooth/HearingDeviceAudioRoutingBasePreferenceController.java b/src/com/android/settings/accessibility/HearingDeviceAudioRoutingBasePreferenceController.java similarity index 79% rename from src/com/android/settings/bluetooth/HearingDeviceAudioRoutingBasePreferenceController.java rename to src/com/android/settings/accessibility/HearingDeviceAudioRoutingBasePreferenceController.java index e93863ae064..3599f4874c4 100644 --- a/src/com/android/settings/bluetooth/HearingDeviceAudioRoutingBasePreferenceController.java +++ b/src/com/android/settings/accessibility/HearingDeviceAudioRoutingBasePreferenceController.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings.bluetooth; +package com.android.settings.accessibility; import android.content.ContentResolver; import android.content.Context; @@ -47,19 +47,24 @@ public abstract class HearingDeviceAudioRoutingBasePreferenceController extends private static final String TAG = "HARoutingBasePreferenceController"; private static final boolean DEBUG = false; - private final HearingAidAudioRoutingHelper mHelper; + private final HearingAidAudioRoutingHelper mAudioRoutingHelper; + private final HearingAidHelper mHearingAidHelper; public HearingDeviceAudioRoutingBasePreferenceController(Context context, String preferenceKey) { - super(context, preferenceKey); - mHelper = new HearingAidAudioRoutingHelper(context); + this(context, preferenceKey, + new HearingAidAudioRoutingHelper(context), + new HearingAidHelper(context)); } @VisibleForTesting public HearingDeviceAudioRoutingBasePreferenceController(Context context, - String preferenceKey, HearingAidAudioRoutingHelper helper) { + String preferenceKey, HearingAidAudioRoutingHelper audioRoutingHelper, + HearingAidHelper hearingAidHelper) { super(context, preferenceKey); - mHelper = helper; + + mAudioRoutingHelper = audioRoutingHelper; + mHearingAidHelper = hearingAidHelper; } @Override @@ -81,7 +86,11 @@ public abstract class HearingDeviceAudioRoutingBasePreferenceController extends final Integer routingValue = Ints.tryParse((String) newValue); saveRoutingValue(mContext, routingValue); - trySetAudioRoutingConfig(getSupportedAttributeList(), getHearingDevice(), routingValue); + final CachedBluetoothDevice device = mHearingAidHelper.getConnectedHearingAidDevice(); + if (device != null) { + trySetAudioRoutingConfig(getSupportedAttributeList(), + mHearingAidHelper.getConnectedHearingAidDevice(), routingValue); + } return true; } @@ -89,10 +98,10 @@ public abstract class HearingDeviceAudioRoutingBasePreferenceController extends private void trySetAudioRoutingConfig(int[] audioAttributes, CachedBluetoothDevice hearingDevice, @HearingAidAudioRoutingConstants.RoutingValue int routingValue) { - final List supportedStrategies = mHelper.getSupportedStrategies( - audioAttributes); + final List supportedStrategies = + mAudioRoutingHelper.getSupportedStrategies(audioAttributes); final AudioDeviceAttributes hearingDeviceAttributes = - mHelper.getMatchedHearingDeviceAttributes(hearingDevice); + mAudioRoutingHelper.getMatchedHearingDeviceAttributes(hearingDevice); if (hearingDeviceAttributes == null) { if (DEBUG) { Log.d(TAG, @@ -103,8 +112,8 @@ public abstract class HearingDeviceAudioRoutingBasePreferenceController extends return; } - final boolean status = mHelper.setPreferredDeviceRoutingStrategies(supportedStrategies, - hearingDeviceAttributes, routingValue); + final boolean status = mAudioRoutingHelper.setPreferredDeviceRoutingStrategies( + supportedStrategies, hearingDeviceAttributes, routingValue); if (!status) { final List strategiesName = supportedStrategies.stream() @@ -121,12 +130,6 @@ public abstract class HearingDeviceAudioRoutingBasePreferenceController extends */ protected abstract int[] getSupportedAttributeList(); - /** - * Gets the {@link CachedBluetoothDevice} hearing device that is used to configure audio - * routing. - */ - protected abstract CachedBluetoothDevice getHearingDevice(); - /** * Saves the routing value. * diff --git a/src/com/android/settings/bluetooth/HearingDeviceCallRoutingPreferenceController.java b/src/com/android/settings/accessibility/HearingDeviceCallRoutingPreferenceController.java similarity index 81% rename from src/com/android/settings/bluetooth/HearingDeviceCallRoutingPreferenceController.java rename to src/com/android/settings/accessibility/HearingDeviceCallRoutingPreferenceController.java index 4e5e1937b11..8ca266359c2 100644 --- a/src/com/android/settings/bluetooth/HearingDeviceCallRoutingPreferenceController.java +++ b/src/com/android/settings/accessibility/HearingDeviceCallRoutingPreferenceController.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings.bluetooth; +package com.android.settings.accessibility; import android.content.Context; import android.provider.Settings; @@ -35,15 +35,6 @@ public class HearingDeviceCallRoutingPreferenceController extends super(context, preferenceKey); } - /** - * Initializes objects in this controller. Need to call this before using the controller. - * - * @param cachedBluetoothDevice the hearing device to configure audio routing - */ - public void init(CachedBluetoothDevice cachedBluetoothDevice) { - mHearingDevice = cachedBluetoothDevice; - } - @Override public int getAvailabilityStatus() { return Utils.isVoiceCapable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; @@ -54,11 +45,6 @@ public class HearingDeviceCallRoutingPreferenceController extends return HearingAidAudioRoutingConstants.CALL_ROUTING_ATTRIBUTES; } - @Override - protected CachedBluetoothDevice getHearingDevice() { - return mHearingDevice; - } - @Override protected void saveRoutingValue(Context context, int routingValue) { Settings.Secure.putInt(context.getContentResolver(), diff --git a/src/com/android/settings/bluetooth/HearingDeviceMediaRoutingPreferenceController.java b/src/com/android/settings/accessibility/HearingDeviceMediaRoutingPreferenceController.java similarity index 79% rename from src/com/android/settings/bluetooth/HearingDeviceMediaRoutingPreferenceController.java rename to src/com/android/settings/accessibility/HearingDeviceMediaRoutingPreferenceController.java index 1ea36c783e2..cd99ce0c0d0 100644 --- a/src/com/android/settings/bluetooth/HearingDeviceMediaRoutingPreferenceController.java +++ b/src/com/android/settings/accessibility/HearingDeviceMediaRoutingPreferenceController.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings.bluetooth; +package com.android.settings.accessibility; import android.content.Context; import android.provider.Settings; @@ -34,26 +34,12 @@ public class HearingDeviceMediaRoutingPreferenceController extends super(context, preferenceKey); } - /** - * Initializes objects in this controller. Need to call this before using the controller. - * - * @param cachedBluetoothDevice the hearing device to configure audio routing - */ - public void init(CachedBluetoothDevice cachedBluetoothDevice) { - mHearingDevice = cachedBluetoothDevice; - } - @Override protected int[] getSupportedAttributeList() { return HearingAidAudioRoutingConstants.MEDIA_ROUTING_ATTRIBUTES; } - @Override - protected CachedBluetoothDevice getHearingDevice() { - return mHearingDevice; - } - @Override protected void saveRoutingValue(Context context, int routingValue) { Settings.Secure.putInt(context.getContentResolver(), diff --git a/src/com/android/settings/bluetooth/HearingDeviceRingtoneRoutingPreferenceController.java b/src/com/android/settings/accessibility/HearingDeviceRingtoneRoutingPreferenceController.java similarity index 80% rename from src/com/android/settings/bluetooth/HearingDeviceRingtoneRoutingPreferenceController.java rename to src/com/android/settings/accessibility/HearingDeviceRingtoneRoutingPreferenceController.java index 006cb6b217a..3e8f79cec29 100644 --- a/src/com/android/settings/bluetooth/HearingDeviceRingtoneRoutingPreferenceController.java +++ b/src/com/android/settings/accessibility/HearingDeviceRingtoneRoutingPreferenceController.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings.bluetooth; +package com.android.settings.accessibility; import android.content.Context; import android.provider.Settings; @@ -34,26 +34,12 @@ public class HearingDeviceRingtoneRoutingPreferenceController extends super(context, preferenceKey); } - /** - * Initializes objects in this controller. Need to call this before using the controller. - * - * @param cachedBluetoothDevice the hearing device to configure audio routing - */ - public void init(CachedBluetoothDevice cachedBluetoothDevice) { - mHearingDevice = cachedBluetoothDevice; - } - @Override protected int[] getSupportedAttributeList() { return HearingAidAudioRoutingConstants.RINGTONE_ROUTING_ATTRIBUTE; } - @Override - protected CachedBluetoothDevice getHearingDevice() { - return mHearingDevice; - } - @Override protected void saveRoutingValue(Context context, int routingValue) { Settings.Secure.putInt(context.getContentResolver(), diff --git a/src/com/android/settings/bluetooth/HearingDeviceSystemSoundsRoutingPreferenceController.java b/src/com/android/settings/accessibility/HearingDeviceSystemSoundsRoutingPreferenceController.java similarity index 80% rename from src/com/android/settings/bluetooth/HearingDeviceSystemSoundsRoutingPreferenceController.java rename to src/com/android/settings/accessibility/HearingDeviceSystemSoundsRoutingPreferenceController.java index a66cfab93a0..1bc0090c7e9 100644 --- a/src/com/android/settings/bluetooth/HearingDeviceSystemSoundsRoutingPreferenceController.java +++ b/src/com/android/settings/accessibility/HearingDeviceSystemSoundsRoutingPreferenceController.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings.bluetooth; +package com.android.settings.accessibility; import android.content.Context; import android.provider.Settings; @@ -35,26 +35,12 @@ public class HearingDeviceSystemSoundsRoutingPreferenceController extends super(context, preferenceKey); } - /** - * Initializes objects in this controller. Need to call this before using the controller. - * - * @param cachedBluetoothDevice the hearing device to configure audio routing - */ - public void init(CachedBluetoothDevice cachedBluetoothDevice) { - mHearingDevice = cachedBluetoothDevice; - } - @Override protected int[] getSupportedAttributeList() { return HearingAidAudioRoutingConstants.SYSTEM_SOUNDS_ROUTING_ATTRIBUTES; } - @Override - protected CachedBluetoothDevice getHearingDevice() { - return mHearingDevice; - } - @Override protected void saveRoutingValue(Context context, int routingValue) { Settings.Secure.putInt(context.getContentResolver(), diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingController.java b/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingController.java deleted file mode 100644 index 91221a33ba9..00000000000 --- a/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingController.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * 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.bluetooth; - -import static com.android.settings.bluetooth.BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS; - -import android.content.Context; -import android.os.Bundle; -import android.util.FeatureFlagUtils; - -import androidx.annotation.VisibleForTesting; -import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; -import androidx.preference.PreferenceFragmentCompat; -import androidx.preference.PreferenceScreen; - -import com.android.settings.R; -import com.android.settingslib.bluetooth.CachedBluetoothDevice; -import com.android.settingslib.core.lifecycle.Lifecycle; - -/** - * The controller of the audio routing in the bluetooth detail settings. - */ -public class BluetoothDetailsAudioRoutingController extends BluetoothDetailsController { - - private static final String KEY_DEVICE_CONTROLS_SPECIFIC_GROUP = "device_controls_specific"; - @VisibleForTesting - static final String KEY_AUDIO_ROUTING = "audio_routing"; - - public BluetoothDetailsAudioRoutingController(Context context, - PreferenceFragmentCompat fragment, CachedBluetoothDevice device, Lifecycle lifecycle) { - super(context, fragment, device, lifecycle); - } - - @Override - public boolean isAvailable() { - return mCachedDevice.isHearingAidDevice() && FeatureFlagUtils.isEnabled(mContext, - FeatureFlagUtils.SETTINGS_AUDIO_ROUTING); - } - - @Override - protected void init(PreferenceScreen screen) { - if (!mCachedDevice.isHearingAidDevice()) { - return; - } - - final PreferenceCategory prefCategory = screen.findPreference(getPreferenceKey()); - final Preference pref = createAudioRoutingPreference(prefCategory.getContext()); - prefCategory.addPreference(pref); - } - - @Override - protected void refresh() {} - - @Override - public String getPreferenceKey() { - return KEY_DEVICE_CONTROLS_SPECIFIC_GROUP; - } - - private Preference createAudioRoutingPreference(Context context) { - final Preference preference = new Preference(context); - - preference.setKey(KEY_AUDIO_ROUTING); - preference.setTitle(context.getString(R.string.bluetooth_audio_routing_title)); - preference.setSummary(context.getString(R.string.bluetooth_audio_routing_summary)); - final Bundle extras = preference.getExtras(); - extras.putString(KEY_DEVICE_ADDRESS, mCachedDevice.getAddress()); - preference.setFragment(BluetoothDetailsAudioRoutingFragment.class.getName()); - - return preference; - } -} diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingFragment.java b/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingFragment.java deleted file mode 100644 index 6c435a27cd2..00000000000 --- a/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingFragment.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2023 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.bluetooth; - -import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH; - -import static com.android.settings.bluetooth.BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS; - -import android.app.settings.SettingsEnums; -import android.bluetooth.BluetoothDevice; -import android.content.Context; -import android.util.Log; - -import androidx.annotation.VisibleForTesting; - -import com.android.settings.R; -import com.android.settings.dashboard.RestrictedDashboardFragment; -import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settingslib.bluetooth.CachedBluetoothDevice; -import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; -import com.android.settingslib.bluetooth.LocalBluetoothManager; - -/** Settings fragment containing bluetooth audio routing. */ -public class BluetoothDetailsAudioRoutingFragment extends RestrictedDashboardFragment { - - public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider(R.xml.bluetooth_audio_routing_fragment); - private static final String TAG = "BluetoothDetailsAudioRoutingFragment"; - @VisibleForTesting - CachedBluetoothDevice mCachedDevice; - - public BluetoothDetailsAudioRoutingFragment() { - super(DISALLOW_CONFIG_BLUETOOTH); - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - final LocalBluetoothManager localBtMgr = Utils.getLocalBtManager(context); - final CachedBluetoothDeviceManager cachedDeviceMgr = localBtMgr.getCachedDeviceManager(); - final BluetoothDevice bluetoothDevice = localBtMgr.getBluetoothAdapter().getRemoteDevice( - getArguments().getString(KEY_DEVICE_ADDRESS)); - - mCachedDevice = cachedDeviceMgr.findDevice(bluetoothDevice); - if (mCachedDevice == null) { - // Close this page if device is null with invalid device mac address - Log.w(TAG, "onAttach() CachedDevice is null! Can not find address: " - + bluetoothDevice.getAnonymizedAddress()); - finish(); - return; - } - - use(HearingDeviceRingtoneRoutingPreferenceController.class).init(mCachedDevice); - use(HearingDeviceCallRoutingPreferenceController.class).init(mCachedDevice); - use(HearingDeviceMediaRoutingPreferenceController.class).init(mCachedDevice); - use(HearingDeviceSystemSoundsRoutingPreferenceController.class).init(mCachedDevice); - } - - @Override - public int getMetricsCategory() { - return SettingsEnums.BLUETOOTH_AUDIO_ROUTING; - } - - @Override - protected int getPreferenceScreenResId() { - return R.xml.bluetooth_audio_routing_fragment; - } - - @Override - protected String getLogTag() { - return TAG; - } -} diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java index a3b1105015d..c4a422186dd 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java @@ -34,7 +34,7 @@ import com.android.settingslib.core.lifecycle.Lifecycle; import com.google.common.annotations.VisibleForTesting; /** - * The controller of the hearing device controls in the bluetooth detail settings. + * The controller of the hearing device settings to launch Hearing device page. */ public class BluetoothDetailsHearingDeviceControlsController extends BluetoothDetailsController implements Preference.OnPreferenceClickListener { @@ -87,6 +87,7 @@ public class BluetoothDetailsHearingDeviceControlsController extends BluetoothDe final Preference preference = new Preference(context); preference.setKey(KEY_HEARING_DEVICE_CONTROLS); preference.setTitle(context.getString(R.string.bluetooth_device_controls_title)); + preference.setSummary(context.getString(R.string.bluetooth_device_controls_summary)); preference.setOnPreferenceClickListener(this); return preference; diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java index 2a94b1e077e..99f3e3187cb 100644 --- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java +++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java @@ -314,8 +314,6 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment lifecycle)); controllers.add(new BluetoothDetailsHearingDeviceControlsController(context, this, mCachedDevice, lifecycle)); - controllers.add(new BluetoothDetailsAudioRoutingController(context, this, mCachedDevice, - lifecycle)); } return controllers; } diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java index 5ee7ab3d13c..c68e90bdc17 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java @@ -24,25 +24,22 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHapClient; import android.bluetooth.BluetoothHearingAid; import android.bluetooth.BluetoothProfile; import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; -import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.FragmentActivity; import androidx.preference.Preference; +import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; import com.android.settings.bluetooth.Utils; -import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; import com.android.settings.testutils.shadow.ShadowBluetoothUtils; -import com.android.settings.utils.ActivityControllerWrapper; import com.android.settingslib.bluetooth.BluetoothEventManager; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; @@ -55,11 +52,12 @@ import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; import org.junit.After; import org.junit.Before; import org.junit.Ignore; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.robolectric.Robolectric; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import org.robolectric.shadow.api.Shadow; @@ -74,6 +72,9 @@ import java.util.Set; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothUtils.class}) public class AccessibilityHearingAidPreferenceControllerTest { + @Rule + public final MockitoRule mockito = MockitoJUnit.rule(); + private static final String TEST_DEVICE_ADDRESS = "00:A1:A1:A1:A1:A1"; private static final String TEST_DEVICE_ADDRESS_2 = "00:A2:A2:A2:A2:A2"; private static final String TEST_DEVICE_NAME = "TEST_HEARING_AID_BT_DEVICE_NAME"; @@ -82,7 +83,8 @@ public class AccessibilityHearingAidPreferenceControllerTest { private BluetoothAdapter mBluetoothAdapter; private ShadowBluetoothAdapter mShadowBluetoothAdapter; private BluetoothDevice mBluetoothDevice; - private Activity mContext; + private final Context mContext = ApplicationProvider.getApplicationContext(); + private Preference mHearingAidPreference; private AccessibilityHearingAidPreferenceController mPreferenceController; private ShadowApplication mShadowApplication; @@ -106,11 +108,7 @@ public class AccessibilityHearingAidPreferenceControllerTest { @Before public void setUp() { - MockitoAnnotations.initMocks(this); mShadowApplication = ShadowApplication.getInstance(); - - mContext = spy((Activity) ActivityControllerWrapper.setup( - Robolectric.buildActivity(Activity.class)).get()); setupEnvironment(); mHearingAidPreference = new Preference(mContext); @@ -274,65 +272,6 @@ public class AccessibilityHearingAidPreferenceControllerTest { verify(mPreferenceController).launchBluetoothDeviceDetailSetting(mCachedBluetoothDevice); } - @Test - public void onSupportHearingAidProfile_isAvailable() { - mShadowBluetoothAdapter.clearSupportedProfiles(); - mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID); - mPreferenceController = new AccessibilityHearingAidPreferenceController(mContext, - HEARING_AID_PREFERENCE); - mPreferenceController.setPreference(mHearingAidPreference); - - assertThat(mPreferenceController.isAvailable()).isTrue(); - } - - @Test - public void onSupportHapClientProfile_isAvailable() { - mShadowBluetoothAdapter.clearSupportedProfiles(); - mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HAP_CLIENT); - mPreferenceController = new AccessibilityHearingAidPreferenceController(mContext, - HEARING_AID_PREFERENCE); - mPreferenceController.setPreference(mHearingAidPreference); - - assertThat(mPreferenceController.isAvailable()).isTrue(); - } - - @Test - public void onNotSupportAnyHearingAidRelatedProfile_isNotAvailable() { - mShadowBluetoothAdapter.clearSupportedProfiles(); - mPreferenceController = new AccessibilityHearingAidPreferenceController(mContext, - HEARING_AID_PREFERENCE); - mPreferenceController.setPreference(mHearingAidPreference); - - assertThat(mPreferenceController.isAvailable()).isFalse(); - } - - @Test - public void getConnectedHearingAidDevice_doNotReturnSubDevice() { - when(mHearingAidProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList()); - when(mLocalBluetoothManager.getCachedDeviceManager().isSubDevice(mBluetoothDevice)) - .thenReturn(true); - - assertThat(mPreferenceController.getConnectedHearingAidDevice()).isNull(); - } - - @Test - @Config(shadows = ShadowAlertDialogCompat.class) - public void onActiveDeviceChanged_hearingAidProfile_launchHearingAidPairingDialog() { - final FragmentActivity mActivity = Robolectric.setupActivity(FragmentActivity.class); - when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); - when(mCachedBluetoothDevice.getDeviceMode()).thenReturn( - HearingAidInfo.DeviceMode.MODE_BINAURAL); - when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( - HearingAidInfo.DeviceSide.SIDE_LEFT); - mPreferenceController.setFragmentManager(mActivity.getSupportFragmentManager()); - - mPreferenceController.onActiveDeviceChanged(mCachedBluetoothDevice, - BluetoothProfile.HEARING_AID); - - final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); - assertThat(dialog.isShowing()).isTrue(); - } - @Test public void onServiceConnected_onHearingAidProfileConnected_updateSummary() { when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidAudioRoutingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidAudioRoutingPreferenceControllerTest.java new file mode 100644 index 00000000000..d16bc4351c3 --- /dev/null +++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidAudioRoutingPreferenceControllerTest.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2023 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.accessibility; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.util.FeatureFlagUtils; + +import androidx.test.core.app.ApplicationProvider; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link HearingAidAudioRoutingPreferenceController}. */ +@RunWith(RobolectricTestRunner.class) +public class HearingAidAudioRoutingPreferenceControllerTest { + @Rule + public final MockitoRule mockito = MockitoJUnit.rule(); + + private final Context mContext = ApplicationProvider.getApplicationContext(); + + private HearingAidAudioRoutingPreferenceController mController; + + @Before + public void setUp() { + mController = new HearingAidAudioRoutingPreferenceController(mContext, "test_key"); + } + + @Test + public void getAvailabilityStatus_audioRoutingNotSupported_returnUnsupported() { + FeatureFlagUtils.setEnabled(mContext, + FeatureFlagUtils.SETTINGS_AUDIO_ROUTING, false); + + assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); + } + + @Test + public void getAvailabilityStatus_audioRoutingNotSupported_available() { + FeatureFlagUtils.setEnabled(mContext, + FeatureFlagUtils.SETTINGS_AUDIO_ROUTING, true); + + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } +} diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidHelperTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidHelperTest.java new file mode 100644 index 00000000000..194b766dd75 --- /dev/null +++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidHelperTest.java @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2023 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.accessibility; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.when; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothProfile; +import android.content.Context; + +import androidx.test.core.app.ApplicationProvider; + +import com.android.settings.bluetooth.Utils; +import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; +import com.android.settings.testutils.shadow.ShadowBluetoothUtils; +import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; +import com.android.settingslib.bluetooth.HapClientProfile; +import com.android.settingslib.bluetooth.HearingAidProfile; +import com.android.settingslib.bluetooth.LocalBluetoothManager; +import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; +import org.robolectric.shadow.api.Shadow; + +import java.util.ArrayList; +import java.util.Collections; + +/** Tests for {@link HearingAidHelper}. */ +@RunWith(RobolectricTestRunner.class) +@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothUtils.class}) +public class HearingAidHelperTest { + @Rule + public final MockitoRule mockito = MockitoJUnit.rule(); + private final Context mContext = ApplicationProvider.getApplicationContext(); + private static final String TEST_DEVICE_ADDRESS = "00:A1:A1:A1:A1:A1"; + + @Mock + private LocalBluetoothManager mLocalBluetoothManager; + @Mock + private LocalBluetoothProfileManager mLocalBluetoothProfileManager; + @Mock + private CachedBluetoothDeviceManager mCachedDeviceManager; + @Mock + private CachedBluetoothDevice mCachedBluetoothDevice; + @Mock + private HearingAidProfile mHearingAidProfile; + @Mock + private HapClientProfile mHapClientProfile; + private ShadowBluetoothAdapter mShadowBluetoothAdapter; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothDevice; + private HearingAidHelper mHelper; + + @Before + public void setUp() { + ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager; + mLocalBluetoothManager = Utils.getLocalBtManager(mContext); + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + mShadowBluetoothAdapter = Shadow.extract(mBluetoothAdapter); + mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS); + when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_DEVICE_ADDRESS); + when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager); + when(mCachedDeviceManager.findDevice(mBluetoothDevice)).thenReturn(mCachedBluetoothDevice); + when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager); + when(mLocalBluetoothProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile); + when(mLocalBluetoothProfileManager.getHapClientProfile()).thenReturn(mHapClientProfile); + + mHelper = new HearingAidHelper(mContext); + } + + @Test + public void isHearingAidSupported_supported_returnTrue() { + mBluetoothAdapter.enable(); + mShadowBluetoothAdapter.clearSupportedProfiles(); + mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID); + + assertThat(mHelper.isHearingAidSupported()).isTrue(); + } + + @Test + public void isHearingAidSupported_bluetoothOff_returnFalse() { + mShadowBluetoothAdapter.clearSupportedProfiles(); + mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID); + mBluetoothAdapter.disable(); + + assertThat(mHelper.isHearingAidSupported()).isFalse(); + } + + + @Test + public void isAllHearingAidRelatedProfilesReady_allReady_returnTrue() { + when(mHearingAidProfile.isProfileReady()).thenReturn(true); + when(mHapClientProfile.isProfileReady()).thenReturn(true); + + assertThat(mHelper.isAllHearingAidRelatedProfilesReady()).isTrue(); + } + + @Test + public void isAllHearingAidRelatedProfilesReady_notFullReady_returnFalse() { + when(mHearingAidProfile.isProfileReady()).thenReturn(false); + when(mHapClientProfile.isProfileReady()).thenReturn(true); + + assertThat(mHelper.isAllHearingAidRelatedProfilesReady()).isFalse(); + } + + @Test + public void getConnectedHearingAidDeviceList_oneDeviceAdded_getOneDevice() { + mBluetoothAdapter.enable(); + mShadowBluetoothAdapter.clearSupportedProfiles(); + mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID); + when(mHearingAidProfile.getConnectedDevices()).thenReturn(new ArrayList<>( + Collections.singletonList(mBluetoothDevice))); + + assertThat(mHelper.getConnectedHearingAidDeviceList().size()).isEqualTo(1); + } + + @Test + public void getConnectedHearingAidDeviceList_oneSubDeviceAdded_getZeroDevice() { + mBluetoothAdapter.enable(); + mShadowBluetoothAdapter.clearSupportedProfiles(); + mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID); + when(mHearingAidProfile.getConnectedDevices()).thenReturn(new ArrayList<>( + Collections.singletonList(mBluetoothDevice))); + when(mLocalBluetoothManager.getCachedDeviceManager().isSubDevice( + mBluetoothDevice)).thenReturn(true); + + assertThat(mHelper.getConnectedHearingAidDeviceList().size()).isEqualTo(0); + } + + @Test + public void getConnectedHearingAidDevice_getExpectedCachedBluetoothDevice() { + mBluetoothAdapter.enable(); + mShadowBluetoothAdapter.clearSupportedProfiles(); + mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID); + when(mHearingAidProfile.getConnectedDevices()).thenReturn(new ArrayList<>( + Collections.singletonList(mBluetoothDevice))); + + assertThat(mHelper.getConnectedHearingAidDevice()).isEqualTo(mCachedBluetoothDevice); + assertThat(mCachedBluetoothDevice.getAddress()).isEqualTo(mBluetoothDevice.getAddress()); + } +} diff --git a/tests/robotests/src/com/android/settings/bluetooth/HearingDeviceAudioRoutingBasePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingDeviceAudioRoutingBasePreferenceControllerTest.java similarity index 70% rename from tests/robotests/src/com/android/settings/bluetooth/HearingDeviceAudioRoutingBasePreferenceControllerTest.java rename to tests/robotests/src/com/android/settings/accessibility/HearingDeviceAudioRoutingBasePreferenceControllerTest.java index 105da6546ad..4decf68d68c 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/HearingDeviceAudioRoutingBasePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/HearingDeviceAudioRoutingBasePreferenceControllerTest.java @@ -14,13 +14,14 @@ * limitations under the License. */ -package com.android.settings.bluetooth; +package com.android.settings.accessibility; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -37,9 +38,15 @@ import androidx.preference.ListPreference; import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; +import com.android.settings.bluetooth.Utils; +import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; +import com.android.settings.testutils.shadow.ShadowBluetoothUtils; import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; import com.android.settingslib.bluetooth.HearingAidAudioRoutingConstants; import com.android.settingslib.bluetooth.HearingAidAudioRoutingHelper; +import com.android.settingslib.bluetooth.LocalBluetoothManager; +import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; import org.junit.Before; import org.junit.Rule; @@ -50,11 +57,13 @@ import org.mockito.Spy; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; import java.util.List; /** Tests for {@link HearingDeviceAudioRoutingBasePreferenceController}. */ @RunWith(RobolectricTestRunner.class) +@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothUtils.class}) public class HearingDeviceAudioRoutingBasePreferenceControllerTest { @Rule @@ -63,8 +72,14 @@ public class HearingDeviceAudioRoutingBasePreferenceControllerTest { @Spy private final Context mContext = ApplicationProvider.getApplicationContext(); private static final String TEST_DEVICE_ADDRESS = "00:A1:A1:A1:A1:A1"; - private static final String FAKE_KEY = "fake_key"; + private final ListPreference mListPreference = new ListPreference(mContext); + @Mock + private LocalBluetoothManager mLocalBluetoothManager; + @Mock + private LocalBluetoothProfileManager mLocalBluetoothProfileManager; + @Mock + private CachedBluetoothDeviceManager mCachedDeviceManager; @Mock private AudioProductStrategy mAudioProductStrategyMedia; @Mock @@ -72,8 +87,10 @@ public class HearingDeviceAudioRoutingBasePreferenceControllerTest { @Mock private BluetoothDevice mBluetoothDevice; @Spy - private HearingAidAudioRoutingHelper mHelper = new HearingAidAudioRoutingHelper(mContext); - private final ListPreference mListPreference = new ListPreference(mContext); + private HearingAidAudioRoutingHelper mAudioRoutingHelper = + new HearingAidAudioRoutingHelper(mContext); + @Mock + private HearingAidHelper mHearingAidHelper; private TestHearingDeviceAudioRoutingBasePreferenceController mController; @Before @@ -83,19 +100,23 @@ public class HearingDeviceAudioRoutingBasePreferenceControllerTest { AudioDeviceInfo.TYPE_HEARING_AID, TEST_DEVICE_ADDRESS); + ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager; + mLocalBluetoothManager = Utils.getLocalBtManager(mContext); + when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager); + when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager); when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice); when(mBluetoothDevice.getAnonymizedAddress()).thenReturn(TEST_DEVICE_ADDRESS); when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_DEVICE_ADDRESS); - when(mHelper.getMatchedHearingDeviceAttributes(any())).thenReturn(hearingDeviceAttribute); + doReturn(hearingDeviceAttribute).when( + mAudioRoutingHelper).getMatchedHearingDeviceAttributes(any()); when(mAudioProductStrategyMedia.getAudioAttributesForLegacyStreamType( - AudioManager.STREAM_MUSIC)) - .thenReturn((new AudioAttributes.Builder()).build()); - when(mHelper.getAudioProductStrategies()).thenReturn(List.of(mAudioProductStrategyMedia)); + AudioManager.STREAM_MUSIC)).thenReturn((new AudioAttributes.Builder()).build()); + when(mAudioRoutingHelper.getAudioProductStrategies()).thenReturn( + List.of(mAudioProductStrategyMedia)); - mController = new TestHearingDeviceAudioRoutingBasePreferenceController(mContext, FAKE_KEY, - mHelper); - TestHearingDeviceAudioRoutingBasePreferenceController.setupForTesting( - mCachedBluetoothDevice); + mController = new TestHearingDeviceAudioRoutingBasePreferenceController(mContext, + "test_key", + mAudioRoutingHelper, mHearingAidHelper); mListPreference.setEntries(R.array.bluetooth_audio_routing_titles); mListPreference.setEntryValues(R.array.bluetooth_audio_routing_values); mListPreference.setSummary("%s"); @@ -122,20 +143,21 @@ public class HearingDeviceAudioRoutingBasePreferenceControllerTest { @Test public void onPreferenceChange_noMatchedDeviceAttributes_notCallSetStrategies() { - when(mHelper.getMatchedHearingDeviceAttributes(any())).thenReturn(null); + when(mAudioRoutingHelper.getMatchedHearingDeviceAttributes(any())).thenReturn(null); - verify(mHelper, never()).setPreferredDeviceRoutingStrategies(any(), isNull(), anyInt()); + verify(mAudioRoutingHelper, never()).setPreferredDeviceRoutingStrategies(any(), isNull(), + anyInt()); } private static class TestHearingDeviceAudioRoutingBasePreferenceController extends HearingDeviceAudioRoutingBasePreferenceController { - private static CachedBluetoothDevice sCachedBluetoothDevice; private static int sSavedRoutingValue; TestHearingDeviceAudioRoutingBasePreferenceController(Context context, - String preferenceKey, HearingAidAudioRoutingHelper helper) { - super(context, preferenceKey, helper); + String preferenceKey, HearingAidAudioRoutingHelper audioRoutingHelper, + HearingAidHelper hearingAidHelper) { + super(context, preferenceKey, audioRoutingHelper, hearingAidHelper); } @Override @@ -143,11 +165,6 @@ public class HearingDeviceAudioRoutingBasePreferenceControllerTest { return new int[]{AudioAttributes.USAGE_MEDIA}; } - @Override - protected CachedBluetoothDevice getHearingDevice() { - return sCachedBluetoothDevice; - } - @Override protected void saveRoutingValue(Context context, int routingValue) { sSavedRoutingValue = routingValue; @@ -157,9 +174,5 @@ public class HearingDeviceAudioRoutingBasePreferenceControllerTest { protected int restoreRoutingValue(Context context) { return sSavedRoutingValue; } - - public static void setupForTesting(CachedBluetoothDevice cachedBluetoothDevice) { - sCachedBluetoothDevice = cachedBluetoothDevice; - } } } diff --git a/tests/robotests/src/com/android/settings/bluetooth/HearingDeviceCallRoutingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingDeviceCallRoutingPreferenceControllerTest.java similarity index 98% rename from tests/robotests/src/com/android/settings/bluetooth/HearingDeviceCallRoutingPreferenceControllerTest.java rename to tests/robotests/src/com/android/settings/accessibility/HearingDeviceCallRoutingPreferenceControllerTest.java index dec4cc4bb01..8eed2940984 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/HearingDeviceCallRoutingPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/HearingDeviceCallRoutingPreferenceControllerTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings.bluetooth; +package com.android.settings.accessibility; import static com.android.settings.core.BasePreferenceController.AVAILABLE; import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingControllerTest.java deleted file mode 100644 index ea65856de61..00000000000 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingControllerTest.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * 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.bluetooth; - -import static com.android.settings.bluetooth.BluetoothDetailsAudioRoutingController.KEY_AUDIO_ROUTING; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.when; - -import android.util.FeatureFlagUtils; - -import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; -import org.robolectric.RobolectricTestRunner; - -/** Tests for {@link BluetoothDetailsAudioRoutingController}. */ -@RunWith(RobolectricTestRunner.class) -public class BluetoothDetailsAudioRoutingControllerTest extends - BluetoothDetailsControllerTestBase { - @Rule - public final MockitoRule mockito = MockitoJUnit.rule(); - - private static final String TEST_ADDRESS = "55:66:77:88:99:AA"; - - private BluetoothDetailsAudioRoutingController mController; - - @Override - public void setUp() { - super.setUp(); - - mController = new BluetoothDetailsAudioRoutingController(mContext, mFragment, mCachedDevice, - mLifecycle); - final PreferenceCategory preferenceCategory = new PreferenceCategory(mContext); - preferenceCategory.setKey(mController.getPreferenceKey()); - mScreen.addPreference(preferenceCategory); - } - - @Test - public void isAvailable_isHearingAidDevice_available() { - FeatureFlagUtils.setEnabled(mContext, - FeatureFlagUtils.SETTINGS_AUDIO_ROUTING, true); - when(mCachedDevice.isHearingAidDevice()).thenReturn(true); - - assertThat(mController.isAvailable()).isTrue(); - } - - @Test - public void isAvailable_isNotHearingAidDevice_notAvailable() { - FeatureFlagUtils.setEnabled(mContext, - FeatureFlagUtils.SETTINGS_AUDIO_ROUTING, true); - when(mCachedDevice.isHearingAidDevice()).thenReturn(false); - - assertThat(mController.isAvailable()).isFalse(); - } - - @Test - public void init_isHearingAidDevice_expectedAudioRoutingPreference() { - when(mCachedDevice.isHearingAidDevice()).thenReturn(true); - when(mCachedDevice.getAddress()).thenReturn(TEST_ADDRESS); - - mController.init(mScreen); - final Preference preference = mScreen.findPreference(KEY_AUDIO_ROUTING); - final String address = preference.getExtras().getString( - BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS); - final String fragment = preference.getFragment(); - - assertThat(address).isEqualTo(TEST_ADDRESS); - assertThat(fragment).isEqualTo(BluetoothDetailsAudioRoutingFragment.class.getName()); - - } -} diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingFragmentTest.java deleted file mode 100644 index 9bd4f1b8d84..00000000000 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioRoutingFragmentTest.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2023 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.bluetooth; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.when; - -import android.bluetooth.BluetoothDevice; -import android.content.Context; -import android.os.Bundle; - -import androidx.test.core.app.ApplicationProvider; - -import com.android.settings.testutils.shadow.ShadowBluetoothUtils; -import com.android.settingslib.bluetooth.CachedBluetoothDevice; -import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; -import com.android.settingslib.bluetooth.LocalBluetoothAdapter; -import com.android.settingslib.bluetooth.LocalBluetoothManager; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; - -/** Tests for {@link BluetoothDetailsAudioRoutingFragment}. */ -@RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowBluetoothUtils.class}) -public class BluetoothDetailsAudioRoutingFragmentTest { - - @Rule - public MockitoRule mMockitoRule = MockitoJUnit.rule(); - - private static final String TEST_ADDRESS = "55:66:77:88:99:AA"; - - private final Context mContext = ApplicationProvider.getApplicationContext(); - - private BluetoothDetailsAudioRoutingFragment mFragment; - @Mock - private LocalBluetoothManager mLocalBluetoothManager; - @Mock - private CachedBluetoothDeviceManager mCachedDeviceManager; - @Mock - private LocalBluetoothAdapter mLocalBluetoothAdapter; - @Mock - private BluetoothDevice mBluetoothDevice; - @Mock - private CachedBluetoothDevice mCachedDevice; - - @Before - public void setUp() { - setupEnvironment(); - - when(mLocalBluetoothAdapter.getRemoteDevice(TEST_ADDRESS)).thenReturn(mBluetoothDevice); - when(mCachedDevice.getAddress()).thenReturn(TEST_ADDRESS); - when(mCachedDeviceManager.findDevice(mBluetoothDevice)).thenReturn(mCachedDevice); - - mFragment = new BluetoothDetailsAudioRoutingFragment(); - } - - @Test - public void onAttach_setArgumentsWithAddress_expectedCachedDeviceWithAddress() { - final Bundle args = new Bundle(); - args.putString(BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS, TEST_ADDRESS); - mFragment.setArguments(args); - - mFragment.onAttach(mContext); - - assertThat(mFragment.mCachedDevice.getAddress()).isEqualTo(TEST_ADDRESS); - } - - private void setupEnvironment() { - ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager; - when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager); - when(mLocalBluetoothManager.getBluetoothAdapter()).thenReturn(mLocalBluetoothAdapter); - } -} From 0faf38eadd1a124e7d91e46d8c1c5f3df78692ca Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Fri, 12 May 2023 17:18:37 +0800 Subject: [PATCH 12/20] The UI does not remove the preference The LE audio structure have two or more devices, it use CSIP to combine them with the groupId. It breaks the UI structure, since the UI use the map to save relationship between the bluetoothDevice and preference. There are two or more devices using the same UI, it causes UI show the wrong preference when CSIP do switching of device. Remove the unuse device when UI refreshing. Bug: 281697186 Test: Build pass Test: make RunSettingsRoboTests ROBOTEST_FILTER=AvailableMediaDeviceGroupControllerTest Change-Id: I798cf9edb590c4a25273913d2f2faf0ed4364ba9 --- .../bluetooth/BluetoothDeviceUpdater.java | 51 +++++++++++++++---- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java index 17c5f36d5c6..2935c6779dc 100644 --- a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java @@ -35,8 +35,10 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -125,7 +127,7 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback, update(cachedBluetoothDevice); } } else { - removeAllDevicesFromPreference(); + removeAllDevicesFromPreference(); } } @@ -252,7 +254,7 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback, btPreference.setOnGearClickListener(mDeviceProfilesListener); if (this instanceof Preference.OnPreferenceClickListener) { btPreference.setOnPreferenceClickListener( - (Preference.OnPreferenceClickListener)this); + (Preference.OnPreferenceClickListener) this); } mPreferenceMap.put(device, btPreference); mDevicePreferenceCallback.onDeviceAdded(btPreference); @@ -266,17 +268,20 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback, final BluetoothDevice device = cachedDevice.getDevice(); final CachedBluetoothDevice subCachedDevice = cachedDevice.getSubDevice(); if (mPreferenceMap.containsKey(device)) { - mDevicePreferenceCallback.onDeviceRemoved(mPreferenceMap.get(device)); - mPreferenceMap.remove(device); + removePreference(device); } else if (subCachedDevice != null) { // When doing remove, to check if preference maps to sub device. // This would happen when connection state is changed in detail page that there is no // callback from SettingsLib. final BluetoothDevice subDevice = subCachedDevice.getDevice(); - if (mPreferenceMap.containsKey(subDevice)) { - mDevicePreferenceCallback.onDeviceRemoved(mPreferenceMap.get(subDevice)); - mPreferenceMap.remove(subDevice); - } + removePreference(subDevice); + } + } + + private void removePreference(BluetoothDevice device) { + if (mPreferenceMap.containsKey(device)) { + mDevicePreferenceCallback.onDeviceRemoved(mPreferenceMap.get(device)); + mPreferenceMap.remove(device); } } @@ -324,14 +329,38 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback, * Update the attributes of {@link Preference}. */ public void refreshPreference() { - for (Preference preference : mPreferenceMap.values()) { - ((BluetoothDevicePreference) preference).onPreferenceAttributesChanged(); + List removeList = new ArrayList<>(); + mPreferenceMap.forEach((key, preference) -> { + if (isDeviceOfMapInCachedDevicesList(key)) { + ((BluetoothDevicePreference) preference).onPreferenceAttributesChanged(); + } else { + // If the BluetoothDevice of preference is not in the CachedDevices List, then + // remove this preference. + removeList.add(key); + } + }); + + for (BluetoothDevice bluetoothDevice : removeList) { + Log.d(getLogTag(), "removePreference key: " + bluetoothDevice.getAnonymizedAddress()); + removePreference(bluetoothDevice); } } - protected boolean isDeviceInCachedDevicesList(CachedBluetoothDevice cachedDevice){ + protected boolean isDeviceInCachedDevicesList(CachedBluetoothDevice cachedDevice) { return mLocalManager.getCachedDeviceManager().getCachedDevicesCopy().contains(cachedDevice); } + + private boolean isDeviceOfMapInCachedDevicesList(BluetoothDevice inputBluetoothDevice) { + Collection cachedDevices = + mLocalManager.getCachedDeviceManager().getCachedDevicesCopy(); + if (cachedDevices == null || cachedDevices.isEmpty()) { + return false; + } + return cachedDevices.stream() + .anyMatch(cachedBluetoothDevice -> cachedBluetoothDevice.getDevice() != null + && cachedBluetoothDevice.getDevice().equals(inputBluetoothDevice)); + } + protected String getLogTag() { return TAG; } From 3988d11dddec8126c60b4e5a12950915bdc83647 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Fri, 12 May 2023 16:25:27 +0800 Subject: [PATCH 13/20] Fix Bluetooth tethering toggle status The mBluetoothPan is updated async, toggle status is set before data loaded. Refresh the status after load to fix this issue. Fix: 272525310 Test: Manually when Bluetooth tethering is on Change-Id: Ia306f3648ba8d32a63a8ec6c72260f7f43b830bc --- src/com/android/settings/network/tether/TetherSettings.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/network/tether/TetherSettings.java b/src/com/android/settings/network/tether/TetherSettings.java index ba19d1c129b..9fa8730cf10 100644 --- a/src/com/android/settings/network/tether/TetherSettings.java +++ b/src/com/android/settings/network/tether/TetherSettings.java @@ -171,6 +171,8 @@ public class TetherSettings extends RestrictedSettingsFragment return; } + setupTetherPreference(); + final Activity activity = getActivity(); BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); if (adapter != null) { @@ -184,7 +186,6 @@ public class TetherSettings extends RestrictedSettingsFragment new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)); } - setupTetherPreference(); setTopIntroPreferenceTitle(); mDataSaverBackend.addListener(this); @@ -605,6 +606,7 @@ public class TetherSettings extends RestrictedSettingsFragment public void onServiceConnected(int profile, BluetoothProfile proxy) { if (mBluetoothPan.get() == null) { mBluetoothPan.set((BluetoothPan) proxy); + updateBluetoothState(); } } From 77deb463a0bed6f5cf784d16acb35767028c6b5c Mon Sep 17 00:00:00 2001 From: Wesley Wang Date: Fri, 12 May 2023 17:40:05 +0800 Subject: [PATCH 14/20] Update battery settings remaining time format - Update the remaining time format to align with status bar - Remove unused test case since no more less than 7 or 15 remaining time case for battery settings screenshots: https://screenshot.googleplex.com/8jPYPj7yznGFU4b.png https://screenshot.googleplex.com/5GYXA2tusSUVmVQ.png https://screenshot.googleplex.com/3EnB3ejAxAzP28q.png https://screenshot.googleplex.com/5jeUxwBEyHotf9d.png Bug: 281685505 Test: make SettingsLibRoboTests Change-Id: If33e1828582845f78d8ef666c2b74ab5bba22357 --- .../settings/fuelgauge/BatteryInfo.java | 13 ++---- .../settings/fuelgauge/BatteryInfoTest.java | 40 ------------------- 2 files changed, 3 insertions(+), 50 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java index 98240447aeb..300db23007c 100644 --- a/src/com/android/settings/fuelgauge/BatteryInfo.java +++ b/src/com/android/settings/fuelgauge/BatteryInfo.java @@ -322,18 +322,11 @@ public class BatteryInfo { final long drainTimeUs = PowerUtil.convertMsToUs(estimate.getEstimateMillis()); if (drainTimeUs > 0) { info.remainingTimeUs = drainTimeUs; - info.remainingLabel = PowerUtil.getBatteryRemainingStringFormatted( + info.remainingLabel = PowerUtil.getBatteryRemainingShortStringFormatted( context, - PowerUtil.convertUsToMs(drainTimeUs), - null /* percentageString */, - false /* basedOnUsage */ - ); - info.chargeLabel = PowerUtil.getBatteryRemainingStringFormatted( - context, - PowerUtil.convertUsToMs(drainTimeUs), - info.batteryPercentString, - estimate.isBasedOnUsage() && !shortString + PowerUtil.convertUsToMs(drainTimeUs) ); + info.chargeLabel = info.remainingLabel; info.suggestionLabel = PowerUtil.getBatteryTipStringFormatted( context, PowerUtil.convertUsToMs(drainTimeUs)); } else { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java index eb4b598823f..ded108cfc89 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java @@ -43,7 +43,6 @@ import com.android.internal.os.BatteryStatsHistoryIterator; import com.android.settings.testutils.BatteryTestUtils; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.widget.UsageView; -import com.android.settingslib.R; import com.android.settingslib.fuelgauge.Estimate; import org.junit.Before; @@ -163,26 +162,6 @@ public class BatteryInfoTest { assertThat(info2.suggestionLabel).contains(BATTERY_RUN_OUT_PREFIX); } - @Test - public void testGetBatteryInfo_basedOnUsageTrueLessThanSevenMinutes_usesCorrectString() { - Estimate estimate = new Estimate(Duration.ofMinutes(7).toMillis(), - true /* isBasedOnUsage */, - 1000 /* averageDischargeTime */); - BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast, - mBatteryUsageStats, estimate, SystemClock.elapsedRealtime() * 1000, - false /* shortString */); - BatteryInfo info2 = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast, - mBatteryUsageStats, estimate, SystemClock.elapsedRealtime() * 1000, - true /* shortString */); - - // These should be identical in either case - assertThat(info.remainingLabel.toString()).isEqualTo( - mContext.getString(R.string.power_remaining_duration_only_shutdown_imminent)); - assertThat(info2.remainingLabel.toString()).isEqualTo( - mContext.getString(R.string.power_remaining_duration_only_shutdown_imminent)); - assertThat(info2.suggestionLabel).contains(BATTERY_RUN_OUT_PREFIX); - } - @Test @Ignore public void getBatteryInfo_MoreThanOneDay_suggestionLabelIsCorrectString() { @@ -196,25 +175,6 @@ public class BatteryInfoTest { assertThat(info.suggestionLabel).doesNotContain(BATTERY_RUN_OUT_PREFIX); } - @Test - public void - testGetBatteryInfo_basedOnUsageTrueBetweenSevenAndFifteenMinutes_usesCorrectString() { - Estimate estimate = new Estimate(Duration.ofMinutes(10).toMillis(), - true /* isBasedOnUsage */, - 1000 /* averageDischargeTime */); - BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast, - mBatteryUsageStats, estimate, SystemClock.elapsedRealtime() * 1000, - false /* shortString */); - - // Check that strings are showing less than 15 minutes remaining regardless of exact time. - assertThat(info.chargeLabel.toString()).isEqualTo( - mContext.getString(R.string.power_remaining_less_than_duration, - FIFTEEN_MIN_FORMATTED, TEST_BATTERY_LEVEL_10)); - assertThat(info.remainingLabel.toString()).isEqualTo( - mContext.getString(R.string.power_remaining_less_than_duration_only, - FIFTEEN_MIN_FORMATTED)); - } - @Test public void testGetBatteryInfo_basedOnUsageFalse_usesDefaultString() { BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast, From 6968e32ed9489215b8aab081b7439eb545ff21f3 Mon Sep 17 00:00:00 2001 From: Avinash Vadlamudi Date: Fri, 12 May 2023 12:18:03 +0000 Subject: [PATCH 15/20] [Auto Pin Confirmation]: Fix the color token for the checkbox fill icon Bug: 281946128 Test: Manual test by flashing and testing on device Change-Id: I182e530bc39620582a0c228ab3d5934638474da2 --- res/drawable/ic_check_circle_filled_24dp.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/drawable/ic_check_circle_filled_24dp.xml b/res/drawable/ic_check_circle_filled_24dp.xml index 9d2e296ef2f..507bf678ae2 100644 --- a/res/drawable/ic_check_circle_filled_24dp.xml +++ b/res/drawable/ic_check_circle_filled_24dp.xml @@ -20,7 +20,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" - android:tint="?androidprv:attr/materialColorPrimaryContainer"> + android:tint="?android:attr/colorPrimary"> From 852404809408afedf88ebe99541da9e91e3dfe1c Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Wed, 10 May 2023 17:07:15 +0800 Subject: [PATCH 16/20] Improve Settings launch performance for normal phones 1. Initialize ActivitEmbedding component only if necessary 2. Early return to avoid executing long execution time operations ex: initialize ActivityEmbedding component, feature flag operations Test: manual - launch settings and profile Test: run v2/android-crystalball-eng/health/microbench/startup/firstparty/open-settings on affacted devices Test: atest SettingsHomepageActivityTest TopLevelWallpaperPreferenceControllerTest DashboardFeatureProviderImplTest TopLevelSettingsTest TopLevelWallpaperPreferenceControllerTest SearchResultTrampolineTest Test: atest CtsSettingsTestCases Fixes: 281505190 Change-Id: I0c1a1dc50f26c4ded02de82190dd7aad59c20c01 --- .../android/settings/SettingsApplication.java | 5 +-- .../ActivityEmbeddingUtils.java | 33 +++++++++++-------- .../homepage/SettingsHomepageActivity.java | 14 ++++---- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java index 7d8055d6337..8c050ea2b55 100644 --- a/src/com/android/settings/SettingsApplication.java +++ b/src/com/android/settings/SettingsApplication.java @@ -51,8 +51,9 @@ public class SettingsApplication extends Application { // Set Spa environment. setSpaEnvironment(); - if (FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN) - && ActivityEmbeddingUtils.isSettingsSplitEnabled(this)) { + if (ActivityEmbeddingUtils.isSettingsSplitEnabled(this) + && FeatureFlagUtils.isEnabled(this, + FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN)) { if (WizardManagerHelper.isUserSetupComplete(this)) { new ActivityEmbeddingRulesController(this).initRules(); } else { diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java index ae890f87632..67d56e0393a 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java @@ -97,16 +97,24 @@ public class ActivityEmbeddingUtils { * */ public static boolean isEmbeddingActivityEnabled(Context context) { - boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context, - FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN); - boolean isSettingsSplitSupported = isSettingsSplitEnabled(context); - boolean isUserSetupComplete = WizardManagerHelper.isUserSetupComplete(context); - - Log.d(TAG, "isFlagEnabled = " + isFlagEnabled); - Log.d(TAG, "isSettingsSplitSupported = " + isSettingsSplitSupported); - Log.d(TAG, "isUserSetupComplete = " + isUserSetupComplete); - - return isFlagEnabled && isSettingsSplitSupported && isUserSetupComplete; + // Activity Embedding feature is not enabled if Settings doesn't enable large screen + // optimization or the device is not supported. + if (!isSettingsSplitEnabled(context)) { + Log.d(TAG, "isSettingsSplitSupported = false"); + return false; + } + // Activity Embedding feature is not enabled if a user chooses to disable the feature. + if (!FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN)) { + Log.d(TAG, "isFlagEnabled = false"); + return false; + } + // Don't enable Activity embedding for setup wizard. + if (!WizardManagerHelper.isUserSetupComplete(context)) { + Log.d(TAG, "isUserSetupComplete = false"); + return false; + } + Log.d(TAG, "isEmbeddingActivityEnabled = true"); + return true; } /** Whether to show the regular or simplified homepage layout. */ @@ -120,8 +128,7 @@ public class ActivityEmbeddingUtils { * Check if activity is already embedded */ public static boolean isAlreadyEmbedded(Activity activity) { - return ActivityEmbeddingController - .getInstance(activity) - .isActivityEmbedded(activity); + return isEmbeddingActivityEnabled(activity) && ActivityEmbeddingController.getInstance( + activity).isActivityEmbedded(activity); } } diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index 03bc1b32fb2..829a89c6f03 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -57,7 +57,6 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; -import androidx.window.embedding.ActivityEmbeddingController; import androidx.window.embedding.SplitRule; import com.android.settings.R; @@ -108,7 +107,6 @@ public class SettingsHomepageActivity extends FragmentActivity implements private View mTwoPaneSuggestionView; private CategoryMixin mCategoryMixin; private Set mLoadedListeners; - private ActivityEmbeddingController mActivityEmbeddingController; private boolean mIsEmbeddingActivityEnabled; private boolean mIsTwoPane; // A regular layout shows icons on homepage, whereas a simplified layout doesn't. @@ -200,8 +198,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements setupEdgeToEdge(); setContentView(R.layout.settings_homepage_container); - mActivityEmbeddingController = ActivityEmbeddingController.getInstance(this); - mIsTwoPane = mActivityEmbeddingController.isActivityEmbedded(this); + mIsTwoPane = ActivityEmbeddingUtils.isAlreadyEmbedded(this); updateAppBarMinHeight(); initHomepageContainer(); @@ -242,7 +239,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements // Settings app may be launched on an existing task. Reset SplitPairRule of SubSettings here // to prevent SplitPairRule of an existing task applied on a new started Settings app. - if (ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this) + if (mIsEmbeddingActivityEnabled && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { initSplitPairRules(); } @@ -284,7 +281,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); - final boolean newTwoPaneState = mActivityEmbeddingController.isActivityEmbedded(this); + final boolean newTwoPaneState = ActivityEmbeddingUtils.isAlreadyEmbedded(this); if (mIsTwoPane != newTwoPaneState) { mIsTwoPane = newTwoPaneState; updateHomepageAppBar(); @@ -427,8 +424,9 @@ public class SettingsHomepageActivity extends FragmentActivity implements } private boolean shouldLaunchDeepLinkIntentToRight() { - if (!FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN) - || !ActivityEmbeddingUtils.isSettingsSplitEnabled(this)) { + if (!ActivityEmbeddingUtils.isSettingsSplitEnabled(this) + || !FeatureFlagUtils.isEnabled(this, + FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN)) { return false; } From baeca6fb534a66e5e0878eb0e7a1569cbdb7cba1 Mon Sep 17 00:00:00 2001 From: Peter Zhang Date: Mon, 8 May 2023 16:59:01 +0200 Subject: [PATCH 17/20] Add the support of preference group / category to the Settings Tile API Test: robotest, manual Bug: 281517110 Change-Id: Ie36b0b3eb8ed80766efa050f1f0aee1f784a5949 --- .../settings/dashboard/DashboardFragment.java | 41 +++++++++---- .../dashboard/DashboardFragmentTest.java | 57 +++++++++++++++++++ 2 files changed, 86 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index f928d863858..dc4d5992b86 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -31,6 +31,7 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.LifecycleObserver; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; @@ -46,7 +47,6 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.PrimarySwitchPreference; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; -import com.android.settingslib.drawer.ActivityTile; import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.Tile; import com.android.settingslib.search.Indexable; @@ -55,6 +55,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Objects; @@ -504,6 +505,10 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment // Install dashboard tiles and collect pending observers. final boolean forceRoundedIcons = shouldForceRoundedIcon(); final List pendingObservers = new ArrayList<>(); + + // Move group tiles to the beginning of the list to ensure they are created before the + // other tiles. + tiles.sort(Comparator.comparingInt(tile -> tile.getType() == Tile.Type.GROUP ? 0 : 1)); for (Tile tile : tiles) { final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile); if (TextUtils.isEmpty(key)) { @@ -526,7 +531,14 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment observers = mDashboardFeatureProvider.bindPreferenceToTileAndGetObservers( getActivity(), this, forceRoundedIcons, pref, tile, key, mPlaceholderPreferenceController.getOrder()); - screen.addPreference(pref); + if (tile.hasGroupKey() && mDashboardTilePrefKeys.containsKey(tile.getGroupKey())) { + final Preference group = screen.findPreference(tile.getGroupKey()); + if (group instanceof PreferenceCategory) { + ((PreferenceCategory) group).addPreference(pref); + } + } else { + screen.addPreference(pref); + } registerDynamicDataObservers(observers); mDashboardTilePrefKeys.put(key, observers); } @@ -569,16 +581,21 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment } protected Preference createPreference(Tile tile) { - if (tile.hasSwitch()) { - return (tile instanceof ActivityTile || tile.hasPendingIntent()) - ? new PrimarySwitchPreference(getPrefContext()) - : new SwitchPreference(getPrefContext()); - } else if (tile.hasPendingIntent()) { - Preference preference = new Preference(getPrefContext()); - preference.setWidgetLayoutResource(R.layout.preference_external_action_icon); - return preference; - } else { - return new Preference(getPrefContext()); + switch (tile.getType()) { + case EXTERNAL_ACTION: + Preference externalActionPreference = new Preference(getPrefContext()); + externalActionPreference + .setWidgetLayoutResource(R.layout.preference_external_action_icon); + return externalActionPreference; + case SWITCH: + return new SwitchPreference(getPrefContext()); + case SWITCH_WITH_ACTION: + return new PrimarySwitchPreference(getPrefContext()); + case GROUP: + return new PreferenceCategory((getPrefContext())); + case ACTION: + default: + return new Preference(getPrefContext()); } } diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java index ae1997b380b..febc865136c 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java @@ -16,7 +16,9 @@ package com.android.settings.dashboard; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.DASHBOARD_CONTAINER; +import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_GROUP_KEY; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; +import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_PENDING_INTENT; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SWITCH_URI; import static com.google.common.truth.Truth.assertThat; @@ -43,6 +45,7 @@ import android.os.UserHandle; import android.preference.PreferenceManager.OnActivityResultListener; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; @@ -60,6 +63,7 @@ import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin; import com.android.settingslib.drawer.ActivityTile; import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.ProviderTile; +import com.android.settingslib.drawer.Tile; import org.junit.Before; import org.junit.Ignore; @@ -180,6 +184,43 @@ public class DashboardFragmentTest { verify(mTestFragment.mScreen, times(2)).addPreference(nullable(Preference.class)); } + @Test + public void displayTilesAsPreference_withGroup_shouldAddTilesIntoGroup() { + final ProviderInfo providerInfo = new ProviderInfo(); + providerInfo.packageName = "pkg"; + providerInfo.name = "provider"; + providerInfo.authority = "authority"; + final Bundle groupTileMetaData = new Bundle(); + groupTileMetaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_group_key"); + ProviderTile groupTile = new ProviderTile(providerInfo, mDashboardCategory.key, + groupTileMetaData); + mDashboardCategory.addTile(groupTile); + + final Bundle subTileMetaData = new Bundle(); + subTileMetaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_key3"); + subTileMetaData.putString(META_DATA_PREFERENCE_GROUP_KEY, "injected_tile_group_key"); + subTileMetaData.putParcelable( + META_DATA_PREFERENCE_PENDING_INTENT, + PendingIntent.getActivity(mContext, 0, new Intent(), 0)); + ProviderTile subTile = new ProviderTile(providerInfo, mDashboardCategory.key, + subTileMetaData); + mDashboardCategory.addTile(subTile); + + PreferenceCategory groupPreference = mock(PreferenceCategory.class); + when(mFakeFeatureFactory.dashboardFeatureProvider + .getTilesForCategory(nullable(String.class))) + .thenReturn(mDashboardCategory); + when(mFakeFeatureFactory.dashboardFeatureProvider + .getDashboardKeyForTile(any(Tile.class))) + .then(invocation -> ((Tile) invocation.getArgument(0)).getKey(mContext)); + when(mTestFragment.mScreen.findPreference("injected_tile_group_key")) + .thenReturn(groupPreference); + mTestFragment.onCreatePreferences(new Bundle(), "rootKey"); + + verify(mTestFragment.mScreen, times(3)).addPreference(nullable(Preference.class)); + verify(groupPreference).addPreference(nullable(Preference.class)); + } + @Test public void displayTilesAsPreference_shouldNotAddTilesWithoutIntent() { mTestFragment.onCreatePreferences(new Bundle(), "rootKey"); @@ -405,6 +446,22 @@ public class DashboardFragmentTest { assertThat(pref).isInstanceOf(PrimarySwitchPreference.class); } + @Test + public void createPreference_isGroupTile_returnPreferenceCategory() { + final ProviderInfo providerInfo = new ProviderInfo(); + providerInfo.packageName = "pkg"; + providerInfo.name = "provider"; + providerInfo.authority = "authority"; + final Bundle metaData = new Bundle(); + metaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_key2"); + ProviderTile providerTile = + new ProviderTile(providerInfo, mDashboardCategory.key, metaData); + + final Preference pref = mTestFragment.createPreference(providerTile); + + assertThat(pref).isInstanceOf(PreferenceCategory.class); + } + @Test public void onActivityResult_test() { final int requestCode = 10; From f6a267bd3605a7a42a90263e37a8a237cc656177 Mon Sep 17 00:00:00 2001 From: Peter Zhang Date: Wed, 10 May 2023 16:01:58 +0200 Subject: [PATCH 18/20] Add logging when a group tile with PreferenceCategory widget is added to the screen Test: robotest, manual Bug: 281517110 Change-Id: I4de1938bdeea003c70e5c554e988a97b762f7f81 --- .../settings/dashboard/DashboardFragment.java | 6 ++++++ .../settings/dashboard/DashboardFragmentTest.java | 12 +++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index dc4d5992b86..f8a5d76b6fa 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -592,6 +592,12 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment case SWITCH_WITH_ACTION: return new PrimarySwitchPreference(getPrefContext()); case GROUP: + mMetricsFeatureProvider.action( + mMetricsFeatureProvider.getAttribution(getActivity()), + SettingsEnums.ACTION_SETTINGS_GROUP_TILE_ADDED_TO_SCREEN, + getMetricsCategory(), + tile.getKey(getContext()), + /* value= */ 0); return new PreferenceCategory((getPrefContext())); case ACTION: default: diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java index febc865136c..ecaf36fa161 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java @@ -447,7 +447,7 @@ public class DashboardFragmentTest { } @Test - public void createPreference_isGroupTile_returnPreferenceCategory() { + public void createPreference_isGroupTile_returnPreferenceCategory_logTileAdded() { final ProviderInfo providerInfo = new ProviderInfo(); providerInfo.packageName = "pkg"; providerInfo.name = "provider"; @@ -456,10 +456,20 @@ public class DashboardFragmentTest { metaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_key2"); ProviderTile providerTile = new ProviderTile(providerInfo, mDashboardCategory.key, metaData); + MetricsFeatureProvider metricsFeatureProvider = + mFakeFeatureFactory.getMetricsFeatureProvider(); + when(metricsFeatureProvider.getAttribution(any())).thenReturn(123); final Preference pref = mTestFragment.createPreference(providerTile); assertThat(pref).isInstanceOf(PreferenceCategory.class); + verify(metricsFeatureProvider) + .action( + 123, + SettingsEnums.ACTION_SETTINGS_GROUP_TILE_ADDED_TO_SCREEN, + mTestFragment.getMetricsCategory(), + "injected_tile_key2", + 0); } @Test From 0aa67ede68d72d3ce9d2608e16eee207212221f7 Mon Sep 17 00:00:00 2001 From: Roy Chou Date: Fri, 12 May 2023 03:32:34 +0000 Subject: [PATCH 19/20] chore(#AlwaysOnMagnification): hardcode the feature flag default true Set the feature flag getter default return value to be true to rollout to public. We keep the checking code so that it's still remote controllable. Bug: 281788002 Test: manually test with adb command Change-Id: Ie7f32721cf99d8a97c11f0f9c6d0d466c083d668 --- ...oggleScreenMagnificationPreferenceFragment.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java index 201172575ed..12706712427 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java @@ -249,12 +249,18 @@ public class ToggleScreenMagnificationPreferenceFragment extends super.onProcessArguments(arguments); } - private void addAlwaysOnSetting(PreferenceCategory generalCategory) { - if (!DeviceConfig.getBoolean( + private boolean isAlwaysOnSettingEnabled() { + final boolean defaultValue = getContext().getResources().getBoolean( + com.android.internal.R.bool.config_magnification_always_on_enabled); + + return DeviceConfig.getBoolean( DeviceConfig.NAMESPACE_WINDOW_MANAGER, "AlwaysOnMagnifier__enable_always_on_magnifier", - false - )) { + defaultValue + ); + } + private void addAlwaysOnSetting(PreferenceCategory generalCategory) { + if (!isAlwaysOnSettingEnabled()) { return; } From 400e5491a391c0ee7418cac09d94cfd9e42814e0 Mon Sep 17 00:00:00 2001 From: Becca Hughes Date: Fri, 12 May 2023 16:33:55 +0000 Subject: [PATCH 20/20] Add extra null checks Test: ondevice Bug: 281047738 Change-Id: I07ced78af5da086433aa4288949673161bfe4f20 --- .../credentials/CombinedProviderInfo.java | 38 ++++++++++++------- .../DefaultCombinedPreferenceController.java | 11 ++++-- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/applications/credentials/CombinedProviderInfo.java b/src/com/android/settings/applications/credentials/CombinedProviderInfo.java index 1fd30758cc4..074fb7b31c2 100644 --- a/src/com/android/settings/applications/credentials/CombinedProviderInfo.java +++ b/src/com/android/settings/applications/credentials/CombinedProviderInfo.java @@ -51,7 +51,7 @@ public final class CombinedProviderInfo { @Nullable List cpis, @Nullable AutofillServiceInfo asi, boolean isDefaultAutofillProvider, - boolean IsPrimaryCredmanProvider) { + boolean isPrimaryCredmanProvider) { if (cpis == null) { mCredentialProviderInfos = new ArrayList<>(); } else { @@ -59,11 +59,11 @@ public final class CombinedProviderInfo { } mAutofillServiceInfo = asi; mIsDefaultAutofillProvider = isDefaultAutofillProvider; - mIsPrimaryCredmanProvider = IsPrimaryCredmanProvider; + mIsPrimaryCredmanProvider = isPrimaryCredmanProvider; } /** Returns the credential provider info. */ - @Nullable + @NonNull public List getCredentialProviderInfos() { return mCredentialProviderInfos; } @@ -85,11 +85,13 @@ public final class CombinedProviderInfo { /** Returns the app icon. */ @Nullable public Drawable getAppIcon(@NonNull Context context, int userId) { - IconDrawableFactory factory = IconDrawableFactory.newInstance(context); + final IconDrawableFactory factory = IconDrawableFactory.newInstance(context); + final ServiceInfo brandingService = getBrandingService(); + final ApplicationInfo appInfo = getApplicationInfo(); + Drawable icon = null; - ServiceInfo brandingService = getBrandingService(); - if (brandingService != null) { - icon = factory.getBadgedIcon(brandingService, getApplicationInfo(), userId); + if (brandingService != null && appInfo != null) { + icon = factory.getBadgedIcon(brandingService, appInfo, userId); } // If the branding service gave us a icon then use that. @@ -98,7 +100,10 @@ public final class CombinedProviderInfo { } // Otherwise fallback to the app icon and then the package name. - return factory.getBadgedIcon(getApplicationInfo(), userId); + if (appInfo != null) { + return factory.getBadgedIcon(appInfo, userId); + } + return null; } /** Returns the app name. */ @@ -116,11 +121,14 @@ public final class CombinedProviderInfo { } // Otherwise fallback to the app label and then the package name. - name = getApplicationInfo().loadLabel(context.getPackageManager()); - if (TextUtils.isEmpty(name)) { - name = getApplicationInfo().packageName; + final ApplicationInfo appInfo = getApplicationInfo(); + if (appInfo != null) { + name = appInfo.loadLabel(context.getPackageManager()); + if (TextUtils.isEmpty(name)) { + return appInfo.packageName; + } } - return name; + return ""; } /** Gets the service to use for branding (name, icons). */ @@ -245,8 +253,10 @@ public final class CombinedProviderInfo { // Now go through and build the joint datasets. List cmpi = new ArrayList<>(); for (String packageName : packageNames) { - List asi = autofillServices.get(packageName); - List cpi = credmanServices.get(packageName); + List asi = + autofillServices.getOrDefault(packageName, new ArrayList<>()); + List cpi = + credmanServices.getOrDefault(packageName, new ArrayList<>()); // If there are multiple autofill services then pick the first one. AutofillServiceInfo selectedAsi = null; diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java index 742faf1758e..59c33b2c8ea 100644 --- a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java +++ b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java @@ -35,6 +35,7 @@ import android.view.autofill.AutofillManager; import com.android.settings.applications.defaultapps.DefaultAppPreferenceController; import com.android.settingslib.applications.DefaultAppInfo; +import java.util.ArrayList; import java.util.List; public class DefaultCombinedPreferenceController extends DefaultAppPreferenceController { @@ -110,15 +111,19 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon private List getAllProviders(int userId) { final List autofillProviders = AutofillServiceInfo.getAvailableServices(mContext, userId); - final List credManProviders = - mCredentialManager.getCredentialProviderServices( - userId, CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY); final String selectedAutofillProvider = Settings.Secure.getStringForUser( mContext.getContentResolver(), DefaultCombinedPicker.AUTOFILL_SETTING, userId); + final List credManProviders = new ArrayList<>(); + if (mCredentialManager != null) { + credManProviders.addAll( + mCredentialManager.getCredentialProviderServices( + userId, CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY)); + } + return CombinedProviderInfo.buildMergedList( autofillProviders, credManProviders, selectedAutofillProvider); }