From da2e2c3e4a42a8bc057348581a78205348539c9c Mon Sep 17 00:00:00 2001 From: Sal Savage Date: Wed, 10 Jul 2024 15:50:11 -0700 Subject: [PATCH 01/19] Clean up BT stack log level preference controller and tests Problem: These tests were failing because the resource ID used in the test and its version of the R class resolved to a different integer (and subsequently a different string array) than the R class used on device. This was causing different string arrays with different lengths and values to sometimes appear, especially when the source and tests were builts separately. Solution: Manually lookup the resource ID to use by name instead of using the pre-baked R class and assuming its ID is correct. This allows us to get the proper ID every time and trust the values in the array. This trust allows for some clean up on the code and tests, such that now our tests can iterate on values instead of relying on private constants being made visible or even hardcoded values. Flag: EXEMPT, test fix and minor refactor with no behavior change Bug: 339148064 Test: atest com.android.settings.development.bluetooth.BluetoothStackLogPreferenceControllerTest Change-Id: I8149bd06ed70589afb3797a9f453eb2a11c3c410 --- ...BluetoothStackLogPreferenceController.java | 193 ++++++++++++---- ...toothStackLogPreferenceControllerTest.java | 210 ++++++++---------- 2 files changed, 237 insertions(+), 166 deletions(-) diff --git a/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceController.java b/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceController.java index 23d4cc64efa..9f7512c45c9 100644 --- a/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceController.java +++ b/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceController.java @@ -30,85 +30,184 @@ import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.development.DeveloperOptionsPreferenceController; +/** + * This preference represents the default log level for the Bluetooth stack + * + * The default log level is captured and held in an Android Log Framework log tag, using "bluetooth" + * as the tag name. The Log framework does not provide methods to directly write a log tag value, + * but instead leverages special system properties to hold the value of a log tag. + * + * This preferences aims to keep the selection in sync with the currently set log tag value. It + * writes directly to the system properties that hold the level associated with the bluetooth log + * tag. It leverages the Log.isLoggable("bluetooth", level) function to discern the current value. + * The default level is INFO. + * + * This value is read once at start of the Bluetooth stack. To use a new value once setting it, be + * sure to turn Bluetooth off and back on again. + */ public class BluetoothStackLogPreferenceController extends DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { + private static final String TAG = BluetoothStackLogPreferenceController.class.getSimpleName(); + + private static final String PREFERENCE_KEY = "bt_stack_log_level"; /* Ensure that the indexes match with bt_stack_log_values and bt_stack_log_entries ordering */ - private static final String PREFERENCE_KEY = "bt_stack_log_level"; - @VisibleForTesting static final int BTSTACK_LOG_MODE_VERBOSE_INDEX = 0; - @VisibleForTesting static final int BTSTACK_LOG_MODE_DEBUG_INDEX = 1; - @VisibleForTesting static final int BTSTACK_LOG_MODE_INFO_INDEX = 2; - @VisibleForTesting static final int BTSTACK_LOG_MODE_WARN_INDEX = 3; - @VisibleForTesting static final int BTSTACK_LOG_MODE_ERROR_INDEX = 4; + private static final int BT_LOG_LEVEL_VERBOSE_INDEX = 0; + private static final int BT_LOG_LEVEL_DEBUG_INDEX = 1; + private static final int BT_LOG_LEVEL_INFO_INDEX = 2; + private static final int BT_LOG_LEVEL_WARN_INDEX = 3; + private static final int BT_LOG_LEVEL_ERROR_INDEX = 4; + @VisibleForTesting static final int BT_LOG_LEVEL_DEFAULT_INDEX = BT_LOG_LEVEL_INFO_INDEX; - @VisibleForTesting - static final String BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST = "persist.log.tag.bluetooth"; - static final String BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY = "log.tag.bluetooth"; - static final String BLUETOOTH_STRING_NAME = "bluetooth"; - static final int DEFAULT_MODE = BTSTACK_LOG_MODE_INFO_INDEX; - - private final String[] mListValues; - private final String[] mListEntries; + private static final String BT_LOG_TAG = "bluetooth"; + @VisibleForTesting static final String BT_LOG_LEVEL_PROP_PERSIST = "persist.log.tag.bluetooth"; + @VisibleForTesting static final String BT_LOG_LEVEL_PROP = "log.tag.bluetooth"; + // Values represents the untranslatable log level strings that should be used for writing to + // system properties. Entries represents the translatable log level strings that should be used + // in the UI to communicate to the user their options for this preference. + private String[] mListValues; + private String[] mListEntries; + /** + * Create a BluetoothStackLogPreferenceController instance + */ public BluetoothStackLogPreferenceController(@NonNull Context context) { super(context); mListValues = context.getResources().getStringArray(R.array.bt_stack_log_level_values); mListEntries = context.getResources().getStringArray(R.array.bt_stack_log_level_entries); } - /** returns default log level index of INFO */ - public int getDefaultModeIndex() { - return DEFAULT_MODE; - } - + /** + * Returns the preference key associated with this preference + * + * Note that this key is _usually_ a system property in and of itself, which is expected to hold + * the value of the preference. In this case though, this key *does not* hold the preference. It + * is only really used to tie this controller to the list preference defined in the XML file. + * + * @return the preference key associated with this preference + */ @Override @Nullable public String getPreferenceKey() { return PREFERENCE_KEY; } + /** + * Update the state of the preference based on what the user has selected + * + * This function is invoked when the user has selected a new value for this preference. The new + * value is the entry value at the index of the list the user has selected. This value will be + * one of the values from the array returned in getEntryValues(). Specifically, this array is + * set using R.array.bt_stack_log_level_values + * + * @param preference - the preference object to set the value of + * @param newValue - the value the user has selected, as an Object + * @return True when updated successfully + */ @Override public boolean onPreferenceChange(@NonNull Preference preference, @NonNull Object newValue) { - SystemProperties.set(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST, newValue.toString()); - SystemProperties.set(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY, newValue.toString()); - updateState(mPreference); + Log.v(TAG, "onPreferenceChange(pref=" + preference + "value=" + newValue.toString() + ")"); + setBluetoothLogTag(newValue.toString()); + setBluetoothLogLevelIndex(getBluetoothLogLevelIndex()); return true; } + /** + * Refresh the state of this preference based on the state stored on the system + * + * Read the Bluetooth stack log level from the underlying system property/log tag, and map that + * level to the proper index in the values and entries array. Use those strings to set the value + * and summary of the preference. + * + * @param preference - the preference object to refresh the state of + */ @Override public void updateState(@NonNull Preference preference) { - final ListPreference listPreference = (ListPreference) preference; - int index = getBluetoothLogLevelIndex(); - listPreference.setValue(mListValues[index]); - listPreference.setSummary(mListEntries[index]); + Log.v(TAG, "updateState(pref=" + preference + "): refresh preference state"); + setBluetoothLogLevelIndex(getBluetoothLogLevelIndex()); } /** - * Returns the current log level from Log.isLoggable(). + * Notify this developer options preference of a change to developer options visibility + * + * We developer options are closed, we should clear out the value of this developer option + * preference and revert it back to the default state of INFO. */ - @VisibleForTesting - public int getBluetoothLogLevelIndex() { - if (Log.isLoggable(BLUETOOTH_STRING_NAME, Log.VERBOSE)) { - return BTSTACK_LOG_MODE_VERBOSE_INDEX; - } else if (Log.isLoggable(BLUETOOTH_STRING_NAME, Log.DEBUG)) { - return BTSTACK_LOG_MODE_DEBUG_INDEX; - } else if (Log.isLoggable(BLUETOOTH_STRING_NAME, Log.INFO)) { - return BTSTACK_LOG_MODE_INFO_INDEX; - } else if (Log.isLoggable(BLUETOOTH_STRING_NAME, Log.WARN)) { - return BTSTACK_LOG_MODE_WARN_INDEX; - } else if (Log.isLoggable(BLUETOOTH_STRING_NAME, Log.ERROR)) { - return BTSTACK_LOG_MODE_ERROR_INDEX; - } - return BTSTACK_LOG_MODE_INFO_INDEX; - } - @Override protected void onDeveloperOptionsSwitchDisabled() { super.onDeveloperOptionsSwitchDisabled(); - SystemProperties.set(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST, null); - SystemProperties.set(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY, null); - ((ListPreference) mPreference).setValue(mListValues[getDefaultModeIndex()]); - ((ListPreference) mPreference).setSummary(mListEntries[getDefaultModeIndex()]); + Log.v(TAG, "onDeveloperOptionsSwitchDisabled(): Revert stack log to default"); + setBluetoothLogTag(null); + setBluetoothLogLevelIndex(BT_LOG_LEVEL_DEFAULT_INDEX); + } + + /** + * Set the system property values used by the Log framework to read the "bluetooth" log tag + * + * @param logLevel - the log level to set the Bluetooth stack minimum log level to + */ + private void setBluetoothLogTag(@Nullable String logLevel) { + Log.i(TAG, "setBluetoothLogTag(logLevel=" + logLevel + "): Set properties for log tag"); + SystemProperties.set(BT_LOG_LEVEL_PROP_PERSIST, logLevel); + SystemProperties.set(BT_LOG_LEVEL_PROP, logLevel); + } + + /** + * Get the entry and value index corresponding to the current Bluetooth stack log level + * + * Since this preference uses an actual log tag and not a specific/private system property, we + * can read the value using the Log.isLoggable() function with our "bluetooth" log tag that + * represents the log level of the Bluetooth stack. This is safer than trying to replacate the + * logic used in the Log framework around the various persist, ro, and blank variants of the tag + * + * If no value is present, INFO is used. + * + * @return the entry/value index corresponding to the current log level of the tag "bluetooth" + */ + @VisibleForTesting + public int getBluetoothLogLevelIndex() { + int level = BT_LOG_LEVEL_DEFAULT_INDEX; + if (Log.isLoggable(BT_LOG_TAG, Log.VERBOSE)) { + level = BT_LOG_LEVEL_VERBOSE_INDEX; + } else if (Log.isLoggable(BT_LOG_TAG, Log.DEBUG)) { + level = BT_LOG_LEVEL_DEBUG_INDEX; + } else if (Log.isLoggable(BT_LOG_TAG, Log.INFO)) { + level = BT_LOG_LEVEL_INFO_INDEX; + } else if (Log.isLoggable(BT_LOG_TAG, Log.WARN)) { + level = BT_LOG_LEVEL_WARN_INDEX; + } else if (Log.isLoggable(BT_LOG_TAG, Log.ERROR)) { + level = BT_LOG_LEVEL_ERROR_INDEX; + } + Log.v(TAG, "getBluetoothLogLevelIndex() -> " + level); + return level; + } + + /** + * Set the current Bluetooth stack log level displayed in the list for this preference + * + * @param index - the index representing the log level choice of this preference + */ + private void setBluetoothLogLevelIndex(int index) { + if (index < BT_LOG_LEVEL_VERBOSE_INDEX || index > BT_LOG_LEVEL_ERROR_INDEX) { + Log.e(TAG, "setBluetoothLogLevelIndex(index=" + index + "): Log level invalid"); + return; + } + + String value = mListValues[index]; + String entryValue = mListEntries[index]; + + ListPreference preference = ((ListPreference) mPreference); + if (preference == null) { + Log.e(TAG, "setBluetoothLogLevelIndex(index=" + index + "): mPreference is null"); + return; + } + + preference.setValue(value); + preference.setSummary(entryValue); + + Log.i(TAG, "setBluetoothLogLevelIndex(index=" + index + + "): Updated Bluetooth stack log level to value='" + value + "', entryValue='" + + entryValue + "'"); } } diff --git a/tests/unit/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceControllerTest.java index ab1f46926fa..2aa10bba45f 100644 --- a/tests/unit/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceControllerTest.java @@ -16,13 +16,9 @@ package com.android.settings.development.bluetooth; -import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY; -import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST; -import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BTSTACK_LOG_MODE_VERBOSE_INDEX; -import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BTSTACK_LOG_MODE_DEBUG_INDEX; -import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BTSTACK_LOG_MODE_INFO_INDEX; -import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BTSTACK_LOG_MODE_WARN_INDEX; -import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BTSTACK_LOG_MODE_ERROR_INDEX; +import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BT_LOG_LEVEL_DEFAULT_INDEX; +import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BT_LOG_LEVEL_PROP; +import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BT_LOG_LEVEL_PROP_PERSIST; import static com.google.common.truth.Truth.assertThat; @@ -37,18 +33,21 @@ import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) -@Ignore("b/339148064") public class BluetoothStackLogPreferenceControllerTest { - private static final String TAG = "BluetoothStackLogPreferenceControllerTest"; + private static final String COM_ANDROID_SETTINGS = "com.android.settings"; + private static final String TYPE_ARRAY = "array"; - @Mock private Context mContext; + private static final String XML_DEFINED_PREFERENCE_KEY = "bt_stack_log_level"; + private static final String XML_DEFINED_ENTRIES_RESOURCE = "bt_stack_log_level_entries"; + private static final String XML_DEFINED_VALUES_RESOURCE = "bt_stack_log_level_values"; + + private static final String PROPERTY_CLEARED = ""; + + private Context mContext; private ListPreference mPreference; private PreferenceManager mPreferenceManager; @@ -61,7 +60,6 @@ public class BluetoothStackLogPreferenceControllerTest { @Before public void setup() { - MockitoAnnotations.initMocks(this); mContext = ApplicationProvider.getApplicationContext(); if (Looper.myLooper() == null) { @@ -71,12 +69,11 @@ public class BluetoothStackLogPreferenceControllerTest { mPreferenceManager = new PreferenceManager(mContext); mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext); mPreference = new ListPreference(mContext); - mController = new BluetoothStackLogPreferenceController(mContext); mPreference.setKey(mController.getPreferenceKey()); - mPreference.setEntries(com.android.settings.R.array.bt_stack_log_level_entries); - mPreference.setEntryValues(com.android.settings.R.array.bt_stack_log_level_values); + mPreference.setEntries(getStringArrayResourceId(XML_DEFINED_ENTRIES_RESOURCE)); + mPreference.setEntryValues(getStringArrayResourceId(XML_DEFINED_VALUES_RESOURCE)); mPreferenceScreen.addPreference(mPreference); mController.displayPreference(mPreferenceScreen); @@ -86,134 +83,109 @@ public class BluetoothStackLogPreferenceControllerTest { } /** - * Test that default log level is set to INFO + * Get the resource ID associated with a resource name + * + * This looks up the resource id by name using our device's context. This way, we can avoid + * hardcoding a resource ID or value from the R class which may not match the resource IDs on + * the device under test. + * + * Usage: int valuesResId = getStringArrayResource("bt_stack_log_level_values"); + * Usage: int entriesResId = getStringArrayResource("bt_stack_log_level_entries"); + * + * @param res - The resource name to look up + * @return The integer resource ID corresponding to the given resource name */ - @Test - public void verifyDefaultState_enablesDefaultLogLevelEntriesAndValuesSameSize() { - mController.onPreferenceChange(mPreference, mController.getDefaultModeIndex()); - assertThat(mPreference.getValue().toString()).isEqualTo(mListValues - [BTSTACK_LOG_MODE_INFO_INDEX].toString()); - assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries - [BTSTACK_LOG_MODE_INFO_INDEX].toString()); + public int getStringArrayResourceId(String res) { + return mContext.getResources().getIdentifier(res, TYPE_ARRAY, COM_ANDROID_SETTINGS); } /** - * Test that log level is changed to VERBOSE when VERBOSE is selected + * Test that, for each possible value a user can select, our controller properly handles the + * value to update the underlying system property _and_ set the UI entry to the proper value. */ @Test - public void onPreferenceChanged_enableBluetoothStackVerboseLogLevel() { - mController.onPreferenceChange(mPreference, mListValues[BTSTACK_LOG_MODE_VERBOSE_INDEX] - .toString()); + public void onPreferenceChange_withEachValue_uiSetProperlyAndAllValuesWrittenToProperties() { + for (int index = 0; index < mListValues.length; index++) { + String value = mListValues[index].toString(); + String entry = mListEntries[index].toString(); - final String persistedLogLevel = SystemProperties.get( - BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST); - final String logLevel = SystemProperties.get(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY); - assertThat(persistedLogLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_VERBOSE_INDEX] - .toString()); - assertThat(logLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_VERBOSE_INDEX].toString()); + mController.onPreferenceChange(mPreference, value); - assertThat(mPreference.getValue().toString()).isEqualTo(mListValues - [BTSTACK_LOG_MODE_VERBOSE_INDEX].toString()); - assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries - [BTSTACK_LOG_MODE_VERBOSE_INDEX].toString()); + final String persistedLogLevel = SystemProperties.get(BT_LOG_LEVEL_PROP_PERSIST); + final String logLevel = SystemProperties.get(BT_LOG_LEVEL_PROP); + final String currentValue = mPreference.getValue().toString(); + final String currentEntry = mPreference.getEntry().toString(); + final String currentSummary = mPreference.getSummary().toString(); + final int currentIndex = mPreference.findIndexOfValue(currentValue); + + assertThat(persistedLogLevel).isEqualTo(value); + assertThat(logLevel).isEqualTo(value); + assertThat(currentIndex).isEqualTo(index); + assertThat(currentValue).isEqualTo(value); + assertThat(currentEntry).isEqualTo(entry); + assertThat(currentSummary).isEqualTo(entry); + } } /** - * Test that log level is changed to DEBUG when DEBUG is selected + * Test that, for each possible log tag log level value, our controller properly handles the + * value to set the UI entry to the proper value. */ @Test - public void onPreferenceChanged_enableBluetoothStackDebugLogLevel() { - mController.onPreferenceChange(mPreference, mListValues[BTSTACK_LOG_MODE_DEBUG_INDEX] - .toString()); + public void updateState_withEachValue_uiSetProperly() { + for (int index = 0; index < mListValues.length; index++) { + String value = mListValues[index].toString(); + String entry = mListEntries[index].toString(); - final String persistedLogLevel = SystemProperties.get( - BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST); - final String logLevel = SystemProperties.get(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY); - assertThat(persistedLogLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_DEBUG_INDEX] - .toString()); - assertThat(logLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_DEBUG_INDEX].toString()); + SystemProperties.set(BT_LOG_LEVEL_PROP_PERSIST, value); + SystemProperties.set(BT_LOG_LEVEL_PROP, value); - assertThat(mPreference.getValue().toString()).isEqualTo(mListValues - [BTSTACK_LOG_MODE_DEBUG_INDEX].toString()); - assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries - [BTSTACK_LOG_MODE_DEBUG_INDEX].toString()); + mController.updateState(mPreference); + + final String currentValue = mPreference.getValue().toString(); + final String currentEntry = mPreference.getEntry().toString(); + final String currentSummary = mPreference.getSummary().toString(); + final int currentIndex = mPreference.findIndexOfValue(currentValue); + + assertThat(currentIndex).isEqualTo(index); + assertThat(currentValue).isEqualTo(value); + assertThat(currentEntry).isEqualTo(entry); + assertThat(currentSummary).isEqualTo(entry); + } } /** - * Test that log level is changed to INFO when INFO is selected + * Test that our controller reverts the log level back to a missing/default value when we're + * notified that Developer Options has been disabled. */ @Test - public void onPreferenceChanged_enableBluetoothStackInfoLogLevel() { - mController.onPreferenceChange(mPreference, mListValues[BTSTACK_LOG_MODE_INFO_INDEX] - .toString()); + public void onDeveloperOptionsSwitchDisabled_preferenceSetToDefault() { + mController.onDeveloperOptionsSwitchDisabled(); - final String persistedLogLevel = SystemProperties.get( - BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST); - final String logLevel = SystemProperties.get(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY); - assertThat(persistedLogLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_INFO_INDEX] - .toString()); - assertThat(logLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_INFO_INDEX].toString()); + final String defaultEntry = mListEntries[BT_LOG_LEVEL_DEFAULT_INDEX].toString(); + final String defaultValue = mListValues[BT_LOG_LEVEL_DEFAULT_INDEX].toString(); - assertThat(mPreference.getValue().toString()).isEqualTo(mListValues - [BTSTACK_LOG_MODE_INFO_INDEX].toString()); - assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries - [BTSTACK_LOG_MODE_INFO_INDEX].toString()); + final String persistedLogLevel = SystemProperties.get(BT_LOG_LEVEL_PROP_PERSIST); + final String logLevel = SystemProperties.get(BT_LOG_LEVEL_PROP); + final String currentValue = mPreference.getValue().toString(); + final String currentEntry = mPreference.getEntry().toString(); + final String currentSummary = mPreference.getSummary().toString(); + final int currentIndex = mPreference.findIndexOfValue(currentValue); + + assertThat(persistedLogLevel).isEqualTo(PROPERTY_CLEARED); + assertThat(logLevel).isEqualTo(PROPERTY_CLEARED); + assertThat(currentIndex).isEqualTo(BT_LOG_LEVEL_DEFAULT_INDEX); + assertThat(currentValue).isEqualTo(defaultValue); + assertThat(currentEntry).isEqualTo(defaultEntry); + assertThat(currentSummary).isEqualTo(defaultEntry); } /** - * Test that log level is changed to WARN when WARN is selected + * Test that our preference key returned by our controller matches the one defined in the XML + * definition. */ @Test - public void onPreferenceChanged_enableBluetoothStackWarnLogLevel() { - mController.onPreferenceChange(mPreference, mListValues[BTSTACK_LOG_MODE_WARN_INDEX] - .toString()); - - final String persistedLogLevel = SystemProperties.get( - BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST); - final String logLevel = SystemProperties.get(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY); - assertThat(persistedLogLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_WARN_INDEX] - .toString()); - assertThat(logLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_WARN_INDEX].toString()); - - assertThat(mPreference.getValue().toString()).isEqualTo(mListValues - - [BTSTACK_LOG_MODE_WARN_INDEX].toString()); - assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries - [BTSTACK_LOG_MODE_WARN_INDEX].toString()); - } - - /** - * Test that log level is changed to ERROR when ERROR is selected - */ - @Test - public void onPreferenceChanged_enableBluetoothStackErrorLogLevel() { - mController.onPreferenceChange(mPreference, mListValues[BTSTACK_LOG_MODE_ERROR_INDEX] - .toString()); - - final String persistedLogLevel = SystemProperties.get( - BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST); - final String logLevel = SystemProperties.get(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY); - assertThat(persistedLogLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_ERROR_INDEX] - .toString()); - assertThat(logLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_ERROR_INDEX].toString()); - - assertThat(mPreference.getValue().toString()).isEqualTo(mListValues - [BTSTACK_LOG_MODE_ERROR_INDEX].toString()); - assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries - [BTSTACK_LOG_MODE_ERROR_INDEX].toString()); - } - - /** - * Test that preference is disabled when developer options is disabled - * Log level is also reset to default - */ - @Test - public void onDeveloperOptionsDisabled_shouldDisablePreference() { - mController.onDeveloperOptionsDisabled(); - assertThat(mPreference.isEnabled()).isFalse(); - assertThat(mPreference.getValue().toString()).isEqualTo(mListValues[mController - .getDefaultModeIndex()].toString()); - assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries[mController - .getDefaultModeIndex()].toString()); + public void getPreferenceKey_matchesXmlDefinedPreferenceKey() { + assertThat(mController.getPreferenceKey()).isEqualTo(XML_DEFINED_PREFERENCE_KEY); } } From 8dd7d1cc80f009a4d76253b0dc9486ff262db712 Mon Sep 17 00:00:00 2001 From: chelseahao Date: Mon, 22 Jul 2024 14:17:11 +0800 Subject: [PATCH 02/19] Add accessibility label for "QR code" button in Audio sharing page. Test: atest Bug: 354112158 Flag: com.android.settingslib.flags.enable_le_audio_sharing Change-Id: I5d2e2c70ca76e3598ca3d9550ebcc140d3400e34 --- .../audiosharing/AudioSharingNamePreference.java | 2 ++ .../audiosharing/AudioSharingNamePreferenceTest.java | 1 + 2 files changed, 3 insertions(+) diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreference.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreference.java index bfccdc4c672..0a90e7b3c4a 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreference.java +++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreference.java @@ -92,6 +92,8 @@ public class AudioSharingNamePreference extends ValidatedEditTextPreference { shareButton.setVisibility(View.VISIBLE); shareButton.setImageDrawable(getContext().getDrawable(R.drawable.ic_qrcode_24dp)); shareButton.setOnClickListener(unused -> launchAudioSharingQrCodeFragment()); + shareButton.setContentDescription( + getContext().getString(R.string.audio_sharing_qrcode_button_label)); } private void configureInvisibleStateForQrCodeIcon(ImageButton shareButton, View divider) { diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreferenceTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreferenceTest.java index 13e2a9d4636..be62414253e 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreferenceTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreferenceTest.java @@ -117,6 +117,7 @@ public class AudioSharingNamePreferenceTest { assertThat(shareButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(shareButton.getDrawable()).isNotNull(); assertThat(shareButton.hasOnClickListeners()).isTrue(); + assertThat(shareButton.getContentDescription()).isNotNull(); assertThat(divider).isNotNull(); assertThat(divider.getVisibility()).isEqualTo(View.VISIBLE); From c0c3b65c5ce069042519e15f9d1a3757ebbf4b54 Mon Sep 17 00:00:00 2001 From: Pajace Chen Date: Mon, 22 Jul 2024 08:22:32 +0000 Subject: [PATCH 03/19] [BugFix] Fix the incorrect state for dockdefend on battery settings page Bug: 348563863 Change-Id: Ie5f0f3e380b9355f96898eeddc755a18a71917a0 Test: Manual Test Test: http://ab/I16200010297673244 Flag: EXEMPT bug fix --- .../BatteryHeaderPreferenceController.java | 5 ++++- ...BatteryHeaderPreferenceControllerTest.java | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java index 7d15858f8b5..f121d0c2e5b 100644 --- a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java @@ -81,7 +81,10 @@ public class BatteryHeaderPreferenceController extends BasePreferenceController return mContext.getString( com.android.settingslib.R.string.battery_info_status_not_charging); } - if (BatteryUtils.isBatteryDefenderOn(info)) { + if (BatteryUtils.isBatteryDefenderOn(info) + || FeatureFactory.getFeatureFactory() + .getPowerUsageFeatureProvider() + .isExtraDefend()) { return mContext.getString( com.android.settingslib.R.string.battery_info_status_charging_on_hold); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java index b949a3eb302..fdb075d2e03 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java @@ -389,6 +389,28 @@ public class BatteryHeaderPreferenceControllerTest { verify(mBatteryUsageProgressBarPref).setBottomSummary(expectedChargingString); } + @Test + public void updateBatteryStatus_dockDefend_chargingOnHold() { + var expected = "Charging on hold"; + mBatteryInfo.isBatteryDefender = false; + when(mFactory.powerUsageFeatureProvider.isExtraDefend()).thenReturn(true); + + mController.updateBatteryStatus(/* label= */ null, mBatteryInfo); + + verify(mBatteryUsageProgressBarPref).setBottomSummary(expected); + } + + @Test + public void updateBatteryStatus_batteryDefender_chargingOnHold() { + var expected = "Charging on hold"; + mBatteryInfo.isBatteryDefender = true; + when(mFactory.powerUsageFeatureProvider.isExtraDefend()).thenReturn(false); + + mController.updateBatteryStatus(/* label= */ null, mBatteryInfo); + + verify(mBatteryUsageProgressBarPref).setBottomSummary(expected); + } + private BatteryInfo arrangeUpdateBatteryStatusTestWithRemainingLabel( String remainingLabel, String statusLabel, From 7299e0f6bd312f01920e8d38004876ff184f9780 Mon Sep 17 00:00:00 2001 From: chelseahao Date: Mon, 22 Jul 2024 15:53:51 +0800 Subject: [PATCH 04/19] Add accessibility label for "QR code" image. Also added landscape mode. Test: atest Bug: 354116021 Flag: com.android.settingslib.flags.enable_le_audio_sharing Change-Id: Ide20e07f38660ef7f444fbe3b20d3364b9951e02 --- .../bluetooth_audio_streams_qr_code.xml | 62 +++++++++++++++++++ .../bluetooth_audio_streams_qr_code.xml | 4 +- res/values/strings.xml | 2 + .../AudioStreamsQrCodeFragment.java | 2 +- 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 res/layout-land/bluetooth_audio_streams_qr_code.xml rename res/{xml => layout}/bluetooth_audio_streams_qr_code.xml (91%) diff --git a/res/layout-land/bluetooth_audio_streams_qr_code.xml b/res/layout-land/bluetooth_audio_streams_qr_code.xml new file mode 100644 index 00000000000..b35bc65f84f --- /dev/null +++ b/res/layout-land/bluetooth_audio_streams_qr_code.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + diff --git a/res/xml/bluetooth_audio_streams_qr_code.xml b/res/layout/bluetooth_audio_streams_qr_code.xml similarity index 91% rename from res/xml/bluetooth_audio_streams_qr_code.xml rename to res/layout/bluetooth_audio_streams_qr_code.xml index 5ec5505c4bb..fd521febc4a 100644 --- a/res/xml/bluetooth_audio_streams_qr_code.xml +++ b/res/layout/bluetooth_audio_streams_qr_code.xml @@ -47,7 +47,9 @@ + android:layout_height="@dimen/qrcode_size" + android:contentDescription="@string/audio_streams_qr_code_page_image_label" + android:focusable="true"/> Scan an audio stream QR code to listen with %1$s Can\u0027t edit password while sharing. To change the password, first turn off audio sharing. + + QR code diff --git a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsQrCodeFragment.java b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsQrCodeFragment.java index e4c07949b41..47f9c75514e 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsQrCodeFragment.java +++ b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsQrCodeFragment.java @@ -55,7 +55,7 @@ public class AudioStreamsQrCodeFragment extends InstrumentedFragment { @Override public final View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return inflater.inflate(R.xml.bluetooth_audio_streams_qr_code, container, false); + return inflater.inflate(R.layout.bluetooth_audio_streams_qr_code, container, false); } @Override From 467bb26083beb000f8400fa585eadcc2c7f6d60d Mon Sep 17 00:00:00 2001 From: chelseahao Date: Mon, 22 Jul 2024 16:58:58 +0800 Subject: [PATCH 05/19] Add accessibility label for "QR code" scanner. Also added landscape mode. Test: atest Bug: 354116021 Flag: com.android.settingslib.flags.enable_le_audio_sharing Change-Id: Ibb68252c5de5b30bdcbb9e9f88127b26e767ef04 --- res/layout-land/qrcode_scanner_fragment.xml | 74 +++++++++++++++++++++ res/layout/qrcode_scanner_fragment.xml | 4 +- res/values/strings.xml | 2 + 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 res/layout-land/qrcode_scanner_fragment.xml diff --git a/res/layout-land/qrcode_scanner_fragment.xml b/res/layout-land/qrcode_scanner_fragment.xml new file mode 100644 index 00000000000..0e563e32f6c --- /dev/null +++ b/res/layout-land/qrcode_scanner_fragment.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/qrcode_scanner_fragment.xml b/res/layout/qrcode_scanner_fragment.xml index 4f748c5fdf2..72049a4b2e7 100644 --- a/res/layout/qrcode_scanner_fragment.xml +++ b/res/layout/qrcode_scanner_fragment.xml @@ -55,7 +55,9 @@ android:layout_height="wrap_content" android:layout_gravity="top" android:gravity="center" - android:clipChildren="true"> + android:clipChildren="true" + android:contentDescription="@string/audio_streams_qr_code_scanner_label" + android:focusable="true"> Can\u0027t edit password while sharing. To change the password, first turn off audio sharing. QR code + + QR code scanner From 11865236b0146b8fafc10f4cf5f2e7c1eb9e3762 Mon Sep 17 00:00:00 2001 From: Haijie Hong Date: Mon, 22 Jul 2024 20:26:59 +0800 Subject: [PATCH 06/19] Update color of ring battery indicator Test: verify the color locally Bug: 343317785 Flag: com.android.settings.flags.enable_bluetooth_device_details_polish Change-Id: I96b7775dfca51c4304b413a9a56a6489d735f748 --- res/layout/advanced_bt_entity_sub.xml | 2 +- res/values/colors.xml | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/res/layout/advanced_bt_entity_sub.xml b/res/layout/advanced_bt_entity_sub.xml index 90ac4567176..dd8e43a0f73 100644 --- a/res/layout/advanced_bt_entity_sub.xml +++ b/res/layout/advanced_bt_entity_sub.xml @@ -45,7 +45,7 @@ android:layout_gravity="center" android:indeterminate="false" app:trackColor="@android:color/transparent" - app:indicatorColor="@color/bluetooth_battery_ring_indicator_color" + app:indicatorColor="@color/settingslib_materialColorPrimary" app:trackThickness="4dp" app:indicatorSize="76dp" app:indicatorInset="0dp" diff --git a/res/values/colors.xml b/res/values/colors.xml index b0de8702049..6d925261979 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -218,7 +218,4 @@ #1F1F1F1F - - - #9ED582 From f5b58ea3be34a9b9ffd711c407356a808d765b52 Mon Sep 17 00:00:00 2001 From: Ram Peri Date: Fri, 19 Jul 2024 17:23:40 -0400 Subject: [PATCH 07/19] Robolectric upgrade Test: atest SystemUIGoogleRoboRNGTests Flag: TEST_ONLY Change-Id: I833ac67223875480994f947907754290bb25c946 --- .../testutils/shadow/ShadowCrossProfileApps.java | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowCrossProfileApps.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowCrossProfileApps.java index 64a5f1169ef..c52fe2f2723 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowCrossProfileApps.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowCrossProfileApps.java @@ -19,9 +19,8 @@ package com.android.settings.testutils.shadow; import android.Manifest; import android.content.Context; import android.content.pm.CrossProfileApps; -import android.content.pm.ICrossProfileApps; -import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageInfo; import androidx.annotation.NonNull; @@ -35,15 +34,7 @@ import java.util.Set; @Implements(CrossProfileApps.class) public class ShadowCrossProfileApps extends org.robolectric.shadows.ShadowCrossProfileApps { private static final Set configurableInteractAcrossProfilePackages = new HashSet<>(); - private Context mContext; - private PackageManager mPackageManager; - @Implementation - protected void __constructor__(Context context, ICrossProfileApps service) { - super.__constructor__(context, service); - this.mContext = context; - this.mPackageManager = context.getPackageManager(); - } public void addCrossProfilePackage(String packageName) { configurableInteractAcrossProfilePackages.add(packageName); } @@ -57,7 +48,9 @@ public class ShadowCrossProfileApps extends org.robolectric.shadows.ShadowCrossP protected boolean canUserAttemptToConfigureInteractAcrossProfiles(@NonNull String packageName) { PackageInfo packageInfo; try { - packageInfo = mPackageManager.getPackageInfo(packageName, /* flags= */ 0); + packageInfo = getContext().getPackageManager().getPackageInfo( + packageName, + /* flags= */ 0); } catch (PackageManager.NameNotFoundException e) { return false; } From 9609216cb5f4d413cff6d7b59820e3802a1c6178 Mon Sep 17 00:00:00 2001 From: Alina Zaidi Date: Mon, 22 Jul 2024 14:31:04 +0000 Subject: [PATCH 08/19] [Dev options] Conditionally show Freeform toggle: Only display when freeform is NOT available by default on the device. Previously Freeform Toggle was a no-op when freeform was by default available on devices On the other hand Desktop mode toggle is displayed only when freeform IS available by default on the device. (This is because desktop mode support is tied to devices with default freeform capability.) Also update toggle strings for a clearer user experience Test: Updated tests Bug: 348193756 Bug: 348186127 Flag: com.android.window.flags.show_desktop_windowing_dev_option Change-Id: I29e36a939db78010bb3153e756f95bb6c21a31f9 --- res/values/strings.xml | 27 +++++++----------- res/xml/development_settings.xml | 9 ++---- ...eSecondaryDisplayPreferenceController.java | 3 +- .../FreeformWindowsPreferenceController.java | 18 +++++++----- ...eeformWindowsPreferenceControllerTest.java | 28 ++++++++++--------- 5 files changed, 41 insertions(+), 44 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index d5259a6a450..574d37ba0f8 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -12238,16 +12238,11 @@ Settings Panel - - Enable freeform windows - - Enable support for freeform windows. + + Enable freeform windowing experiences - - - Enable freeform windowing on second display - - Enable freeform windows only on secondary display. + + Enable desktop mode on secondary display Enable non-resizable in multi window @@ -13210,14 +13205,12 @@ Customize %1$s - - A reboot is required to enable legacy freeform windowing support. - - A reboot is required to change freeform windowing support. - - A reboot is required to force freeform windowing on secondary displays. + + A reboot is required to enable freeform window support. + + A reboot is required to update availability of freeform windowing experiences. + + A reboot is required to enable desktop mode on secondary displays. Reboot now diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index 9420f59e881..88abadb5233 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -739,18 +739,15 @@ + android:title="@string/enable_desktop_mode" /> + android:title="@string/enable_freeform_support" /> + android:title="@string/enable_desktop_mode_on_secondary_display"/> Date: Mon, 22 Jul 2024 18:32:33 +0000 Subject: [PATCH 09/19] Fix settings crash for non-fingerpirnt devices Test: Verified that Settings does not crash on non-fingerprint devices Flag: EXEMPT bugfix Fixes: b/350635316 Change-Id: Ia6be6672cf8f8d84b2503fdb305a0217224a864d --- .../fingerprint2/BiometricsEnvironment.kt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/biometrics/fingerprint2/BiometricsEnvironment.kt b/src/com/android/settings/biometrics/fingerprint2/BiometricsEnvironment.kt index 215692ab0e1..9bc920a96ba 100644 --- a/src/com/android/settings/biometrics/fingerprint2/BiometricsEnvironment.kt +++ b/src/com/android/settings/biometrics/fingerprint2/BiometricsEnvironment.kt @@ -16,7 +16,9 @@ package com.android.settings.biometrics.fingerprint2 +import android.content.pm.PackageManager import android.hardware.fingerprint.FingerprintManager +import android.os.ServiceManager.ServiceNotFoundException import android.view.MotionEvent import android.view.accessibility.AccessibilityManager import androidx.fragment.app.FragmentActivity @@ -74,8 +76,15 @@ class BiometricsEnvironment(context: SettingsApplication) : ViewModelStoreOwner private val backgroundDispatcher = executorService.asCoroutineDispatcher() private val applicationScope = MainScope() private val gateKeeperPasswordProvider = GatekeeperPasswordProvider(LockPatternUtils(context)) - private val fingerprintManager = - context.getSystemService(FragmentActivity.FINGERPRINT_SERVICE) as FingerprintManager? + private val fingerprintManager = try { + if (context.packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { + context.getSystemService(FragmentActivity.FINGERPRINT_SERVICE) as FingerprintManager? + } else { + null + } + } catch (exception: ServiceNotFoundException){ + null + } private val fingerprintSensorRepository: FingerprintSensorRepository = FingerprintSensorRepositoryImpl(fingerprintManager, backgroundDispatcher, applicationScope) From 581fbc8dfa0f3e0bed2ee17ba4410440d76e492e Mon Sep 17 00:00:00 2001 From: Isaac Chai Date: Thu, 11 Jul 2024 00:16:50 +0000 Subject: [PATCH 10/19] feat(color correction): Disable slider when not applicable We received feedback that slider should be disabled when it's not applicable, namely when it's off and when mode == gray scale. Bug: 351920992 Test: Locally tested + unit tests Flag: com.android.server.accessibility.enable_color_correction_saturation Change-Id: I1162a501a797a1d2b30da76f0c75e5fdea3f61d2 --- res/values/strings.xml | 2 + ...SaturationSeekbarPreferenceController.java | 80 +++++- ...rationSeekbarPreferenceControllerTest.java | 252 +++++++++++++++--- 3 files changed, 298 insertions(+), 36 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 572851ed06e..c179eba8ae9 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5465,6 +5465,8 @@ Grayscale Intensity + + Unavailable for grayscale mode or when color correction is disabled Green weak, deuteranomaly diff --git a/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceController.java b/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceController.java index 7dcd6612ac4..29971854e6b 100644 --- a/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceController.java +++ b/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceController.java @@ -17,26 +17,50 @@ package com.android.settings.accessibility; import android.content.ContentResolver; import android.content.Context; +import android.database.ContentObserver; +import android.os.Handler; +import android.os.Looper; import android.provider.Settings; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; +import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.server.accessibility.Flags; +import com.android.settings.R; import com.android.settings.core.SliderPreferenceController; import com.android.settings.widget.SeekBarPreference; /** * The controller of the seekbar preference for the saturation level of color correction. */ -public class DaltonizerSaturationSeekbarPreferenceController extends SliderPreferenceController { +public class DaltonizerSaturationSeekbarPreferenceController + extends SliderPreferenceController + implements DefaultLifecycleObserver { private static final int DEFAULT_SATURATION_LEVEL = 7; private static final int SATURATION_MAX = 10; - private static final int SATURATION_MIN = 0; + private static final int SATURATION_MIN = 1; private int mSliderPosition; private final ContentResolver mContentResolver; + @Nullable + private SeekBarPreference mPreference; + + public final ContentObserver mContentObserver = new ContentObserver( + new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange) { + if (mPreference != null) { + updateState(mPreference); + } + } + }; + public DaltonizerSaturationSeekbarPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); @@ -49,10 +73,33 @@ public class DaltonizerSaturationSeekbarPreferenceController extends SliderPrefe // TODO: Observer color correction on/off and enable/disable based on secure settings. } + @Override + public void onStart(@NonNull LifecycleOwner owner) { + if (!isAvailable()) return; + mContentResolver.registerContentObserver( + Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER), + true, + mContentObserver + ); + mContentResolver.registerContentObserver( + Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED), + true, + mContentObserver + ); + } + + @Override + public void onStop(@NonNull LifecycleOwner owner) { + if (!isAvailable()) return; + mContentResolver.unregisterContentObserver(mContentObserver); + mPreference = null; + } + @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); SeekBarPreference preference = screen.findPreference(getPreferenceKey()); + mPreference = preference; preference.setMax(getMax()); preference.setMin(getMin()); preference.setProgress(mSliderPosition); @@ -62,7 +109,7 @@ public class DaltonizerSaturationSeekbarPreferenceController extends SliderPrefe @Override public int getAvailabilityStatus() { if (Flags.enableColorCorrectionSaturation()) { - return AVAILABLE; + return shouldSeekBarEnabled() ? AVAILABLE : DISABLED_DEPENDENT_SETTING; } return CONDITIONALLY_UNAVAILABLE; } @@ -85,6 +132,21 @@ public class DaltonizerSaturationSeekbarPreferenceController extends SliderPrefe return true; } + @Override + public void updateState(Preference preference) { + if (preference == null) { + return; + } + + var shouldSeekbarEnabled = shouldSeekBarEnabled(); + // setSummary not working yet on SeekBarPreference. + String summary = shouldSeekbarEnabled + ? "" + : mContext.getString(R.string.daltonizer_saturation_unavailable_summary); + preference.setSummary(summary); + preference.setEnabled(shouldSeekbarEnabled); + } + @Override public int getMax() { return SATURATION_MAX; @@ -94,4 +156,16 @@ public class DaltonizerSaturationSeekbarPreferenceController extends SliderPrefe public int getMin() { return SATURATION_MIN; } + + private boolean shouldSeekBarEnabled() { + int enabled = Settings.Secure.getInt( + mContentResolver, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0); + int mode = Settings.Secure.getInt( + mContentResolver, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, -1); + + // enabled == 0 is disabled and also default. + // mode == 0 is gray scale where saturation level isn't applicable. + // mode == -1 is disabled and also default. + return enabled != 0 && mode != -1 && mode != 0; + } } diff --git a/tests/robotests/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceControllerTest.java index 98ed4422dc8..5fd11f910fa 100644 --- a/tests/robotests/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/DaltonizerSaturationSeekbarPreferenceControllerTest.java @@ -16,38 +16,39 @@ package com.android.settings.accessibility; +import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; +import static androidx.lifecycle.Lifecycle.Event.ON_STOP; + import static com.android.settings.core.BasePreferenceController.AVAILABLE; import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE; +import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING; 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.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.robolectric.Shadows.shadowOf; import android.content.ContentResolver; import android.content.Context; +import android.os.Looper; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; +import androidx.lifecycle.LifecycleOwner; +import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import com.android.server.accessibility.Flags; import com.android.settings.widget.SeekBarPreference; +import com.android.settingslib.core.lifecycle.Lifecycle; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; /** Tests for {@link DaltonizerSaturationSeekbarPreferenceController}. */ @@ -60,8 +61,9 @@ public class DaltonizerSaturationSeekbarPreferenceControllerTest { private int mOriginalSaturationLevel = -1; private PreferenceScreen mScreen; + private LifecycleOwner mLifecycleOwner; + private Lifecycle mLifecycle; - @Mock private SeekBarPreference mPreference; @Rule @@ -69,7 +71,6 @@ public class DaltonizerSaturationSeekbarPreferenceControllerTest { @Before public void setup() { - MockitoAnnotations.initMocks(this); Context context = ApplicationProvider.getApplicationContext(); mContentResolver = context.getContentResolver(); mOriginalSaturationLevel = Settings.Secure.getInt( @@ -77,10 +78,13 @@ public class DaltonizerSaturationSeekbarPreferenceControllerTest { Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, 7); - mScreen = spy(new PreferenceScreen(context, /* attrs= */ null)); - when(mScreen.findPreference(ToggleDaltonizerPreferenceFragment.KEY_SATURATION)) - .thenReturn(mPreference); + mPreference = new SeekBarPreference(context); + mPreference.setKey(ToggleDaltonizerPreferenceFragment.KEY_SATURATION); + mScreen = new PreferenceManager(context).createPreferenceScreen(context); + mScreen.addPreference(mPreference); + mLifecycleOwner = () -> mLifecycle; + mLifecycle = new Lifecycle(mLifecycleOwner); mController = new DaltonizerSaturationSeekbarPreferenceController( context, ToggleDaltonizerPreferenceFragment.KEY_SATURATION); @@ -94,6 +98,12 @@ public class DaltonizerSaturationSeekbarPreferenceControllerTest { mOriginalSaturationLevel); } + @Test + public void constructor_defaultValuesMatch() { + assertThat(mController.getSliderPosition()).isEqualTo(7); + assertThat(mController.getMax()).isEqualTo(10); + assertThat(mController.getMin()).isEqualTo(1); + } @Test @DisableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) @@ -103,28 +113,72 @@ public class DaltonizerSaturationSeekbarPreferenceControllerTest { @Test @EnableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) - public void getAvailabilityStatus_flagEnabled_available() { + public void getAvailabilityStatus_flagEnabledProtanEnabled_available() { + setDaltonizerMode(/* enabled= */ 1, /* mode= */ 11); assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); } @Test - public void constructor_defaultValuesMatch() { - assertThat(mController.getSliderPosition()).isEqualTo(7); - assertThat(mController.getMax()).isEqualTo(10); - assertThat(mController.getMin()).isEqualTo(0); + @EnableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) + public void getAvailabilityStatus_flagEnabledDeutranEnabled_available() { + setDaltonizerMode(/* enabled= */ 1, /* mode= */ 12); + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); } @Test @EnableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) - public void displayPreference_enabled_visible() { + public void getAvailabilityStatus_flagEnabledTritanEnabled_available() { + setDaltonizerMode(/* enabled= */ 1, /* mode= */ 13); + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) + public void getAvailabilityStatus_flagEnabledGrayScale_disabled() { + setDaltonizerMode(/* enabled= */ 1, /* mode= */ 0); + assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_DEPENDENT_SETTING); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) + public void getAvailabilityStatus_flagEnabledColorCorrectionDisabled_disabled() { + setDaltonizerMode(/* enabled= */ 0, /* mode= */ 11); + assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_DEPENDENT_SETTING); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) + public void getAvailabilityStatus_flagEnabledColorCorrectionDisabledGrayScale_disabled() { + setDaltonizerMode(/* enabled= */ 0, /* mode= */ 0); + assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_DEPENDENT_SETTING); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) + public void displayPreference_flagEnabledColorCorrectionEnabled_enabledWithDefaultValues() { + setDaltonizerMode(/* enabled= */ 1, /* mode= */ 11); mController.displayPreference(mScreen); - verify(mPreference).setMax(eq(10)); - verify(mPreference).setMin(eq(0)); - verify(mPreference).setProgress(eq(7)); - verify(mPreference).setContinuousUpdates(eq(true)); - verify(mPreference).setOnPreferenceChangeListener(eq(mController)); - verify(mPreference).setVisible(eq(true)); + assertThat(mPreference.isEnabled()).isTrue(); + assertThat(mPreference.getMax()).isEqualTo(10); + assertThat(mPreference.getMin()).isEqualTo(1); + assertThat(mPreference.getProgress()).isEqualTo(7); + assertThat(mPreference.isVisible()).isTrue(); + assertThat(mPreference.getOnPreferenceChangeListener()).isEqualTo(mController); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_COLOR_CORRECTION_SATURATION) + public void displayPreference_flagEnabledColorCorrectionDisabled_disabledWithDefaultValues() { + setDaltonizerMode(/* enabled= */ 0, /* mode= */ 11); + mController.displayPreference(mScreen); + + assertThat(mPreference.isEnabled()).isFalse(); + assertThat(mPreference.getMax()).isEqualTo(10); + assertThat(mPreference.getMin()).isEqualTo(1); + assertThat(mPreference.getProgress()).isEqualTo(7); + assertThat(mPreference.isVisible()).isTrue(); + assertThat(mPreference.getOnPreferenceChangeListener()).isEqualTo(mController); } @Test @@ -132,12 +186,8 @@ public class DaltonizerSaturationSeekbarPreferenceControllerTest { public void displayPreference_disabled_notVisible() { mController.displayPreference(mScreen); - verify(mPreference).setMax(eq(10)); - verify(mPreference).setMin(eq(0)); - verify(mPreference).setProgress(eq(7)); - verify(mPreference).setContinuousUpdates(eq(true)); - verify(mPreference, never()).setOnPreferenceChangeListener(any()); - verify(mPreference).setVisible(eq(false)); + assertThat(mPreference.isVisible()).isFalse(); + assertThat(mPreference.getOnPreferenceChangeListener()).isNull(); } @Test @@ -153,13 +203,13 @@ public class DaltonizerSaturationSeekbarPreferenceControllerTest { @Test public void setSliderPosition_min_secureSettingsUpdated() { - var isSliderSet = mController.setSliderPosition(0); + var isSliderSet = mController.setSliderPosition(1); assertThat(isSliderSet).isTrue(); assertThat(Settings.Secure.getInt( mContentResolver, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, - 7)).isEqualTo(0); + 7)).isEqualTo(1); } @Test @@ -194,4 +244,140 @@ public class DaltonizerSaturationSeekbarPreferenceControllerTest { Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_SATURATION_LEVEL, 7)).isEqualTo(7); } + + @Test + public void updateState_enabledProtan_preferenceEnabled() { + setDaltonizerMode(/* enabled= */ 1, /* mode= */ 11); + + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isTrue(); + } + + @Test + public void updateState_enabledDeuteran_preferenceEnabled() { + setDaltonizerMode(/* enabled= */ 1, /* mode= */ 12); + + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isTrue(); + } + + @Test + public void updateState_enabledTritan_preferenceEnabled() { + setDaltonizerMode(/* enabled= */ 1, /* mode= */ 13); + + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isTrue(); + } + + @Test + public void updateState_disabledGrayScale_preferenceDisabled() { + setDaltonizerMode(/* enabled= */ 0, /* mode= */ 0); + + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isFalse(); + } + + @Test + public void updateState_nullPreference_noError() { + setDaltonizerMode(/* enabled= */ 0, /* mode= */ 0); + + mController.updateState(null); + } + + @Test + public void updateState_enabledGrayScale_preferenceDisabled() { + setDaltonizerMode(/* enabled= */ 1, /* mode= */ 0); + + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isFalse(); + } + + @Test + public void onResume_daltonizerEnabledAfterResumed_preferenceEnabled() { + setDaltonizerMode(/* enabled= */ 0, /* mode= */ 11); + mController.displayPreference(mScreen); + assertThat(mPreference.isEnabled()).isFalse(); + + mLifecycle.addObserver(mController); + mLifecycle.handleLifecycleEvent(ON_RESUME); + + Settings.Secure.putInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, + 1); + shadowOf(Looper.getMainLooper()).idle(); + + assertThat(mPreference.isEnabled()).isTrue(); + } + + @Test + public void onResume_daltonizerDisabledAfterResumed_preferenceDisabled() { + setDaltonizerMode(/* enabled= */ 1, /* mode= */ 11); + mController.displayPreference(mScreen); + assertThat(mPreference.isEnabled()).isTrue(); + + mLifecycle.addObserver(mController); + mLifecycle.handleLifecycleEvent(ON_RESUME); + + Settings.Secure.putInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, + 0); + shadowOf(Looper.getMainLooper()).idle(); + + assertThat(mPreference.isEnabled()).isFalse(); + } + + @Test + public void onResume_daltonizerGrayScaledAfterResumed_preferenceDisabled() { + setDaltonizerMode(/* enabled= */ 1, /* mode= */ 11); + mController.displayPreference(mScreen); + assertThat(mPreference.isEnabled()).isTrue(); + + mLifecycle.addObserver(mController); + mLifecycle.handleLifecycleEvent(ON_RESUME); + + Settings.Secure.putInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, + 0); + shadowOf(Looper.getMainLooper()).idle(); + + assertThat(mPreference.isEnabled()).isFalse(); + } + + @Test + public void onStop_daltonizerEnabledAfterOnStop_preferenceNotChanged() { + setDaltonizerMode(/* enabled= */ 0, /* mode= */ 11); + mController.displayPreference(mScreen); + assertThat(mPreference.isEnabled()).isFalse(); + + mLifecycle.addObserver(mController); + mLifecycle.handleLifecycleEvent(ON_STOP); + + // enabled. + Settings.Secure.putInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, + 1); + shadowOf(Looper.getMainLooper()).idle(); + + assertThat(mPreference.isEnabled()).isFalse(); + } + + private void setDaltonizerMode(int enabled, int mode) { + Settings.Secure.putInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, + enabled); + Settings.Secure.putInt( + mContentResolver, + Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, + mode); + } } From 20d2eabe35cda27ca80f8b19f1f4d3de07f884ee Mon Sep 17 00:00:00 2001 From: Daniel Norman Date: Sat, 20 Jul 2024 00:46:50 +0000 Subject: [PATCH 11/19] Checks that prebundled categories contain only preinstalled contents. Bug: 353888087 Test: atest AccessibilitySettingsTest Test: manually check all prebundled services are still in their proper groups, even after installing an APK update Flag: com.android.settings.accessibility.check_prebundled_is_preinstalled Change-Id: I023db9c37d7990deb50c9eec516619f0a8db65b7 --- .../accessibility/accessibility_flags.aconfig | 10 +++ .../accessibility/AccessibilitySettings.java | 62 ++++++++++++++----- .../AccessibilitySettingsTest.java | 55 ++++++++-------- 3 files changed, 87 insertions(+), 40 deletions(-) diff --git a/aconfig/accessibility/accessibility_flags.aconfig b/aconfig/accessibility/accessibility_flags.aconfig index 3ed618bd6e0..3092b8fe72b 100644 --- a/aconfig/accessibility/accessibility_flags.aconfig +++ b/aconfig/accessibility/accessibility_flags.aconfig @@ -20,6 +20,16 @@ flag { } } +flag { + name: "check_prebundled_is_preinstalled" + namespace: "accessibility" + description: "Checks that all 'prebundled' components, used for grouping, are also preinstalled" + bug: "353888087" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "edit_shortcuts_in_full_screen" namespace: "accessibility" diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index 23f8ec7fab1..d01806aa3a8 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -75,7 +75,8 @@ public class AccessibilitySettings extends DashboardFragment implements private static final String CATEGORY_AUDIO = "audio_category"; private static final String CATEGORY_SPEECH = "speech_category"; private static final String CATEGORY_DISPLAY = "display_category"; - private static final String CATEGORY_DOWNLOADED_SERVICES = "user_installed_services_category"; + @VisibleForTesting + static final String CATEGORY_DOWNLOADED_SERVICES = "user_installed_services_category"; private static final String CATEGORY_KEYBOARD_OPTIONS = "physical_keyboard_options_category"; @VisibleForTesting static final String CATEGORY_INTERACTION_CONTROL = "interaction_control_category"; @@ -380,6 +381,7 @@ public class AccessibilitySettings extends DashboardFragment implements } protected void updateServicePreferences() { + final AccessibilityManager a11yManager = AccessibilityManager.getInstance(getPrefContext()); // Since services category is auto generated we have to do a pass // to generate it since services can come and go and then based on // the global accessibility state to decided whether it is enabled. @@ -410,8 +412,18 @@ public class AccessibilitySettings extends DashboardFragment implements AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM, mCategoryToPrefCategoryMap.get(CATEGORY_INTERACTION_CONTROL)); - final List preferenceList = getInstalledAccessibilityList( - getPrefContext()); + final List installedShortcutList = + a11yManager.getInstalledAccessibilityShortcutListAsUser(getPrefContext(), + UserHandle.myUserId()); + final List modifiableInstalledServiceList = + new ArrayList<>(a11yManager.getInstalledAccessibilityServiceList()); + final List preferenceList = getInstalledAccessibilityPreferences( + getPrefContext(), installedShortcutList, modifiableInstalledServiceList); + + if (Flags.checkPrebundledIsPreinstalled()) { + removeNonPreinstalledComponents(mPreBundledServiceComponentToCategoryMap, + installedShortcutList, modifiableInstalledServiceList); + } final PreferenceCategory downloadedServicesCategory = mCategoryToPrefCategoryMap.get(CATEGORY_DOWNLOADED_SERVICES); @@ -456,13 +468,21 @@ public class AccessibilitySettings extends DashboardFragment implements updatePreferenceCategoryVisibility(CATEGORY_KEYBOARD_OPTIONS); } - private List getInstalledAccessibilityList(Context context) { - final AccessibilityManager a11yManager = AccessibilityManager.getInstance(context); + /** + * Gets a list of {@link RestrictedPreference}s for the provided a11y shortcuts and services. + * + *

{@code modifiableInstalledServiceList} may be modified to remove any entries with + * matching package name and label as an entry in {@code installedShortcutList}. + * + * @param installedShortcutList A list of installed {@link AccessibilityShortcutInfo}s. + * @param modifiableInstalledServiceList A modifiable list of installed + * {@link AccessibilityServiceInfo}s. + */ + private List getInstalledAccessibilityPreferences(Context context, + List installedShortcutList, + List modifiableInstalledServiceList) { final RestrictedPreferenceHelper preferenceHelper = new RestrictedPreferenceHelper(context); - final List installedShortcutList = - a11yManager.getInstalledAccessibilityShortcutListAsUser(context, - UserHandle.myUserId()); final List activityList = preferenceHelper.createAccessibilityActivityPreferenceList(installedShortcutList); final Set> packageLabelPairs = @@ -471,16 +491,14 @@ public class AccessibilitySettings extends DashboardFragment implements a11yActivityPref.getPackageName(), a11yActivityPref.getLabel()) ).collect(Collectors.toSet()); - // Remove duplicate item here, new a ArrayList to copy unmodifiable list result - // (getInstalledAccessibilityServiceList). - final List installedServiceList = new ArrayList<>( - a11yManager.getInstalledAccessibilityServiceList()); + // Remove duplicate A11yServices that are already shown as A11yActivities. if (!packageLabelPairs.isEmpty()) { - installedServiceList.removeIf( + modifiableInstalledServiceList.removeIf( target -> containsPackageAndLabelInList(packageLabelPairs, target)); } final List serviceList = - preferenceHelper.createAccessibilityServicePreferenceList(installedServiceList); + preferenceHelper.createAccessibilityServicePreferenceList( + modifiableInstalledServiceList); final List preferenceList = new ArrayList<>(); preferenceList.addAll(activityList); @@ -489,6 +507,22 @@ public class AccessibilitySettings extends DashboardFragment implements return preferenceList; } + private static void removeNonPreinstalledComponents( + Map componentToCategory, + List shortcutInfos, + List serviceInfos) { + for (AccessibilityShortcutInfo info : shortcutInfos) { + if (!info.getActivityInfo().applicationInfo.isSystemApp()) { + componentToCategory.remove(info.getComponentName()); + } + } + for (AccessibilityServiceInfo info : serviceInfos) { + if (!info.getResolveInfo().serviceInfo.applicationInfo.isSystemApp()) { + componentToCategory.remove(info.getComponentName()); + } + } + } + private boolean containsPackageAndLabelInList( Set> packageLabelPairs, AccessibilityServiceInfo targetServiceInfo) { diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java index 1463cd0b7f9..cb2429c558f 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java @@ -26,11 +26,9 @@ import static org.robolectric.Shadows.shadowOf; import static java.util.Collections.singletonList; import android.accessibilityservice.AccessibilityServiceInfo; -import android.accessibilityservice.AccessibilityShortcutInfo; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; @@ -110,9 +108,7 @@ public class AccessibilitySettingsTest { private final Context mContext = ApplicationProvider.getApplicationContext(); @Spy private final AccessibilityServiceInfo mServiceInfo = getMockAccessibilityServiceInfo( - PACKAGE_NAME, CLASS_NAME); - @Mock - private AccessibilityShortcutInfo mShortcutInfo; + new ComponentName(PACKAGE_NAME, CLASS_NAME)); private ShadowAccessibilityManager mShadowAccessibilityManager; @Mock private LocalBluetoothManager mLocalBluetoothManager; @@ -125,7 +121,6 @@ public class AccessibilitySettingsTest { mShadowAccessibilityManager.setInstalledAccessibilityServiceList(new ArrayList<>()); mContext.setTheme(androidx.appcompat.R.style.Theme_AppCompat); ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager; - setMockAccessibilityShortcutInfo(mShortcutInfo); Intent intent = new Intent(); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, @@ -398,14 +393,25 @@ public class AccessibilitySettingsTest { public void testAccessibilityMenuInSystem_IncludedInInteractionControl() { mShadowAccessibilityManager.setInstalledAccessibilityServiceList( List.of(getMockAccessibilityServiceInfo( - AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM))); + AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM, + /*isSystemApp=*/true))); setupFragment(); - final RestrictedPreference pref = mFragment.getPreferenceScreen().findPreference( - AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM.flattenToString()); - final String prefCategory = mFragment.mServicePreferenceToPreferenceCategoryMap.get( - pref).getKey(); - assertThat(prefCategory).isEqualTo(AccessibilitySettings.CATEGORY_INTERACTION_CONTROL); + assertThat(getPreferenceCategory(AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM)) + .isEqualTo(AccessibilitySettings.CATEGORY_INTERACTION_CONTROL); + } + + @Test + @EnableFlags(com.android.settings.accessibility.Flags.FLAG_CHECK_PREBUNDLED_IS_PREINSTALLED) + public void testNonPreinstalledApp_IncludedInDownloadedCategory() { + mShadowAccessibilityManager.setInstalledAccessibilityServiceList( + List.of(getMockAccessibilityServiceInfo( + AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM, + /*isSystemApp=*/false))); + setupFragment(); + + assertThat(getPreferenceCategory(AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM)) + .isEqualTo(AccessibilitySettings.CATEGORY_DOWNLOADED_SERVICES); } @Test @@ -418,13 +424,20 @@ public class AccessibilitySettingsTest { assertThat(pref).isNull(); } - private AccessibilityServiceInfo getMockAccessibilityServiceInfo(String packageName, - String className) { - return getMockAccessibilityServiceInfo(new ComponentName(packageName, className)); + private String getPreferenceCategory(ComponentName componentName) { + return mFragment.mServicePreferenceToPreferenceCategoryMap.get( + mFragment.getPreferenceScreen().findPreference( + componentName.flattenToString())).getKey(); } private AccessibilityServiceInfo getMockAccessibilityServiceInfo(ComponentName componentName) { - final ApplicationInfo applicationInfo = new ApplicationInfo(); + return getMockAccessibilityServiceInfo(componentName, true); + } + + private AccessibilityServiceInfo getMockAccessibilityServiceInfo(ComponentName componentName, + boolean isSystemApp) { + final ApplicationInfo applicationInfo = Mockito.mock(ApplicationInfo.class); + when(applicationInfo.isSystemApp()).thenReturn(isSystemApp); final ServiceInfo serviceInfo = new ServiceInfo(); applicationInfo.packageName = componentName.getPackageName(); serviceInfo.packageName = componentName.getPackageName(); @@ -445,16 +458,6 @@ public class AccessibilitySettingsTest { return null; } - private void setMockAccessibilityShortcutInfo(AccessibilityShortcutInfo mockInfo) { - final ActivityInfo activityInfo = Mockito.mock(ActivityInfo.class); - activityInfo.applicationInfo = new ApplicationInfo(); - when(mockInfo.getActivityInfo()).thenReturn(activityInfo); - when(activityInfo.loadLabel(any())).thenReturn(DEFAULT_LABEL); - when(mockInfo.loadSummary(any())).thenReturn(DEFAULT_SUMMARY); - when(mockInfo.loadDescription(any())).thenReturn(DEFAULT_DESCRIPTION); - when(mockInfo.getComponentName()).thenReturn(COMPONENT_NAME); - } - private void setInvisibleToggleFragmentType(AccessibilityServiceInfo info) { info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion = Build.VERSION_CODES.R; info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON; From 9bae71c15cda6dc02329cb56d95f5a095cbc71fd Mon Sep 17 00:00:00 2001 From: Diya Bera Date: Mon, 22 Jul 2024 21:52:36 +0000 Subject: [PATCH 12/19] Add mandatory biometric prompt to platform surfaces (3/N) Pass user ids for identity check. This is to make sure that the right user is requested auth for different profiles. Flag: android.hardware.biometrics.Flags.MANDATORY_BIOMETRICS Bug: 339910718 Test: atest UtilsTest Change-Id: I953b56e9bfd1edd49d080124905d42a23247b7a7 --- src/com/android/settings/MainClear.java | 7 +++- src/com/android/settings/Utils.java | 23 ++++++----- .../combination/BiometricsSettingsBase.java | 10 +++-- .../biometrics/face/FaceSettings.java | 6 ++- .../fingerprint/FingerprintSettings.java | 12 ++++-- .../settings/password/ChooseLockGeneric.java | 5 ++- .../com/android/settings/MainClearTest.java | 8 ++-- .../src/com/android/settings/UtilsTest.java | 40 ++++++++++++++----- .../CombinedBiometricProfileSettingsTest.java | 10 ++--- .../FingerprintSettingsFragmentTest.java | 2 +- 10 files changed, 79 insertions(+), 44 deletions(-) diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java index 9d219d783ba..9dadcb9600d 100644 --- a/src/com/android/settings/MainClear.java +++ b/src/com/android/settings/MainClear.java @@ -182,10 +182,13 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis } if (requestCode == KEYGUARD_REQUEST) { + final int userId = getActivity().getUserId(); if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(), false /* biometricsSuccessfullyAuthenticated */, - false /* biometricsAuthenticationRequested */)) { - Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRICS_REQUEST); + false /* biometricsAuthenticationRequested */, + userId)) { + Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRICS_REQUEST, + userId); return; } } diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index e94769ad61a..add5604a617 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -1487,23 +1487,25 @@ public final class Utils extends com.android.settingslib.Utils { /** * Request biometric authentication if all requirements for mandatory biometrics is satisfied. - * @param context of the corresponding activity/fragment + * + * @param context of the corresponding activity/fragment * @param biometricsSuccessfullyAuthenticated if the user has already authenticated using * biometrics - * @param biometricsAuthenticationRequested if the activity/fragment has already requested for - * biometric prompt + * @param biometricsAuthenticationRequested if the activity/fragment has already requested for + * biometric prompt + * @param userId user id for the authentication request * @return true if all requirements for mandatory biometrics is satisfied */ public static boolean requestBiometricAuthenticationForMandatoryBiometrics( @NonNull Context context, boolean biometricsSuccessfullyAuthenticated, - boolean biometricsAuthenticationRequested) { + boolean biometricsAuthenticationRequested, int userId) { final BiometricManager biometricManager = context.getSystemService(BiometricManager.class); if (biometricManager == null) { Log.e(TAG, "Biometric Manager is null."); return false; } - final int status = biometricManager.canAuthenticate( + final int status = biometricManager.canAuthenticate(userId, BiometricManager.Authenticators.MANDATORY_BIOMETRICS); return android.hardware.biometrics.Flags.mandatoryBiometrics() && status == BiometricManager.BIOMETRIC_SUCCESS @@ -1513,15 +1515,16 @@ public final class Utils extends com.android.settingslib.Utils { /** * Launch biometric prompt for mandatory biometrics. Call - * {@link #requestBiometricAuthenticationForMandatoryBiometrics(Context, boolean, boolean)} + * {@link #requestBiometricAuthenticationForMandatoryBiometrics(Context, boolean, boolean, int)} * to check if all requirements for mandatory biometrics is satisfied * before launching biometric prompt. * - * @param fragment corresponding fragment of the surface + * @param fragment corresponding fragment of the surface * @param requestCode for starting the new activity + * @param userId user id for the authentication request */ public static void launchBiometricPromptForMandatoryBiometrics(@NonNull Fragment fragment, - int requestCode) { + int requestCode, int userId) { final Intent intent = new Intent(); intent.putExtra(BIOMETRIC_PROMPT_AUTHENTICATORS, BiometricManager.Authenticators.MANDATORY_BIOMETRICS); @@ -1529,8 +1532,10 @@ public final class Utils extends com.android.settingslib.Utils { fragment.getString(R.string.cancel)); intent.putExtra(KeyguardManager.EXTRA_DESCRIPTION, fragment.getString(R.string.mandatory_biometrics_prompt_description)); + intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_ALLOW_ANY_USER, true); + intent.putExtra(EXTRA_USER_ID, userId); intent.setClassName(SETTINGS_PACKAGE_NAME, - ConfirmDeviceCredentialActivity.class.getName()); + ConfirmDeviceCredentialActivity.InternalActivity.class.getName()); fragment.startActivityForResult(intent, requestCode); } diff --git a/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java b/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java index b9a0b939a6b..835f3a87d68 100644 --- a/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java +++ b/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java @@ -144,9 +144,10 @@ public abstract class BiometricsSettingsBase extends DashboardFragment { launchChooseOrConfirmLock(); } else if (Utils.requestBiometricAuthenticationForMandatoryBiometrics( getActivity(), mBiometricsSuccessfullyAuthenticated, - mBiometricsAuthenticationRequested)) { + mBiometricsAuthenticationRequested, mUserId)) { mBiometricsAuthenticationRequested = true; - Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST); + Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST, + mUserId); } updateUnlockPhonePreferenceSummary(); @@ -161,10 +162,11 @@ public abstract class BiometricsSettingsBase extends DashboardFragment { public void onResume() { super.onResume(); if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(), - mBiometricsSuccessfullyAuthenticated, mBiometricsAuthenticationRequested) + mBiometricsSuccessfullyAuthenticated, mBiometricsAuthenticationRequested, mUserId) && mGkPwHandle != 0L) { mBiometricsAuthenticationRequested = true; - Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST); + Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST, + mUserId); } if (!mConfirmCredential) { mDoNotFinishActivity = false; diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java index 2a0dd83a491..305d6703cfe 100644 --- a/src/com/android/settings/biometrics/face/FaceSettings.java +++ b/src/com/android/settings/biometrics/face/FaceSettings.java @@ -289,9 +289,11 @@ public class FaceSettings extends DashboardFragment { finish(); } } else if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(), - mBiometricsSuccessfullyAuthenticated, mBiometricsAuthenticationRequested)) { + mBiometricsSuccessfullyAuthenticated, mBiometricsAuthenticationRequested, + mUserId)) { mBiometricsAuthenticationRequested = true; - Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST); + Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST, + mUserId); } else { mAttentionController.setToken(mToken); mEnrollController.setToken(mToken); diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index c4bbcdeea07..815c08e0de1 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -485,9 +485,11 @@ public class FingerprintSettings extends SubSettings { mLaunchedConfirm = true; launchChooseOrConfirmLock(); } else if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(), - mBiometricsSuccessfullyAuthenticated, mBiometricsAuthenticationRequested)) { + mBiometricsSuccessfullyAuthenticated, mBiometricsAuthenticationRequested, + mUserId)) { mBiometricsAuthenticationRequested = true; - Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST); + Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST, + mUserId); } else if (!mHasFirstEnrolled) { mIsEnrolling = true; addFirstFingerprint(null); @@ -777,9 +779,11 @@ public class FingerprintSettings extends SubSettings { .getUdfpsEnrollCalibrator(getActivity().getApplicationContext(), null, null); if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(), - mBiometricsSuccessfullyAuthenticated, mBiometricsAuthenticationRequested)) { + mBiometricsSuccessfullyAuthenticated, mBiometricsAuthenticationRequested, + mUserId)) { mBiometricsAuthenticationRequested = true; - Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST); + Utils.launchBiometricPromptForMandatoryBiometrics(this, + BIOMETRIC_AUTH_REQUEST, mUserId); } } diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index b4f13e8d77b..d5d079ecf6d 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -492,9 +492,10 @@ public class ChooseLockGeneric extends SettingsActivity { : null; updatePreferencesOrFinish(false /* isRecreatingActivity */); if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getContext(), - mBiometricsAuthSuccessful, mWaitingForConfirmation)) { + mBiometricsAuthSuccessful, mWaitingForConfirmation, mUserId)) { mWaitingForConfirmation = true; - Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST); + Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST, + mUserId); } } else if (requestCode == BIOMETRIC_AUTH_REQUEST) { if (resultCode == Activity.RESULT_OK) { diff --git a/tests/robotests/src/com/android/settings/MainClearTest.java b/tests/robotests/src/com/android/settings/MainClearTest.java index 187fce113f9..26a430b161c 100644 --- a/tests/robotests/src/com/android/settings/MainClearTest.java +++ b/tests/robotests/src/com/android/settings/MainClearTest.java @@ -140,8 +140,8 @@ public class MainClearTest { when(mScrollView.getChildCount()).thenReturn(1); doReturn(mMockActivity).when(mMainClear).getActivity(); when(mMockActivity.getSystemService(BiometricManager.class)).thenReturn(mBiometricManager); - when(mBiometricManager.canAuthenticate( - BiometricManager.Authenticators.MANDATORY_BIOMETRICS)) + when(mBiometricManager.canAuthenticate(anyInt(), + eq(BiometricManager.Authenticators.MANDATORY_BIOMETRICS))) .thenReturn(BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE); } @@ -370,8 +370,8 @@ public class MainClearTest { when(mContext.getResources()).thenReturn(mResources); when(mMockActivity.getSystemService(BiometricManager.class)).thenReturn(mBiometricManager); when(mResources.getString(anyInt())).thenReturn(TEST_ACCOUNT_NAME); - when(mBiometricManager.canAuthenticate( - BiometricManager.Authenticators.MANDATORY_BIOMETRICS)) + when(mBiometricManager.canAuthenticate(anyInt(), + eq(BiometricManager.Authenticators.MANDATORY_BIOMETRICS))) .thenReturn(BiometricManager.BIOMETRIC_SUCCESS); doReturn(true).when(mMainClear).isValidRequestCode(eq(MainClear.KEYGUARD_REQUEST)); doNothing().when(mMainClear).startActivityForResult(any(), anyInt()); diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java index fd97b78d2ec..b36e9d63e32 100644 --- a/tests/robotests/src/com/android/settings/UtilsTest.java +++ b/tests/robotests/src/com/android/settings/UtilsTest.java @@ -81,6 +81,7 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import com.android.internal.widget.LockPatternUtils; +import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.ConfirmDeviceCredentialActivity; import com.android.settings.testutils.shadow.ShadowLockPatternUtils; @@ -532,31 +533,45 @@ public class UtilsTest { when(mContext.getSystemService(BiometricManager.class)).thenReturn(null); assertThat(Utils.requestBiometricAuthenticationForMandatoryBiometrics(mContext, false /* biometricsSuccessfullyAuthenticated */, - false /* biometricsAuthenticationRequested */)).isFalse(); + false /* biometricsAuthenticationRequested */, USER_ID)).isFalse(); } @Test @EnableFlags(Flags.FLAG_MANDATORY_BIOMETRICS) public void testRequestBiometricAuthentication_biometricManagerReturnsSuccess_shouldReturnTrue() { - when(mBiometricManager.canAuthenticate( + when(mBiometricManager.canAuthenticate(USER_ID, BiometricManager.Authenticators.MANDATORY_BIOMETRICS)) .thenReturn(BiometricManager.BIOMETRIC_SUCCESS); - boolean requestBiometricAuthenticationForMandatoryBiometrics = + final boolean requestBiometricAuthenticationForMandatoryBiometrics = Utils.requestBiometricAuthenticationForMandatoryBiometrics(mContext, - true /* biometricsSuccessfullyAuthenticated */, - false /* biometricsAuthenticationRequested */); - assertThat(requestBiometricAuthenticationForMandatoryBiometrics).isFalse(); + false /* biometricsSuccessfullyAuthenticated */, + false /* biometricsAuthenticationRequested */, USER_ID); + assertThat(requestBiometricAuthenticationForMandatoryBiometrics).isTrue(); } @Test @EnableFlags(Flags.FLAG_MANDATORY_BIOMETRICS) public void testRequestBiometricAuthentication_biometricManagerReturnsError_shouldReturnFalse() { - when(mBiometricManager.canAuthenticate( - BiometricManager.Authenticators.MANDATORY_BIOMETRICS)) + when(mBiometricManager.canAuthenticate(anyInt(), + eq(BiometricManager.Authenticators.MANDATORY_BIOMETRICS))) .thenReturn(BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE); assertThat(Utils.requestBiometricAuthenticationForMandatoryBiometrics(mContext, false /* biometricsSuccessfullyAuthenticated */, - false /* biometricsAuthenticationRequested */)).isFalse(); + false /* biometricsAuthenticationRequested */, USER_ID)).isFalse(); + } + + @Test + @EnableFlags(Flags.FLAG_MANDATORY_BIOMETRICS) + public void testRequestBiometricAuthentication_biometricManagerReturnsSuccessForDifferentUser_shouldReturnFalse() { + when(mBiometricManager.canAuthenticate(anyInt(), + eq(BiometricManager.Authenticators.MANDATORY_BIOMETRICS))) + .thenReturn(BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE); + when(mBiometricManager.canAuthenticate(0 /* userId */, + BiometricManager.Authenticators.MANDATORY_BIOMETRICS)) + .thenReturn(BiometricManager.BIOMETRIC_SUCCESS); + assertThat(Utils.requestBiometricAuthenticationForMandatoryBiometrics(mContext, + false /* biometricsSuccessfullyAuthenticated */, + false /* biometricsAuthenticationRequested */, USER_ID)).isFalse(); } @Test @@ -566,7 +581,7 @@ public class UtilsTest { final int requestCode = 1; final ArgumentCaptor intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class); - Utils.launchBiometricPromptForMandatoryBiometrics(mFragment, requestCode); + Utils.launchBiometricPromptForMandatoryBiometrics(mFragment, requestCode, USER_ID); verify(mFragment).startActivityForResult(intentArgumentCaptor.capture(), eq(requestCode)); @@ -576,9 +591,12 @@ public class UtilsTest { BiometricManager.Authenticators.MANDATORY_BIOMETRICS); assertThat(intent.getExtra(BIOMETRIC_PROMPT_NEGATIVE_BUTTON_TEXT)).isNotNull(); assertThat(intent.getExtra(KeyguardManager.EXTRA_DESCRIPTION)).isNotNull(); + assertThat(intent.getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_ALLOW_ANY_USER, false)) + .isTrue(); + assertThat(intent.getIntExtra(Intent.EXTRA_USER_ID, 0)).isEqualTo(USER_ID); assertThat(intent.getComponent().getPackageName()).isEqualTo(SETTINGS_PACKAGE_NAME); assertThat(intent.getComponent().getClassName()).isEqualTo( - ConfirmDeviceCredentialActivity.class.getName()); + ConfirmDeviceCredentialActivity.InternalActivity.class.getName()); } private void setUpForConfirmCredentialString(boolean isEffectiveUserManagedProfile) { diff --git a/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java b/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java index a775731df59..4f8860e8832 100644 --- a/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java @@ -127,8 +127,8 @@ public class CombinedBiometricProfileSettingsTest { mFragment = spy(new TestCombinedBiometricProfileSettings(mContext)); doReturn(mActivity).when(mFragment).getActivity(); doReturn(mBiometricManager).when(mActivity).getSystemService(BiometricManager.class); - when(mBiometricManager.canAuthenticate( - BiometricManager.Authenticators.MANDATORY_BIOMETRICS)) + when(mBiometricManager.canAuthenticate(anyInt(), + eq(BiometricManager.Authenticators.MANDATORY_BIOMETRICS))) .thenReturn(BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE); ReflectionHelpers.setField(mFragment, "mDashboardFeatureProvider", @@ -181,8 +181,8 @@ public class CombinedBiometricProfileSettingsTest { public void testLaunchBiometricPrompt_onCreateFragment() { ArgumentCaptor intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class); doNothing().when(mFragment).startActivityForResult(any(), anyInt()); - when(mBiometricManager.canAuthenticate( - BiometricManager.Authenticators.MANDATORY_BIOMETRICS)) + when(mBiometricManager.canAuthenticate(anyInt(), + eq(BiometricManager.Authenticators.MANDATORY_BIOMETRICS))) .thenReturn(BiometricManager.BIOMETRIC_SUCCESS); mFragment.onAttach(mContext); @@ -193,7 +193,7 @@ public class CombinedBiometricProfileSettingsTest { Intent intent = intentArgumentCaptor.getValue(); assertThat(intent.getComponent().getClassName()).isEqualTo( - ConfirmDeviceCredentialActivity.class.getName()); + ConfirmDeviceCredentialActivity.InternalActivity.class.getName()); } @Test diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java index a34b6de5335..29b29614133 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java @@ -176,7 +176,7 @@ public class FingerprintSettingsFragmentTest { Intent intent = intentArgumentCaptor.getValue(); assertThat(intent.getComponent().getClassName()).isEqualTo( - ConfirmDeviceCredentialActivity.class.getName()); + ConfirmDeviceCredentialActivity.InternalActivity.class.getName()); } // Test the case when FingerprintAuthenticateSidecar receives an error callback from the From 6a8dff19acd15e8f52f1162b58dcd8707cda31af Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 Jul 2024 21:14:33 -0700 Subject: [PATCH 13/19] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ic7a3ed2076e279e5b23f5f069a95381ca70e0ccb --- res/values-es-rUS/arrays.xml | 6 +++--- res/values-kk/arrays.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/res/values-es-rUS/arrays.xml b/res/values-es-rUS/arrays.xml index a23b02680fb..4c679758748 100644 --- a/res/values-es-rUS/arrays.xml +++ b/res/values-es-rUS/arrays.xml @@ -360,10 +360,10 @@ "Manual" - "Desconectado" + "Desconectada" "Iniciando..." "Conectando..." - "Conectado" + "Conectada" "Tiempo de espera agotado" "Incorrecta" @@ -413,7 +413,7 @@ "Desactivado" - "Depurado" + "Depuración" "Detallado" diff --git a/res/values-kk/arrays.xml b/res/values-kk/arrays.xml index 3b04bed36a9..d08ae5becbc 100644 --- a/res/values-kk/arrays.xml +++ b/res/values-kk/arrays.xml @@ -58,7 +58,7 @@ "Ажыратуда…" "Ажыратылған" "Сәтсіз" - "Бөгелген" + "Блокталған" "Нашар байланысты уақытша қолданбау" From 6ac305bdc57c4befcdb5cd0c7576608a561b9711 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 Jul 2024 21:15:58 -0700 Subject: [PATCH 14/19] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I781749a47677cef224c9aa79c1333374a2e86fe8 --- res/values-ar/strings.xml | 60 +++++++++++++++++------------------ res/values-bn/strings.xml | 2 +- res/values-es-rUS/strings.xml | 56 ++++++++++++++++---------------- res/values-es/strings.xml | 56 ++++++++++++++++---------------- res/values-eu/strings.xml | 4 +-- res/values-fr-rCA/strings.xml | 58 ++++++++++++++++----------------- res/values-fr/strings.xml | 2 +- res/values-it/strings.xml | 48 ++++++++++++++-------------- res/values-lv/strings.xml | 2 +- res/values-or/strings.xml | 4 +-- res/values-th/strings.xml | 2 +- 11 files changed, 147 insertions(+), 147 deletions(-) diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 5e4e5f8a4ba..8bacde63250 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -267,14 +267,14 @@ "أمان التطبيقات، وقَفل الجهاز، والأذونات" "تمت إضافة وجه" "يجب إعداد الميزة" - "فتح الجهاز بالتعرف على الوجه" - "فتح قفل ملف العمل بالتعرّف على الوجه" - "كيفية إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" - "إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" + "فتح الجهاز ببصمة الوجه" + "فتح قفل ملف العمل ببصمة الوجه" + "كيفية إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" + "إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" "استخدام وجهك للمصادقة" "بدء" - "‏إذا تم إيقاف ميزة \"فتح الجهاز بالتعرف على الوجه\" السهلة الاستخدام، قد لا تعمل بعض خطوات الإعداد بشكل سليم باستخدام TalkBack." + "‏إذا تم إيقاف ميزة \"فتح الجهاز ببصمة الوجه\" السهلة الاستخدام، قد لا تعمل بعض خطوات الإعداد بشكل سليم باستخدام TalkBack." "رجوع" "مواصلة الإعداد" "استخدام إعدادات \"سهولة الاستخدام\"" @@ -285,7 +285,7 @@ "أوافق" "المزيد" "فتح القفل باستخدام وجهك" - "السماح بـ \"فتح الجهاز بالتعرف على الوجه\"" + "السماح بـ \"فتح الجهاز ببصمة الوجه\"" "استخدام وجهك للمصادقة" "يمكنك استخدام وجهك لفتح الهاتف أو الموافقة على عمليات الشراء.\n\nملاحظة: لا يمكنك استخدام وجهك لفتح هذا الجهاز. للحصول على المزيد من المعلومات، اتصل بمشرف المؤسسة." "استخدِم وجهك لفتح هاتفك أو السماح بعمليات الشراء أو تسجيل الدخول إلى التطبيقات." @@ -305,25 +305,25 @@ "تعذّر مسح الوجه." "اكتمل التسجيل بنجاح." "تم" - "تحسين أداء ميزة \"فتح الجهاز بالتعرف على الوجه\"" - "إعادة إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" - "إعادة إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" + "تحسين أداء ميزة \"فتح الجهاز ببصمة الوجه\"" + "إعادة إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" + "إعادة إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" "تحسين الأمان ومستوى الأداء" - "إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" - "يمكنك حذف نموذج الوجه الحالي لإعادة إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\".\n\nسيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد الحذف، ستحتاج إلى رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل الهاتف أو للمصادقة في التطبيقات." - "يمكنك حذف نموذج الوجه الحالي لإعادة إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\".\n\nسيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد الحذف، ستحتاج إلى بصمة الإصبع أو رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل الهاتف أو للمصادقة في التطبيقات." - "استخدام \"فتح الجهاز بالتعرف على الوجه\" من أجل" - "عند استخدام ميزة \"فتح الجهاز بالتعرف على الوجه\"" + "إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" + "يمكنك حذف نموذج الوجه الحالي لإعادة إعداد ميزة \"فتح الجهاز ببصمة الوجه\".\n\nسيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد الحذف، ستحتاج إلى رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل الهاتف أو للمصادقة في التطبيقات." + "يمكنك حذف نموذج الوجه الحالي لإعادة إعداد ميزة \"فتح الجهاز ببصمة الوجه\".\n\nسيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد الحذف، ستحتاج إلى بصمة الإصبع أو رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل الهاتف أو للمصادقة في التطبيقات." + "استخدام \"فتح الجهاز ببصمة الوجه\" من أجل" + "عند استخدام ميزة \"فتح الجهاز ببصمة الوجه\"" "مطلوب فتح العينين" "يتطلب فتح قفل الهاتف النظر إليه بعينين مفتوحتين." "طلب التأكيد دائمًا" - "طلب خطوة تأكيد دائمًا عند استخدام \"فتح الجهاز بالتعرف على الوجه\" في التطبيقات" + "طلب خطوة تأكيد دائمًا عند استخدام \"فتح الجهاز ببصمة الوجه\" في التطبيقات" "حذف نموذج الوجه" - "إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" + "إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" "هل تريد حذف نموذج الوجه؟" "سيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد حذفه، ستحتاج إلى رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل هاتفك أو لعمليات المصادقة في التطبيقات." "سيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد حذفه، ستحتاج إلى رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل الهاتف." - "استخدام ميزة \"فتح الجهاز بالتعرف على الوجه\" لفتح قفل هاتفك" + "استخدام ميزة \"فتح الجهاز ببصمة الوجه\" لفتح قفل هاتفك" "بصمة الإصبع" "بصمة الإصبع" "عند استخدام ميزة \"فتح الجهاز ببصمة الإصبع\"" @@ -353,7 +353,7 @@ "‏للحصول على أفضل النتائج، استخدم واقي شاشة مُعتمَد ويحمل شعار Made for Google. قد لا تعمل بصمة إصبع طفلك مع واقيات الشاشة الأخرى." "فتح الهاتف من الساعة" - "في حال إعداد ميزتَي \"فتح الجهاز بالتعرف على الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الهاتف إدخال بصمة إصبعك عندما تكون في منطقة مظلمة أو ترتدي كمّامة.\n\nيمكنك فتح الهاتف من ساعتك عندما لا يتم التعرف على وجهك أو بصمة إصبعك." + "في حال إعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الهاتف إدخال بصمة إصبعك عندما تكون في منطقة مظلمة أو ترتدي كمّامة.\n\nيمكنك فتح الهاتف من ساعتك عندما لا يتم التعرف على وجهك أو بصمة إصبعك." "يمكنك فتح الجهاز من ساعتك عندما لا يتم التعرف على بصمة إصبعك." "يمكنك فتح الجهاز من ساعتك عندما لا يتم التعرف على وجهك." "استخدام بصمة الإصبع أو الساعة من أجل" @@ -364,11 +364,11 @@ "استخدام بصمة الإصبع أو الساعة" "استخدام الوجه أو بصمة الإصبع أو الساعة" "استخدام الساعة" - "إعداد ميزتَي فتح الجهاز بالتعرف على الوجه أو بصمة إصبع أولاً" + "إعداد ميزتَي فتح الجهاز ببصمة الوجه أو بصمة إصبع أولاً" "يمكنك فتح الجهاز باستخدام ساعتك عندما لا يتم التعرف على وجهك أو بصمة إصبعك." "يجب إعداد ميزة \"فتح الجهاز ببصمة الإصبع\" أولاً" "يمكنك فتح الهاتف من ساعتك عندما لا يتم التعرف على بصمة الإصبع." - "يجب إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\" أولاً" + "يجب إعداد ميزة \"فتح الجهاز ببصمة الوجه\" أولاً" "يمكنك فتح الهاتف من ساعتك عندما لا يتم التعرف على وجهك." "الإعداد" "تمت إضافة بصمة إصبع و\"%s\"." @@ -376,12 +376,12 @@ "تمت إضافة وجه و\"%s\"." "تمت إضافة وجه وبصمة إصبع و\"%s\"." "تمت إضافة وجه وبصمات أصابع و\"%s\"." - "فتح الجهاز بالتعرف على الوجه وببصمة الإصبع" - "فتح قفل ملف العمل ببصمة الإصبع وبالتعرف على الوجه" + "فتح الجهاز ببصمة الوجه وببصمة الإصبع" + "فتح قفل ملف العمل ببصمة الإصبع وببصمة الوجه" "يجب ضبط الإعدادات" "تمت إضافة وجه وبصمات أصابع." "تمت إضافة وجه وبصمة إصبع" - "في حال إعداد ميزتَي \"فتح الجهاز بالتعرف على الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الهاتف إدخال بصمة إصبعك عندما تكون في منطقة مظلمة أو ترتدي كمّامة." + "في حال إعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الهاتف إدخال بصمة إصبعك عندما تكون في منطقة مظلمة أو ترتدي كمّامة." "طرق فتح القفل" "استخدام الوجه أو بصمة الإصبع من أجل:" "فتح قفل الهاتف" @@ -390,8 +390,8 @@ "باستخدام بصمة الإصبع" "باستخدام الوجه أو بصمة الإصبع" "حسنًا" - "هل يتعذّر إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"؟" - "أغلِق وضع تقسيم الشاشة لإعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"." + "هل يتعذّر إعداد ميزة \"فتح الجهاز ببصمة الوجه\"؟" + "أغلِق وضع تقسيم الشاشة لإعداد ميزة \"فتح الجهاز ببصمة الوجه\"." "يتعذّر إعداد بصمة الإصبع" "أغلِق وضع تقسيم الشاشة لإعداد ميزة \"فتح الجهاز ببصمة الإصبع\"." "حسنًا" @@ -532,7 +532,7 @@ "النقش• الوجه" "رقم التعريف الشخصي • الوجه" "كلمة المرور • الوجه" - "المتابعة بدون إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" + "المتابعة بدون إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" "النقش • الوجه • بصمة الإصبع" "رقم التعريف الشخصي • الوجه • بصمة الإصبع" "كلمة المرور • الوجه • بصمة الإصبع" @@ -1425,9 +1425,9 @@ "تم ضبط كلمة المرور" "‏تم ضبط رمز PIN" "تم ضبط النقش" - "ضبط كلمة مرور لاستخدام \"فتح الجهاز بالتعرف على الوجه\"" - "ضبط نقش لاستخدام \"فتح الجهاز بالتعرف على الوجه\"" - "‏ضبط رقم PIN لاستخدام \"فتح الجهاز بالتعرف على الوجه\"" + "ضبط كلمة مرور لاستخدام \"فتح الجهاز ببصمة الوجه\"" + "ضبط نقش لاستخدام \"فتح الجهاز ببصمة الوجه\"" + "‏ضبط رقم PIN لاستخدام \"فتح الجهاز ببصمة الوجه\"" "يجب ضبط كلمة مرور لفتح جهازك ببصمة إصبع أو بالتعرف على الوجه" "يجب ضبط نقش لفتح جهازك ببصمة الإصبع أو بالتعرف على الوجه" "‏يجب ضبط رقم PIN لفتح جهازك ببصمة الإصبع أو بالتعرف على الوجه" @@ -3264,7 +3264,7 @@ "‏الرسائل القصيرة SMS والرسائل النصية والاتصالات الأخرى" "الإشعارات" "يمكن إصدار رنين أو اهتزاز بناءً على الإعدادات" - "صامت" + "الوضع الصامت" "الإشعارات التي لا تصدِر صوتًا أو اهتزازًا مطلقًا" "التطبيقات المسموح لها" "التطبيقات غير المسموح لها" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index a7eb16929de..c2cc0802300 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -2631,7 +2631,7 @@ "সর্বদা-চালু VPN এর সার্ভার্র এবং DNS উভয়েরই জন্য আইপি অ্যাড্রেস প্রয়োজন।" "কোনো নেটওয়ার্ক কানেকশন নেই। দয়া করে পরে আবার চেষ্টা করুন।" "VPN থেকে ডিসকানেক্ট হয়েছে" - "কোনো কিছুই নয়" + "কোনওটাই নয়" "একটি সার্টিফিকেট পাওয়া যাচ্ছে না। প্রোফাইলটি সম্পাদনা করুন।" "সিস্টেম" "ব্যবহারকারী" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 8b4c47fe885..c4bd550645f 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -24,9 +24,9 @@ "Activar" "Desconocido" "Presiona para obtener más información" - "{count,plural, =1{Ahora estás a # paso de activar las opciones para desarrolladores}other{Ahora estás a # pasos de activar las opciones para desarrolladores}}" + "{count,plural, =1{Ahora estás a # paso de activar las opciones para desarrolladores.}other{Ahora estás a # pasos de activar las opciones para desarrolladores.}}" "¡Ya eres desarrollador!" - "No es necesario, ya eres desarrollador." + "No es necesario. Ya eres desarrollador." "Primero habilita las opciones para programador." "Sistema" "En servicio" @@ -336,7 +336,7 @@ "Usa tus huellas dactilares" "Más información sobre Desbloqueo con huellas dactilares" "Tú tienes el control" - "Tanto tú como tu hijo tienen el control" + "Tanto tú como tu hijo o hija tienen el control" "Para tener en cuenta" "Usa tu huella dactilar para desbloquear el teléfono o aprobar compras.\n\nNota: No puedes usar tu huella dactilar para desbloquear este dispositivo. Para obtener más información, comunícate con el administrador de la organización." "Cancelar" @@ -365,7 +365,7 @@ "Con rostro, huella dactilar o reloj" "Con reloj" "Primero configura Desbloqueo facial o con huellas dactilares" - "Puedes usar el reloj para desbloquear el dispositivo cuando no se reconozcan tu rostro ni tu huella dactilar." + "Puedes desbloquear con el reloj cuando no se reconozcan tu rostro ni tu huella dactilar" "Primero configura Desbloqueo con huellas dactilares" "Puedes desbloquear con el reloj cuando no se reconozca tu huella dactilar" "Primero configura Desbloqueo facial" @@ -601,7 +601,7 @@ "Si ingresas un PIN incorrecto en el próximo intento, se borrarán tu perfil de trabajo y sus datos" "Si ingresas una contraseña incorrecta en el próximo intento, se borrarán tu perfil de trabajo y sus datos" "{count,plural, =1{Debe tener al menos # carácter}other{Debe tener al menos # caracteres}}" - "{count,plural, =1{Si solo se usan números, debe ser de al menos 1 dígito}other{Si solo se usan números, deben ser de al menos # dígitos}}" + "{count,plural, =1{Si solo se usan números, debe ser de al menos 1 dígito}other{Si solo se usan números, debe ser de al menos # dígitos}}" "{count,plural, =1{El PIN debe tener al menos # dígito}other{El PIN debe tener al menos # dígitos}}" "{count,plural, =1{El PIN debe tener al menos # dígito, pero se recomienda un PIN de {minAutoConfirmLen} dígitos para mayor seguridad}other{El PIN debe tener al menos # dígitos, pero se recomienda un PIN de {minAutoConfirmLen} dígitos para mayor seguridad}}" "{count,plural, =1{Debe tener menos de # carácter}other{Debe tener menos de # caracteres}}" @@ -614,7 +614,7 @@ "{count,plural, =1{Debe tener al menos 1 dígito numérico}other{Debe tener al menos # dígitos numéricos}}" "{count,plural, =1{Debe tener al menos 1 símbolo especial}other{Debe tener al menos # símbolos especiales}}" "{count,plural, =1{Debe tener al menos 1 carácter que no sea una letra}other{Debe tener al menos # caracteres que no sean letras}}" - "{count,plural, =1{Debe tener al menos 1 carácter no numérico}other{Debe tener al menos # caracteres no numéricos}}" + "{count,plural, =1{Debe tener al menos 1 carácter no numérico}other{Debe tener al menos # de caracteres no numéricos}}" "El administrador del dispositivo no permite el uso de contraseñas recientes" "No se permiten secuencias de dígitos ascendentes, descendentes ni repetidas" "Confirmar" @@ -980,7 +980,7 @@ "Seleccionada" "Colores" "Naturales" - "Mejorados" + "Potenciado" "Saturados" "Automáticos" "Nivel de brillo" @@ -1187,10 +1187,10 @@ "Formateando dispositivo (^1)…" "No extraigas ^1 durante el proceso de formateo." "Formateo de ^1" - "Transferir la aplicación ^1" + "Mover ^1" "Transferir la aplicación ^1 y los datos relacionados al dispositivo ^2 solo demorará un momento. Hasta que no se complete la transferencia, no podrás usar la aplicación. \n\nNo extraigas el dispositivo ^2 durante el proceso." "Para transferir datos, debes desbloquear al usuario ^1." - "Transfiriendo la aplicación ^1…" + "Transfiriendo ^1…" "Durante el proceso, no extraigas el dispositivo ^1. \n\nLa aplicación ^2 estará disponible en este dispositivo cuando se complete el proceso." "¿Cómo usarás ^1?" "O bien" @@ -1200,7 +1200,7 @@ "Configurar más tarde" "¿Quieres formatear ^1?" "Debes formatear ^1 para poder almacenar apps, archivos y contenido multimedia. \n\nEl formateo borrará todo el contenido existente en ^2. Para no perderlo, crea una copia de seguridad en otro dispositivo (como ^3)." - "Debe formatearse ste dispositivo (^1) para almacenar fotos, videos, música y mucho más. \n\nCuando lo formatees, se borrará todo el contenido existente en ^2. Para no perder el contenido, crea una copia de seguridad en otro dispositivo (^3 u otros)." + "Este dispositivo (^1) debe formatearse para que pueda almacenar fotos, videos, música y mucho más. \n\nAl formatear, se borrará todo el contenido existente en la ^2. Para no perder el contenido, crea una copia de seguridad en una ^3 distinta o en otro dispositivo." "Formatear ^1" "¿Transferir el contenido a ^1?" "Durante la transferencia:" @@ -1677,7 +1677,7 @@ "Personaliza los gestos de navegación del panel táctil" "Invertir desplazamiento" "El contenido sube cuando te desplazas hacia abajo" - "Toque en la parte inferior derecha" + "Toque de la parte inferior derecha" "Más opciones en la esquina inferior derecha del panel táctil" "Velocidad del puntero" "Aprende los gestos del panel táctil" @@ -2005,7 +2005,7 @@ "Vincula los audífonos" "En la siguiente pantalla, presiona tus audífonos. Es posible que debas vincular el audífono izquierdo y el derecho por separado.\n\nAsegúrate de que los audífonos estén encendidos y listos para la vinculación." "%1$s activo" - "%1$s, solo izquierdo" + "%1$s, solo el izquierdo" "%1$s, solo el derecho" "%1$s, izquierdo y derecho" "Más de 1 %1$s" @@ -2608,8 +2608,8 @@ "¿Configurar la VPN siempre activa?" "Si activas esta opción de configuración, no tendrás conexión a Internet hasta que se conecte la VPN" "Se reemplazará la VPN actual y no tendrás conexión a Internet hasta que se conecte la nueva VPN" - "Ya estás conectado a una VPN siempre activa. Si te conectas a otra, se reemplazará la VPN actual y se desactivará el modo siempre activo." - "Ya estás conectado a una VPN. Si te conectas a otra, se reemplazará la VPN actual." + "Ya estableciste conexión con una VPN siempre activa. Si te conectas a otra, se reemplazará la VPN actual y se desactivará el modo siempre activo." + "Ya te conectaste a una VPN. Si te conectas a otra, se reemplazará la VPN actual." "Activar" "No se puede establecer conexión con %1$s" "Esta app no es compatible con VPN siempre activada" @@ -2619,14 +2619,14 @@ "Borrar perfil" "VPN siempre activada" "No se agregó ninguna VPN" - "Mantente siempre conectado a una VPN" + "Mantén siempre conexión a la VPN" "La opción no es compatible con esta app" "Siempre activada" "No es segura" "Bloquear conexiones sin VPN" "¿Requerir una conexión VPN?" "La VPN no es segura. Actualiza a una VPN IKEv2." - "Selecciona el perfil de la VPN con la que deseas establecer una conexión ininterrumpida. El tráfico de red solo se permitirá cuando estés conectado a esta VPN." + "Selecciona el perfil de la VPN con la que deseas establecer una conexión ininterrumpida. El tráfico de red solo se permitirá cuando tengas conexión a esta VPN." "Ninguna" "La VPN siempre activada requiere una dirección IP tanto para el servidor como para el DNS." "No hay conexión de red. Inténtalo de nuevo más tarde." @@ -2662,8 +2662,8 @@ "Es posible que la red esté supervisada" "Listo" "{count,plural, =1{Confiar en el certificado o quitarlo}other{Confiar en los certificados o quitarlos}}" - "{numberOfCertificates,plural, =1{{orgName} instaló una autoridad certificadora en tu dispositivo, lo que le permitirá supervisar la actividad de la red del dispositivo, incluidos los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre este certificado, comunícate con tu administrador.}other{{orgName} instaló autoridades certificadoras en tu dispositivo, lo que le permitirá supervisar la actividad de la red del dispositivo, incluidos los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre estos certificados, comunícate con tu administrador.}}" - "{numberOfCertificates,plural, =1{{orgName} instaló una autoridad certificadora para tu perfil de trabajo, lo que le permitirá supervisar la actividad de la red laboral, incluidos los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre este certificado, comunícate con tu administrador.}other{{orgName} instaló autoridades certificadoras para tu perfil de trabajo, lo que les permitirá supervisar la actividad de la red laboral, como los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre estos certificados, comunícate con tu administrador.}}" + "{numberOfCertificates,plural, =1{{orgName} instaló una autoridad certificadora en tu dispositivo, lo que le permitirá supervisar la actividad de red del dispositivo, incluidos los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre este certificado, comunícate con tu administrador.}other{{orgName} instaló autoridades certificadoras en tu dispositivo, lo que le permitirá supervisar la actividad de red del dispositivo, incluidos los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre estos certificados, comunícate con tu administrador.}}" + "{numberOfCertificates,plural, =1{{orgName} instaló una autoridad certificadora para tu perfil de trabajo, lo que le permitirá supervisar la actividad de red laboral, incluidos los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre este certificado, comunícate con tu administrador.}other{{orgName} instaló autoridades certificadoras para tu perfil de trabajo, lo que les permitirá supervisar la actividad de red laboral, como los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre estos certificados, comunícate con tu administrador.}}" "Un tercero puede supervisar tu actividad en la red, incluido el correo electrónico, las aplicaciones y los sitios web seguros.\n\nEsto ocurre porque hay una credencial de confianza instalada en el dispositivo." "{count,plural, =1{Revisar certificado}other{Revisar certificados}}" "Varios usuarios" @@ -2677,11 +2677,11 @@ "Tú (%s)" "No puedes agregar más usuarios. Quita alguno para agregar nuevos." "Los perfiles restringidos no pueden agregar cuentas." - "Borrar a %1$s del disp." + "Borrar a %1$s" "Configuración de la pantalla de bloqueo" "Agregar usuarios desde la pantalla de bloqueo" "Cambiar a usuario administrador cuando se conecte" - "¿Deseas borrarte a ti mismo?" + "¿Quieres borrar tu perfil?" "¿Borrar este usuario?" "¿Eliminar este perfil?" "¿Eliminar perfil de trabajo?" @@ -3010,7 +3010,7 @@ "Sí (%1$s y %2$s)" "También puedes activar el audio espacial para dispositivos Bluetooth." "Parámetros de configuración de dispositivos conectados" - "{count,plural, =0{Ninguno}=1{Se estableció 1 programa}other{Se establecieron # programas}}" + "{count,plural, =0{Ninguno}=1{1 programa establecido}other{# programas establecidos}}" "No interrumpir" "Solo recibe notificaciones de las personas y apps que más te interesan" "Limitar las interrupciones" @@ -3083,7 +3083,7 @@ "Hasta que lo desactives" "{count,plural, =1{1 hora}other{# horas}}" "{count,plural, =1{1 minuto}other{# minutos}}" - "{count,plural, =0{Desactivado}=1{Desactivado/1 programa se puede activar automáticamente}other{Desactivado/# programas se pueden activar automáticamente}}" + "{count,plural, =0{Desactivada}=1{Desactivada/1 programa se puede activar automáticamente}other{Desactivada/# programas se pueden activar automáticamente}}" "Pueden suspender el modo No interrumpir:" "Personas" "Apps" @@ -3470,7 +3470,7 @@ "Al fijar una app, esta se mantiene visible hasta que dejas de fijarla. Esta función se puede utilizar, por ejemplo, para dejar que alguien de confianza juegue un juego específico." "Si fijas una app, esta podrá abrir otras apps y acceder a tus datos personales. \n\nPara usar la fijación de apps, sigue estos pasos: \n1. Activa la fijación de apps. \n2. Abre Recientes. \n3. Presiona el icono de la app que se encuentra en la parte superior de la pantalla y, luego, Fijar." "Si fijas una app, esta podrá abrir otras apps y acceder a tus datos personales. \n\nSi quieres compartir tu dispositivo con alguien de forma segura, usa un perfil de invitado. \n\nPara fijar una app, sigue estos pasos: \n1. Activa fijar apps. \n2. Abre Recientes. \n3. Presiona el icono de la app que se encuentra en la parte superior de la pantalla y, luego, Fijar." - "Cuando fijas una app, puede ocurrir lo siguiente: \n\n• Esta podrá acceder a datos personales (como contactos y contenido de los correos electrónicos). \n•  Es posible que las apps fijadas abran otras apps. \n\nUsa la función para fijar apps solo con personas de confianza.\n" + "Cuando fijas una app, puede ocurrir lo siguiente: \n\n• Esta podrá acceder a datos personales \n (como contactos y contenido de los correos electrónicos) \n• Es posible que la app fijada abra otras apps \n\nUsa la fijación de apps solo con personas de confianza." "Solicitar desbloqueo para quitar fijación" "Solicitar PIN para quitar fijación" "Solicitar contraseña para quitar fijación" @@ -3854,8 +3854,8 @@ "Error al aplicar superposición" "Acceso especial de apps" - %d apps pueden usar datos ilimitados - 1 app puede usar datos ilimitados + %d apps pueden usar datos sin restricción + 1 app puede usar datos sin restricción "Ver más" "Tareas largas en segundo plano" @@ -3990,7 +3990,7 @@ "Registro de tráfico de red más reciente" "Informe de errores más reciente" "Registro de seguridad más reciente" - "Ninguno" + "Ninguna" "Apps instaladas" "La cantidad de apps es aproximada. Es posible que no se cuenten las apps que no hayas instalado desde Play Store." "{count,plural, =1{Al menos # app}other{Al menos # apps}}" @@ -4282,7 +4282,7 @@ "El modo de red no es válido: %1$d. Ignorar." "Nombres de puntos de acceso" "apn" - "No está disponible cuando estás conectado a %1$s" + "No está disponible cuando el dispositivo está conectado a %1$s" "Ver más" "¿Quieres activar %1$s?" "¿Quieres activar la SIM?" @@ -4690,7 +4690,7 @@ "Sensor de huellas dactilares" "Notificaciones con flash" "Info. sobre notificaciones con flash" - "Desactivadas" + "No" "Activado / Flash de la cámara" "Activadas: Flash de la pantalla" "Activadas: Flash de la cámara y pantalla" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 2b334791ca8..91511d7fb68 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -25,7 +25,7 @@ "Desconocido" "Toca para que se muestre la información" "{count,plural, =1{Te queda # paso para habilitar las opciones para desarrolladores.}other{Te quedan # pasos para habilitar las opciones para desarrolladores.}}" - "¡Ahora están activadas las opciones para desarrolladores!" + "¡Ya eres desarrollador!" "Las opciones para desarrolladores ya están activadas." "Habilita primero las opciones para desarrolladores." "Sistema" @@ -246,7 +246,7 @@ "%1$s después de agotarse el tiempo de espera de la pantalla, salvo si %2$s mantiene el dispositivo desbloqueado" "Añadir texto a pantalla de bloqueo" "Ninguno" - "p. ej., Android de Juan" + "P. ej., Android de Juan." "Ubicación" "Usar ubicación" "Desactivado" @@ -348,7 +348,7 @@ "Importante" "Cómo funciona" "Desbloqueo con huella digital crea un modelo único de tu huella digital para verificar que eres tú. Para crear este modelo durante la configuración, se toman imágenes de tu huella en diferentes posiciones." - "Desbloqueo con huella digital crea un modelo único de la huella digital de tu hijo/a para verificar que es él/ella. Para crear este modelo de huella digital durante la configuración, se toman imágenes de su huella desde diferentes posiciones." + "Desbloqueo con Huella Digital crea un modelo único de la huella digital de tu hijo/a para verificar su identidad. Para crear este modelo de huella digital durante la configuración, se toman imágenes de su huella desde diferentes posiciones." "Para obtener mejores resultados, usa un protector de pantalla con certificado Made for Google. Con otros protectores de pantalla, puede que tu huella digital no funcione." "Para obtener mejores resultados, usa un protector de pantalla con certificado Made for Google. Con otros protectores de pantalla, puede que la huella digital de tu hijo/a no funcione." @@ -780,7 +780,7 @@ "Escanea el código QR" "Centra el código QR de abajo para conectarte a \"%1$s\"" "Escanea el código QR para conectarte a la red Wi‑Fi" - "Compartir Wi‑Fi" + "Compartir Wi-Fi" "Escanea este código QR con otro dispositivo para conectarlo a \"%1$s\"" "Escanea este código QR con otro dispositivo para conectarte a \"%1$s\"" "Vuelve a intentarlo. Si el problema persiste, ponte en contacto con el fabricante del dispositivo" @@ -980,9 +980,9 @@ "Seleccionado" "Colores" "Naturales" - "Mejorados" + "Mejorado" "Saturados" - "Adaptativos" + "Adaptativo" "Nivel de brillo" "Brillo adaptativo" "El brillo de la pantalla se ajustará automáticamente según el entorno y lo que hagas. Puedes mover el control deslizante para que la función Brillo adaptativo reconozca tus preferencias." @@ -1269,7 +1269,7 @@ "El Bluetooth y el Wi-Fi se han restablecido" "Borrar" "Borrar eSIMs" - "No se cancelará ningún plan de servicios móviles. Para descargar una tarjeta SIM de sustitución, ponte en contacto con tu operador." + "No se cancelará ningún plan de servicios móviles. Para descargar SIMs de sustitución, ponte en contacto con tu operador." "Restablecer ajustes" "¿Quieres restablecer la configuración de red? No podrás deshacer esta acción." "¿Restablecer todos los ajustes de red y borrar las eSIMs? No podrás deshacer esta acción." @@ -1619,7 +1619,7 @@ "En caché" "%1$s de RAM" "Aplicación en ejecución" - "Inactivos" + "Inactivo" "Servicios" "Procesos" "Detener" @@ -1633,13 +1633,13 @@ "Proveedor %1$s en uso" "¿Quieres detener el servicio del sistema?" "Idiomas, entrada de texto y gestos" - "Idiomas e introducción de texto" + "Idiomas e introducción de texto" "Idiomas" "Teclado" "No tienes permiso para cambiar el idioma del dispositivo." "Idiomas e introd. de texto" "Herramientas" - "Teclado e introducción de texto" + "Teclado y métodos de entrada" "Idiomas del sistema" "Idiomas" @@ -2226,7 +2226,7 @@ "Cargar por completo" "Problema con el accesorio de carga" "Más información sobre la carga con adaptadores incompatibles" - "Gestor de batería" + "Administrador de batería" "Gestionar aplicaciones automáticamente" "Cuando el gestor de batería detecte que las aplicaciones consumen batería, podrás restringirlas, aunque es posible que no funcionen correctamente y las notificaciones se retrasen." "Aplicaciones restringidas" @@ -2408,10 +2408,10 @@ "No se ha podido borrar el almacenamiento de credenciales." "Apps con acceso de uso" "Certificado AC" - "Certificado de usuario" + "Certificado de usuario de VPN y aplicaciones" "Certificado de Wi‑Fi" "Tus datos no serán privados" - "Con los certificados AC, los sitios web, las aplicaciones y las VPNs pueden cifrar datos. Instala solo certificados AC de organizaciones en las que confíes. \n\nSi instalas un certificado AC, su propietario podría acceder a tus datos, como contraseñas o información de tarjetas de crédito, de sitios web que visites o aplicaciones que uses, incluso si tus datos están cifrados." + "Con los certificados AC, los sitios web, las aplicaciones y las VPNs pueden cifrar datos. Instala solo certificados AC de organizaciones en las que confíes. \n\nSi instalas un certificado AC, su propietario podría acceder a datos que hayas introducido en los sitios web que visitas o las aplicaciones que usas, aunque estén cifrados. Por ejemplo, podría tener acceso a contraseñas o a la información de tarjetas de crédito." "No instalar" "Instalar de todas formas" "No se ha instalado el certificado" @@ -2608,8 +2608,8 @@ "¿Configurar el modo de VPN siempre activada?" "Si esta opción está activada, no tendrás acceso a Internet hasta que se conecte la red VPN" "La nueva red VPN sustituirá a la actual y no tendrás acceso a Internet hasta que dicha VPN se conecte" - "Ya estás conectado a una red VPN siempre activada. Si te conectas a otra, esta sustituirá a la VPN actual y se desactivará el modo de VPN siempre activada." - "Ya estás conectado a una red VPN. Si te conectas a otra, esta sustituirá a la VPN actual." + "Ya te has conectado a una red VPN siempre activada. Si te conectas a otra, esta sustituirá a la VPN actual y se desactivará el modo de VPN siempre activada." + "Ya te has conectado a una red VPN. Si te conectas a otra, esta sustituirá a la VPN actual." "Activar" "No se puede conectar a %1$s" "Esta aplicación no es compatible con el modo de VPN siempre activada" @@ -2626,11 +2626,11 @@ "Bloquear conexiones sin VPN" "¿Requerir una conexión VPN?" "No es segura. Cambia a una VPN IKEv2." - "Selecciona un perfil de VPN para permanecer conectado de forma continua. Solo se permitirá el tráfico de red cuando estés conectado a esta red VPN." + "Selecciona un perfil de VPN para mantener la conexión de forma continua. Solo se permitirá el tráfico de red cuando tengas conexión a esta red VPN." "Ninguno" "Las redes VPN activadas continuamente requieren una dirección IP para el servidor y el DNS." "No hay conexión de red. Inténtalo de nuevo más tarde." - "Desconectado de la red VPN" + "Te has desconectado de la VPN" "Ninguna" "Falta un certificado. Prueba a editar el perfil." "Sistema" @@ -2680,7 +2680,7 @@ "Eliminar a %1$s de este dispositivo" "Ajustes de pantalla de bloqueo" "Añadir usuarios desde la pantalla de bloqueo" - "Cambiar a administrador al ponerse en la base" + "Cambiar al usuario administrador al conectarse" "¿Eliminarte a ti mismo?" "¿Eliminar este usuario?" "¿Quitar este perfil?" @@ -2697,7 +2697,7 @@ "Usuarios" "Otros usuarios" "Eliminar actividad de invitado" - "Elimina todas las aplicaciones y datos de la sesión de invitado al salir del modo Invitado" + "Elimina todos los datos y aplicaciones de la sesión de invitado al salir del modo Invitado" "¿Eliminar actividad de invitado?" "Se eliminarán las aplicaciones y datos de esta sesión de invitado ahora, y toda la actividad futura correspondiente se borrará cada vez que salgas del modo Invitado" "eliminar, invitado, actividad, retirar, datos, visitante, borrar" @@ -2707,9 +2707,9 @@ "Convertir a este usuario en administrador" "Eliminar usuario" "¿Activar llamadas y SMS?" - "El historial de SMS y de llamadas se compartirá con este usuario." + "El historial de SMS y de llamadas se compartirán con este usuario." "¿Quitar privilegios de administrador?" - "Si le quitas los privilegios de administrador a este usuario, tanto tú como otro administrador podéis devolvérselos más tarde." + "Si le quitas los privilegios de administrador a este usuario, tanto tú como otro administrador puede devolvérselos más tarde." "Información de emergencia" "Información y contactos de %1$s" "Abrir %1$s" @@ -2889,7 +2889,7 @@ "preferencias de funciones inteligentes, batería inteligente" "ortografía, diccionarios, corrector ortográfico, autocorrección" "herramienta de reconocimiento, entrada, conversión de texto a voz, hablar, idioma, manos libres, reconocimiento, ofensiva, palabra, audio, historial, auriculares bluetooth" - "valorar, idioma, predeterminado, hablar, conversión de texto a voz, accesibilidad, lector de pantalla, ciego" + "valorar, idioma, predeterminado, hablar, tts, accesibilidad, lector de pantalla, invidente" "reloj, militar" "restablecer, restaurar, fábrica" "borrar, eliminar, restaurar, resetear, recuperar, restablecer estado de fábrica" @@ -3081,7 +3081,7 @@ "Activado" "Preguntar siempre" "Hasta que lo desactives" - "{count,plural, =1{1 hora}other{# horas}}" + "{count,plural, =1{1 hora}other{# horas}}" "{count,plural, =1{1 minuto}other{# minutos}}" "{count,plural, =0{Desactivado}=1{Desactivado / 1 programación puede activarlo automáticamente}other{Desactivado / # programaciones pueden activarlo automáticamente}}" "Qué puede interrumpirte durante el modo No molestar" @@ -3382,7 +3382,7 @@ "llamadas" "Llamadas que pueden interrumpirte" "Para asegurarte de que las llamadas permitidas suenan, comprueba que el dispositivo esté configurado para sonar" - "Las llamadas entrantes se bloquean en la programación \"%1$s\". Cambia los ajustes para que tus amigos, familiares u otras personas puedan contactar contigo." + "Las llamadas entrantes se bloquean en la programación %1$s. Cambia los ajustes para que tus amigos, familiares u otros puedan contactar contigo." "Contactos destacados" "{count,plural,offset:2 =0{Nadie}=1{{contact_1}}=2{{contact_1} y {contact_2}}=3{{contact_1}, {contact_2} y {contact_3}}other{{contact_1}, {contact_2} y # más}}" "(Sin nombre)" @@ -3391,7 +3391,7 @@ "Mensajes" "Mensajes que pueden interrumpirte" "Para asegurarte de que los mensajes permitidos suenan, comprueba que el dispositivo esté configurado para sonar" - "Los mensajes entrantes se bloquean en la programación \"%1$s\". Cambia los ajustes para que tus amigos, familiares u otras personas puedan contactar contigo." + "Los mensajes entrantes se bloquean en la programación %1$s. Cambia los ajustes para que tus amigos, familiares u otras personas puedan contactar contigo." "Todos los mensajes pueden interrumpirte" "Todas las llamadas pueden interrumpirte" "{count,plural, =0{Nadie}=1{1 contacto}other{# contactos}}" @@ -3480,7 +3480,7 @@ "Protección memoria avanzada beta" "Protección de memoria avanzada" "Esta función beta te ayuda a proteger tu dispositivo de errores que pueden poner en riesgo tu seguridad." - "Activado" + "Activada" "Desactivado" "Se activará tras reiniciar" "Se desactivará tras reiniciar" @@ -3521,7 +3521,7 @@ "Cambiar almacenamiento" "Notificaciones" "Activadas" - "%1$s/%2$s" + "%1$s / %2$s" "Desactivadas" "{count,plural, =1{# categoría desactivada}other{# categorías desactivadas}}" "{count,plural, =1{# permiso adicional}other{# permisos adicionales}}" @@ -4508,7 +4508,7 @@ "Cambiar" "%1$s / %2$s" "Conectado" - "Conectado temporalmente" + "Conectada temporalmente" "Usando %1$s temporalmente" "Sin conexión" "Los datos móviles no se conectarán automáticamente" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 90c4cca5075..c38185b34d3 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -1436,13 +1436,13 @@ "PINa ahaztu zaizu?" "Aurrera egiteko, marraztu gailuaren eredua" "Aurrera egiteko, idatzi gailuaren PINa" - "Aurrera egiteko, idatzi gailuaren pasahitza" + "Aurrera egiteko, idatzi gailuko pasahitza" "Aurrera egiteko, marraztu laneko eredua" "Aurrera egiteko, idatzi laneko PINa" "Aurrera egiteko, idatzi laneko pasahitza" "Segurtasuna bermatzeko, marraztu gailuaren eredua" "Segurtasuna bermatzeko, idatzi gailuaren PINa" - "Segurtasuna bermatzeko, idatzi gailuaren pasahitza" + "Segurtasuna bermatzeko, idatzi gailuko pasahitza" "Segurtasuna bermatzeko, marraztu laneko eredua" "Segurtasuna bermatzeko, idatzi laneko PINa" "Segurtasuna bermatzeko, idatzi laneko pasahitza" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 9add174b13d..fcf8c2f5fad 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -246,8 +246,8 @@ "%1$s après la mise en veille, sauf lorsque l\'appareil est maintenu déverrouillé par %2$s" "Ajouter du texte sur l\'écran" "Aucun" - "Par exemple : Android de Jonathan" - "Position" + "Par exemple : Android de Jonathan." + "Localisation" "Utiliser ma position" "Désactivé" "{count,plural, =1{Activée : # appli a accès à la position}one{Activée : # appli a accès à la position}other{Activée : # applis ont accès à la position}}" @@ -270,7 +270,7 @@ "Déverr. par reconn. faciale" "Déverrouillage reconnaissance faciale pour travail" "Configurer le déverrouillage par reconn. faciale" - "Configurer le Déverrouillage par reconn. faciale" + "Configurer le Déverrouillage par reconnaissance faciale" "Utiliser son visage pour s\'authentifier" "Commencer" @@ -377,7 +377,7 @@ "Empreinte digitale, %s et visage ajoutés" "Empreintes digitales, %s et visage ajoutés" "Déverr. par reconn. faciale et empreinte digitale" - "Déverr. par reconn. faciale et empreinte digitale pour le travail" + "Déverrouillage par recon. faciale et emp. digitale pour le travail" "Configuration requise" "Empreintes digitales et visage ajoutés" "Empreinte digitale et visage ajoutés" @@ -812,7 +812,7 @@ "Utilisez un code QR pour ajouter un appareil à ce réseau" "Le format du code QR est incorrect" "Réessayer" - "Partager avec d\'autres utilisateurs d\'appareils" + "Partager avec d\'autres utilisateurs de l\'appareil" "(aucune modification)" "Veuillez choisir" "(Certificats multiples ajoutés)" @@ -826,7 +826,7 @@ "Pour améliorer la précision de la position, une appli inconnue souhaite activer la recherche de réseaux, même lorsque le Wi-Fi est désactivé.\n\nAutoriser toutes les applis qui le demandent?" "Autoriser" "Refuser" - "Ce réseau ne dispose d\'aucun accès à Internet. Voulez-vous quand même l\'utiliser?" + "Ce réseau ne dispose d\'aucun accès Internet. Voulez-vous quand même l\'utiliser?" "Connectivité limitée : certains services et applis pourraient ne pas fonctionner. Utiliser quand même?" "Ne plus me demander pour ce réseau" "Le Wi‑Fi n\'est pas connecté à Internet" @@ -1107,7 +1107,7 @@ "Autorisez votre téléphone à passer automatiquement à %1$s pour les données cellulaires en cas de meilleure disponibilité." \n\n"Les appels, les messages et le trafic réseau peuvent être visibles pour votre organisation." "NIP de carte SIM incorrect. Vous devez maintenant communiquer avec votre fournisseur de services pour déverrouiller votre appareil." - "{count,plural, =1{NIP de la carte SIM incorrect. Il vous reste # tentative. Après cela, vous devrez communiquer avec votre fournisseur de services pour déverrouiller votre appareil.}one{NIP de la carte SIM incorrect. Il vous reste # tentative.}other{NIP de la carte SIM incorrect. Il vous reste # tentatives.}}" + "{count,plural, =1{NIP de la carte SIM incorrect. Il vous reste # tentative. Après cela, vous devrez communiquer avec votre opérateur pour déverrouiller votre appareil.}one{NIP de la carte SIM incorrect. Il vous reste # tentative.}other{NIP de la carte SIM incorrect. Il vous reste # tentatives.}}" "NIP de module SIM incorrect. Il vous reste une tentative. Après cela, vous devrez communiquer avec votre fournisseur de services pour déverrouiller votre appareil." "Le déverrouillage par NIP de carte SIM a échoué." "Mises à jour du système" @@ -1183,7 +1183,7 @@ "Oublier « ^1 »?" "Toutes les applis, photos et données enregistrées sur la mémoire de stockage « ^1 » seront perdues définitivement." "Le répertoire Système comprend des fichiers utilisés pour faire fonctionner Android version %s" - "En mode Invité, on ne peut formater de cartes SD" + "En mode Invité, on ne peut pas formater de cartes SD" "Formatage de « ^1 » en cours..." "Ne retirez pas ^1 durant le formatage." "^1 formatée" @@ -1560,7 +1560,7 @@ "Applis désactivées" "Téléchargée" "Diffusion en cours" - "Non installé pour cet utilisateur" + "Pas installée pour cet utilisateur" "Installée" "Aucune appli" "Mémoire de stockage interne" @@ -1605,7 +1605,7 @@ "Utilisateur : %1$s" - "Utilisateur supprimé" + "Utilisateur retiré" "%1$d processus et %2$d service" "%1$d processus et %2$d services" "%1$d processus et %2$d service" @@ -2111,7 +2111,7 @@ "Convivialité, facilité d\'accès, assistance, accessibilité" "Agrandisseur d\'écran, zoom, agrandissement, vision faible, agrandir, rendre plus gros" - "Sous-titres, sous-titrage, CC, sous-titres instantanés, malentendant, perte auditive, transcription en temps réel assistée par ordinateur, synthèse textuelle, sous-titrer" + "Sous-titres, sous-titrage, CC, Transcription instantanée, malentendant, perte auditive, la traduction en temps réel des communications (CART), synthèse textuelle, sous-titrer" @@ -2396,7 +2396,7 @@ "Supprimer tous les certificats" "Certificats de confiance" "Afficher les certificats d\'autorité de confiance" - "Authentifiants d\'utilisateur" + "Authentifiant d\'utilisateur" "Afficher et modifier les authentifiants stockés" "Paramètres avancés" "Les authentifiants ne sont pas accessibles pour cet utilisateur" @@ -2564,7 +2564,7 @@ "^1""^2"\n"alerte" "^1""^2"\n"limite" "Applis supprimées" - "Applis et utilisateurs supprimés" + "Applis et utilisateurs retirés" "Utilisation du réseau" "Facturé à l\'usage" "Nom" @@ -2608,7 +2608,7 @@ "Définir le RPV permanent?" "Si vous activez ce paramètre, vous ne disposerez d\'aucune connexion Internet jusqu\'à ce que le RPV parvienne à se connecter" "Votre RPV existant sera remplacé, et vous ne disposerez d\'aucune connexion Internet jusqu\'à ce que le RPV parvienne à se connecter" - "Vous êtes déjà connecté à un RPV permanent. Si vous vous connectez à un autre RPV, le RPV actuel sera remplacé et le mode permanent sera désactivé." + "Votre appareil est déjà connecté à un RPV permanent. Si vous vous connectez à un autre RPV, le RPV actuel sera remplacé, et le mode permanent sera désactivé." "Vous êtes déjà connecté à un RPV. Si vous vous connectez à un RPV différent, votre RPV actuel sera remplacé." "Activer" "%1$s n\'est pas en mesure de se connecter" @@ -2626,7 +2626,7 @@ "Bloquer les connexions sans RPV" "Exiger une connexion RPV?" "Pas sécuritaire. Passez à un RPV de type IKEv2" - "Sélectionnez un profil RPV auquel rester connecté en permanence. Le trafic réseau ne sera autorisé que lorsque vous serez connecté à ce RPV." + "Sélectionnez un profil RPV auquel l\'appareil restera connecté en permanence. Le trafic réseau sera autorisé seulement lorsque votre appareil sera connecté à ce RPV." "Aucun" "Le RPV permanent nécessite une adresse IP pour le serveur et le DNS." "Aucune connexion réseau. Veuillez réessayer plus tard." @@ -2644,10 +2644,10 @@ "Supprimer définitivement le certificat d\'autorité utilisateur?" "En cours d\'utilisation par" "Cette entrée contient" - "Une clé utilisateur" + "1 clé d\'utilisateur" "Un certificat utilisateur" "Un certificat CA" - "%d certificats CA" + "%d certificats CA" "Détails de l\'authentifiant" "L\'identifiant suivant a été supprimé : %s" "Aucun authentifiant d\'utilisateur installé" @@ -2662,8 +2662,8 @@ "Le réseau peut être surveillé" "Terminé" "{count,plural, =1{Faire confiance au certificat ou le retirer}one{Faire confiance au certificat ou le retirer}other{Faire confiance aux certificats ou les retirer}}" - "{numberOfCertificates,plural, =1{{orgName} a installé une autorité de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}one{{orgName} a installé une autorité de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}other{{orgName} a installé des autorités de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ces certificats, communiquez avec votre administrateur.}}" - "{numberOfCertificates,plural, =1{{orgName} a installé une autorité de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}one{{orgName} a installé une autorité de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}other{{orgName} a installé des autorités de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ces certificats, communiquez avec votre administrateur.}}" + "{numberOfCertificates,plural, =1{{orgName} a installé une autorité de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}one{{orgName} a installé une autorité de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}other{{orgName} a installé des autorités de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}}" + "{numberOfCertificates,plural, =1{{orgName} a installé une autorité de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}one{{orgName} a installé une autorité de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}other{{orgName} a installé des autorités de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}}" "Un tiers peut surveiller votre activité réseau, y compris les courriels, les applis et les sites Web sécurisés. \n\nUn certificat de confiance installé sur votre appareil rend cela possible." "{count,plural, =1{Vérifier le certificat}one{Vérifier le certificat}other{Vérifier les certificats}}" "Plusieurs utilisateurs" @@ -2673,7 +2673,7 @@ "Non configuré" "Non configuré : profil limité" "Non configuré : profil professionnel" - "Admin" + "Administrateur" "Vous (%s)" "Vous ne pouvez plus ajouter d’utilisateurs. Retirez un utilisateur pour en ajouter un nouveau." "Les profils limités ne peuvent pas ajouter de compte." @@ -2688,7 +2688,7 @@ "L\'ensemble des applis et des données seront supprimées." "Toutes les applis et les données de ce profil seront supprimées si vous continuez." "L\'ensemble des applis et des données seront supprimées." - "Ajout de l\'utilisateur…" + "Ajout de l\'utilisateur en cours…" "Supprimer l\'utilisateur" "Supprimer" "Toutes les applis et les données de cette session seront supprimées." @@ -2805,7 +2805,7 @@ "Position" "Autoriser les applis à utiliser vos données de localisation" "Précédent" - "SUIVANT" + "Suivant" "Formater autrement" "Cartes SIM" @@ -3173,7 +3173,7 @@ "Après le déverrouillage, accédez au dernier écran utilisé. Les notifications ne s\'afficheront pas à l\'écran. Balayez du haut vers le bas pour les voir." "Écran de verrouillage, écran verrouillé, ignorer, contourner" "Lorsque le profil professionnel est verrouillé" - "Afficher seul. les nouv. notif. sur l\'écran de verrouillage" + "Afficher seul. les nouvelles notifi. sur l\'écran de verrou." "Retirez automatiquement les notifications consultées de l\'écran de verrouillage" "Notifications sur l\'écran de verrouillage" "Afficher les conversations, par défaut et silencieuses" @@ -3245,7 +3245,7 @@ "Aucune" "Aucune demande d\'accès aux notifications n\'a été envoyée pour les applis installées." "Autoriser l\'accès aux notifications" - "Les notifications améliorées ont remplacé les notifications adaptatives Android sous Android 12. Cette fonctionnalité vous présente des suggestions d\'actions et de réponses, et organise vos notifications. \n\nLes notifications améliorées peuvent accéder au contenu de toutes les notifications, y compris les renseignements personnels comme le nom des contacts et les messages. Cette fonctionnalité peut aussi fermer des notifications ou interagir avec elles, comme répondre aux appels téléphoniques et gérer le mode Ne pas déranger." + "Les notifications améliorées ont remplacé les notifications adaptatives Android sous Android 12. Cette fonctionnalité vous suggère des actions et des réponses, et organise vos notifications. \n\nLes notifications améliorées peuvent accéder au contenu de toutes les notifications, y compris les renseignements personnels comme le nom des contacts et les messages. Cette fonctionnalité peut aussi fermer des notifications ou interagir avec elles, comme répondre aux appels téléphoniques et gérer le mode Ne pas déranger." "Autoriser %1$s à accéder aux notifications?" "L\'appli %1$s pourra lire toutes les notifications, y compris les renseignements personnels tels que les noms des contacts, les photos et le texte des messages que vous recevez. Cette appli pourra également répéter ou fermer des notifications, ou effectuer des actions sur des boutons dans les notifications, y compris répondre à des appels téléphoniques. \n\nCette action permettra également à l\'appli d\'activer et de désactiver la fonctionnalité Ne pas déranger et de modifier les paramètres connexes." "L\'appli %1$s pourra effectuer les actions suivantes :" @@ -3781,7 +3781,7 @@ "C\'est votre appareil qui mesure l\'utilisation des données pour les limites et les avertissements. Ces mesures peuvent différer de celles de votre fournisseur de services." "Définir limite consomm. données" "Limite de données" - "%1$s utilisés pour la période : %2$s" + "%1$s utilisées pour la période suivante : %2$s" "Configurer" "Autres applis incluses dans l\'utilisation" "{count,plural, =1{1 appli est autorisée à ignorer les restrictions lorsque la fonction Économiseur de données est activée}one{# appli est autorisée à ignorer les restrictions lorsque la fonction Économiseur de données est activée}other{# applis sont autorisées à ignorer les restrictions lorsque la fonction Économiseur de données est activée}}" @@ -3849,7 +3849,7 @@ "L\'objet de classement est manquant." "L\'objet de classement ne contient pas cette touche." "Encoche de l\'écran" - "découpe d\'affichage, encoche" + "encoche de l\'écran, encoche" "Valeurs par défaut de l\'appareil" "Impossible d\'appliquer la superposition" "Accès spécial des applis" @@ -3885,7 +3885,7 @@ "Contribue à prolonger l\'autonomie de la pile" "Paramètres rapides, tuiles de développeur" "Désactiver le délai d\'expiration des autorisations adb" - "Désactivez le retrait automatique des autorisations adb pour des systèmes qui ne se sont pas connectés ou qui n\'ont pas été configurés par l\'utilisateur dans le délai d\'expiration par défaut (respectivement, sept jours et un jour minimum)." + "Désactiver le retrait automatique des autorisations adb pour des systèmes qui ne se sont pas connectés ou qui n\'ont pas été configurés par l\'utilisateur dans le délai d\'expiration par défaut (respectivement, sept jours et un jour minimum)." "Traçage Winscope" "Capteurs désactivés" "Paramètres du profil professionnel" @@ -4072,7 +4072,7 @@ "Jeux" "Espace utilisé" "(désinst. pour l\'utilisateur %s)" - "(désactivé pour l\'utilisateur %s)" + "(désactivé pour %s)" "Service de remplissage auto" "Service de remplissage automatique par défaut" "Mots de passe" @@ -4416,7 +4416,7 @@ "Gestionnaire de rapport de bogue" "Détermine quelle appli gère le raccourci de rapport de bogue sur votre appareil." "Personnel" - "Travail" + "Profil professionnel" "Paramètres par défaut" "Aucune" "Ce choix n\'est plus valide. Réessayez." diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 37b72b9e8ab..309fc8f2f73 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -1840,7 +1840,7 @@ "Des projets pour le week-end ?" "Je vais à la plage. Tu veux venir ?" "Options" - "Zoom avant sur l\'écran" + "Zoomez sur l\'écran" "Appuyer trois fois pour zoomer" "Appuyer sur un bouton pour zoomer" "Faites un zoom avant rapide sur l\'écran pour agrandir le contenu" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 1d98457c91d..90e1b379326 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -61,7 +61,7 @@ "Accoppia l\'altro orecchio" "La tua protesi uditiva sinistra è connessa.\n\nPer accoppiare quella destra, assicurati che sia accesa e pronta per l\'accoppiamento." "La tua protesi uditiva destra è connessa.\n\nPer accoppiare quella sinistra, assicurati che sia accesa e pronta per l\'accoppiamento." - "Accoppia orecchio destro" + "Accoppia orecchio dx" "Accoppia orecchio sx" "Per tutte le protesi uditive disponibili" "Impostazioni protesi uditive" @@ -189,7 +189,7 @@ "Sabato" "Se un\'app non supporta le preferenze locali, userà le proprie impostazioni internazionali predefinite." "Scopri di più sulle preferenze di lingua." - "{count,plural, =1{Vuoi rimuovere la lingua selezionata?}other{Vuoi rimuovere le lingue selezionate?}}" + "{count,plural, =1{Rimuovere la lingua selezionata?}other{Rimuovere le lingue selezionate?}}" "Il testo verrà mostrato in un\'altra lingua." "Impossibile rimuovere tutte le lingue" "Mantieni almeno una lingua preferita" @@ -310,8 +310,8 @@ "Riconfigura lo Sblocco con il Volto" "Migliora la sicurezza e le prestazioni" "Configura lo Sblocco con il Volto" - "Elimina l\'attuale modello del volto per riconfigurare lo Sblocco con il Volto.\n\nIl 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 o eseguire l\'autenticazione nelle app." - "Elimina l\'attuale modello del volto per riconfigurare lo Sblocco con il Volto.\n\nIl modello del volto verrà eliminato definitivamente e in sicurezza.\n\nDopo l\'eliminazione dovrai usare l\'impronta, il PIN, la sequenza o la password per sbloccare il telefono o eseguire l\'autenticazione nelle app." + "Elimina l\'attuale modello del volto per riconfigurare lo Sblocco con il Volto.\n\nIl modello del volto verrà eliminato definitivamente e in sicurezza.\n\nDopo l\'eliminazione dovrai usare il PIN, la sequenza o la password per sbloccare lo smartphone o eseguire l\'autenticazione nelle app." + "Elimina l\'attuale modello del volto per riconfigurare lo Sblocco con il Volto.\n\nIl modello del volto verrà eliminato definitivamente e in sicurezza.\n\nDopo l\'eliminazione dovrai usare l\'impronta, il PIN, la sequenza o la password per sbloccare lo smartphone o eseguire l\'autenticazione nelle app." "Usa lo Sblocco con il Volto per" "Quando usi lo Sblocco con il Volto" "Gli occhi devono essere aperti" @@ -603,7 +603,7 @@ "{count,plural, =1{Deve contenere almeno # carattere}other{Deve contenere almeno # caratteri}}" "{count,plural, =1{Se utilizzi solo numeri, la password deve avere almeno 1 cifra}other{Se utilizzi solo numeri, la password deve avere almeno # cifre}}" "{count,plural, =1{Il PIN deve contenere almeno # cifra}other{Il PIN deve contenere almeno # cifre}}" - "{count,plural, =1{Il PIN deve contenere almeno # cifra, ma è consigliato un PIN di {minAutoConfirmLen} cifre per una maggiore sicurezza}other{Il PIN deve contenere almeno # cifre, ma è consigliato un PIN di {minAutoConfirmLen} cifre per una maggiore sicurezza}}" + "{count,plural, =1{Il PIN deve contenere almeno # cifra, ma un PIN di {minAutoConfirmLen} cifre è consigliato per una maggiore sicurezza}other{Il PIN deve contenere almeno # cifre, ma un PIN di {minAutoConfirmLen} cifre è consigliato per una maggiore sicurezza}}" "{count,plural, =1{Deve contenere meno di # carattere}other{Deve contenere meno di # caratteri}}" "{count,plural, =1{Deve contenere meno di # cifra}other{Deve contenere meno di # cifre}}" "L\'amministratore del dispositivo non consente l\'utilizzo di un PIN recente" @@ -826,7 +826,7 @@ "Per migliorare la precisione della posizione e per altri scopi, un\'app sconosciuta vuole attivare la ricerca della rete, anche se il Wi‑Fi non è attivo.\n\nVuoi autorizzare ogni app che richiede di eseguire la ricerca?" "Consenti" "Rifiuta" - "Questa rete non ha accesso a Internet. Vuoi restare connesso?" + "Questa rete non ha accesso a internet. Vuoi restare connesso?" "Alcuni servizi e app potrebbero non funzionare a causa della connettività limitata. Usarli comunque?" "Non chiedermelo più per questa rete" "Wi-Fi non connesso a Internet" @@ -926,7 +926,7 @@ "Salvata" "Impossibile salvare. Riprova." "Vuoi salvare le reti?" - "Salvataggio di %d reti…" + "Salvataggio di %d reti in corso…" "Reti salvate" "Chiamate Wi-Fi" "Estendi le chiamate usando il Wi‑Fi" @@ -952,7 +952,7 @@ "Se le chiamate Wi-Fi sono attive, il tuo telefono può indirizzare le chiamate tramite reti Wi-Fi o la rete del tuo operatore, in base alle tue preferenze e alla potenza del segnale. Prima di attivare questa funzionalità, verifica tariffe e altri dettagli con il tuo operatore.%1$s" "Indirizzo per le emergenze" - "Viene considerato la tua posizione quando fai una chiamata di emergenza tramite Wi‑Fi" + "Viene considerato come la tua posizione quando fai una chiamata di emergenza tramite Wi‑Fi" "Scopri di più"" sulle funzioni di DNS privato" "On" "Attiva le chiamate Wi-Fi" @@ -1183,14 +1183,14 @@ "Dimenticare ^1?" "Tutti i dati, le app e le foto memorizzati su ^1 verranno perduti per sempre." "Il sistema include i file utilizzati per eseguire Android versione %s" - "Utenti Ospite non possono formattare le schede SD" + "Utenti ospite non possono formattare le schede SD" "Formattazione della ^1…" "Non rimuovere il dispositivo ^1 durante la formattazione." "Formattazione ^1 eseguita" "Sposta ^1" "Lo spostamento dell\'app ^1 e dei relativi dati sulla ^2 sarà veloce. Potrai utilizzare l\'app soltanto al termine dello spostamento. \n\nNon rimuovere la ^2 durante lo spostamento." "Per spostare i dati devi sbloccare l\'utente ^1." - "Spostamento dell\'app ^1…" + "Spostamento dell\'app ^1 in corso…" "Non rimuovere la ^1 durante lo spostamento. \n\nL\'app ^2 su questo dispositivo sarà disponibile soltanto al termine dello spostamento." "Come userai ^1?" "Oppure" @@ -1356,7 +1356,7 @@ "Mostra tutto" "Vedi dettagli" "Nessuna app ha richiesto la posizione di recente" - "Nessuna app ha effettuato di recente l\'accesso alla posizone" + "Nessuna app ha effettuato di recente l\'accesso alla posizione" "Elevato utilizzo della batteria" "Basso utilizzo della batteria" "Ricerca di reti Wi-Fi" @@ -2005,8 +2005,8 @@ "Accoppia apparecchi acustici" "Nella schermata successiva, seleziona i tuoi apparecchi acustici. Potresti dover accoppiare l\'orecchio destro e sinistro separatamente.\n\nAssicurati che gli apparecchi acustici siano accesi e pronti per l\'accoppiamento." "Dispositivo %1$s attivo" - "%1$s, solo sinistra" - "%1$s, solo destra" + "%1$s, solo destro" + "%1$s, solo destro" "%1$s, sinistra e destra" "%1$s più un altro" "Accoppia nuovo dispositivo" @@ -2489,7 +2489,7 @@ "Rimuovi profilo di lavoro" "Dati in background" "Sincron., invio e ricezione dati possibili in ogni momento" - "Disatt. dati backgr.?" + "Disatt. dati backg.?" "La disattivazione dei dati in background aumenta la durata della batteria e riduce l\'utilizzo dei dati. Alcune applicazioni potrebbero utilizzare comunque la connessione dati in background." "Sincronizzazione attiva" "La sincronizzazione non è attiva" @@ -2608,8 +2608,8 @@ "Impostare la rete VPN sempre attiva?" "Quando questa impostazione è attiva, la connessione Internet non sarà disponibile fino a quando la rete VPN sarà connessa correttamente" "La rete VPN attuale sarà sostituita e la connessione Internet non sarà disponibile fino a quando la rete VPN sarà connessa correttamente" - "Sei già collegato a una rete VPN sempre attiva. Se ti connetti a un\'altra rete, la rete VPN attuale verrà sostituita e la modalità sempre attiva verrà disattivata." - "Sei già collegato a una rete VPN. Se ti connetti a un\'altra rete, la VPN attuale verrà sostituita." + "Hai già effettuato la connessione a una rete VPN sempre attiva. Se ti connetti a un\'altra rete, la rete VPN attuale verrà sostituita e la modalità sempre attiva verrà disattivata." + "Hai già eseguito la connessione a una rete VPN. Se ti connetti a un\'altra rete, la VPN attuale verrà sostituita." "Attiva" "Impossibile connettersi alla rete %1$s" "Questa app non supporta le reti VPN sempre attive" @@ -2626,7 +2626,7 @@ "Blocca connessioni senza VPN" "Connessione VPN obbligatoria?" "Tipo non sicuro. Usa una VPN IKEv2." - "Seleziona un profilo VPN a cui rimanere sempre connesso. Il traffico di rete sarà consentito solo quando sei connesso a questa VPN." + "Seleziona un profilo VPN con cui mantenere la connessione attiva. Il traffico di rete sarà consentito solo durante la connessione a questa VPN." "Nessuna" "La VPN sempre attiva richiede un indirizzo IP per server e DNS." "Nessuna connessione di rete disponibile. Riprova più tardi." @@ -3083,7 +3083,7 @@ "Fino alla disattivazione" "{count,plural, =1{1 ora}other{# ore}}" "{count,plural, =1{1 minuto}other{# minuti}}" - "{count,plural, =0{Off}=1{Off/1 pianificazione può attivarsi automaticamente}other{Off/# pianificazioni possono attivarsi automaticamente}}" + "{count,plural, =0{Off}=1{Off/Può essere attivata automaticamente 1 programmazione}other{Off/Possono essere attivate automaticamente # programmazioni}}" "Possono interrompere la modalità Non disturbare" "Persone" "App" @@ -3239,13 +3239,13 @@ "Mai" "Notifiche app e dispositivi" "Controlla quali app e dispositivi possono leggere le notifiche" - "Accosso bloccato alle notifiche del profilo di lavoro" + "Accesso bloccato alle notifiche del profilo di lavoro" "Notifiche avanzate" "Ricevi suggerimenti di azioni, risposte e altro" "Nessuna" "Nessuna delle app installate ha richiesto l\'accesso alle notifiche." "Consenti l\'accesso alle notifiche" - "Le notifiche adattive sono state sostituite dalle notifiche avanzate in Android 12. Questa funzionalità mostra risposte e azioni suggerite e organizza le tue notifiche. \n\nLe notifiche avanzate possono accedere ai contenuti delle notifiche, incluse le informazioni personali, come i nomi dei contatti e i messaggi. Questa funzionalità può anche ignorare le notifiche o rispondervi, ad esempio accettando le telefonate, e controllare la modalità Non disturbare." + "Le notifiche adattive Android sono state sostituite dalle notifiche avanzate in Android 12. Questa funzionalità mostra risposte e azioni suggerite e organizza le tue notifiche. \n\nLe notifiche avanzate possono accedere ai contenuti di una notifica, incluse le informazioni personali, come i nomi dei contatti e i messaggi. Questa funzionalità può anche ignorare le notifiche o rispondervi, ad esempio accettando le telefonate, e controllare la modalità Non disturbare." "Consentire a %1$s di accedere alle notifiche?" "L\'app %1$s potrà leggere tutte le notifiche, incluse informazioni personali quali nomi dei contatti, foto e il testo dei messaggi ricevuti. Questa app potrà inoltre posticipare o ignorare le notifiche oppure agire sui pulsanti nelle notifiche, ad esempio rispondere alle telefonate. \n\nL\'app potrà anche attivare o disattivare la funzionalità Non disturbare e modificare le relative impostazioni." "L\'app %1$s potrà:" @@ -3655,7 +3655,7 @@ "Ottimizza" "La batteria potrebbe scaricarsi più rapidamente. L\'uso della batteria in background non sarà più impedito all\'app." "Opzione consigliata per una durata maggiore della batteria" - "Nessuno" + "Nessuna" "Se disattivi l\'accesso ai dati di utilizzo di questa app, l\'amministratore potrà comunque monitorare l\'utilizzo dei dati per le app nel tuo profilo di lavoro" "Mostra sopra altre app" "Mostra sopra altre app" @@ -3792,7 +3792,7 @@ "Dati rimanenti: ^1" "Grafico che mostra l\'utilizzo dei dati dal giorno %1$s al giorno %2$s." "Non ci sono dati in questo intervallo di date" - "{count,plural, =1{# giorno rimanente}other{# giorni rimanenti}}" + "{count,plural, =1{Manca # giorno}other{Mancano # giorni}}" "Tempo scaduto" "Meno di 1 giorno rimanente" "Aggiornato da ^1 ^2 fa" @@ -4109,7 +4109,7 @@ "Tema del dispositivo" "Valore predefinito" "Nome della rete" - "Nome della Rete Display nella bara di stato" + "Mostra nome della rete nella barra di stato" "App istantanea" "Disattivare la gestione della memoria?" "Aggiorna modalità Non disturbare" @@ -4707,7 +4707,7 @@ "Ciano" "Verde primavera" "Verde" - "Giallo-verdognolo" + "Verde acido" "Giallo" "Arancione" "Rosso" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 99a5ab95009..ad073aff9ed 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -3461,7 +3461,7 @@ "Sūtīt atsauksmes par šo ierīci" "Ievadiet administratora PIN" "Ieslēgts" - "Izslēgts" + "Izslēgta" "Ieslēgti" "Izslēgti" "Ieslēgta" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index 2ba700a614a..16223e18c34 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -596,7 +596,7 @@ "ଏଥର ମଧ୍ୟ ଭୁଲ ପାସ୍‌ୱାର୍ଡ ଲେଖିଲେ ଏହି ଡିଭାଇସ୍‌ ଡାଟା ଲିଭାଇ ଦିଆଯିବ" "ପରବର୍ତ୍ତୀ ପ୍ରୟାସରେ ଯଦି ଆପଣ ଭୁଲ ପାଟର୍ନ ଅଙ୍କନ କରନ୍ତି, ତେବେ ଏହି ୟୁଜର ଡିଲିଟ ହୋଇଯିବେ" "ପରବର୍ତ୍ତୀ ପ୍ରୟାସରେ ଯଦି ଆପଣ ଭୁଲ ପିନ ନମ୍ବର ଲେଖନ୍ତି, ତେବେ ଏହି ୟୁଜର ଡିଲିଟ ହୋଇଯିବେ" - "ପରବର୍ତ୍ତୀ ପ୍ରୟାସରେ ଯଦି ଆପଣ ଭୁଲ ପାସ୍‌ୱର୍ଡ ଦିଅନ୍ତି, ତେବେ ଏହି ଉପଯୋଗକର୍ତ୍ତା ଡିଲିଟ୍‌ ହୋଇଯିବେ" + "ପରବର୍ତ୍ତୀ ପ୍ରୟାସରେ ଯଦି ଆପଣ ଭୁଲ ପାସୱର୍ଡ ଦିଅନ୍ତି ତେବେ ଏହି ୟୁଜର ଡିଲିଟ ହୋଇଯିବେ" "ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଯଦି ଆପଣ ଭୁଲ ପାଟର୍ନ ଦିଅନ୍ତି, ତେବେ ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍‌ ଓ ଏହାର ଡାଟା ଡିଲିଟ୍‌ ହୋଇଯିବ" "ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଯଦି ଆପଣ ଭୁଲ PIN ଦିଅନ୍ତି, ତେବେ ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍‌ ଓ ତାର ଡାଟା ଡିଲିଟ୍‌ ହୋଇଯିବ" "ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଯଦି ଆପଣ ଭୁଲ ପାସ‌ୱାର୍ଡ ଲେଖନ୍ତି, ତେବେ ଆପଣଙ୍କର ୱାର୍କ ପ୍ରୋଫାଇଲ୍‌ ଓ ତାର ଡାଟାକୁ ଡିଲିଟ୍‌ କରିଦିଆଯିବ।" @@ -1605,7 +1605,7 @@ "ୟୁଜର: %1$s" - "କାଢ଼ିଦିଆଯାଇଥିବା ଉପଯୋଗକର୍ତ୍ତା" + "କାଢ଼ିଦିଆଯାଇଥିବା ୟୁଜର" "%1$d ପ୍ରକ୍ରିୟା ଏବଂ %2$d ସେବା" "%1$d ପ୍ରକ୍ରିୟା ଓ %2$d ସେବା" "%1$d ପ୍ରକ୍ରିୟା ଓ %2$d ସେବା" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index bd7ee9f4a2a..11c221c56c1 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -3565,7 +3565,7 @@ "การเข้าถึงการใช้งาน" "อนุญาตการเข้าถึงการใช้งาน" "เวลาอยู่หน้าจอ" - "การเข้าถึงการใช้งานทำให้แอปสามารถติดตามว่าคุณกำลังใช้​แอปอื่นใดอยู่ ความถี่ในการใช้ รวมทั้งผู้ให้บริการ การตั้งค่าภาษา และรายละเอียดอื่นๆ" + "การเข้าถึงการใช้งานทำให้แอปสามารถติดตามว่าคุณกำลังใช้​แอปอื่นใดอยู่ ความถี่ในการใช้ รวมทั้งผู้ให้บริการ การตั้งค่าภาษา และรายละ⁠เอียดอื่นๆ" "หน่วยความจำ" "ทำงานตลอดเวลา (%s)" "ทำงานบางครั้ง (%s)" From d5e4ae0a80116f87ad17a88e13851b0d23debcb6 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 Jul 2024 21:18:27 -0700 Subject: [PATCH 15/19] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I3165dc060f3b2334b94fc557fc9ce6a817f24d72 --- res/values-es-rUS/arrays.xml | 6 +++--- res/values-kk/arrays.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/res/values-es-rUS/arrays.xml b/res/values-es-rUS/arrays.xml index 6136db37a6b..94c8ff0b26b 100644 --- a/res/values-es-rUS/arrays.xml +++ b/res/values-es-rUS/arrays.xml @@ -365,10 +365,10 @@ "Manual" - "Desconectado" + "Desconectada" "Iniciando..." "Conectando..." - "Conectado" + "Conectada" "Tiempo de espera agotado" "Incorrecta" @@ -418,7 +418,7 @@ "Desactivado" - "Depurado" + "Depuración" "Detallado" diff --git a/res/values-kk/arrays.xml b/res/values-kk/arrays.xml index 9b796ec8ba5..37e749b4485 100644 --- a/res/values-kk/arrays.xml +++ b/res/values-kk/arrays.xml @@ -58,7 +58,7 @@ "Ажыратуда…" "Ажыратылған" "Сәтсіз" - "Бөгелген" + "Блокталған" "Нашар байланысты уақытша қолданбау" From 6173c8acb7de81318f4262f369f4869fb2826c78 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 Jul 2024 21:22:02 -0700 Subject: [PATCH 16/19] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Id62f40843994cc42fe3d8a4209d7907351cb483d --- res/values-ar/strings.xml | 64 +++++++++++++++++------------------ res/values-bn/strings.xml | 2 +- res/values-es-rUS/strings.xml | 58 +++++++++++++++---------------- res/values-es/strings.xml | 58 +++++++++++++++---------------- res/values-eu/strings.xml | 4 +-- res/values-fr-rCA/strings.xml | 62 ++++++++++++++++----------------- res/values-fr/strings.xml | 2 +- res/values-it/strings.xml | 50 +++++++++++++-------------- res/values-lv/strings.xml | 2 +- res/values-or/strings.xml | 4 +-- res/values-th/strings.xml | 2 +- 11 files changed, 154 insertions(+), 154 deletions(-) diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 7148b6c4758..5b2c742aa9f 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -294,14 +294,14 @@ "أمان التطبيقات، وقَفل الجهاز، والأذونات" "تمت إضافة وجه" "يجب إعداد الميزة" - "فتح الجهاز بالتعرف على الوجه" - "فتح قفل ملف العمل بالتعرّف على الوجه" - "كيفية إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" - "إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" + "فتح الجهاز ببصمة الوجه" + "فتح قفل ملف العمل ببصمة الوجه" + "كيفية إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" + "إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" "استخدام وجهك للمصادقة" "بدء" - "‏إذا تم إيقاف ميزة \"فتح الجهاز بالتعرف على الوجه\" السهلة الاستخدام، قد لا تعمل بعض خطوات الإعداد بشكل سليم باستخدام TalkBack." + "‏إذا تم إيقاف ميزة \"فتح الجهاز ببصمة الوجه\" السهلة الاستخدام، قد لا تعمل بعض خطوات الإعداد بشكل سليم باستخدام TalkBack." "رجوع" "مواصلة الإعداد" "استخدام إعدادات \"سهولة الاستخدام\"" @@ -312,7 +312,7 @@ "أوافق" "المزيد" "فتح القفل باستخدام وجهك" - "السماح بـ \"فتح الجهاز بالتعرف على الوجه\"" + "السماح بـ \"فتح الجهاز ببصمة الوجه\"" "استخدام وجهك للمصادقة" "يمكنك استخدام وجهك لفتح الهاتف أو الموافقة على عمليات الشراء.\n\nملاحظة: لا يمكنك استخدام وجهك لفتح هذا الجهاز. للحصول على المزيد من المعلومات، اتصل بمشرف المؤسسة." "استخدِم وجهك لفتح هاتفك أو السماح بعمليات الشراء أو تسجيل الدخول إلى التطبيقات." @@ -332,27 +332,27 @@ "تعذّر مسح الوجه." "اكتمل التسجيل بنجاح." "تم" - "تحسين أداء ميزة \"فتح الجهاز بالتعرف على الوجه\"" - "إعادة إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" - "إعادة إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" + "تحسين أداء ميزة \"فتح الجهاز ببصمة الوجه\"" + "إعادة إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" + "إعادة إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" "تحسين الأمان ومستوى الأداء" - "إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" - "يمكنك حذف نموذج الوجه الحالي لإعادة إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\".\n\nسيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد الحذف، ستحتاج إلى رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل الهاتف أو للمصادقة في التطبيقات." - "يمكنك حذف نموذج الوجه الحالي لإعادة إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\".\n\nسيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد الحذف، ستحتاج إلى بصمة الإصبع أو رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل الهاتف أو للمصادقة في التطبيقات." - "استخدام \"فتح الجهاز بالتعرف على الوجه\" من أجل" - "عند استخدام ميزة \"فتح الجهاز بالتعرف على الوجه\"" + "إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" + "يمكنك حذف نموذج الوجه الحالي لإعادة إعداد ميزة \"فتح الجهاز ببصمة الوجه\".\n\nسيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد الحذف، ستحتاج إلى رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل الهاتف أو للمصادقة في التطبيقات." + "يمكنك حذف نموذج الوجه الحالي لإعادة إعداد ميزة \"فتح الجهاز ببصمة الوجه\".\n\nسيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد الحذف، ستحتاج إلى بصمة الإصبع أو رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل الهاتف أو للمصادقة في التطبيقات." + "استخدام \"فتح الجهاز ببصمة الوجه\" من أجل" + "عند استخدام ميزة \"فتح الجهاز ببصمة الوجه\"" "مطلوب فتح العينين" "يتطلب فتح قفل الهاتف النظر إليه بعينين مفتوحتين." "طلب التأكيد دائمًا" - "طلب خطوة تأكيد دائمًا عند استخدام \"فتح الجهاز بالتعرف على الوجه\" في التطبيقات" + "طلب خطوة تأكيد دائمًا عند استخدام \"فتح الجهاز ببصمة الوجه\" في التطبيقات" "حذف نموذج الوجه" - "إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" + "إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" "هل تريد حذف نموذج الوجه؟" "سيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد حذفه، ستحتاج إلى رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل هاتفك أو لعمليات المصادقة في التطبيقات." "سيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد حذفه، ستحتاج إلى رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل الهاتف." "سيتم حذف نموذج الوجه نهائيًا وبشكلٍ آمن.\n\nبعد حذفه، ستحتاج إلى بصمة الإصبع أو رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل هاتفك أو لعمليات المصادقة في التطبيقات." "سيتم حذف نموذج الوجه نهائيًا وبأمان.\n\nبعد حذفه، ستحتاج إلى بصمة الإصبع أو رقم التعريف الشخصي أو النقش أو كلمة المرور لفتح قفل الهاتف." - "استخدام ميزة \"فتح الجهاز بالتعرف على الوجه\" لفتح قفل هاتفك" + "استخدام ميزة \"فتح الجهاز ببصمة الوجه\" لفتح قفل هاتفك" "بصمة الإصبع" "بصمة الإصبع" "عند استخدام ميزة \"فتح الجهاز ببصمة الإصبع\"" @@ -382,7 +382,7 @@ "‏للحصول على أفضل النتائج، استخدم واقي شاشة مُعتمَد ويحمل شعار Made for Google. قد لا تعمل بصمة إصبع طفلك مع واقيات الشاشة الأخرى." "فتح الهاتف من الساعة" - "في حال إعداد ميزتَي \"فتح الجهاز بالتعرف على الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الهاتف إدخال بصمة إصبعك عندما تكون مرتديًا كمامة أو متواجدًا في منطقة مظلمة.\n\nوتوفِّر لك ميزة \"فتح الهاتف من الساعة\" طريقة سهلة أخرى لفتح هاتفك عندما تكون أصابعك مبتلة أو عندما لا يتم التعرّف على وجهك." + "في حال إعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الهاتف إدخال بصمة إصبعك عندما تكون مرتديًا كمامة أو متواجدًا في منطقة مظلمة.\n\nوتوفِّر لك ميزة \"فتح الهاتف من الساعة\" طريقة سهلة أخرى لفتح هاتفك عندما تكون أصابعك مبتلة أو عندما لا يتم التعرّف على وجهك." "توفِّر لك ميزة \"فتح الهاتف من الساعة\" طريقة سهلة أخرى لفتح قفل هاتفك عندما لا يتم التعرّف على بصمة إصبعك." "توفِّر لك ميزة \"فتح الهاتف من الساعة\" طريقة سهلة أخرى لفتح قفل هاتفك عندما لا يتم التعرّف على وجهك." "استخدام بصمة الإصبع أو الساعة من أجل" @@ -393,11 +393,11 @@ "استخدام بصمة الإصبع أو الساعة" "استخدام الوجه أو بصمة الإصبع أو الساعة" "استخدام الساعة" - "إعداد ميزتَي فتح الجهاز بالتعرف على الوجه أو بصمة إصبع أولاً" + "إعداد ميزتَي فتح الجهاز ببصمة الوجه أو بصمة إصبع أولاً" "يمكنك فتح الجهاز باستخدام ساعتك عندما لا يتم التعرف على وجهك أو بصمة إصبعك." "يجب إعداد ميزة \"فتح الجهاز ببصمة الإصبع\" أولاً" "يمكنك فتح الهاتف من ساعتك عندما لا يتم التعرف على بصمة الإصبع." - "يجب إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\" أولاً" + "يجب إعداد ميزة \"فتح الجهاز ببصمة الوجه\" أولاً" "يمكنك فتح الهاتف من ساعتك عندما لا يتم التعرف على وجهك." "الإعداد" "تمت إضافة بصمة إصبع و\"%s\"." @@ -432,12 +432,12 @@ "مزيد من المعلومات عن ميزة \"فتح الهاتف من الساعة\"" "إضافة ساعة" "إزالة ساعة" - "فتح الجهاز بالتعرّف على الوجه وبصمة الإصبع" - "فتح قفل ملف العمل ببصمة الإصبع وبالتعرف على الوجه" + "فتح الجهاز ببصمة الوجه وبصمة الإصبع" + "فتح قفل ملف العمل ببصمة الإصبع وببصمة الوجه" "يجب ضبط الإعدادات" "تمت إضافة وجه وبصمات أصابع." "تمت إضافة وجه وبصمة إصبع" - "في حال إعداد ميزتَي \"فتح الجهاز بالتعرف على الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الهاتف إدخال بصمة إصبعك عندما تكون في منطقة مظلمة أو ترتدي كمّامة." + "في حال إعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\"، سيطلب منك الهاتف إدخال بصمة إصبعك عندما تكون في منطقة مظلمة أو ترتدي كمّامة." "طرق فتح القفل" "استخدام الوجه أو بصمة الإصبع من أجل:" "فتح قفل الهاتف" @@ -446,8 +446,8 @@ "باستخدام بصمة الإصبع" "باستخدام الوجه أو بصمة الإصبع" "حسنًا" - "هل يتعذّر إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"؟" - "أغلِق وضع تقسيم الشاشة لإعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"." + "هل يتعذّر إعداد ميزة \"فتح الجهاز ببصمة الوجه\"؟" + "أغلِق وضع تقسيم الشاشة لإعداد ميزة \"فتح الجهاز ببصمة الوجه\"." "يتعذّر إعداد بصمة الإصبع" "أغلِق وضع تقسيم الشاشة لإعداد ميزة \"فتح الجهاز ببصمة الإصبع\"." "حسنًا" @@ -546,9 +546,9 @@ "قفل المساحة الخاصة" "يمكنك فتح قفل المساحة الخاصة بالطريقة نفسها المستخدَمة لفتح قفل جهازك، أو يمكنك اختيار طريقة أخرى" "استخدام قفل شاشة الجهاز" - "فتح الجهاز ببصمة الإصبع والتعرّف على الوجه" + "فتح الجهاز ببصمة الإصبع وببصمة الوجه" "فتح الجهاز ببصمة الإصبع" - "فتح الجهاز بالتعرّف على الوجه" + "فتح الجهاز ببصمة الوجه" "انقر لإعداد هذه الميزة." "فتح المساحة الخاصة باستخدام بصمة الإصبع" "فتح المساحة الخاصة باستخدام بصمة الوجه" @@ -675,7 +675,7 @@ "النقش• الوجه" "رقم التعريف الشخصي • الوجه" "كلمة المرور • الوجه" - "المتابعة بدون إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"" + "المتابعة بدون إعداد ميزة \"فتح الجهاز ببصمة الوجه\"" "المتابعة بدون استخدام الوجه أو بصمة الإصبع" "بدون قفل" "التمرير السريع" @@ -1616,9 +1616,9 @@ "تم ضبط كلمة المرور" "‏تم ضبط رمز PIN" "تم ضبط النقش" - "ضبط كلمة مرور لاستخدام \"فتح الجهاز بالتعرف على الوجه\"" - "ضبط نقش لاستخدام \"فتح الجهاز بالتعرف على الوجه\"" - "‏ضبط رقم PIN لاستخدام \"فتح الجهاز بالتعرف على الوجه\"" + "ضبط كلمة مرور لاستخدام \"فتح الجهاز ببصمة الوجه\"" + "ضبط نقش لاستخدام \"فتح الجهاز ببصمة الوجه\"" + "‏ضبط رقم PIN لاستخدام \"فتح الجهاز ببصمة الوجه\"" "يجب ضبط كلمة مرور لفتح جهازك ببصمة إصبع أو بالتعرف على الوجه" "يجب ضبط نقش لفتح جهازك ببصمة الإصبع أو بالتعرف على الوجه" "‏يجب ضبط رقم PIN لفتح جهازك ببصمة الإصبع أو بالتعرف على الوجه" @@ -3502,7 +3502,7 @@ "‏الرسائل القصيرة SMS والرسائل النصية والاتصالات الأخرى" "الإشعارات" "يمكن إصدار رنين أو اهتزاز بناءً على الإعدادات" - "صامت" + "الوضع الصامت" "الإشعارات التي لا تصدِر صوتًا أو اهتزازًا مطلقًا" "التطبيقات المسموح لها" "التطبيقات غير المسموح لها" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index 33c8c05281e..634b69c45c9 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -2872,7 +2872,7 @@ "সর্বদা-চালু VPN এর সার্ভার্র এবং DNS উভয়েরই জন্য আইপি অ্যাড্রেস প্রয়োজন।" "কোনো নেটওয়ার্ক কানেকশন নেই। দয়া করে পরে আবার চেষ্টা করুন।" "VPN থেকে ডিসকানেক্ট হয়েছে" - "কোনো কিছুই নয়" + "কোনওটাই নয়" "একটি সার্টিফিকেট পাওয়া যাচ্ছে না। প্রোফাইলটি সম্পাদনা করুন।" "সিস্টেম" "ব্যবহারকারী" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index abe0a8b616b..52173918d2a 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -24,9 +24,9 @@ "Activar" "Desconocido" "Presiona para obtener más información" - "{count,plural, =1{Ahora estás a # paso de activar las opciones para desarrolladores}other{Ahora estás a # pasos de activar las opciones para desarrolladores}}" + "{count,plural, =1{Ahora estás a # paso de activar las opciones para desarrolladores.}other{Ahora estás a # pasos de activar las opciones para desarrolladores.}}" "¡Ya eres desarrollador!" - "No es necesario, ya eres desarrollador." + "No es necesario. Ya eres desarrollador." "Primero habilita las opciones para programador." "Solo los usuarios administradores pueden acceder a la configuración para desarrolladores." "Sistema" @@ -365,7 +365,7 @@ "Usa tus huellas dactilares" "Más información sobre Desbloqueo con huellas dactilares" "Tú tienes el control" - "Tanto tú como tu hijo tienen el control" + "Tanto tú como tu hijo o hija tienen el control" "Para tener en cuenta" "Usa tu huella dactilar para desbloquear el teléfono o aprobar compras.\n\nNota: No puedes usar tu huella dactilar para desbloquear este dispositivo. Para obtener más información, comunícate con el administrador de la organización." "Cancelar" @@ -394,7 +394,7 @@ "Con rostro, huella dactilar o reloj" "Con reloj" "Primero configura Desbloqueo facial o con huellas dactilares" - "Puedes usar el reloj para desbloquear el dispositivo cuando no se reconozcan tu rostro ni tu huella dactilar." + "Puedes desbloquear con el reloj cuando no se reconozcan tu rostro ni tu huella dactilar" "Primero configura Desbloqueo con huellas dactilares" "Puedes desbloquear con el reloj cuando no se reconozca tu huella dactilar" "Primero configura Desbloqueo facial" @@ -572,7 +572,7 @@ "Sistema" "Borrar espacio privado" "¿Borrar espacio privado?" - "Se quitará el espacio privado de tu dispositivo, además de todos los datos y las apps privados. No podrás deshacer esta acción." + "Se quitará el espacio privado de tu dispositivo, además de todos los datos y las apps privadas. No podrás deshacer esta acción." "Las siguientes cuentas se quitarán de tu espacio privado:" "Borrar" "Borrando el espacio privado…" @@ -761,7 +761,7 @@ "Si ingresas un PIN incorrecto en el próximo intento, se borrarán tu perfil de trabajo y sus datos" "Si ingresas una contraseña incorrecta en el próximo intento, se borrarán tu perfil de trabajo y sus datos" "{count,plural, =1{Debe tener al menos # carácter}other{Debe tener al menos # caracteres}}" - "{count,plural, =1{Si solo se usan números, debe ser de al menos 1 dígito}other{Si solo se usan números, deben ser de al menos # dígitos}}" + "{count,plural, =1{Si solo se usan números, debe ser de al menos 1 dígito}other{Si solo se usan números, debe ser de al menos # dígitos}}" "{count,plural, =1{El PIN debe tener al menos # dígito}other{El PIN debe tener al menos # dígitos}}" "{count,plural, =1{El PIN debe tener al menos # dígito, pero se recomienda un PIN de {minAutoConfirmLen} dígitos para mayor seguridad}other{El PIN debe tener al menos # dígitos, pero se recomienda un PIN de {minAutoConfirmLen} dígitos para mayor seguridad}}" "{count,plural, =1{Debe tener menos de # carácter}other{Debe tener menos de # caracteres}}" @@ -774,7 +774,7 @@ "{count,plural, =1{Debe tener al menos 1 dígito numérico}other{Debe tener al menos # dígitos numéricos}}" "{count,plural, =1{Debe tener al menos 1 símbolo especial}other{Debe tener al menos # símbolos especiales}}" "{count,plural, =1{Debe tener al menos 1 carácter que no sea una letra}other{Debe tener al menos # caracteres que no sean letras}}" - "{count,plural, =1{Debe tener al menos 1 carácter no numérico}other{Debe tener al menos # caracteres no numéricos}}" + "{count,plural, =1{Debe tener al menos 1 carácter no numérico}other{Debe tener al menos # de caracteres no numéricos}}" "El administrador del dispositivo no permite el uso de contraseñas recientes" "No se permiten secuencias de dígitos ascendentes, descendentes ni repetidas" "Confirmar" @@ -1168,7 +1168,7 @@ "Seleccionada" "Colores" "Naturales" - "Mejorados" + "Potenciado" "Saturados" "Automáticos" "Nivel de brillo" @@ -1388,10 +1388,10 @@ "Formateando dispositivo (^1)…" "No extraigas ^1 durante el proceso de formateo." "Formateo de ^1" - "Transferir la aplicación ^1" + "Mover ^1" "Transferir la aplicación ^1 y los datos relacionados al dispositivo ^2 solo demorará un momento. Hasta que no se complete la transferencia, no podrás usar la aplicación. \n\nNo extraigas el dispositivo ^2 durante el proceso." "Para transferir datos, debes desbloquear al usuario ^1." - "Transfiriendo la aplicación ^1…" + "Transfiriendo ^1…" "Durante el proceso, no extraigas el dispositivo ^1. \n\nLa aplicación ^2 estará disponible en este dispositivo cuando se complete el proceso." "¿Cómo usarás ^1?" "O bien" @@ -1401,7 +1401,7 @@ "Configurar más tarde" "¿Quieres formatear ^1?" "Debes formatear ^1 para poder almacenar apps, archivos y contenido multimedia. \n\nEl formateo borrará todo el contenido existente en ^2. Para no perderlo, crea una copia de seguridad en otro dispositivo (como ^3)." - "Debe formatearse ste dispositivo (^1) para almacenar fotos, videos, música y mucho más. \n\nCuando lo formatees, se borrará todo el contenido existente en ^2. Para no perder el contenido, crea una copia de seguridad en otro dispositivo (^3 u otros)." + "Este dispositivo (^1) debe formatearse para que pueda almacenar fotos, videos, música y mucho más. \n\nAl formatear, se borrará todo el contenido existente en la ^2. Para no perder el contenido, crea una copia de seguridad en una ^3 distinta o en otro dispositivo." "Formatear ^1" "¿Transferir el contenido a ^1?" "Durante la transferencia:" @@ -1891,7 +1891,7 @@ "Personaliza los gestos de navegación del panel táctil" "Invertir desplazamiento" "El contenido sube cuando te desplazas hacia abajo" - "Toque en la parte inferior derecha" + "Toque de la parte inferior derecha" "Más opciones en la esquina inferior derecha del panel táctil" "Velocidad del puntero" "Aprende los gestos del panel táctil" @@ -2249,7 +2249,7 @@ "Vincula los audífonos" "En la siguiente pantalla, presiona tus audífonos. Es posible que debas vincular el audífono izquierdo y el derecho por separado.\n\nAsegúrate de que los audífonos estén encendidos y listos para la vinculación." "%1$s activo" - "%1$s, solo izquierdo" + "%1$s, solo el izquierdo" "%1$s, solo el derecho" "%1$s, izquierdo y derecho" "Más de 1 %1$s" @@ -2509,7 +2509,7 @@ "desde la última carga completa" "Apps del sistema" - "Apps desinstalada" + "Apps desinstaladas" "Otros" "Tiempo restante estimado" "Para completar la carga" @@ -2848,8 +2848,8 @@ "¿Configurar la VPN siempre activa?" "Si activas esta opción de configuración, no tendrás conexión a Internet hasta que se conecte la VPN" "Se reemplazará la VPN actual y no tendrás conexión a Internet hasta que se conecte la nueva VPN" - "Ya estás conectado a una VPN siempre activa. Si te conectas a otra, se reemplazará la VPN actual y se desactivará el modo siempre activo." - "Ya estás conectado a una VPN. Si te conectas a otra, se reemplazará la VPN actual." + "Ya estableciste conexión con una VPN siempre activa. Si te conectas a otra, se reemplazará la VPN actual y se desactivará el modo siempre activo." + "Ya te conectaste a una VPN. Si te conectas a otra, se reemplazará la VPN actual." "Activar" "No se puede establecer conexión con %1$s" "Esta app no es compatible con VPN siempre activada" @@ -2859,7 +2859,7 @@ "Borrar perfil" "VPN siempre activada" "No se agregó ninguna VPN" - "Mantente siempre conectado a una VPN" + "Mantén siempre conexión a la VPN" "La opción no es compatible con esta app" "Siempre activada" "No es segura" @@ -2867,7 +2867,7 @@ "¿Requerir una conexión VPN?" "La VPN no es segura. Actualiza a una VPN IKEv2." "No se pudo iniciar la VPN no compatible." - "Selecciona el perfil de la VPN con la que deseas establecer una conexión ininterrumpida. El tráfico de red solo se permitirá cuando estés conectado a esta VPN." + "Selecciona el perfil de la VPN con la que deseas establecer una conexión ininterrumpida. El tráfico de red solo se permitirá cuando tengas conexión a esta VPN." "Ninguna" "La VPN siempre activada requiere una dirección IP tanto para el servidor como para el DNS." "No hay conexión de red. Inténtalo de nuevo más tarde." @@ -2903,8 +2903,8 @@ "Es posible que la red esté supervisada" "Listo" "{count,plural, =1{Confiar en el certificado o quitarlo}other{Confiar en los certificados o quitarlos}}" - "{numberOfCertificates,plural, =1{{orgName} instaló una autoridad certificadora en tu dispositivo, lo que le permitirá supervisar la actividad de la red del dispositivo, incluidos los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre este certificado, comunícate con tu administrador.}other{{orgName} instaló autoridades certificadoras en tu dispositivo, lo que le permitirá supervisar la actividad de la red del dispositivo, incluidos los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre estos certificados, comunícate con tu administrador.}}" - "{numberOfCertificates,plural, =1{{orgName} instaló una autoridad certificadora para tu perfil de trabajo, lo que le permitirá supervisar la actividad de la red laboral, incluidos los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre este certificado, comunícate con tu administrador.}other{{orgName} instaló autoridades certificadoras para tu perfil de trabajo, lo que les permitirá supervisar la actividad de la red laboral, como los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre estos certificados, comunícate con tu administrador.}}" + "{numberOfCertificates,plural, =1{{orgName} instaló una autoridad certificadora en tu dispositivo, lo que le permitirá supervisar la actividad de red del dispositivo, incluidos los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre este certificado, comunícate con tu administrador.}other{{orgName} instaló autoridades certificadoras en tu dispositivo, lo que le permitirá supervisar la actividad de red del dispositivo, incluidos los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre estos certificados, comunícate con tu administrador.}}" + "{numberOfCertificates,plural, =1{{orgName} instaló una autoridad certificadora para tu perfil de trabajo, lo que le permitirá supervisar la actividad de red laboral, incluidos los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre este certificado, comunícate con tu administrador.}other{{orgName} instaló autoridades certificadoras para tu perfil de trabajo, lo que les permitirá supervisar la actividad de red laboral, como los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre estos certificados, comunícate con tu administrador.}}" "Un tercero puede supervisar tu actividad en la red, incluido el correo electrónico, las aplicaciones y los sitios web seguros.\n\nEsto ocurre porque hay una credencial de confianza instalada en el dispositivo." "{count,plural, =1{Revisar certificado}other{Revisar certificados}}" "Varios usuarios" @@ -2918,11 +2918,11 @@ "Tú (%s)" "No puedes agregar más usuarios. Quita alguno para agregar nuevos." "Los perfiles restringidos no pueden agregar cuentas." - "Borrar a %1$s del disp." + "Borrar a %1$s" "Configuración de la pantalla de bloqueo" "Agregar usuarios desde la pantalla de bloqueo" "Cambiar a usuario administrador cuando se conecte" - "¿Deseas borrarte a ti mismo?" + "¿Quieres borrar tu perfil?" "¿Borrar este usuario?" "¿Eliminar este perfil?" "¿Eliminar perfil de trabajo?" @@ -3247,7 +3247,7 @@ "Sí (%1$s y %2$s)" "También puedes activar el audio espacial para dispositivos Bluetooth." "Parámetros de configuración de dispositivos conectados" - "{count,plural, =0{Ninguno}=1{Se estableció 1 programa}other{Se establecieron # programas}}" + "{count,plural, =0{Ninguno}=1{1 programa establecido}other{# programas establecidos}}" "No interrumpir" "Solo recibe notificaciones de las personas y apps que más te interesan" "Limitar las interrupciones" @@ -3320,7 +3320,7 @@ "Hasta que lo desactives" "{count,plural, =1{1 hora}other{# horas}}" "{count,plural, =1{1 minuto}other{# minutos}}" - "{count,plural, =0{Desactivado}=1{Desactivado/1 programa se puede activar automáticamente}other{Desactivado/# programas se pueden activar automáticamente}}" + "{count,plural, =0{Desactivada}=1{Desactivada/1 programa se puede activar automáticamente}other{Desactivada/# programas se pueden activar automáticamente}}" "Pueden suspender el modo No interrumpir:" "Personas" "Apps" @@ -3721,7 +3721,7 @@ "Al fijar una app, esta se mantiene visible hasta que dejas de fijarla. Esta función se puede utilizar, por ejemplo, para dejar que alguien de confianza juegue un juego específico." "Si fijas una app, esta podrá abrir otras apps y acceder a tus datos personales. \n\nPara usar la fijación de apps, haz lo siguiente: \n{0,number,integer}. Activa la fijación de apps. \n{1,number,integer}. Abre Recientes. \n{2,number,integer}. Presiona el ícono de la app que se encuentra en la parte superior de la pantalla y, luego, Fijar." "Si fijas una app, esta podrá abrir otras apps y acceder a tus datos personales. \n\nSi quieres compartir tu dispositivo con alguien de forma segura, usa un perfil de invitado. \n\nPara usar la fijación de apps, haz lo siguiente: \n{0,number,integer}. Activa la fijación de apps. \n{1,number,integer}. Abre Recientes. \n{2,number,integer}. Presiona el ícono de la app que se encuentra en la parte superior de la pantalla y, luego, Fijar." - "Cuando fijas una app, puede ocurrir lo siguiente: \n\n• Esta podrá acceder a datos personales (como contactos y contenido de los correos electrónicos). \n•  Es posible que las apps fijadas abran otras apps. \n\nUsa la función para fijar apps solo con personas de confianza.\n" + "Cuando fijas una app, puede ocurrir lo siguiente: \n\n• Esta podrá acceder a datos personales \n (como contactos y contenido de los correos electrónicos) \n• Es posible que la app fijada abra otras apps \n\nUsa la fijación de apps solo con personas de confianza." "Solicitar desbloqueo para quitar fijación" "Solicitar PIN para quitar fijación" "Solicitar contraseña para quitar fijación" @@ -3896,7 +3896,7 @@ "Libre(s)" "Memoria que utilizan las aplicaciones" "{count,plural, =1{1 app usó la memoria en las últimas {time}}other{# apps usaron la memoria en las últimas {time}}}" - "Habilitar la gen. de per. de uso de mem." + "Habilitar la generación de perfiles de uso de memoria" "La generación de perfiles del uso de memoria requiere recursos de sistema adicionales." "Se inhabilitó la generación de perfiles de memoria" "Frecuencia" @@ -4263,7 +4263,7 @@ "Registro de tráfico de red más reciente" "Informe de errores más reciente" "Registro de seguridad más reciente" - "Ninguno" + "Ninguna" "Apps instaladas" "La cantidad de apps es aproximada. Es posible que no se cuenten las apps que no hayas instalado desde Play Store." "{count,plural, =1{Al menos # app}other{Al menos # apps}}" @@ -4583,7 +4583,7 @@ "Para activar %1$s, primero termina la conexión satelital" "Nombres de puntos de acceso" "apn" - "No está disponible cuando estás conectado a %1$s" + "No está disponible cuando el dispositivo está conectado a %1$s" "Ver más" "¿Quieres activar %1$s?" "¿Quieres activar la SIM?" @@ -5061,7 +5061,7 @@ "Sensor de huellas dactilares" "Notificaciones con flash" "Info. sobre notificaciones con flash" - "Desactivadas" + "No" "Activado / Flash de la cámara" "Activadas: Flash de la pantalla" "Activadas: Flash de la cámara y pantalla" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 784e45a504e..85d173f1cf7 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -25,7 +25,7 @@ "Desconocido" "Toca para que se muestre la información" "{count,plural, =1{Te queda # paso para habilitar las opciones para desarrolladores.}other{Te quedan # pasos para habilitar las opciones para desarrolladores.}}" - "¡Ahora están activadas las opciones para desarrolladores!" + "¡Ya eres desarrollador!" "Las opciones para desarrolladores ya están activadas." "Habilita primero las opciones para desarrolladores." "Solo los usuarios administradores pueden acceder a los ajustes para desarrolladores." @@ -272,7 +272,7 @@ "%1$s después de agotarse el tiempo de espera de la pantalla, salvo si %2$s mantiene el dispositivo desbloqueado" "Añadir texto a pantalla de bloqueo" "Ninguno" - "p. ej., Android de Juan" + "P. ej., Android de Juan." "Ubicación" "Usar ubicación" "Desactivado" @@ -377,7 +377,7 @@ "Importante" "Cómo funciona" "Desbloqueo con huella digital crea un modelo único de tu huella digital para verificar que eres tú. Para crear este modelo durante la configuración, se toman imágenes de tu huella en diferentes posiciones." - "Desbloqueo con huella digital crea un modelo único de la huella digital de tu hijo/a para verificar que es él/ella. Para crear este modelo de huella digital durante la configuración, se toman imágenes de su huella desde diferentes posiciones." + "Desbloqueo con Huella Digital crea un modelo único de la huella digital de tu hijo/a para verificar su identidad. Para crear este modelo de huella digital durante la configuración, se toman imágenes de su huella desde diferentes posiciones." "Para obtener mejores resultados, usa un protector de pantalla con certificado Made for Google. Con otros protectores de pantalla, puede que tu huella digital no funcione." "Para obtener mejores resultados, usa un protector de pantalla con certificado Made for Google. Con otros protectores de pantalla, puede que la huella digital de tu hijo/a no funcione." @@ -572,7 +572,7 @@ "Sistema" "Eliminar espacio privado" "¿Eliminar espacio privado?" - "Se eliminará tu espacio privado del dispositivo. Se eliminarán todos los datos y aplicaciones privados. No podrás deshacer esta acción." + "Se eliminará tu espacio privado del dispositivo. Se eliminarán los datos y las aplicaciones. No podrás deshacer esta acción." "Las siguientes cuentas se eliminarán de tu espacio privado:" "Eliminar" "Eliminando espacio privado…" @@ -961,7 +961,7 @@ "Escanea el código QR" "Centra el código QR de abajo para conectarte a \"%1$s\"" "Escanea el código QR para conectarte a la red Wi‑Fi" - "Compartir Wi‑Fi" + "Compartir Wi-Fi" "Escanea este código QR con otro dispositivo para conectarlo a \"%1$s\"" "Escanea este código QR con otro dispositivo para conectarte a \"%1$s\"" "Vuelve a intentarlo. Si el problema persiste, ponte en contacto con el fabricante del dispositivo" @@ -1168,9 +1168,9 @@ "Seleccionado" "Colores" "Naturales" - "Mejorados" + "Mejorado" "Saturados" - "Adaptativos" + "Adaptativo" "Nivel de brillo" "Brillo adaptativo" "El brillo de la pantalla se ajustará automáticamente según el entorno y lo que hagas. Puedes mover el control deslizante para que la función Brillo adaptativo reconozca tus preferencias." @@ -1239,7 +1239,7 @@ "El tema oscuro utiliza un fondo negro que ayuda a ahorrar batería en algunas pantallas. Si lo programas, se esperará a que la pantalla esté apagada antes de activarse." "El tema oscuro sigue tus horarios del modo Descanso" "Ajustes del modo Descanso" - "Más atenuado" + "Aún más atenuado" "Permite que el dispositivo se atenúe más de lo normal" "Tiempo de espera de la pantalla" "%1$s de inactividad" @@ -1826,7 +1826,7 @@ "En caché" "%1$s de RAM" "Aplicación en ejecución" - "Inactivos" + "Inactivo" "Servicios" "Procesos" "Detener" @@ -1840,13 +1840,13 @@ "Proveedor %1$s en uso" "¿Quieres detener el servicio del sistema?" "Idiomas, entrada de texto y gestos" - "Idiomas e introducción de texto" + "Idiomas e introducción de texto" "Idiomas" "Teclado" "No tienes permiso para cambiar el idioma del dispositivo." "Idiomas e introd. de texto" "Herramientas" - "Teclado e introducción de texto" + "Teclado y métodos de entrada" "Idiomas del sistema" "Idiomas" @@ -2471,7 +2471,7 @@ "Invalidar" "Comprueba el accesorio de carga" "Más información sobre la carga con adaptadores incompatibles" - "Gestor de batería" + "Administrador de batería" "Gestionar aplicaciones automáticamente" "Cuando el gestor de batería detecte que las aplicaciones consumen batería, podrás restringirlas, aunque es posible que no funcionen correctamente y las notificaciones se retrasen." "Aplicaciones restringidas" @@ -2658,10 +2658,10 @@ "No se ha podido borrar el almacenamiento de credenciales." "Apps con acceso de uso" "Certificado AC" - "Certificado de usuario" + "Certificado de usuario de VPN y aplicaciones" "Certificado de Wi‑Fi" "Tus datos no serán privados" - "Con los certificados AC, los sitios web, las aplicaciones y las VPNs pueden cifrar datos. Instala solo certificados AC de organizaciones en las que confíes. \n\nSi instalas un certificado AC, su propietario podría acceder a tus datos, como contraseñas o información de tarjetas de crédito, de sitios web que visites o aplicaciones que uses, incluso si tus datos están cifrados." + "Con los certificados AC, los sitios web, las aplicaciones y las VPNs pueden cifrar datos. Instala solo certificados AC de organizaciones en las que confíes. \n\nSi instalas un certificado AC, su propietario podría acceder a datos que hayas introducido en los sitios web que visitas o las aplicaciones que usas, aunque estén cifrados. Por ejemplo, podría tener acceso a contraseñas o a la información de tarjetas de crédito." "No instalar" "Instalar de todas formas" "No se ha instalado el certificado" @@ -2848,8 +2848,8 @@ "¿Configurar el modo de VPN siempre activada?" "Si esta opción está activada, no tendrás acceso a Internet hasta que se conecte la red VPN" "La nueva red VPN sustituirá a la actual y no tendrás acceso a Internet hasta que dicha VPN se conecte" - "Ya estás conectado a una red VPN siempre activada. Si te conectas a otra, esta sustituirá a la VPN actual y se desactivará el modo de VPN siempre activada." - "Ya estás conectado a una red VPN. Si te conectas a otra, esta sustituirá a la VPN actual." + "Ya te has conectado a una red VPN siempre activada. Si te conectas a otra, esta sustituirá a la VPN actual y se desactivará el modo de VPN siempre activada." + "Ya te has conectado a una red VPN. Si te conectas a otra, esta sustituirá a la VPN actual." "Activar" "No se puede conectar a %1$s" "Esta aplicación no es compatible con el modo de VPN siempre activada" @@ -2867,11 +2867,11 @@ "¿Requerir una conexión VPN?" "No es segura. Cambia a una VPN IKEv2." "No se ha podido iniciar la VPN no compatible." - "Selecciona un perfil de VPN para permanecer conectado de forma continua. Solo se permitirá el tráfico de red cuando estés conectado a esta red VPN." + "Selecciona un perfil de VPN para mantener la conexión de forma continua. Solo se permitirá el tráfico de red cuando tengas conexión a esta red VPN." "Ninguno" "Las redes VPN activadas continuamente requieren una dirección IP para el servidor y el DNS." "No hay conexión de red. Inténtalo de nuevo más tarde." - "Desconectado de la red VPN" + "Te has desconectado de la VPN" "Ninguna" "Falta un certificado. Prueba a editar el perfil." "Sistema" @@ -2921,7 +2921,7 @@ "Eliminar a %1$s de este dispositivo" "Ajustes de pantalla de bloqueo" "Añadir usuarios desde la pantalla de bloqueo" - "Cambiar a administrador al ponerse en la base" + "Cambiar al usuario administrador al conectarse" "¿Eliminarte a ti mismo?" "¿Eliminar este usuario?" "¿Quitar este perfil?" @@ -2938,7 +2938,7 @@ "Usuarios" "Otros usuarios" "Eliminar actividad de invitado" - "Elimina todas las aplicaciones y datos de la sesión de invitado al salir del modo Invitado" + "Elimina todos los datos y aplicaciones de la sesión de invitado al salir del modo Invitado" "¿Eliminar actividad de invitado?" "Se eliminarán las aplicaciones y datos de esta sesión de invitado ahora, y toda la actividad futura correspondiente se borrará cada vez que salgas del modo Invitado" "eliminar, invitado, actividad, retirar, datos, visitante, borrar" @@ -2948,9 +2948,9 @@ "Convertir a este usuario en administrador" "Eliminar usuario" "¿Activar llamadas y SMS?" - "El historial de SMS y de llamadas se compartirá con este usuario." + "El historial de SMS y de llamadas se compartirán con este usuario." "¿Quitar privilegios de administrador?" - "Si le quitas los privilegios de administrador a este usuario, tanto tú como otro administrador podéis devolvérselos más tarde." + "Si le quitas los privilegios de administrador a este usuario, tanto tú como otro administrador puede devolvérselos más tarde." "Información de emergencia" "Información y contactos de %1$s" "Abrir %1$s" @@ -3125,7 +3125,7 @@ "preferencias de funciones inteligentes, batería inteligente" "ortografía, diccionarios, corrector ortográfico, autocorrección" "herramienta de reconocimiento, entrada, conversión de texto a voz, hablar, idioma, manos libres, reconocimiento, ofensiva, palabra, audio, historial, auriculares bluetooth" - "valorar, idioma, predeterminado, hablar, conversión de texto a voz, accesibilidad, lector de pantalla, ciego" + "valorar, idioma, predeterminado, hablar, tts, accesibilidad, lector de pantalla, invidente" "reloj, militar" "restablecer, restaurar, fábrica" "borrar, eliminar, restaurar, resetear, recuperar, restablecer estado de fábrica" @@ -3318,7 +3318,7 @@ "Activado" "Preguntar siempre" "Hasta que lo desactives" - "{count,plural, =1{1 hora}other{# horas}}" + "{count,plural, =1{1 hora}other{# horas}}" "{count,plural, =1{1 minuto}other{# minutos}}" "{count,plural, =0{Desactivado}=1{Desactivado / 1 programación puede activarlo automáticamente}other{Desactivado / # programaciones pueden activarlo automáticamente}}" "Qué puede interrumpirte durante el modo No molestar" @@ -3633,7 +3633,7 @@ "llamadas" "Llamadas que pueden interrumpirte" "Para asegurarte de que las llamadas permitidas suenan, comprueba que el dispositivo esté configurado para sonar" - "Las llamadas entrantes se bloquean en la programación \"%1$s\". Cambia los ajustes para que tus amigos, familiares u otras personas puedan contactar contigo." + "Las llamadas entrantes se bloquean en la programación %1$s. Cambia los ajustes para que tus amigos, familiares u otros puedan contactar contigo." "Contactos destacados" "{count,plural,offset:2 =0{Nadie}=1{{contact_1}}=2{{contact_1} y {contact_2}}=3{{contact_1}, {contact_2} y {contact_3}}other{{contact_1}, {contact_2} y # más}}" "(Sin nombre)" @@ -3642,7 +3642,7 @@ "Mensajes" "Mensajes que pueden interrumpirte" "Para asegurarte de que los mensajes permitidos suenan, comprueba que el dispositivo esté configurado para sonar" - "Los mensajes entrantes se bloquean en la programación \"%1$s\". Cambia los ajustes para que tus amigos, familiares u otras personas puedan contactar contigo." + "Los mensajes entrantes se bloquean en la programación %1$s. Cambia los ajustes para que tus amigos, familiares u otras personas puedan contactar contigo." "Todos los mensajes pueden interrumpirte" "Todas las llamadas pueden interrumpirte" "{count,plural, =0{Nadie}=1{1 contacto}other{# contactos}}" @@ -3731,7 +3731,7 @@ "Protección memoria avanzada beta" "Protección de memoria avanzada" "Esta función beta te ayuda a proteger tu dispositivo de errores que pueden poner en riesgo tu seguridad." - "Activado" + "Activada" "Desactivado" "Se activará tras reiniciar" "Se desactivará tras reiniciar" @@ -3772,7 +3772,7 @@ "Cambiar almacenamiento" "Notificaciones" "Activadas" - "%1$s/%2$s" + "%1$s / %2$s" "Desactivadas" "{count,plural, =1{# categoría desactivada}other{# categorías desactivadas}}" "{count,plural, =1{# permiso adicional}other{# permisos adicionales}}" @@ -4845,7 +4845,7 @@ "Cambiar" "%1$s / %2$s" "Conectado" - "Conectado temporalmente" + "Conectada temporalmente" "Usando %1$s temporalmente" "Sin conexión" "Los datos móviles no se conectarán automáticamente" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index b4473c93166..db3fd28dcb5 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -1633,7 +1633,7 @@ "Aurrera egiteko, idatzi laneko pasahitza" "Segurtasuna bermatzeko, marraztu gailuaren eredua" "Segurtasuna bermatzeko, idatzi gailuaren PINa" - "Segurtasuna bermatzeko, idatzi gailuaren pasahitza" + "Segurtasuna bermatzeko, idatzi gailuko pasahitza" "Segurtasuna bermatzeko, marraztu laneko eredua" "Segurtasuna bermatzeko, idatzi laneko PINa" "Segurtasuna bermatzeko, idatzi laneko pasahitza" @@ -1652,7 +1652,7 @@ "Egiaztatu pasahitza" "Aurrera egiteko, marraztu gailuaren eredua" "Aurrera egiteko, idatzi gailuaren PINa" - "Aurrera egiteko, idatzi gailuaren pasahitza" + "Aurrera egiteko, idatzi gailuko pasahitza" "PINa ez da zuzena" "Pasahitza ez da zuzena" "Eredua ez da zuzena" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 4d9dcb985e9..22ad470aa06 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -272,8 +272,8 @@ "%1$s après la mise en veille, sauf lorsque l\'appareil est maintenu déverrouillé par %2$s" "Ajouter du texte sur l\'écran" "Aucun" - "Par exemple : Android de Jonathan" - "Position" + "Par exemple : Android de Jonathan." + "Localisation" "Utiliser ma position" "Désactivé" "{count,plural, =1{Activée / # appli a accès à la position}one{Activée / # appli a accès à la position}other{Activée / # applis ont accès à la position}}" @@ -297,7 +297,7 @@ "Déverr. par reconn. faciale" "Déverrouillage reconnaissance faciale pour travail" "Configurer le déverrouillage par reconn. faciale" - "Configurer le Déverrouillage par reconn. faciale" + "Configurer le Déverrouillage par reconnaissance faciale" "Utiliser son visage pour s\'authentifier" "Commencer" @@ -433,7 +433,7 @@ "Ajouter une montre" "Retirer une montre" "Déverrouillage empreinte digitale et reconnaissance faciale" - "Déverr. par reconn. faciale et empreinte digitale pour le travail" + "Déverrouillage par recon. faciale et emp. digitale pour le travail" "Configuration requise" "Empreintes digitales et visage ajoutés" "Empreinte digitale et visage ajoutés" @@ -916,7 +916,7 @@ "Autoriser WEP" "Fermer" "Se déconnecter du réseau %1$s?" - "Vous êtes connecté à un réseau WEP. Si vous bloquez ces réseaux, vous serez déconnecté." + "Vous avez une connexion à un réseau WEP. Si vous bloquez ces réseaux, vous perdrez votre connexion." "Options avancées" "Liste déroulante des options avancées" "développer" @@ -993,7 +993,7 @@ "Utilisez un code QR pour ajouter un appareil à ce réseau" "Le format du code QR est incorrect" "Réessayer" - "Partager avec d\'autres utilisateurs d\'appareils" + "Partager avec d\'autres utilisateurs de l\'appareil" "(aucune modification)" "Veuillez choisir" "(Certificats multiples ajoutés)" @@ -1007,7 +1007,7 @@ "Pour améliorer la précision de la position, une appli inconnue souhaite activer la recherche de réseaux, même lorsque le Wi-Fi est désactivé.\n\nAutoriser toutes les applis qui le demandent?" "Autoriser" "Refuser" - "Ce réseau ne dispose d\'aucun accès à Internet. Voulez-vous quand même l\'utiliser?" + "Ce réseau ne dispose d\'aucun accès Internet. Voulez-vous quand même l\'utiliser?" "Connectivité limitée : certains services et applis pourraient ne pas fonctionner. Utiliser quand même?" "Ne plus me demander pour ce réseau" "Le Wi‑Fi n\'est pas connecté à Internet" @@ -1301,7 +1301,7 @@ "Autorisez votre téléphone à passer automatiquement à %1$s pour les données cellulaires en cas de meilleure disponibilité." \n\n"Les appels, les messages et le trafic réseau peuvent être visibles pour votre organisation." "NIP de carte SIM incorrect. Vous devez maintenant communiquer avec votre fournisseur de services pour déverrouiller votre appareil." - "{count,plural, =1{NIP de la carte SIM incorrect. Il vous reste # tentative. Après cela, vous devrez communiquer avec votre fournisseur de services pour déverrouiller votre appareil.}one{NIP de la carte SIM incorrect. Il vous reste # tentative.}other{NIP de la carte SIM incorrect. Il vous reste # tentatives.}}" + "{count,plural, =1{NIP de la carte SIM incorrect. Il vous reste # tentative. Après cela, vous devrez communiquer avec votre opérateur pour déverrouiller votre appareil.}one{NIP de la carte SIM incorrect. Il vous reste # tentative.}other{NIP de la carte SIM incorrect. Il vous reste # tentatives.}}" "NIP de module SIM incorrect. Il vous reste une tentative. Après cela, vous devrez communiquer avec votre fournisseur de services pour déverrouiller votre appareil." "Le déverrouillage par NIP de carte SIM a échoué." "Mises à jour du système" @@ -1384,7 +1384,7 @@ "Oublier « ^1 »?" "Toutes les applis, photos et données enregistrées sur la mémoire de stockage « ^1 » seront perdues définitivement." "Le répertoire Système comprend des fichiers utilisés pour faire fonctionner Android version %s" - "En mode Invité, on ne peut formater de cartes SD" + "En mode Invité, on ne peut pas formater de cartes SD" "Formatage de « ^1 » en cours..." "Ne retirez pas ^1 durant le formatage." "^1 formatée" @@ -1763,7 +1763,7 @@ "Applis désactivées" "Téléchargée" "Diffusion en cours" - "Non installé pour cet utilisateur" + "Pas installée pour cet utilisateur" "Installée" "Aucune appli" "Mémoire de stockage interne" @@ -1812,7 +1812,7 @@ "Utilisateur : %1$s" - "Utilisateur supprimé" + "Utilisateur retiré" "%1$d processus et %2$d service" "%1$d processus et %2$d services" "%1$d processus et %2$d service" @@ -2354,7 +2354,7 @@ "vision, audition, aveugle, sourd, motricité, dextérité, fonctionnel, assistance, facilité d\'utilisation, facilité d\'accès, main, aide" "Agrandisseur d\'écran, zoom, agrandissement, vision faible, agrandir, rendre plus gros" - "Sous-titres, sous-titrage, CC, sous-titres instantanés, malentendant, perte auditive, transcription en temps réel assistée par ordinateur, synthèse textuelle, sous-titrer" + "Sous-titres, sous-titrage, CC, Transcription instantanée, malentendant, perte auditive, la traduction en temps réel des communications (CART), synthèse textuelle, sous-titrer" @@ -2646,7 +2646,7 @@ "Supprimer tous les certificats" "Certificats de confiance" "Afficher les certificats d\'autorité de confiance" - "Authentifiants d\'utilisateur" + "Authentifiant d\'utilisateur" "Afficher et modifier les authentifiants stockés" "Paramètres avancés" "Les authentifiants ne sont pas accessibles pour cet utilisateur" @@ -2813,7 +2813,7 @@ "^1""^2"\n"alerte" "^1""^2"\n"limite" "Applis supprimées" - "Applis et utilisateurs supprimés" + "Applis et utilisateurs retirés" "Utilisation du réseau" "Facturé à l\'usage" "Nom" @@ -2848,7 +2848,7 @@ "Définir le RPV permanent?" "Si vous activez ce paramètre, vous ne disposerez d\'aucune connexion Internet jusqu\'à ce que le RPV parvienne à se connecter" "Votre RPV existant sera remplacé, et vous ne disposerez d\'aucune connexion Internet jusqu\'à ce que le RPV parvienne à se connecter" - "Vous êtes déjà connecté à un RPV permanent. Si vous vous connectez à un autre RPV, le RPV actuel sera remplacé et le mode permanent sera désactivé." + "Votre appareil est déjà connecté à un RPV permanent. Si vous vous connectez à un autre RPV, le RPV actuel sera remplacé, et le mode permanent sera désactivé." "Vous êtes déjà connecté à un RPV. Si vous vous connectez à un RPV différent, votre RPV actuel sera remplacé." "Activer" "%1$s n\'est pas en mesure de se connecter" @@ -2867,7 +2867,7 @@ "Exiger une connexion RPV?" "Pas sécuritaire. Passez à un RPV de type IKEv2" "Échec du démarrage d\'un RPV non pris en charge." - "Sélectionnez un profil RPV auquel rester connecté en permanence. Le trafic réseau ne sera autorisé que lorsque vous serez connecté à ce RPV." + "Sélectionnez un profil RPV auquel l\'appareil restera connecté en permanence. Le trafic réseau sera autorisé seulement lorsque votre appareil sera connecté à ce RPV." "Aucun" "Le RPV permanent nécessite une adresse IP pour le serveur et le DNS." "Aucune connexion réseau. Veuillez réessayer plus tard." @@ -2885,10 +2885,10 @@ "Supprimer définitivement le certificat d\'autorité utilisateur?" "En cours d\'utilisation par" "Cette entrée contient" - "Une clé utilisateur" + "1 clé d\'utilisateur" "Un certificat utilisateur" "Un certificat CA" - "%d certificats CA" + "%d certificats CA" "Détails de l\'authentifiant" "L\'identifiant suivant a été supprimé : %s" "Aucun authentifiant d\'utilisateur installé" @@ -2903,8 +2903,8 @@ "Le réseau peut être surveillé" "Terminé" "{count,plural, =1{Faire confiance au certificat ou le retirer}one{Faire confiance au certificat ou le retirer}other{Faire confiance aux certificats ou les retirer}}" - "{numberOfCertificates,plural, =1{{orgName} a installé une autorité de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}one{{orgName} a installé une autorité de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}other{{orgName} a installé des autorités de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ces certificats, communiquez avec votre administrateur.}}" - "{numberOfCertificates,plural, =1{{orgName} a installé une autorité de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}one{{orgName} a installé une autorité de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}other{{orgName} a installé des autorités de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ces certificats, communiquez avec votre administrateur.}}" + "{numberOfCertificates,plural, =1{{orgName} a installé une autorité de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}one{{orgName} a installé une autorité de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}other{{orgName} a installé des autorités de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}}" + "{numberOfCertificates,plural, =1{{orgName} a installé une autorité de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}one{{orgName} a installé une autorité de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}other{{orgName} a installé des autorités de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.}}" "Un tiers peut surveiller votre activité réseau, y compris les courriels, les applis et les sites Web sécurisés. \n\nUn certificat de confiance installé sur votre appareil rend cela possible." "{count,plural, =1{Vérifier le certificat}one{Vérifier le certificat}other{Vérifier les certificats}}" "Plusieurs utilisateurs" @@ -2914,7 +2914,7 @@ "Non configuré" "Non configuré : profil limité" "Non configuré : profil professionnel" - "Admin" + "Administrateur" "Vous (%s)" "Vous ne pouvez plus ajouter d’utilisateurs. Retirez un utilisateur pour en ajouter un nouveau." "Les profils limités ne peuvent pas ajouter de compte." @@ -2929,7 +2929,7 @@ "L\'ensemble des applis et des données seront supprimées." "Toutes les applis et les données de ce profil seront supprimées si vous continuez." "L\'ensemble des applis et des données seront supprimées." - "Ajout de l\'utilisateur…" + "Ajout de l\'utilisateur en cours…" "Supprimer l\'utilisateur" "Supprimer" "Toutes les applis et les données de cette session seront supprimées." @@ -3041,7 +3041,7 @@ "Position" "Autoriser les applis à utiliser vos données de localisation" "Précédent" - "SUIVANT" + "Suivant" "Formater autrement" "Cartes SIM" @@ -3410,7 +3410,7 @@ "Après le déverrouillage, accédez au dernier écran utilisé. Les notifications ne s\'afficheront pas à l\'écran. Balayez du haut vers le bas pour les voir." "Écran de verrouillage, écran verrouillé, ignorer, contourner" "Lorsque le profil professionnel est verrouillé" - "Afficher seul. les nouv. notif. sur l\'écran de verrouillage" + "Afficher seul. les nouvelles notifi. sur l\'écran de verrou." "Retirez automatiquement les notifications consultées de l\'écran de verrouillage" "Notifications sur l\'écran de verrouillage" "Afficher les conversations, par défaut et silencieuses" @@ -3483,7 +3483,7 @@ "Aucune" "Aucune demande d\'accès aux notifications n\'a été envoyée pour les applis installées." "Autoriser l\'accès aux notifications" - "Les notifications améliorées ont remplacé les notifications adaptatives Android sous Android 12. Cette fonctionnalité vous présente des suggestions d\'actions et de réponses, et organise vos notifications. \n\nLes notifications améliorées peuvent accéder au contenu de toutes les notifications, y compris les renseignements personnels comme le nom des contacts et les messages. Cette fonctionnalité peut aussi fermer des notifications ou interagir avec elles, comme répondre aux appels téléphoniques et gérer le mode Ne pas déranger." + "Les notifications améliorées ont remplacé les notifications adaptatives Android sous Android 12. Cette fonctionnalité vous suggère des actions et des réponses, et organise vos notifications. \n\nLes notifications améliorées peuvent accéder au contenu de toutes les notifications, y compris les renseignements personnels comme le nom des contacts et les messages. Cette fonctionnalité peut aussi fermer des notifications ou interagir avec elles, comme répondre aux appels téléphoniques et gérer le mode Ne pas déranger." "Autoriser %1$s à accéder aux notifications?" "L\'appli %1$s pourra lire toutes les notifications, y compris les renseignements personnels tels que les noms des contacts, les photos et le texte des messages que vous recevez. Cette appli pourra également répéter ou fermer des notifications, ou effectuer des actions sur des boutons dans les notifications, y compris répondre à des appels téléphoniques. \n\nCette action permettra également à l\'appli d\'activer et de désactiver la fonctionnalité Ne pas déranger et de modifier les paramètres connexes." "L\'appli %1$s pourra effectuer les actions suivantes :" @@ -4039,7 +4039,7 @@ "C\'est votre appareil qui mesure l\'utilisation des données pour les limites et les avertissements. Ces mesures peuvent différer de celles de votre fournisseur de services." "Définir limite consomm. données" "Limite de données" - "%1$s utilisés pour la période : %2$s" + "%1$s utilisées pour la période suivante : %2$s" "Configurer" "Autres applis incluses dans l\'utilisation" "{count,plural, =1{1 appli est autorisée à ignorer les restrictions lorsque la fonction Économiseur de données est activée}one{# appli est autorisée à ignorer les restrictions lorsque la fonction Économiseur de données est activée}other{# applis sont autorisées à ignorer les restrictions lorsque la fonction Économiseur de données est activée}}" @@ -4123,7 +4123,7 @@ "L\'objet de classement est manquant." "L\'objet de classement ne contient pas cette touche." "Encoche de l\'écran" - "découpe d\'affichage, encoche" + "encoche de l\'écran, encoche" "Valeurs par défaut de l\'appareil" "Impossible d\'appliquer la superposition" "Accès spécial des applis" @@ -4159,7 +4159,7 @@ "Contribue à prolonger l\'autonomie de la pile" "Paramètres rapides, tuiles de développeur" "Désactiver le délai d\'expiration des autorisations adb" - "Désactivez le retrait automatique des autorisations adb pour des systèmes qui ne se sont pas connectés ou qui n\'ont pas été configurés par l\'utilisateur dans le délai d\'expiration par défaut (respectivement, sept jours et un jour minimum)." + "Désactiver le retrait automatique des autorisations adb pour des systèmes qui ne se sont pas connectés ou qui n\'ont pas été configurés par l\'utilisateur dans le délai d\'expiration par défaut (respectivement, sept jours et un jour minimum)." "Capteurs désactivés" "Paramètres du profil professionnel" "Laissez les applis personnelles déterminer les contacts à l\'aide de l\'annuaire professionnel" @@ -4345,7 +4345,7 @@ "Jeux" "Espace utilisé" "(désinst. pour l\'utilisateur %s)" - "(désactivé pour l\'utilisateur %s)" + "(désactivé pour %s)" "Service de remplissage auto" "Service de remplissage automatique par défaut" "Mots de passe" @@ -4749,7 +4749,7 @@ "Gestionnaire de rapport de bogue" "Détermine quelle appli gère le raccourci de rapport de bogue sur votre appareil." "Personnel" - "Travail" + "Profil professionnel" "Paramètres par défaut" "Aucune" "Ce choix n\'est plus valide. Réessayez." @@ -5107,7 +5107,7 @@ "Désactivés" "Activés" "Désactivée" - "Activée" + "Activés" "Le nom de votre appareil est visible aux applis que vous avez installées. Il est également possible que d\'autres personnes voient le nom de votre appareil lorsque vous vous connectez à des appareils Bluetooth ou à un réseau Wi-Fi, ou lorsque vous configurez un point d\'accès Wi-Fi." "Genre grammatical" "Sélectionnez un genre grammatical" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 0304a729900..539aba628b5 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -2071,7 +2071,7 @@ "Des projets pour le week-end ?" "Je vais à la plage. Tu veux venir ?" "Options" - "Zoom avant sur l\'écran" + "Zoomez sur l\'écran" "Appuyer trois fois pour zoomer" "Appuyer sur un bouton pour zoomer" "Faites un zoom avant rapide sur l\'écran pour agrandir le contenu" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 10fa172a03f..fcbf014c291 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -71,7 +71,7 @@ "Accoppia l\'altro orecchio" "La tua protesi uditiva sinistra è connessa.\n\nPer accoppiare quella destra, assicurati che sia accesa e pronta per l\'accoppiamento." "La tua protesi uditiva destra è connessa.\n\nPer accoppiare quella sinistra, assicurati che sia accesa e pronta per l\'accoppiamento." - "Accoppia orecchio destro" + "Accoppia orecchio dx" "Accoppia orecchio sx" "Per tutte le protesi uditive disponibili" "Altre impostazioni delle protesi uditive" @@ -215,7 +215,7 @@ "Femminili" "Maschili" "Neutra" - "{count,plural, =1{Vuoi rimuovere la lingua selezionata?}other{Vuoi rimuovere le lingue selezionate?}}" + "{count,plural, =1{Rimuovere la lingua selezionata?}other{Rimuovere le lingue selezionate?}}" "Il testo verrà mostrato in un\'altra lingua." "Impossibile rimuovere tutte le lingue" "Mantieni almeno una lingua preferita" @@ -337,8 +337,8 @@ "Riconfigura lo Sblocco con il Volto" "Migliora la sicurezza e le prestazioni" "Configura lo Sblocco con il Volto" - "Elimina l\'attuale modello del volto per riconfigurare lo Sblocco con il Volto.\n\nIl 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 o eseguire l\'autenticazione nelle app." - "Elimina l\'attuale modello del volto per riconfigurare lo Sblocco con il Volto.\n\nIl modello del volto verrà eliminato definitivamente e in sicurezza.\n\nDopo l\'eliminazione dovrai usare l\'impronta, il PIN, la sequenza o la password per sbloccare il telefono o eseguire l\'autenticazione nelle app." + "Elimina l\'attuale modello del volto per riconfigurare lo Sblocco con il Volto.\n\nIl modello del volto verrà eliminato definitivamente e in sicurezza.\n\nDopo l\'eliminazione dovrai usare il PIN, la sequenza o la password per sbloccare lo smartphone o eseguire l\'autenticazione nelle app." + "Elimina l\'attuale modello del volto per riconfigurare lo Sblocco con il Volto.\n\nIl modello del volto verrà eliminato definitivamente e in sicurezza.\n\nDopo l\'eliminazione dovrai usare l\'impronta, il PIN, la sequenza o la password per sbloccare lo smartphone o eseguire l\'autenticazione nelle app." "Usa lo Sblocco con il Volto per" "Quando usi lo Sblocco con il Volto" "Gli occhi devono essere aperti" @@ -763,7 +763,7 @@ "{count,plural, =1{Deve contenere almeno # carattere}other{Deve contenere almeno # caratteri}}" "{count,plural, =1{Se utilizzi solo numeri, la password deve avere almeno 1 cifra}other{Se utilizzi solo numeri, la password deve avere almeno # cifre}}" "{count,plural, =1{Il PIN deve contenere almeno # cifra}other{Il PIN deve contenere almeno # cifre}}" - "{count,plural, =1{Il PIN deve contenere almeno # cifra, ma è consigliato un PIN di {minAutoConfirmLen} cifre per una maggiore sicurezza}other{Il PIN deve contenere almeno # cifre, ma è consigliato un PIN di {minAutoConfirmLen} cifre per una maggiore sicurezza}}" + "{count,plural, =1{Il PIN deve contenere almeno # cifra, ma un PIN di {minAutoConfirmLen} cifre è consigliato per una maggiore sicurezza}other{Il PIN deve contenere almeno # cifre, ma un PIN di {minAutoConfirmLen} cifre è consigliato per una maggiore sicurezza}}" "{count,plural, =1{Deve contenere meno di # carattere}other{Deve contenere meno di # caratteri}}" "{count,plural, =1{Deve contenere meno di # cifra}other{Deve contenere meno di # cifre}}" "L\'amministratore del dispositivo non consente l\'utilizzo di un PIN recente" @@ -813,7 +813,7 @@ "Quando il Bluetooth è attivato, il tuo dispositivo può comunicare con altri dispositivi che si trovano nelle vicinanze" "Quando il Bluetooth è attivato, il tuo dispositivo può comunicare con altri dispositivi Bluetooth che si trovano nelle vicinanze. Funzionalità come Quick Share, Trova il mio dispositivo e la posizione del dispositivo usano il Bluetooth." "Quando il Bluetooth è attivo, il dispositivo può comunicare con altri dispositivi Bluetooth nelle vicinanze.\n\nPer migliorare l\'esperienza sul dispositivo, app e servizi possono comunque cercare dispositivi nelle vicinanze in qualsiasi momento, anche quando il Bluetooth non è attivo. Questo può essere utile, ad esempio, per migliorare funzionalità e servizi basati sulla posizione. Puoi modificare questa opzione nelle impostazioni relative alla scansione Bluetooth." - "Quando il Bluetooth è attivato, il tuo dispositivo può comunicare con altri dispositivi che si trovano nelle vicinanze. Funzionalità come Quick Share, Find My Device e la posizione del dispositivo usano il Bluetooth.\n\nApp e servizi possono comunque cercare dispositivi nelle vicinanze in qualsiasi momento, anche quando il Bluetooth non è attivo. Questo può essere utile, ad esempio, per migliorare funzionalità e servizi basati sulla posizione. Puoi modificare questa opzione nelle impostazioni di scansione Bluetooth." + "Quando il Bluetooth è attivato, il tuo dispositivo può comunicare con altri dispositivi che si trovano nelle vicinanze. Funzionalità come Quick Share, Trova il mio dispositivo e la posizione del dispositivo usano il Bluetooth.\n\nApp e servizi possono comunque cercare dispositivi nelle vicinanze in qualsiasi momento, anche quando il Bluetooth non è attivo. Questo può essere utile, ad esempio, per migliorare funzionalità e servizi basati sulla posizione. Puoi modificare questa opzione nelle impostazioni di scansione Bluetooth." "Modifica" "Dettagli dispositivo" "Impostazioni tastiera" @@ -1007,7 +1007,7 @@ "Per migliorare la precisione della posizione e per altri scopi, un\'app sconosciuta vuole attivare la ricerca della rete, anche se il Wi‑Fi non è attivo.\n\nVuoi autorizzare ogni app che richiede di eseguire la ricerca?" "Consenti" "Rifiuta" - "Questa rete non ha accesso a Internet. Vuoi restare connesso?" + "Questa rete non ha accesso a internet. Vuoi restare connesso?" "Alcuni servizi e app potrebbero non funzionare a causa della connettività limitata. Usarli comunque?" "Non chiedermelo più per questa rete" "Wi-Fi non connesso a Internet" @@ -1114,7 +1114,7 @@ "Salvata" "Impossibile salvare. Riprova." "Vuoi salvare le reti?" - "Salvataggio di %d reti…" + "Salvataggio di %d reti in corso…" "Reti salvate" "Chiamate Wi-Fi" "Estendi le chiamate usando il Wi‑Fi" @@ -1140,7 +1140,7 @@ "Se le chiamate Wi-Fi sono attive, il tuo telefono può indirizzare le chiamate tramite reti Wi-Fi o la rete del tuo operatore, in base alle tue preferenze e alla potenza del segnale. Prima di attivare questa funzionalità, verifica tariffe e altri dettagli con il tuo operatore.%1$s" "Indirizzo per le emergenze" - "Viene considerato la tua posizione quando fai una chiamata di emergenza tramite Wi‑Fi" + "Viene considerato come la tua posizione quando fai una chiamata di emergenza tramite Wi‑Fi" "Scopri di più"" sulle funzioni di DNS privato" "On" "Attiva le chiamate Wi-Fi" @@ -1384,14 +1384,14 @@ "Dimenticare ^1?" "Tutti i dati, le app e le foto memorizzati su ^1 verranno perduti per sempre." "Il sistema include i file utilizzati per eseguire Android versione %s" - "Utenti Ospite non possono formattare le schede SD" + "Utenti ospite non possono formattare le schede SD" "Formattazione della ^1…" "Non rimuovere il dispositivo ^1 durante la formattazione." "Formattazione ^1 eseguita" "Sposta ^1" "Lo spostamento dell\'app ^1 e dei relativi dati sulla ^2 sarà veloce. Potrai utilizzare l\'app soltanto al termine dello spostamento. \n\nNon rimuovere la ^2 durante lo spostamento." "Per spostare i dati devi sbloccare l\'utente ^1." - "Spostamento dell\'app ^1…" + "Spostamento dell\'app ^1 in corso…" "Non rimuovere la ^1 durante lo spostamento. \n\nL\'app ^2 su questo dispositivo sarà disponibile soltanto al termine dello spostamento." "Come userai ^1?" "Oppure" @@ -1547,7 +1547,7 @@ "Mostra tutto" "Vedi dettagli" "Nessuna app ha richiesto la posizione di recente" - "Nessuna app ha effettuato di recente l\'accesso alla posizone" + "Nessuna app ha effettuato di recente l\'accesso alla posizione" "Elevato utilizzo della batteria" "Basso utilizzo della batteria" "Ricerca di reti Wi-Fi" @@ -2249,8 +2249,8 @@ "Accoppia apparecchi acustici" "Nella schermata successiva, seleziona i tuoi apparecchi acustici. Potresti dover accoppiare l\'orecchio destro e sinistro separatamente.\n\nAssicurati che gli apparecchi acustici siano accesi e pronti per l\'accoppiamento." "Dispositivo %1$s attivo" - "%1$s, solo sinistra" - "%1$s, solo destra" + "%1$s, solo destro" + "%1$s, solo destro" "%1$s, sinistra e destra" "%1$s più un altro" "Accoppia nuovo dispositivo" @@ -2737,7 +2737,7 @@ "Rimuovi profilo di lavoro" "Dati in background" "Sincron., invio e ricezione dati possibili in ogni momento" - "Disatt. dati backgr.?" + "Disatt. dati backg.?" "La disattivazione dei dati in background aumenta la durata della batteria e riduce l\'utilizzo dei dati. Alcune applicazioni potrebbero utilizzare comunque la connessione dati in background." "Sincronizzazione attiva" "La sincronizzazione non è attiva" @@ -2848,8 +2848,8 @@ "Impostare la rete VPN sempre attiva?" "Quando questa impostazione è attiva, la connessione Internet non sarà disponibile fino a quando la rete VPN sarà connessa correttamente" "La rete VPN attuale sarà sostituita e la connessione Internet non sarà disponibile fino a quando la rete VPN sarà connessa correttamente" - "Sei già collegato a una rete VPN sempre attiva. Se ti connetti a un\'altra rete, la rete VPN attuale verrà sostituita e la modalità sempre attiva verrà disattivata." - "Sei già collegato a una rete VPN. Se ti connetti a un\'altra rete, la VPN attuale verrà sostituita." + "Hai già effettuato la connessione a una rete VPN sempre attiva. Se ti connetti a un\'altra rete, la rete VPN attuale verrà sostituita e la modalità sempre attiva verrà disattivata." + "Hai già eseguito la connessione a una rete VPN. Se ti connetti a un\'altra rete, la VPN attuale verrà sostituita." "Attiva" "Impossibile connettersi alla rete %1$s" "Questa app non supporta le reti VPN sempre attive" @@ -2867,7 +2867,7 @@ "Connessione VPN obbligatoria?" "Tipo non sicuro. Usa una VPN IKEv2." "Impossibile avviare la VPN non supportata." - "Seleziona un profilo VPN a cui rimanere sempre connesso. Il traffico di rete sarà consentito solo quando sei connesso a questa VPN." + "Seleziona un profilo VPN con cui mantenere la connessione attiva. Il traffico di rete sarà consentito solo durante la connessione a questa VPN." "Nessuna" "La VPN sempre attiva richiede un indirizzo IP per server e DNS." "Nessuna connessione di rete disponibile. Riprova più tardi." @@ -3320,7 +3320,7 @@ "Fino alla disattivazione" "{count,plural, =1{1 ora}other{# ore}}" "{count,plural, =1{1 minuto}other{# minuti}}" - "{count,plural, =0{Off}=1{Off/1 pianificazione può attivarsi automaticamente}other{Off/# pianificazioni possono attivarsi automaticamente}}" + "{count,plural, =0{Off}=1{Off/Può essere attivata automaticamente 1 programmazione}other{Off/Possono essere attivate automaticamente # programmazioni}}" "Possono interrompere la modalità Non disturbare" "Persone" "App" @@ -3477,13 +3477,13 @@ "Mai" "Notifiche app e dispositivi" "Controlla quali app e dispositivi possono leggere le notifiche" - "Accosso bloccato alle notifiche del profilo di lavoro" + "Accesso bloccato alle notifiche del profilo di lavoro" "Notifiche avanzate" "Ricevi suggerimenti di azioni, risposte e altro" "Nessuna" "Nessuna delle app installate ha richiesto l\'accesso alle notifiche." "Consenti l\'accesso alle notifiche" - "Le notifiche adattive sono state sostituite dalle notifiche avanzate in Android 12. Questa funzionalità mostra risposte e azioni suggerite e organizza le tue notifiche. \n\nLe notifiche avanzate possono accedere ai contenuti delle notifiche, incluse le informazioni personali, come i nomi dei contatti e i messaggi. Questa funzionalità può anche ignorare le notifiche o rispondervi, ad esempio accettando le telefonate, e controllare la modalità Non disturbare." + "Le notifiche adattive Android sono state sostituite dalle notifiche avanzate in Android 12. Questa funzionalità mostra risposte e azioni suggerite e organizza le tue notifiche. \n\nLe notifiche avanzate possono accedere ai contenuti di una notifica, incluse le informazioni personali, come i nomi dei contatti e i messaggi. Questa funzionalità può anche ignorare le notifiche o rispondervi, ad esempio accettando le telefonate, e controllare la modalità Non disturbare." "Consentire a %1$s di accedere alle notifiche?" "L\'app %1$s potrà leggere tutte le notifiche, incluse informazioni personali quali nomi dei contatti, foto e il testo dei messaggi ricevuti. Questa app potrà inoltre posticipare o ignorare le notifiche oppure agire sui pulsanti nelle notifiche, ad esempio rispondere alle telefonate. \n\nL\'app potrà anche attivare o disattivare la funzionalità Non disturbare e modificare le relative impostazioni." "L\'app %1$s potrà:" @@ -3911,7 +3911,7 @@ "Ottimizza" "La batteria potrebbe scaricarsi più rapidamente. L\'uso della batteria in background non sarà più impedito all\'app." "Opzione consigliata per una durata maggiore della batteria" - "Nessuno" + "Nessuna" "Se disattivi l\'accesso ai dati di utilizzo di questa app, l\'amministratore potrà comunque monitorare l\'utilizzo dei dati per le app nel tuo profilo di lavoro" "Mostra sopra altre app" "Mostra sopra altre app" @@ -4050,7 +4050,7 @@ "Dati rimanenti: ^1" "Grafico che mostra l\'utilizzo dei dati dal giorno %1$s al giorno %2$s." "Non ci sono dati in questo intervallo di date" - "{count,plural, =1{# giorno rimanente}other{# giorni rimanenti}}" + "{count,plural, =1{Manca # giorno}other{Mancano # giorni}}" "Tempo scaduto" "Meno di 1 giorno rimanente" "Aggiornato da ^1 ^2 fa" @@ -4392,7 +4392,7 @@ "Tema del dispositivo" "Valore predefinito" "Nome della rete" - "Nome della Rete Display nella bara di stato" + "Mostra nome della rete nella barra di stato" "App istantanea" "Disattivare la gestione della memoria?" "Aggiorna modalità Non disturbare" @@ -5078,7 +5078,7 @@ "Ciano" "Verde primavera" "Verde" - "Giallo-verdognolo" + "Verde acido" "Giallo" "Arancione" "Rosso" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 6d5030d9a1f..2751768aa1c 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -3712,7 +3712,7 @@ "Sūtīt atsauksmes par šo ierīci" "Ievadiet administratora PIN" "Ieslēgts" - "Izslēgts" + "Izslēgta" "Ieslēgti" "Izslēgti" "Ieslēgta" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index ec559bb82fe..114481a6e30 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -756,7 +756,7 @@ "ଏଥର ମଧ୍ୟ ଭୁଲ ପାସ୍‌ୱାର୍ଡ ଲେଖିଲେ ଏହି ଡିଭାଇସ୍‌ ଡାଟା ଲିଭାଇ ଦିଆଯିବ" "ପରବର୍ତ୍ତୀ ପ୍ରୟାସରେ ଯଦି ଆପଣ ଭୁଲ ପାଟର୍ନ ଅଙ୍କନ କରନ୍ତି, ତେବେ ଏହି ୟୁଜର ଡିଲିଟ ହୋଇଯିବେ" "ପରବର୍ତ୍ତୀ ପ୍ରୟାସରେ ଯଦି ଆପଣ ଭୁଲ ପିନ ନମ୍ବର ଲେଖନ୍ତି, ତେବେ ଏହି ୟୁଜର ଡିଲିଟ ହୋଇଯିବେ" - "ପରବର୍ତ୍ତୀ ପ୍ରୟାସରେ ଯଦି ଆପଣ ଭୁଲ ପାସ୍‌ୱର୍ଡ ଦିଅନ୍ତି, ତେବେ ଏହି ଉପଯୋଗକର୍ତ୍ତା ଡିଲିଟ୍‌ ହୋଇଯିବେ" + "ପରବର୍ତ୍ତୀ ପ୍ରୟାସରେ ଯଦି ଆପଣ ଭୁଲ ପାସୱର୍ଡ ଦିଅନ୍ତି ତେବେ ଏହି ୟୁଜର ଡିଲିଟ ହୋଇଯିବେ" "ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଯଦି ଆପଣ ଭୁଲ ପାଟର୍ନ ଦିଅନ୍ତି, ତେବେ ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍‌ ଓ ଏହାର ଡାଟା ଡିଲିଟ୍‌ ହୋଇଯିବ" "ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଯଦି ଆପଣ ଭୁଲ PIN ଦିଅନ୍ତି, ତେବେ ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍‌ ଓ ତାର ଡାଟା ଡିଲିଟ୍‌ ହୋଇଯିବ" "ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଯଦି ଆପଣ ଭୁଲ ପାସ‌ୱାର୍ଡ ଲେଖନ୍ତି, ତେବେ ଆପଣଙ୍କର ୱାର୍କ ପ୍ରୋଫାଇଲ୍‌ ଓ ତାର ଡାଟାକୁ ଡିଲିଟ୍‌ କରିଦିଆଯିବ।" @@ -1812,7 +1812,7 @@ "ୟୁଜର: %1$s" - "କାଢ଼ିଦିଆଯାଇଥିବା ଉପଯୋଗକର୍ତ୍ତା" + "କାଢ଼ିଦିଆଯାଇଥିବା ୟୁଜର" "%1$d ପ୍ରକ୍ରିୟା ଏବଂ %2$d ସେବା" "%1$d ପ୍ରକ୍ରିୟା ଓ %2$d ସେବା" "%1$d ପ୍ରକ୍ରିୟା ଓ %2$d ସେବା" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 624adbec0c5..a99b88b5a9f 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -3818,7 +3818,7 @@ "การเข้าถึงการใช้งาน" "อนุญาตการเข้าถึงการใช้งาน" "เวลาอยู่หน้าจอ" - "การเข้าถึงการใช้งานทำให้แอปสามารถติดตามว่าคุณกำลังใช้​แอปอื่นใดอยู่ ความถี่ในการใช้ รวมทั้งผู้ให้บริการ การตั้งค่าภาษา และรายละเอียดอื่นๆ" + "การเข้าถึงการใช้งานทำให้แอปสามารถติดตามว่าคุณกำลังใช้​แอปอื่นใดอยู่ ความถี่ในการใช้ รวมทั้งผู้ให้บริการ การตั้งค่าภาษา และรายละ⁠เอียดอื่นๆ" "หน่วยความจำ" "ทำงานตลอดเวลา (%s)" "ทำงานบางครั้ง (%s)" From b7e0d7b1a64eb4b8e04a65b3f1892e548eeff2ed Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 Jul 2024 21:25:22 -0700 Subject: [PATCH 17/19] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I16f5cb6e083adbaff08eea7d1af65272e283a323 --- res-product/values-ar/strings.xml | 36 ++++++------ res-product/values-de/strings.xml | 6 +- res-product/values-es-rUS/strings.xml | 26 ++++----- res-product/values-es/strings.xml | 84 +++++++++++++-------------- res-product/values-fr-rCA/strings.xml | 30 +++++----- res-product/values-it/strings.xml | 28 ++++----- res-product/values-zh-rTW/strings.xml | 2 +- 7 files changed, 106 insertions(+), 106 deletions(-) diff --git a/res-product/values-ar/strings.xml b/res-product/values-ar/strings.xml index 3a53ee40680..a1daddb1bc9 100644 --- a/res-product/values-ar/strings.xml +++ b/res-product/values-ar/strings.xml @@ -170,24 +170,24 @@ "يجب ضبط رقم تعريف شخصي لإعداد ميزة \"فتح الجهاز ببصمة الإصبع\".\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\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يحمي النقش الهاتف في حال فقدانه أو سرقته." + "يجب ضبط كلمة مرور لإعداد ميزة \"فتح الجهاز ببصمة الوجه\".\n\nتحمي كلمة المرور الهاتف في حال فقدانه أو سرقته." + "يجب ضبط رقم تعريف شخصي لإعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\".\n\nيحمي رقم التعريف الشخصي الجهاز اللوحي في حال فقدانه أو سرقته." + "يجب ضبط نقش لإعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\".\n\nيحمي النقش الجهاز اللوحي في حال فقدانه أو سرقته." + "يجب ضبط كلمة مرور لإعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\".\n\nتحمي كلمة المرور الجهاز اللوحي في حال فقدانه أو سرقته." + "يجب ضبط رقم تعريف شخصي لإعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\".\n\nيحمي رقم التعريف الشخصي الجهاز في حال فقدانه أو سرقته." + "يجب ضبط نقش لإعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\".\n\nيحمي النقش الجهاز في حال فقدانه أو سرقته." + "يجب ضبط كلمة مرور لإعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\".\n\nتحمي كلمة المرور الجهاز في حال فقدانه أو سرقته." + "يجب ضبط رقم تعريف شخصي لإعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\".\n\nيحمي رقم التعريف الشخصي الهاتف في حال فقدانه أو سرقته." + "يجب ضبط نقش لإعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\".\n\nيحمي النقش الهاتف في حال فقدانه أو سرقته." + "يجب ضبط كلمة مرور لإعداد ميزتَي \"فتح الجهاز ببصمة الوجه\" و\"فتح الجهاز ببصمة الإصبع\".\n\nتحمي كلمة المرور الهاتف في حال فقدانه أو سرقته." "يؤدي هذا الإجراء إلى حذف النموذج والصور المرتبطة ببصمة الإصبع \"%1$s\"، والتي تم تخزينها على هاتفك" "يؤدي هذا الإجراء إلى حذف النموذج والصور المرتبطة ببصمة الإصبع \"%1$s\"، والتي تم تخزينها على جهازك اللوحي" "يؤدي هذا الإجراء إلى حذف النموذج والصور المرتبطة ببصمة الإصبع \"%1$s\"، والتي تم تخزينها على جهازك" diff --git a/res-product/values-de/strings.xml b/res-product/values-de/strings.xml index 4f4f0cfc5d3..ea007fcd13c 100644 --- a/res-product/values-de/strings.xml +++ b/res-product/values-de/strings.xml @@ -135,8 +135,8 @@ "Du kannst deinen Fingerabdruck verwenden, um dein Gerät zu entsperren oder dich zu authentifizieren, beispielsweise um dich in Apps anzumelden" "Du kannst deinen Fingerabdruck verwenden, um dein Smartphone zu entsperren oder dich zu authentifizieren, beispielsweise um dich in Apps anzumelden" "Gib das Tablet an dein Elternteil zurück" - "Gib das Gerät an dein Elternteil zurück" - "Gib das Telefon an dein Elternteil zurück" + "Gib das Gerät an deinen Elternteil zurück" + "Gib das Smartphone an deinen Elternteil zurück" "Die Schutzfunktionen für dein Mobilgerät werden nicht aktiviert. Du kannst dann nicht verhindern, dass andere Personen dieses Tablet verwenden, falls es verloren geht, gestohlen oder zurückgesetzt wird." "Die Schutzfunktionen für dein Mobilgerät werden nicht aktiviert. Du kannst dann nicht verhindern, dass andere Personen dieses Gerät verwenden, falls es verloren geht, gestohlen oder zurückgesetzt wird." "Die Schutzfunktionen für dein Mobilgerät werden nicht aktiviert. Du kannst dann nicht verhindern, dass andere Personen dieses Smartphone verwenden, falls es verloren geht, gestohlen oder zurückgesetzt wird." @@ -312,7 +312,7 @@ "Wenn auch andere Nutzer dein Tablet verwenden dürfen, kannst du ihm neue Nutzer hinzufügen. Jeder Nutzer erhält auf deinem Tablet sein privates Profil für benutzerdefinierte Startbildschirme, Konten, Apps, Einstellungen usw." "Wenn du dein Smartphone mit anderen teilen möchtest, kannst du neue Nutzer hinzufügen. Jeder Nutzer erhält auf deinem Smartphone ein privates Profil für eigene Startbildschirme, Konten, Apps, Einstellungen usw." "Nur der Eigentümer des Tablets kann Nutzer verwalten." - "Nur der Eigentümer des Telefons kann Nutzer verwalten." + "Nur der Eigentümer des Smartphones kann Nutzer verwalten." "Dein Profil und deine Daten werden vom Tablet entfernt. Du kannst diese Aktion nicht rückgängig machen." "Dein Profil und deine Daten werden vom Telefon entfernt. Du kannst diese Aktion nicht rückgängig machen." "Hilfeartikel, Telefon- & Chatsupport" diff --git a/res-product/values-es-rUS/strings.xml b/res-product/values-es-rUS/strings.xml index 143ffc90613..b36f68f92d1 100644 --- a/res-product/values-es-rUS/strings.xml +++ b/res-product/values-es-rUS/strings.xml @@ -55,12 +55,12 @@ "Usa tu rostro para desbloquear el teléfono o autenticarte en apps, como cuando accedes o apruebas compras." "Usa tu rostro para desbloquear la tablet o autenticarte en apps, como cuando accedes o apruebas compras." "Usa tu rostro para desbloquear el dispositivo o autenticarte en apps, como cuando accedes o apruebas compras." - "Permite que tu hijo desbloquee su teléfono con el rostro" - "Permite que tu hijo desbloquee su tablet con el rostro" - "Permite que tu hijo desbloquee su dispositivo con el rostro" + "Permite que tu hijo o hija desbloquee su teléfono con el rostro" + "Permite que tu hijo o hija desbloquee su tablet con el rostro" + "Permite que tu hijo o hija desbloquee su dispositivo con el rostro" "Permite que tu hijo o hija use su rostro para desbloquear el teléfono o verificar su identidad. Permitirá el acceso a apps, aprobar compras y mucho más." "Permite que tu hijo o hija use su rostro para desbloquear la tablet o verificar su identidad. Permitirá el acceso a apps, aprobar compras y mucho más." - "Permite que tu hijo o hija use su rostro para desbloquear el dispositivo o verificar su identidad. Permitirá el acceso a apps, aprobar compras y mucho más." + "Permite que tu hijo o hija use su rostro para desbloquear el dispositivo o verificar su identidad. Permitirá acceder a apps, aprobar compras y mucho más." "Usar el desbloqueo facial para que tu hijo acceda a su teléfono puede ser menos seguro que usar un buen patrón o un PIN." "Usar el desbloqueo facial para que tu hijo acceda a su tablet puede ser menos seguro que usar un buen patrón o un PIN." "Usar el desbloqueo facial para que tu hijo acceda a su dispositivo puede ser menos seguro que usar un buen patrón o un PIN." @@ -107,9 +107,9 @@ "Usa tu rostro para desbloquear la tablet o verificar tu identidad, por ejemplo, cuando accedes a apps o apruebas compras.\n\nTen en cuenta lo siguiente:\nSolo puedes configurar un rostro por vez. Para agregar otro rostro, borra el actual.\n\nPuedes desbloquear la tablet aunque no lo desees cuando la miras.\n\nUn tercero puede desbloquear la tablet si la sostiene frente a tu rostro, incluso aunque tengas los ojos cerrados.\n\nTambién puede desbloquearla cualquier persona que se parezca a ti, como un hermano gemelo." "Usa tu rostro para desbloquear el dispositivo o verificar tu identidad, por ejemplo, cuando accedes a apps o apruebas compras.\n\nTen en cuenta lo siguiente:\nSolo puedes configurar un rostro por vez. Para agregar otro rostro, borra el actual.\n\nPuedes desbloquear el dispositivo aunque no lo desees cuando lo miras.\n\nUn tercero puede desbloquear el dispositivo si lo sostiene frente a tu rostro, incluso aunque tengas los ojos cerrados.\n\nTambién puede desbloquearlo cualquier persona que se parezca a ti, como un hermano gemelo." "Usa tu huella dactilar para desbloquear el dispositivo %s o verificar tu identidad, como cuando accedes a apps o apruebas compras." - "Permite que tu hijo use su huella dactilar para desbloquear el teléfono o verificar su identidad. Eso le permitirá acceder a apps, aprobar compras y mucho más." - "Permite que tu hijo use su huella dactilar para desbloquear la tablet o verificar su identidad. Eso le permitirá acceder a apps, aprobar compras y mucho más." - "Permite que tu hijo use su huella dactilar para desbloquear el dispositivo o verificar su identidad. Eso le permitirá acceder a apps, aprobar compras y mucho más." + "Permite que tu hijo o hija use su huella dactilar para desbloquear el teléfono o verificar su identidad. Eso le permitirá acceder a apps, aprobar compras y mucho más." + "Permite que tu hijo o hija use su huella dactilar para desbloquear la tablet o verificar su identidad. Eso le permitirá acceder a apps, aprobar compras y mucho más." + "Permite que tu hijo o hija use su huella dactilar para desbloquear el dispositivo o verificar su identidad. Eso le permitirá acceder a apps, aprobar compras y mucho más." "Es posible que el desbloqueo con huella dactilar sea menos seguro que un patrón o un PIN eficaz" "El uso de la huella dactilar para desbloquear la tablet puede ser menos seguro que un patrón o PIN confiables" "El uso de la huella dactilar para desbloquear el dispositivo puede ser menos seguro que un patrón o PIN confiables" @@ -128,9 +128,9 @@ "Tu teléfono se puede desbloquear aunque no lo desees, por ejemplo, si alguien lo acerca a tu dedo." "Tu tablet se puede desbloquear aunque no lo desees, por ejemplo, cuando alguien la sostiene frente a tu dedo." "Tu dispositivo se puede desbloquear aunque no lo desees, por ejemplo, cuando alguien lo sostiene frente a tu dedo." - "El teléfono de tu hijo puede desbloquearse sin que así lo quisiera, por ejemplo, porque alguien se lo acercó al dedo." + "El teléfono de tu hijo o hija puede desbloquearse de manera no intencional, por ejemplo, si alguien se lo acerca al dedo." "La tablet de tu hijo puede desbloquearse de manera no intencional, por ejemplo, si alguien se la acerca al dedo." - "El dispositivo de tu hijo puede desbloquearse de manera no intencional, por ejemplo, si alguien se lo acerca al dedo." + "El dispositivo de tu hijo o hija puede desbloquearse de manera no intencional, por ejemplo, si alguien se lo acerca al dedo." "Usa tu huella dactilar para desbloquear la tablet o verificar tu identidad, por ejemplo, cuando accedes a apps." "Usa tu huella dactilar para desbloquear el dispositivo o verificar tu identidad, por ejemplo, cuando accedes a apps" "Usa tu huella dactilar para desbloquear el teléfono o verificar tu identidad, como cuando accedes a apps" @@ -243,7 +243,7 @@ "Formatear tarjeta SD como almacenamiento interno" "Almacenar apps y contenido multimedia para usar solo en este teléfono. <a href=https://support.google.com/android/answer/12153449>Más información para configurar una tarjeta SD</a>." "Formatear" - "Puedes transferir archivos, contenido multimedia y determinadas apps a este ^1. \n\nSi lo haces, podrás liberar hasta ^2 de almacenamiento en tu tablet. El proceso llevará aproximadamente ^3." + "Puedes transferir archivos, contenido multimedia y determinadas apps a \"^1\". \n\nSi lo haces, podrás liberar hasta ^2 de almacenamiento en tu tablet. El proceso tardará aproximadamente ^3." "Puedes transferir archivos, contenido multimedia y algunas apps a este ^1. \n\nSi lo haces, podrás liberar hasta ^2 de almacenamiento en tu teléfono. El proceso llevará aproximadamente ^3." "Mantén la tablet cargada" "Mantén el teléfono cargado" @@ -272,9 +272,9 @@ "Tu tablet y tus datos personales son más vulnerables a los ataques de apps desconocidas. Si instalas apps de esta fuente, serás responsable de los daños que sufra tu tablet y la pérdida de datos debido al uso de estas apps." "Tu teléfono y tus datos personales son más vulnerables a los ataques de apps desconocidas. Si instalas apps de esta fuente, serás responsable de los daños que sufra tu teléfono y la pérdida de datos que pueda derivar de su uso." "Tu dispositivo y tus datos personales son más vulnerables a los ataques de apps desconocidas. Si instalas apps de esta fuente, serás responsable de los daños que sufra el dispositivo o de la pérdida de datos que se pueda derivar de su uso." - "Si detienes este servicio, algunas funciones de la tablet podrían dejar de ejecutarse correctamente hasta que lo apagues y enciendas nuevamente." + "Si detienes este servicio, algunas funciones de la tablet podrían dejar de ejecutarse correctamente hasta que la reinicies." "Si detienes este servicio, algunas funciones del dispositivo podrían dejar de ejecutarse correctamente hasta que lo apagues y enciendas nuevamente." - "Información del tablet" + "Información de la tablet" "Información del dispositivo" "Se restablecerán las preferencias de tamaño de visualización y texto de la pantalla a las de la configuración original del teléfono" "Se restablecerán las preferencias de tamaño de visualización y texto de la pantalla a las de la configuración original de la tablet." @@ -312,7 +312,7 @@ "Agrega nuevos usuarios para compartir tu tablet. Cada usuario tendrá un espacio propio en la tablet con pantalla principal, cuentas, apps y opciones de configuración personalizadas, y mucho más." "Agrega nuevos usuarios para compartir tu teléfono. Cada usuario tendrá un espacio propio en el teléfono con pantalla principal, cuentas, apps y opciones de configuración personalizadas, y mucho más." "Solo los propietarios de la tablet pueden administrar los usuarios." - "Solo los propietarios del dispositivo pueden administrar los usuarios." + "Solo el propietario del teléfono puede administrar usuarios." "Perderás tu espacio y tus datos en esta tablet. No puedes deshacer esta acción." "Perderás tu espacio y tus datos en este dispositivo. No puedes deshacer esta acción." "Artículos de ayuda, teléfono y chat" diff --git a/res-product/values-es/strings.xml b/res-product/values-es/strings.xml index 6b50b231b5a..afb0355111c 100644 --- a/res-product/values-es/strings.xml +++ b/res-product/values-es/strings.xml @@ -56,8 +56,8 @@ "Usa la cara para desbloquear tu tablet o autenticarte en aplicaciones, como al iniciar sesión o aprobar compras." "Usa la cara para desbloquear tu dispositivo o autenticarte en aplicaciones, como al iniciar sesión o aprobar compras." "Permitir que tu hijo/a use el reconocimiento facial para desbloquear su teléfono" - "Permitir que tu hijo/a use el reconocimiento facial para desbloquear su tablet" - "Permitir que tu hijo/a use el reconocimiento facial para desbloquear su dispositivo" + "Permite que tu hijo/a use el reconocimiento facial para desbloquear su tablet" + "Permite que tu hijo/a use el reconocimiento facial para desbloquear su dispositivo" "Permite que tu hijo/a pueda desbloquear su teléfono o verificar su identidad mediante su cara, por ejemplo, para iniciar sesión en aplicaciones, aprobar compras, etc." "Permite que tu hijo/a pueda desbloquear su tablet o verificar su identidad mediante su cara, por ejemplo, para iniciar sesión en aplicaciones, aprobar compras, etc." "Permite que tu hijo/a pueda desbloquear su dispositivo o verificar su identidad mediante su cara, por ejemplo, para iniciar sesión en aplicaciones, aprobar compras, etc." @@ -94,27 +94,27 @@ - "Usa la cara para desbloquear tu 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." - "Usa la cara para desbloquear tu tablet 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 la tablet se desbloquee si la miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear la tablet si la pone frente a tu cara.\n\nEs posible que una persona que se parezca mucho a ti (como un gemelo) pueda desbloquear la tablet." + "Usa la cara para desbloquear tu 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." + "Usa la cara para desbloquear tu tablet 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 la tablet se desbloquee si la miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear la tablet si la pone frente a tu cara.\n\nEs posible que una persona que se parezca mucho a ti (como un gemelo) pueda desbloquear la tablet." "Usa la cara para desbloquear tu dispositivo 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 dispositivo se desbloquee si lo miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear el dispositivo 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 dispositivo." - "Usa la cara para desbloquear tu 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." - "Usa la cara para desbloquear tu tablet 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 la tablet se desbloquee si la miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear la tablet si la 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 la tablet." - "Usa la cara para desbloquear tu dispositivo 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 dispositivo se desbloquee si lo miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear el dispositivo 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 dispositivo." + "Usa la cara para desbloquear tu 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." + "Usa la cara para desbloquear tu tablet 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 la tablet se desbloquee si la miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear la tablet si la 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 la tablet." + "Usa la cara para desbloquear tu dispositivo 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 dispositivo se desbloquee si lo miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear el dispositivo 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 dispositivo." "Usa la cara para desbloquear tu teléfono o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar 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." - "Usa la cara para desbloquear tu tablet o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar 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 la tablet se desbloquee si la miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear la tablet si la pone frente a tu cara.\n\nEs posible que una persona que se parezca mucho a ti (como un gemelo) pueda desbloquear la tablet." - "Usa la cara para desbloquear tu dispositivo o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar 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 dispositivo se desbloquee si lo miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear el dispositivo 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 dispositivo." - "Usa la cara para desbloquear tu teléfono o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar 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." - "Usa la cara para desbloquear tu tablet o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar 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 la tablet se desbloquee si la miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear la tablet si la 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 la tablet." - "Usa la cara para desbloquear tu dispositivo o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar 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 dispositivo se desbloquee si lo miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear el dispositivo 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 dispositivo." + "Usa la cara para desbloquear tu tablet o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar 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 la tablet se desbloquee si la miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear la tablet si la pone frente a tu cara.\n\nEs posible que una persona que se parezca mucho a ti (como un gemelo) pueda desbloquear la tablet." + "Usa la cara para desbloquear tu dispositivo o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar 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 dispositivo se desbloquee si lo miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear el dispositivo 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 dispositivo." + "Usa la cara para desbloquear tu teléfono o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar 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." + "Usa la cara para desbloquear tu tablet o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar 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 la tablet se desbloquee si la miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear la tablet si la 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 la tablet." + "Usa la cara para desbloquear tu dispositivo o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar 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 dispositivo se desbloquee si lo miras, aunque no sea tu intención.\n\nOtra persona puede desbloquear el dispositivo 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 dispositivo." "Usa tu huella digital para desbloquear tu %s o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar compras)" "Permítele a tu hijo/a que, con su huella digital, pueda desbloquear el teléfono o verificar su identidad para iniciar sesión en aplicaciones, aprobar compras, etc." - "Permite que tu hijo/a pueda desbloquear su tablet o verificar su identidad mediante su huella digital, por ejemplo, para iniciar sesión en aplicaciones, aprobar compras, etc." - "Permite que tu hijo/a pueda desbloquear su dispositivo o verificar su identidad mediante su huella digital, por ejemplo, para iniciar sesión en aplicaciones, aprobar compras, etc." + "Permite que tu hijo/a pueda desbloquear su tablet o verificar su identidad mediante su huella digital (por ejemplo, para iniciar sesión en aplicaciones o aprobar compras)." + "Permite que tu hijo/a pueda desbloquear su dispositivo o verificar su identidad mediante su huella digital (por ejemplo, para iniciar sesión en aplicaciones o aprobar compras)." "Es posible que usar la huella digital para desbloquear el teléfono sea menos seguro que un buen patrón o PIN" "Usar la huella digital para desbloquear el tablet puede ser menos seguro que un buen patrón o PIN" "Usar la huella digital para desbloquear el dispositivo puede ser menos seguro que un buen patrón o PIN" "Cuando usas Pixel Imprint, se utilizan imágenes para actualizar el modelo de tu huella digital. Las imágenes usadas para crear el modelo no se guardan nunca, pero el modelo en sí se almacena de manera segura en tu teléfono y nunca sale de él. Todos los procesos se llevan a cabo de forma segura en el teléfono." - "Cuando usas Pixel Imprint, se usan imágenes para actualizar el modelo de tu huella digital. Las imágenes usadas para crear el modelo no se guardan nunca, pero el modelo sí se almacena de manera segura en tu tablet y nunca sale de él. Todos los procesos se llevan a cabo de forma segura en el tablet." + "Cuando usas Pixel Imprint, se usan imágenes para actualizar el modelo de tu huella digital. Las imágenes usadas para crear el modelo no se guardan nunca, pero el modelo sí se almacena de manera segura en tu tablet y nunca sale de ella. Todos los procesos se llevan a cabo de forma segura en la tablet." "Cuando usas Pixel Imprint, se usan imágenes para actualizar el modelo de tu huella digital. Las imágenes usadas para crear el modelo no se guardan nunca, pero el modelo sí se almacena de manera segura en tu dispositivo y nunca sale de él. Todos los procesos se llevan a cabo de forma segura en el dispositivo." "Cuando usa Pixel Imprint, se utilizan imágenes para actualizar el modelo de su huella digital. Las imágenes usadas para crear el modelo de huella digital de tu hijo/a nunca se guardan, pero el modelo en sí se almacena de manera segura en el teléfono y nunca sale de él. Todos los procesos se llevan a cabo de forma segura en el teléfono." "Cuando usa Pixel Imprint, se usan imágenes para actualizar el modelo de su huella digital. Las imágenes usadas para crear el modelo de huella digital de tu hijo/a nunca se guardan, pero el modelo sí se almacena de manera segura en el tablet y nunca sale de él. Todos los procesos se llevan a cabo de forma segura en el tablet." @@ -123,26 +123,26 @@ "Puedes eliminar las imágenes y el modelo de tu huella, así como desactivar Desbloqueo con huella digital cuando quieras desde Ajustes. Las imágenes y los modelos de huellas digitales se almacenan en el tablet hasta que los eliminas." "Puedes eliminar las imágenes y el modelo de tu huella, así como desactivar Desbloqueo con huella digital cuando quieras desde Ajustes. Las imágenes y los modelos de huellas digitales se almacenan en el dispositivo hasta que los eliminas." "Tú y tu hijo/a podéis eliminar el modelo y las imágenes de su huella digital, así como desactivar Desbloqueo con huella digital en cualquier momento desde Ajustes. Los modelos y las imágenes de la huella digital se almacenan en el teléfono hasta que se eliminan." - "Tú y tu hijo/a podéis eliminar el modelo y las imágenes de su huella digital, así como desactivar Desbloqueo con huella digital en cualquier momento desde Ajustes. Los modelos y las imágenes de la huella digital se almacenan en el tablet hasta que se eliminan." + "Tú y tu hijo/a podéis eliminar el modelo y las imágenes de su huella digital, así como desactivar Desbloqueo con huella digital en cualquier momento desde Ajustes. Los modelos y las imágenes de la huella digital se almacenan en la tablet hasta que se eliminan." "Tú y tu hijo/a podéis eliminar el modelo y las imágenes de su huella digital, así como desactivar Desbloqueo con huella digital en cualquier momento desde Ajustes. Los modelos y las imágenes de la huella digital se almacenan en el dispositivo hasta que se eliminan." "Tu teléfono puede desbloquearse aunque no sea tu intención (por ejemplo, si alguien lo acerca a tu dedo)." "Tu tablet puede desbloquearse aunque no sea tu intención (por ejemplo, si alguien la acerca a tu dedo)." "Tu dispositivo puede desbloquearse aunque no sea tu intención (por ejemplo, si alguien lo acerca a tu dedo)." - "El teléfono de tu hijo/a puede desbloquearse sin que quiera, por ejemplo, porque alguien se lo ha acercado al dedo." - "El tablet de tu hijo/a puede desbloquearse sin que quiera, por ejemplo, porque alguien se lo ha acercado al dedo." - "El dispositivo de tu hijo/a puede desbloquearse sin que quiera, por ejemplo, porque alguien se lo ha acercado al dedo." + "El teléfono de tu hijo/a puede desbloquearse sin que quiera (por ejemplo, porque alguien se lo ha acercado al dedo)." + "La tablet de tu hijo/a puede desbloquearse sin que quiera, por ejemplo, porque alguien se la ha acercado al dedo." + "El dispositivo de tu hijo/a puede desbloquearse sin que quiera (por ejemplo, porque alguien se lo ha acercado al dedo)." "Usa tu huella digital para desbloquear tu tablet o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones)" "Usa tu huella digital para desbloquear tu dispositivo o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones)" "Usa tu huella digital para desbloquear tu teléfono o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones)" - "Pásale el tablet a tu padre o a tu madre" - "Pásale el dispositivo a tu padre o a tu madre" - "Pásale el teléfono a tu padre o a tu madre" - "No se activarán las funciones de protección del dispositivo. No podrás evitar que otros usuarios utilicen esta tablet si la pierdes, te la roban o se restablece su estado de fábrica." - "No se activarán las funciones de protección del dispositivo. No podrás evitar que otros usuarios lo utilicen si lo pierdes, te lo roban o se restablecen su estado de fábrica." - "No se activarán las funciones de protección del dispositivo. No podrás evitar que otros usuarios utilicen este teléfono si lo pierdes, te lo roban o se restablecen su estado de fábrica." - "No se activarán las funciones de protección del dispositivo. No podrás evitar que otros usuarios utilicen esta tablet si lo pierdes o te lo roban." + "Pásale la tablet a tu padre o a tu madre" + "Pásale el dispositivo a tu padre o madre" + "Pásale el teléfono a tu padre o madre" + "No se activarán las funciones de protección del dispositivo. No podrás evitar que otros usuarios utilicen esta tablet si la pierdes, te la roban o la restablecen." + "No se activarán las funciones de protección del dispositivo. No podrás evitar que otros usuarios lo utilicen si lo pierdes, te lo roban o se restablece su estado de fábrica." + "No se activarán las funciones de protección del dispositivo. No podrás evitar que otras personas utilicen este teléfono si lo pierdes, te lo roban o restablecen su estado de fábrica." + "No se activarán las funciones de protección del dispositivo. No podrás evitar que otros usuarios utilicen esta tablet si la pierdes o te la roban." "No se activarán las funciones de protección del dispositivo. No podrás evitar que otros usuarios lo utilicen si lo pierdes o te lo roban." - "No se activarán las funciones de protección del dispositivo. No podrás evitar que otros usuarios utilicen este teléfono si lo pierdes o te lo roban." + "No se activarán las funciones de protección del dispositivo. No podrás evitar que otras personas utilicen este teléfono si lo pierdes o te lo roban." "El sensor de huellas digitales está en el botón de encendido. Es el botón plano situado junto al botón de volumen con relieve en el lateral de la tablet." "El sensor de huellas digitales está en el botón de encendido. Es el botón plano situado junto al botón de volumen con relieve en el lateral del dispositivo." "El sensor de huellas digitales está en el botón de encendido. Es el botón plano situado junto al botón de volumen con relieve en el lateral del teléfono." @@ -152,8 +152,8 @@ "Ahora puedes usar tu huella digital para desbloquear tu tablet o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar compras). \n\nAñade otra huella digital para que sea más fácil desbloquear la tablet cuando la sujetas de diferentes formas." "Ahora puedes usar tu huella digital para desbloquear tu dispositivo o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar compras).\n\nAñade otra huella digital para que sea más fácil desbloquear el dispositivo cuando lo sujetas de diferentes formas." "Ahora puedes usar tu huella digital para desbloquear tu teléfono o verificar que eres tú (por ejemplo, al iniciar sesión en aplicaciones o para aprobar compras).\n\nAñade otra huella digital para que sea más fácil desbloquear el teléfono cuando lo sujetas de diferentes formas." - "El PIN protege tu tablet si lo pierdes o te lo roban" - "El patrón protege tu tablet si lo pierdes o te lo roban" + "El PIN protege tu tablet si la pierdes o te la roban" + "El patrón protege tu tablet si la pierdes o te la roban" "La contraseña protege tu tablet si la pierdes o te la roban" "El PIN protege tu dispositivo si lo pierdes o te lo roban" "El patrón protege tu dispositivo si lo pierdes o te lo roban" @@ -161,7 +161,7 @@ "El PIN protege tu teléfono si lo pierdes o te lo roban" "El patrón protege tu teléfono si lo pierdes o te lo roban" "La contraseña protege tu teléfono si lo pierdes o te lo roban" - "Se necesita un PIN para configurar Desbloqueo con huella digital.\n\nEl PIN protege tu tablet si lo pierdes o te lo roban." + "Se necesita un PIN para configurar Desbloqueo con huella digital.\n\nEl PIN protege tu tablet si la pierdes o te la roban." "Se necesita un patrón para configurar Desbloqueo con huella digital.\n\nEl patrón protege tu tablet si lo pierdes o te lo roban." "Se necesita una contraseña para configurar Desbloqueo con huella digital.\n\nLa contraseña protege tu tablet si la pierdes o te la roban." "Se necesita un PIN para configurar Desbloqueo con huella digital.\n\nEl PIN protege tu dispositivo si lo pierdes o te lo roban." @@ -170,7 +170,7 @@ "Se necesita un PIN para configurar Desbloqueo con huella digital.\n\nEl PIN protege tu teléfono si lo pierdes o te lo roban." "Se necesita un patrón para configurar Desbloqueo con huella digital.\n\nEl patrón protege tu teléfono si lo pierdes o te lo roban." "Se necesita una contraseña para configurar Desbloqueo con huella digital.\n\nLa contraseña protege tu teléfono si lo pierdes o te lo roban." - "Se necesita un PIN para configurar Desbloqueo facial.\n\nEl PIN protege tu tablet si lo pierdes o te lo roban." + "Se necesita un PIN para configurar Desbloqueo facial.\n\nEl PIN protege tu tablet si la pierdes o te la roban." "Se necesita un patrón para configurar Desbloqueo facial.\n\nEl patrón protege tu tablet si lo pierdes o te lo roban." "Se necesita una contraseña para configurar Desbloqueo facial.\n\nLa contraseña protege tu tablet si la pierdes o te la roban." "Se necesita un PIN para configurar Desbloqueo facial.\n\nEl PIN protege tu dispositivo si lo pierdes o te lo roban." @@ -179,8 +179,8 @@ "Se necesita un PIN para configurar Desbloqueo facial.\n\nEl PIN protege tu teléfono si lo pierdes o te lo roban." "Se necesita un patrón para configurar Desbloqueo facial.\n\nEl patrón protege tu teléfono si lo pierdes o te lo roban." "Se necesita una contraseña para configurar Desbloqueo facial.\n\nLa contraseña protege tu teléfono si lo pierdes o te lo roban." - "Se necesita un PIN para configurar Desbloqueo facial y Desbloqueo con huella digital.\n\nEl PIN protege tu tablet si lo pierdes o te lo roban." - "Se necesita un patrón para configurar Desbloqueo facial y Desbloqueo con huella digital.\n\nEl patrón protege tu tablet si lo pierdes o te lo roban." + "Se necesita un PIN para configurar Desbloqueo facial y Desbloqueo con huella digital.\n\nEl PIN protege tu tablet si la pierdes o te la roban." + "Se necesita un patrón para configurar Desbloqueo facial y Desbloqueo con huella digital.\n\nEl patrón protege tu tablet si la pierdes o te la roban." "Se necesita una contraseña para configurar Desbloqueo facial y Desbloqueo con huella digital.\n\nLa contraseña protege tu tablet si la pierdes o te la roban." "Se necesita un PIN para configurar Desbloqueo facial y Desbloqueo con huella digital.\n\nEl PIN protege tu dispositivo si lo pierdes o te lo roban." "Se necesita un patrón para configurar Desbloqueo facial y Desbloqueo con huella digital.\n\nEl patrón protege tu dispositivo si lo pierdes o te lo roban." @@ -205,7 +205,7 @@ "Puedes desbloquear el dispositivo con tu cara o con tu huella digital. Por motivos de seguridad, para utilizar esta opción necesitas un método de bloqueo de pantalla alternativo." "Cifrar tablet" "Cifrar teléfono" - "Añade bloqueo de pantalla para proteger el tablet" + "Añade un bloqueo de pantalla para proteger la tablet" "Añade bloqueo de pantalla para proteger el dispositivo" "Añade bloqueo de pantalla para proteger el teléfono" @@ -227,9 +227,9 @@ "%1$s quiere guardar estas redes en tu tablet" "Ajusta automáticamente la orientación de la pantalla cuando cambias tu teléfono de vertical a horizontal" "Ajusta automáticamente la orientación de la pantalla cuando cambias tu tablet de vertical a horizontal" - "Solicitar PIN para utilizar el tablet" + "Solicitar PIN para usar la tablet" "Pide el PIN para usar el teléfono" - "Solicitar PIN para utilizar el tablet" + "Solicitar PIN para utilizar la tablet" "Pide el PIN para usar el teléfono" "MDN" "Número de teléfono" @@ -245,7 +245,7 @@ "Formatear" "Puedes mover archivos, contenido multimedia y determinadas aplicaciones a tu ^1. \n\nAl hacerlo, se liberarán ^2 del almacenamiento de tu teléfono. El proceso tardará ^3, aproximadamente." "Puedes mover archivos, contenido multimedia y determinadas aplicaciones a tu ^1. \n\nAl hacerlo, se liberarán ^2 del almacenamiento de tu teléfono. El proceso tardará ^3, aproximadamente." - "El tablet tiene que estar cargado" + "La tablet tiene que estar cargada" "El teléfono tiene que estar cargado" "Se borrarán todos los datos del ""almacenamiento interno"" de tu tablet, como:\n\n"

  • "Tu cuenta de Google"
  • \n
  • "Los ajustes y los datos de aplicaciones y del sistema"
  • \n
  • "Las aplicaciones descargadas"
  • "Se borrarán todos los datos del ""almacenamiento interno"" de tu teléfono, como:\n\n"
  • "Tu cuenta de Google"
  • \n
  • "Los ajustes y los datos de aplicaciones y del sistema"
  • \n
  • "Las aplicaciones descargadas"
  • @@ -274,7 +274,7 @@ "Tu dispositivo y tus datos personales son más vulnerables a los ataques de aplicaciones desconocidas. Al instalar aplicaciones de esta fuente, aceptas ser responsable de cualquier daño que sufra tu dispositivo o de la pérdida de datos que se pueda derivar de su uso." "Si detienes este servicio, es posible que algunas funciones del tablet dejen de funcionar correctamente hasta que reinicies el dispositivo." "Si detienes este servicio, es posible que algunas funciones del teléfono dejen de funcionar correctamente hasta que reinicies el dispositivo." - "Información del tablet" + "Información de la tablet" "Información sobre el teléfono" "Tus preferencias de tamaño de visualización y del texto se restablecerán a las de la configuración original del teléfono" "Tus preferencias de tamaño de visualización y del texto se restablecerán a las de la configuración original de la tablet" @@ -306,20 +306,20 @@ "Si quitas esta cuenta, se eliminarán todos sus mensajes, contactos y otros datos del dispositivo." "Los cambios que hagas en tus cuentas en la Web se copiarán automáticamente en la tablet.\n\nEs posible que algunas cuentas copien los cambios que hagas en la tablet también en la Web. Las cuentas de Google funcionan así." "Los cambios que hagas en tus cuentas en la Web se copiarán automáticamente en el teléfono.\n\nEs posible que algunas cuentas copien los cambios que hagas en el teléfono también en la Web. Las cuentas de Google funcionan así." - "El tablet desactivará los datos móviles cuando se alcance el límite que configures.\n\nComo el uso de datos lo calcula el tablet y es posible que tu operador lo mida de forma diferente, se recomienda establecer un límite conservador." + "Tu tablet desactivará los datos móviles cuando se alcance el límite que configures.\n\nComo el uso de datos lo calcula la tablet y es posible que tu operador lo mida de forma diferente, se recomienda establecer un límite conservador." "Tu teléfono desactivará los datos móviles cuando se alcance el límite que configures.\n\nComo el uso de datos lo calcula el teléfono y es posible que tu operador lo mida de forma diferente, se recomienda establecer un límite conservador." "Comparte tu dispositivo añadiendo usuarios. Cada uno tiene su propio espacio personal en el dispositivo con opciones de configuración, aplicaciones, cuentas y pantallas de inicio personalizadas, entre otras cosas." "Comparte tu tablet añadiendo usuarios. Cada uno tiene su propio espacio personal en la tablet con opciones de configuración, aplicaciones, cuentas y pantallas de inicio personalizadas, entre otras cosas." "Comparte tu teléfono añadiendo usuarios. Cada uno tiene su propio espacio personal en el teléfono para personalizar las pantallas de inicio, las cuentas, las aplicaciones, los ajustes y más." - "Solo el propietario del tablet puede administrar los usuarios." - "Solo el propietario del teléfono puede administrar los usuarios." + "Solo el propietario de la tablet puede gestionar usuarios." + "Solo el propietario del teléfono puede gestionar usuarios." "Perderás tu espacio y tus datos en esta tablet. Esta acción no se puede deshacer." "Perderás tu espacio y tus datos en este teléfono. Esta acción no se puede deshacer." "Artículos de ayuda, asistencia por teléfono y chat" "Artículos de ayuda, tablet y chat" "Artículos de ayuda, dispositivo y chat" "Doble toque para consultar el teléfono" - "Doble toque para consultar el tablet" + "Doble toque para consultar la tablet" "Doble toque para consultar el dispositivo" "Levantar teléfono para consultarlo" "Levantar para consultar la tablet" diff --git a/res-product/values-fr-rCA/strings.xml b/res-product/values-fr-rCA/strings.xml index fcef790eb62..1ef303aa3a1 100644 --- a/res-product/values-fr-rCA/strings.xml +++ b/res-product/values-fr-rCA/strings.xml @@ -56,13 +56,13 @@ "Utilisez votre visage pour déverrouiller votre tablette ou pour l\'authentification dans les applis, par exemple lorsque vous vous connectez à des applis ou que vous approuvez un achat." "Utilisez votre visage pour déverrouiller votre appareil ou pour l\'authentification dans les applis, par exemple lorsque vous vous connectez à des applis ou que vous approuvez un achat." "Autoriser votre enfant à utiliser son visage pour déverrouiller son téléphone" - "Autoriser votre enfant à utiliser son visage pour déverrouiller sa tablette" + "Autorisez votre enfant à utiliser son visage pour déverrouiller sa tablette" "Autoriser votre enfant à utiliser son visage pour déverrouiller son appareil" - "Autorisez votre enfant à utiliser son visage pour déverrouiller son téléphone ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applis, approuve un achat et plus." + "Autorisez votre enfant à utiliser son visage pour déverrouiller son téléphone ou confirmer qu\'il s\'agit bien de votre enfant. Cette situation se produit lorsque votre enfant se connecte à des applis, approuve un achat et plus." "Autorisez votre enfant à utiliser son visage pour déverrouiller sa tablette ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applis, approuve un achat et plus." - "Autorisez votre enfant à utiliser son visage pour déverrouiller son appareil ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applis, approuve un achat et plus." - "L\'utilisation du visage de votre enfant pour déverrouiller son téléphone peut être moins sûre qu\'un schéma ou un NIP robustes." - "L\'utilisation du visage de votre enfant pour déverrouiller sa tablette peut être moins sûre qu\'un schéma ou un NIP robustes." + "Autorisez votre enfant à utiliser son visage pour déverrouiller son appareil ou confirmer qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applications, approuve un achat et plus." + "L\'utilisation du visage de votre enfant pour déverrouiller son téléphone peut être moins sûre qu\'un schéma ou un NIP robuste." + "L\'utilisation du visage de votre enfant pour déverrouiller sa tablette peut être moins sûre qu\'un schéma ou un NIP robuste." "L\'utilisation du visage de votre enfant pour déverrouiller son appareil peut être moins sûre qu\'un schéma ou un NIP robustes." @@ -96,16 +96,16 @@ "Utilisez votre visage pour déverrouiller votre téléphone ou pour vous authentifier dans les applis, 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\nVous pourriez déverrouiller le téléphone en le regardant, 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 tablette ou pour vous authentifier dans les applis, 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\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique." - "Utilisez votre visage pour déverrouiller votre appareil ou pour vous authentifier dans les applis, 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\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage.\n\nVotre appareil 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 applis, 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\nVous pourriez déverrouiller le téléphone en le regardant, 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." - "Utilisez votre visage pour déverrouiller votre tablette ou pour vous authentifier dans les applis, 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\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique." + "Utilisez votre visage pour déverrouiller votre appareil ou pour vous authentifier dans les applis, 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\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage.\n\nVotre appareil pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme votre jumeau ou jumelle 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\nVous pourriez déverrouiller le téléphone en le regardant, 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." + "Utilisez votre visage pour déverrouiller votre tablette 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\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique." "Utilisez votre visage pour déverrouiller votre appareil ou pour vous authentifier dans les applis, 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\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre appareil 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 vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller le téléphone en le regardant, 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 tablette ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique." - "Utilisez votre visage pour déverrouiller votre appareil ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage.\n\nVotre appareil 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 vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller le téléphone en le regardant, 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." - "Utilisez votre visage pour déverrouiller votre tablette ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique." - "Utilisez votre visage pour déverrouiller votre appareil ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre appareil pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique." + "Utilisez votre visage pour déverrouiller votre tablette ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique." + "Utilisez votre visage pour déverrouiller votre appareil ou confirmer qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage.\n\nVotre appareil pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme votre jumeau ou jumelle identique." + "Utilisez votre visage pour déverrouiller votre téléphone ou confirmer qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller le téléphone en le regardant, 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 votre jumeau ou jumelle identique." + "Utilisez votre visage pour déverrouiller votre tablette ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique." + "Utilisez votre visage pour déverrouiller votre appareil ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre appareil pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique." "Utilisez votre empreinte digitale pour déverrouiller votre %s ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat" "Autorisez votre enfant à utiliser son empreinte digitale pour déverrouiller son téléphone ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applis, approuve un achat et plus." "Autorisez votre enfant à utiliser son empreinte digitale pour déverrouiller sa tablette ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applis, approuve un achat et plus." @@ -312,7 +312,7 @@ "Partagez votre tablette en ajoutant des utilisateurs. Chaque utilisateur dispose d\'un espace personnel sur votre tablette pour ses écrans d\'accueil personnalisés, ses comptes, ses applis, ses paramètres et plus encore." "Partagez votre téléphone en ajoutant des utilisateurs. Chaque utilisateur dispose d\'un espace personnel sur votre téléphone pour ses écrans d\'accueil personnalisés, ses comptes, ses applis, ses paramètres et plus encore." "Seul le propriétaire de la tablette peut gérer les utilisateurs." - "Seul le propriétaire de la tablette peut gérer les utilisateurs." + "Seule la personne propriétaire de la tablette peut gérer les utilisateurs." "Votre espace et vos données vont disparaître de cette tablette. Cette action est irréversible." "Votre espace et vos données vont être supprimés de ce téléphone. Cette action est irréversible." "Articles d\'aide, téléphone et clavardage" @@ -344,7 +344,7 @@ "Téléphone réinitialisé aux paramètres par défaut Pour l\'utiliser, entrez votre ancien NIP." "Tablette réinitialisée aux paramètres par défaut. Pour l\'utiliser, entrez votre ancien NIP." "Appareil réinitialisé aux paramètres par défaut. Pour l\'utiliser, entrez votre ancien NIP." - "Téléphone réinitialisé aux paramètres par défaut Pour l\'utiliser, entrez votre ancien mot de passe." + "Téléphone réinitialisé aux paramètres par défaut. Pour l\'utiliser, entrez votre ancien mot de passe." "Tablette réinitialisée aux paramètres par défaut. Pour l\'utiliser, entrez votre ancien mot de passe." "Appareil réinitialisé aux paramètres par défaut. Pour l\'utiliser, entrez votre ancien mot de passe." "Votre téléphone pourrait se recharger lentement ou ne pas se recharger. Pour une recharge plus rapide, utilisez un adaptateur et un câble recommandés." diff --git a/res-product/values-it/strings.xml b/res-product/values-it/strings.xml index 40600352c82..4988f844417 100644 --- a/res-product/values-it/strings.xml +++ b/res-product/values-it/strings.xml @@ -55,13 +55,13 @@ "Usa il tuo volto per sbloccare lo smartphone o per l\'autenticazione nelle app, ad esempio per accedere alle app o approvare un acquisto." "Usa il tuo volto per sbloccare il tablet o per l\'autenticazione nelle app, ad esempio per accedere alle app o approvare un acquisto." "Usa il tuo volto per sbloccare il dispositivo o per l\'autenticazione nelle app, ad esempio per accedere alle app o approvare un acquisto." - "Consenti a tuo figlio di usare il suo volto per sbloccare il suo telefono" + "Consenti a tuo figlio di usare il suo volto per sbloccare lo smartphone" "Consenti a tuo figlio di usare il suo volto per sbloccare il suo tablet" "Consenti a tuo figlio di usare il suo volto per sbloccare il suo dispositivo" - "Consenti a tuo figlio di usare il volto per sbloccare il suo telefono o verificare la sua identità. Questo si verifica quando accede alle app, approva un acquisto e altro ancora." + "Consenti a tuo figlio di usare il volto per sbloccare il suo smartphone o verificare la sua identità. Questo si verifica quando accede alle app, approva un acquisto e altro ancora." "Consenti a tuo figlio di usare il volto per sbloccare il suo tablet o verificare la sua identità. Questo si verifica quando accede alle app, approva un acquisto e altro ancora." "Consenti a tuo figlio di usare il volto per sbloccare il suo dispositivo o verificare la sua identità. Questo si verifica quando accede alle app, approva un acquisto e altro ancora." - "L\'uso del volto di tuo figlio per sbloccare il suo telefono potrebbe essere meno sicuro di una sequenza o un PIN efficaci." + "L\'uso del volto di tuo figlio per sbloccare il suo smartphone potrebbe essere meno sicuro di una sequenza o un PIN efficaci." "L\'uso del volto di tuo figlio per sbloccare il suo tablet potrebbe essere meno sicuro di una sequenza o un PIN efficaci." "L\'uso del volto di tuo figlio per sbloccare il suo dispositivo potrebbe essere meno sicuro di una sequenza o un PIN efficaci." @@ -107,7 +107,7 @@ "Usa il tuo volto per sbloccare il tablet o verificare la tua identità, ad esempio quando vuoi accedere alle app o approvare un acquisto.\n\nTieni presente che:\nPuoi configurare un solo volto alla volta. Per aggiungere un altro volto devi eliminare quello attuale.\n\nSe guardi direttamente il tablet, potresti sbloccarlo anche senza volerlo.\n\nIl tuo tablet può essere sbloccato da un\'altra persona se viene rivolto verso il tuo viso, anche se hai gli occhi chiusi.\n\nIl tuo tablet può essere sbloccato da qualcuno che ti assomiglia molto, ad esempio un gemello o una gemella." "Usa il tuo volto per sbloccare il dispositivo o verificare la tua identità, ad esempio quando vuoi accedere alle app o approvare un acquisto.\n\nTieni presente che:\nPuoi configurare un solo volto alla volta. Per aggiungere un altro volto devi eliminare quello attuale.\n\nSe guardi direttamente il dispositivo, potresti sbloccarlo anche senza volerlo.\n\nIl tuo dispositivo può essere sbloccato da un\'altra persona se viene rivolto verso il tuo viso, anche se hai gli occhi chiusi.\n\nIl tuo dispositivo può essere sbloccato da qualcuno che ti assomiglia molto, ad esempio un gemello o una gemella." "Usa l\'impronta per sbloccare %s o per verificare la tua identità, ad esempio per accedere alle app o approvare un acquisto" - "Consenti a tuo figlio di usare l\'impronta per sbloccare il suo telefono o verificare la sua identità. Questo si verifica quando accedono alle app, approvano un acquisto e altro ancora." + "Consenti a tuo figlio di usare l\'impronta per sbloccare il suo smartphone o verificare la sua identità. Questo si verifica quando accede alle app, approva un acquisto e altro ancora." "Consenti a tuo figlio di usare l\'impronta per sbloccare il suo tablet o verificare la sua identità. Questo si verifica quando accede alle app, approva un acquisto e altro ancora." "Consenti a tuo figlio di usare l\'impronta per sbloccare il suo dispositivo o verificare la sua identità. Questo si verifica quando accede alle app, approva un acquisto e altro ancora." "L\'uso dell\'impronta per sbloccare il telefono potrebbe essere meno sicuro dell\'uso di una sequenza o un PIN efficaci" @@ -122,13 +122,13 @@ "Puoi eliminare le immagini e il modello dell\'impronta o disattivare lo Sblocco con l\'Impronta in qualsiasi momento nelle Impostazioni. Le immagini e i modelli delle impronte rimangono memorizzati sullo smartphone finché non li elimini." "Puoi eliminare le immagini e il modello dell\'impronta o disattivare lo Sblocco con l\'Impronta in qualsiasi momento nelle Impostazioni. Le immagini e i modelli delle impronte rimangono memorizzati sul tablet finché non li elimini." "Puoi eliminare le immagini e il modello dell\'impronta o disattivare lo Sblocco con l\'Impronta in qualsiasi momento nelle Impostazioni. Le immagini e i modelli delle impronte rimangono memorizzati sul dispositivo finché non li elimini." - "Tu e tuo figlio potete eliminare le immagini e il modello dell\'impronta o disattivare lo Sblocco con l\'Impronta in qualsiasi momento nelle Impostazioni. Le immagini e i modelli delle impronte rimangono memorizzati sul telefono finché non vengono eliminati." + "Tu e tuo figlio potete eliminare le immagini e il modello dell\'impronta o disattivare lo Sblocco con l\'Impronta in qualsiasi momento nelle Impostazioni. Le immagini e i modelli delle impronte rimangono memorizzati sullo smartphone finché non vengono eliminati." "Tu e tuo figlio potete eliminare le immagini e il modello dell\'impronta o disattivare lo Sblocco con l\'Impronta in qualsiasi momento nelle Impostazioni. Le immagini e i modelli delle impronte rimangono memorizzati sul tablet finché non vengono eliminati." "Tu e tuo figlio potete eliminare le immagini e il modello dell\'impronta o disattivare lo Sblocco con l\'Impronta in qualsiasi momento nelle Impostazioni. Le immagini e i modelli delle impronte rimangono memorizzati sul dispositivo finché non vengono eliminati." "Il tuo smartphone può essere sbloccato anche quando non hai intenzione di farlo, ad esempio se qualcuno te lo avvicina al dito." "Il tuo tablet può essere sbloccato anche quando non hai intenzione di farlo, ad esempio se qualcuno lo avvicina al tuo dito." "Il tuo dispositivo può essere sbloccato anche quando non hai intenzione di farlo, ad esempio se qualcuno lo avvicina al tuo dito." - "Il telefono di tuo figlio può essere sbloccato anche quando non vuole farlo intenzionalmente, ad esempio se qualcuno lo rivolge verso il suo dito." + "Lo smartphone di tuo figlio può essere sbloccato anche quando non vuole farlo intenzionalmente, ad esempio se qualcuno lo rivolge verso il suo dito." "Il tablet di tuo figlio può essere sbloccato anche quando non vuole farlo intenzionalmente, ad esempio se qualcuno lo rivolge verso il suo dito." "Il dispositivo di tuo figlio può essere sbloccato anche quando non vuole farlo intenzionalmente, ad esempio se qualcuno lo rivolge verso il suo dito." "Usa l\'impronta per sbloccare il tablet o verificare la tua identità, ad esempio per accedere alle app" @@ -179,15 +179,15 @@ "È necessario un PIN per configurare lo Sblocco con il Volto.\n\nIl PIN protegge il telefono se viene smarrito o rubato." "È necessaria una sequenza per configurare lo Sblocco con il Volto.\n\nLa sequenza protegge il telefono se viene smarrito o rubato." "È necessaria una password per configurare lo Sblocco con il Volto.\n\nLa password protegge il telefono se viene smarrito o rubato." - "È necessario un PIN per configurare lo Sblocco con il Volto e con l\'impronta.\n\nIl PIN protegge il tablet se viene smarrito o rubato." - "È necessaria una sequenza per configurare lo Sblocco con il Volto e con l\'impronta.\n\nLa sequenza protegge il tablet se viene smarrito o rubato." - "È necessaria una password per configurare lo Sblocco con il Volto e con l\'impronta.\n\nLa password protegge il tablet se viene smarrito o rubato." + "È necessario un PIN per configurare lo Sblocco con il Volto e lo Sblocco con l\'Impronta.\n\nIl PIN protegge il tablet se viene smarrito o rubato." + "È necessaria una sequenza per configurare lo Sblocco con il Volto e lo Sblocco con l\'Impronta.\n\nLa sequenza protegge il tablet se viene smarrito o rubato." + "È necessaria una password per configurare lo Sblocco con il Volto e lo Sblocco con l\'Impronta.\n\nLa password protegge il tablet se viene smarrito o rubato." "È necessario un PIN per configurare lo Sblocco con il Volto e con l\'impronta.\n\nIl PIN protegge il dispositivo se viene smarrito o rubato." "È necessaria una sequenza per configurare lo Sblocco con il Volto e l\'Impronta.\n\nLa sequenza protegge il dispositivo se viene smarrito o rubato." - "È necessaria una password per configurare lo Sblocco con il Volto e con l\'impronta.\n\nLa password protegge il dispositivo se viene smarrito o rubato." - "È necessario un PIN per configurare lo Sblocco con il Volto e con l\'impronta.\n\nIl PIN protegge il telefono se viene smarrito o rubato." - "È necessaria una sequenza per configurare lo Sblocco con il Volto e l\'Impronta.\n\nLa sequenza protegge il telefono se viene smarrito o rubato." - "È necessaria una password per configurare lo Sblocco con il Volto e con l\'impronta.\n\nLa password protegge il telefono se viene smarrito o rubato." + "È necessaria una password per configurare lo Sblocco con il Volto e lo Sblocco con l\'Impronta.\n\nLa password protegge il dispositivo se viene smarrito o rubato." + "È necessario un PIN per configurare lo Sblocco con il Volto e lo Sblocco con l\'Impronta.\n\nIl PIN protegge lo smartphone se viene smarrito o rubato." + "È necessaria una sequenza per configurare lo Sblocco con il Volto e l\'Impronta.\n\nLa sequenza protegge lo smartphone se viene smarrito o rubato." + "È necessaria una password per configurare lo Sblocco con il Volto e con l\'Impronta.\n\nLa password protegge lo smartphone se viene smarrito o rubato." "Vengono eliminati il modello e le immagini dell\'impronta associati a \"%1$s\" e memorizzati sullo smartphone" "Vengono eliminati il modello e le immagini dell\'impronta associati a \"%1$s\" e memorizzati sul tablet" "Vengono eliminati il modello e le immagini dell\'impronta associati a \"%1$s\" e memorizzati sul dispositivo" @@ -312,7 +312,7 @@ "Condividi il tuo tablet aggiungendo nuovi utenti. Ogni utente dispone di uno spazio personale sul tablet per impostare schermate Home personalizzate, account, app, impostazioni e altro ancora." "Condividi il tuo smartphone aggiungendo nuovi utenti. Ogni utente dispone di uno spazio personale sullo smartphone per impostare schermate Home personalizzate, account, app, impostazioni e altro ancora." "Solo il proprietario del tablet può gestire gli utenti." - "Solo il proprietario del telefono può gestire gli utenti." + "Solo il proprietario dello smartphone può gestire gli utenti." "Perderai il tuo spazio e i tuoi dati sul tablet. Non è possibile annullare l\'azione." "Perderai il tuo spazio e i tuoi dati sul telefono. Non è possibile annullare l\'azione." "Articoli del Centro assistenza, telefono e chat" diff --git a/res-product/values-zh-rTW/strings.xml b/res-product/values-zh-rTW/strings.xml index c8f6122200f..3eefcf7c451 100644 --- a/res-product/values-zh-rTW/strings.xml +++ b/res-product/values-zh-rTW/strings.xml @@ -226,7 +226,7 @@ "「%1$s」想在你的手機中新增這些網路" "「%1$s」想在你的平板電腦中新增這些網路" "將手機從直向/橫向轉為另一個方向時,系統會自動調整螢幕方向" - "在你以直向或橫向模式使用平板電腦時,自動調整螢幕方向" + "隨著平板電腦轉為直向或橫向,自動調整螢幕方向" "需要 PIN 才能使用平板電腦" "需要輸入 PIN 碼才能使用手機" "需要 PIN 才能使用平板電腦" From d4965bd5cc2df6f8a1a703185c82166cb777ffba Mon Sep 17 00:00:00 2001 From: mxyyiyi Date: Tue, 23 Jul 2024 12:58:05 +0800 Subject: [PATCH 18/19] Ignore broadcast intent from additional profile. - Use isAdditionalProfile() to ignore intent from either work or private profile. Bug: 354828134 Test: atest SettingsRoboTests:com.android.settings.fuelgauge.batteryusage Flag: EXEMPT bug fix Change-Id: Ic0c91d956e4bfcd53576629efab4be847c94155e --- .../BatteryUsageBroadcastReceiver.java | 4 ++-- .../BatteryUsageContentProvider.java | 4 ++-- .../batteryusage/BootBroadcastReceiver.java | 4 ++-- .../fuelgauge/batteryusage/DatabaseUtils.java | 7 ++++-- .../batteryusage/PeriodicJobReceiver.java | 6 ++--- .../bugreport/BugReportContentProvider.java | 4 ++-- .../BatteryUsageBroadcastReceiverTest.java | 16 +++++++++++-- .../BatteryUsageContentProviderTest.java | 21 +++++++++++++++-- .../BootBroadcastReceiverTest.java | 23 +++++++++++++++++-- .../batteryusage/DatabaseUtilsTest.java | 21 ++++++++++++++++- .../batteryusage/PeriodicJobReceiverTest.java | 22 ++++++++++++++++-- .../BugReportContentProviderTest.java | 23 +++++++++++++++++-- 12 files changed, 131 insertions(+), 24 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java index bfa501c16aa..f710c71c969 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java @@ -63,8 +63,8 @@ public final class BatteryUsageBroadcastReceiver extends BroadcastReceiver { } final String action = intent.getAction(); Log.d(TAG, "onReceive:" + action); - if (com.android.settingslib.fuelgauge.BatteryUtils.isWorkProfile(context)) { - Log.w(TAG, "do nothing for work profile action=" + action); + if (com.android.settingslib.fuelgauge.BatteryUtils.isAdditionalProfile(context)) { + Log.w(TAG, "do nothing for an additional profile action=" + action); return; } DatabaseUtils.recordDateTime(context, action); diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProvider.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProvider.java index 095a65a8e10..52010afc77b 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProvider.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProvider.java @@ -110,8 +110,8 @@ public class BatteryUsageContentProvider extends ContentProvider { @Override public boolean onCreate() { - if (BatteryUtils.isWorkProfile(getContext())) { - Log.w(TAG, "do not create provider for work profile"); + if (BatteryUtils.isAdditionalProfile(getContext())) { + Log.w(TAG, "do not create provider for an additional profile"); return false; } mClock = Clock.systemUTC(); diff --git a/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiver.java b/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiver.java index b758df4bd6b..45d724fb208 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiver.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiver.java @@ -54,8 +54,8 @@ public final class BootBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { final String action = intent == null ? "" : intent.getAction(); - if (BatteryUtils.isWorkProfile(context)) { - Log.w(TAG, "do not start job for work profile action=" + action); + if (BatteryUtils.isAdditionalProfile(context)) { + Log.w(TAG, "do not start job for an additional profile action=" + action); return; } diff --git a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java index 76203232329..6feb815dc13 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java +++ b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java @@ -70,6 +70,7 @@ public final class DatabaseUtils { /** Clear memory threshold for device booting phase. */ private static final long CLEAR_MEMORY_THRESHOLD_MS = Duration.ofMinutes(5).toMillis(); + private static final long CLEAR_MEMORY_DELAYED_MS = Duration.ofSeconds(2).toMillis(); private static final long INVALID_TIMESTAMP = 0L; @@ -527,9 +528,11 @@ public final class DatabaseUtils { return startCalendar.getTimeInMillis(); } - /** Returns the context with profile parent identity when current user is work profile. */ + /** + * Returns the context with profile parent identity when current user is an additional profile. + */ public static Context getParentContext(Context context) { - if (com.android.settingslib.fuelgauge.BatteryUtils.isWorkProfile(context)) { + if (com.android.settingslib.fuelgauge.BatteryUtils.isAdditionalProfile(context)) { try { return context.createPackageContextAsUser( /* packageName= */ context.getPackageName(), diff --git a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java index 5c73adb69f9..982cf406101 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java +++ b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java @@ -50,10 +50,10 @@ public final class PeriodicJobReceiver extends BroadcastReceiver { Log.w(TAG, "receive unexpected action=" + action); return; } - if (BatteryUtils.isWorkProfile(context)) { + if (BatteryUtils.isAdditionalProfile(context)) { BatteryUsageLogUtils.writeLog( - context, Action.SCHEDULE_JOB, "do not refresh job for work profile"); - Log.w(TAG, "do not refresh job for work profile action=" + action); + context, Action.SCHEDULE_JOB, "do not refresh job for an additional profile"); + Log.w(TAG, "do not refresh job for an additional profile action=" + action); return; } BatteryUsageLogUtils.writeLog(context, Action.EXECUTE_JOB, ""); diff --git a/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProvider.java b/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProvider.java index 7e759ee3f26..e829a3cd98c 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProvider.java +++ b/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProvider.java @@ -49,8 +49,8 @@ public final class BugReportContentProvider extends ContentProvider { Log.w(TAG, "failed to dump BatteryUsage state: null application context"); return; } - if (BatteryUtils.isWorkProfile(context)) { - Log.w(TAG, "ignore battery usage states dump in the work profile"); + if (BatteryUtils.isAdditionalProfile(context)) { + Log.w(TAG, "ignore battery usage states dump in the additional profile"); return; } writer.println("dump BatteryUsage and AppUsage states:"); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiverTest.java index af0cb91752c..63d44d09a87 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiverTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiverTest.java @@ -28,9 +28,9 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.os.BatteryManager; import android.os.SystemClock; +import android.os.UserManager; import android.text.format.DateUtils; -import com.android.settings.testutils.BatteryTestUtils; import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; @@ -49,6 +49,7 @@ public final class BatteryUsageBroadcastReceiverTest { private FakeFeatureFactory mFakeFeatureFactory; @Mock private PackageManager mPackageManager; + @Mock private UserManager mUserManager; @Before public void setUp() { @@ -57,6 +58,7 @@ public final class BatteryUsageBroadcastReceiverTest { mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); mBatteryUsageBroadcastReceiver = new BatteryUsageBroadcastReceiver(); doReturn(mPackageManager).when(mContext).getPackageManager(); + doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); DatabaseUtils.getSharedPreferences(mContext).edit().clear().apply(); } @@ -69,7 +71,17 @@ public final class BatteryUsageBroadcastReceiverTest { @Test public void onReceive_workProfile_doNothing() { - BatteryTestUtils.setWorkProfile(mContext); + doReturn(true).when(mUserManager).isManagedProfile(); + + mBatteryUsageBroadcastReceiver.onReceive( + mContext, new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING)); + + assertThat(mBatteryUsageBroadcastReceiver.mFetchBatteryUsageData).isFalse(); + } + + @Test + public void onReceive_privateProfile_doNothing() { + doReturn(true).when(mUserManager).isPrivateProfile(); mBatteryUsageBroadcastReceiver.onReceive( mContext, new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING)); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java index 950f8280215..ac711a482af 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java @@ -19,12 +19,16 @@ package com.android.settings.fuelgauge.batteryusage; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; +import android.os.UserManager; import androidx.test.core.app.ApplicationProvider; @@ -39,6 +43,8 @@ import com.android.settings.testutils.FakeClock; 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.time.Duration; @@ -62,9 +68,14 @@ public final class BatteryUsageContentProviderTest { private Context mContext; private BatteryUsageContentProvider mProvider; + @Mock + private UserManager mUserManager; + @Before public void setUp() { - mContext = ApplicationProvider.getApplicationContext(); + MockitoAnnotations.initMocks(this); + mContext = spy(ApplicationProvider.getApplicationContext()); + when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); mProvider = new BatteryUsageContentProvider(); mProvider.attachInfo(mContext, /* info= */ null); BatteryTestUtils.setUpBatteryStateDatabase(mContext); @@ -77,7 +88,13 @@ public final class BatteryUsageContentProviderTest { @Test public void onCreate_withWorkProfileMode_returnsFalse() { - BatteryTestUtils.setWorkProfile(mContext); + doReturn(true).when(mUserManager).isManagedProfile(); + assertThat(mProvider.onCreate()).isFalse(); + } + + @Test + public void onCreate_withPrivateProfileMode_returnsFalse() { + doReturn(true).when(mUserManager).isPrivateProfile(); assertThat(mProvider.onCreate()).isFalse(); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiverTest.java index 704637f14c7..f318a2bcddf 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiverTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiverTest.java @@ -18,6 +18,9 @@ package com.android.settings.fuelgauge.batteryusage; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; import android.app.AlarmManager; @@ -26,6 +29,7 @@ import android.app.usage.UsageStatsManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.os.UserManager; import androidx.test.core.app.ApplicationProvider; @@ -37,6 +41,8 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.Shadows; import org.robolectric.shadows.ShadowAlarmManager; @@ -55,10 +61,15 @@ public final class BootBroadcastReceiverTest { private ShadowAlarmManager mShadowAlarmManager; private PeriodicJobManager mPeriodicJobManager; + @Mock + private UserManager mUserManager; + @Before public void setUp() { + MockitoAnnotations.initMocks(this); TimeZone.setDefault(TimeZone.getTimeZone("UTC")); - mContext = ApplicationProvider.getApplicationContext(); + mContext = spy(ApplicationProvider.getApplicationContext()); + when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); mPeriodicJobManager = PeriodicJobManager.getInstance(mContext); mShadowAlarmManager = shadowOf(mContext.getSystemService(AlarmManager.class)); mReceiver = new BootBroadcastReceiver(); @@ -78,7 +89,15 @@ public final class BootBroadcastReceiverTest { @Test public void onReceive_withWorkProfile_notRefreshesJob() { - BatteryTestUtils.setWorkProfile(mContext); + doReturn(true).when(mUserManager).isManagedProfile(); + mReceiver.onReceive(mContext, new Intent(Intent.ACTION_BOOT_COMPLETED)); + + assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNull(); + } + + @Test + public void onReceive_withPrivateProfile_notRefreshesJob() { + doReturn(true).when(mUserManager).isPrivateProfile(); mReceiver.onReceive(mContext, new Intent(Intent.ACTION_BOOT_COMPLETED)); assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNull(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java index d89e61b00ea..2fda2779106 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java @@ -47,7 +47,6 @@ import android.os.UserManager; import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity; import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity; -import com.android.settings.testutils.BatteryTestUtils; import org.junit.Before; import org.junit.Test; @@ -450,6 +449,26 @@ public final class DatabaseUtilsTest { assertThat(batteryHistMap).isEmpty(); } + @Test + public void getHistoryMap_withPrivateProfile_returnExpectedMap() + throws PackageManager.NameNotFoundException { + doReturn("com.fake.package").when(mContext).getPackageName(); + doReturn(mMockContext) + .when(mContext) + .createPackageContextAsUser("com.fake.package", /* flags= */ 0, UserHandle.OWNER); + doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); + doReturn(UserHandle.CURRENT).when(mContext).getUser(); + doReturn(true).when(mUserManager).isPrivateProfile(); + doReturn(UserHandle.SYSTEM).when(mUserManager).getProfileParent(UserHandle.CURRENT); + + DatabaseUtils.sFakeSupplier = () -> getMatrixCursor(); + + final Map> batteryHistMap = + DatabaseUtils.getHistoryMapSinceQueryTimestamp(mContext, 0); + + assertThat(batteryHistMap).isEmpty(); + } + @Test public void removeUsageSource_hasNoData() { DatabaseUtils.removeUsageSource(mContext); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiverTest.java index d111de2160c..ea3c04c87c0 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiverTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiverTest.java @@ -18,11 +18,15 @@ package com.android.settings.fuelgauge.batteryusage; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; import android.app.AlarmManager; import android.content.Context; import android.content.Intent; +import android.os.UserManager; import androidx.test.core.app.ApplicationProvider; @@ -34,6 +38,8 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.shadows.ShadowAlarmManager; @@ -53,12 +59,17 @@ public final class PeriodicJobReceiverTest { private PeriodicJobManager mPeriodicJobManager; private ShadowAlarmManager mShadowAlarmManager; + @Mock + private UserManager mUserManager; + @Before public void setUp() { - mContext = ApplicationProvider.getApplicationContext(); + MockitoAnnotations.initMocks(this); + mContext = spy(ApplicationProvider.getApplicationContext()); mPeriodicJobManager = PeriodicJobManager.getInstance(mContext); mShadowAlarmManager = shadowOf(mContext.getSystemService(AlarmManager.class)); mReceiver = new PeriodicJobReceiver(); + when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); // Inserts fake data into database for testing. final BatteryStateDatabase database = BatteryTestUtils.setUpBatteryStateDatabase(mContext); @@ -114,7 +125,14 @@ public final class PeriodicJobReceiverTest { @Test public void onReceive_inWorkProfileMode_notRefreshesJob() { - BatteryTestUtils.setWorkProfile(mContext); + doReturn(true).when(mUserManager).isManagedProfile(); + mReceiver.onReceive(mContext, JOB_UPDATE_INTENT); + assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNull(); + } + + @Test + public void onReceive_inPrivateProfileMode_notRefreshesJob() { + doReturn(true).when(mUserManager).isPrivateProfile(); mReceiver.onReceive(mContext, JOB_UPDATE_INTENT); assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNull(); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProviderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProviderTest.java index d9981069a01..0dd18c54ae2 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProviderTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProviderTest.java @@ -18,7 +18,11 @@ package com.android.settings.fuelgauge.batteryusage.bugreport; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + import android.content.Context; +import android.os.UserManager; import androidx.test.core.app.ApplicationProvider; @@ -27,6 +31,8 @@ import com.android.settings.testutils.BatteryTestUtils; 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.io.FileDescriptor; @@ -46,11 +52,17 @@ public final class BugReportContentProviderTest { private StringWriter mStringWriter; private BugReportContentProvider mBugReportContentProvider; + @Mock + private UserManager mUserManager; + @Before public void setUp() { + MockitoAnnotations.initMocks(this); mStringWriter = new StringWriter(); mPrintWriter = new PrintWriter(mStringWriter); - mContext = ApplicationProvider.getApplicationContext(); + mContext = spy(ApplicationProvider.getApplicationContext()); + doReturn(mContext).when(mContext).getApplicationContext(); + doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); mBugReportContentProvider = new BugReportContentProvider(); mBugReportContentProvider.attachInfo(mContext, /* info= */ null); // Inserts fake data into database for testing. @@ -77,7 +89,14 @@ public final class BugReportContentProviderTest { @Test public void dump_inWorkProfileMode_notDumpsBatteryUsageData() { - BatteryTestUtils.setWorkProfile(mContext); + doReturn(true).when(mUserManager).isManagedProfile(); + mBugReportContentProvider.dump(FileDescriptor.out, mPrintWriter, new String[] {}); + assertThat(mStringWriter.toString()).isEmpty(); + } + + @Test + public void dump_inPrivateProfileMode_notDumpsBatteryUsageData() { + doReturn(true).when(mUserManager).isPrivateProfile(); mBugReportContentProvider.dump(FileDescriptor.out, mPrintWriter, new String[] {}); assertThat(mStringWriter.toString()).isEmpty(); } From 9e2ac046e40da2a48f88d4db4bf08fec5e9548e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Hern=C3=A1ndez?= Date: Tue, 23 Jul 2024 17:50:35 +0200 Subject: [PATCH 19/19] Changes to the trigger segment * Switch is always visible, even without a configuration activity * Custom icon, title, and summary for some mode types (such as SCHEDULE_TIME, etc). * Default texts in case of missing trigger description. * Different icons for having/missing configuration activity. * Move the section to the top of the screen. Bug: 349376785 Test: atest ZenModeTriggerLinkPreferenceControllerTest Flag: android.app.modes_ui Change-Id: I960318899cf4da20ffc5765818429d5790d05067 --- .../ic_zen_mode_trigger_with_activity.xml | 26 +++ .../ic_zen_mode_trigger_without_activity.xml | 25 +++ res/values/strings.xml | 17 +- res/xml/modes_rule_settings.xml | 23 +- ...odeSetTriggerLinkPreferenceController.java | 183 +++++++++++---- ...etTriggerLinkPreferenceControllerTest.java | 208 ++++++++++++------ 6 files changed, 356 insertions(+), 126 deletions(-) create mode 100644 res/drawable/ic_zen_mode_trigger_with_activity.xml create mode 100644 res/drawable/ic_zen_mode_trigger_without_activity.xml diff --git a/res/drawable/ic_zen_mode_trigger_with_activity.xml b/res/drawable/ic_zen_mode_trigger_with_activity.xml new file mode 100644 index 00000000000..567f01a87cc --- /dev/null +++ b/res/drawable/ic_zen_mode_trigger_with_activity.xml @@ -0,0 +1,26 @@ + + + + \ No newline at end of file diff --git a/res/drawable/ic_zen_mode_trigger_without_activity.xml b/res/drawable/ic_zen_mode_trigger_without_activity.xml new file mode 100644 index 00000000000..11a97f16953 --- /dev/null +++ b/res/drawable/ic_zen_mode_trigger_without_activity.xml @@ -0,0 +1,25 @@ + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index f994fbc911d..08d29ea0678 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8124,9 +8124,9 @@ Allow visual signals - + Stay focused - + Additional actions @@ -9483,6 +9483,19 @@ Mode name + + Calendar events + + Sleep schedule + + While driving + + Linked to app + + Info and settings in %1$s + + Managed by %1$s + Warning diff --git a/res/xml/modes_rule_settings.xml b/res/xml/modes_rule_settings.xml index a8ba5530e8b..2464c25be5d 100644 --- a/res/xml/modes_rule_settings.xml +++ b/res/xml/modes_rule_settings.xml @@ -28,6 +28,21 @@ android:selectable="false" android:layout="@layout/modes_activation_button"/> + + + + + + + + @@ -49,14 +64,6 @@ android:title="@string/zen_category_exceptions" /> - - - - - diff --git a/src/com/android/settings/notification/modes/ZenModeSetTriggerLinkPreferenceController.java b/src/com/android/settings/notification/modes/ZenModeSetTriggerLinkPreferenceController.java index 86135a96190..1f979022670 100644 --- a/src/com/android/settings/notification/modes/ZenModeSetTriggerLinkPreferenceController.java +++ b/src/com/android/settings/notification/modes/ZenModeSetTriggerLinkPreferenceController.java @@ -16,14 +16,26 @@ package com.android.settings.notification.modes; +import static android.app.AutomaticZenRule.TYPE_BEDTIME; +import static android.app.AutomaticZenRule.TYPE_DRIVING; import static android.app.AutomaticZenRule.TYPE_SCHEDULE_CALENDAR; import static android.app.AutomaticZenRule.TYPE_SCHEDULE_TIME; +import static android.service.notification.ZenModeConfig.tryParseScheduleConditionId; +import static com.google.common.base.Preconditions.checkNotNull; + +import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.service.notification.SystemZenRules; +import android.service.notification.ZenModeConfig; import android.util.Log; +import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; +import androidx.annotation.StringRes; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; @@ -35,6 +47,8 @@ import com.android.settingslib.PrimarySwitchPreference; import com.android.settingslib.notification.modes.ZenMode; import com.android.settingslib.notification.modes.ZenModesBackend; +import com.google.common.base.Strings; + /** * Preference controller for the link to an individual mode's configuration page. */ @@ -42,26 +56,29 @@ class ZenModeSetTriggerLinkPreferenceController extends AbstractZenModePreferenc private static final String TAG = "ZenModeSetTriggerLink"; @VisibleForTesting - protected static final String AUTOMATIC_TRIGGER_PREF_KEY = "zen_automatic_trigger_settings"; + static final String AUTOMATIC_TRIGGER_KEY = "zen_automatic_trigger_settings"; + static final String ADD_TRIGGER_KEY = "zen_add_automatic_trigger"; + private final DashboardFragment mFragment; + private final PackageManager mPackageManager; private final ConfigurationActivityHelper mConfigurationActivityHelper; private final ZenServiceListing mServiceListing; - private final DashboardFragment mFragment; ZenModeSetTriggerLinkPreferenceController(Context context, String key, DashboardFragment fragment, ZenModesBackend backend) { - this(context, key, fragment, backend, + this(context, key, fragment, backend, context.getPackageManager(), new ConfigurationActivityHelper(context.getPackageManager()), new ZenServiceListing(context)); } @VisibleForTesting ZenModeSetTriggerLinkPreferenceController(Context context, String key, - DashboardFragment fragment, ZenModesBackend backend, + DashboardFragment fragment, ZenModesBackend backend, PackageManager packageManager, ConfigurationActivityHelper configurationActivityHelper, ZenServiceListing serviceListing) { super(context, key, backend); mFragment = fragment; + mPackageManager = packageManager; mConfigurationActivityHelper = configurationActivityHelper; mServiceListing = serviceListing; } @@ -83,64 +100,137 @@ class ZenModeSetTriggerLinkPreferenceController extends AbstractZenModePreferenc // This controller is expected to govern a preference category so that it controls the // availability of the entire preference category if the mode doesn't have a way to // automatically trigger (such as manual DND). - PrimarySwitchPreference switchPref = ((PreferenceCategory) preference).findPreference( - AUTOMATIC_TRIGGER_PREF_KEY); - if (switchPref == null) { + if (zenMode.isManualDnd()) { return; } - switchPref.setChecked(zenMode.getRule().isEnabled()); - switchPref.setOnPreferenceChangeListener(mSwitchChangeListener); - switchPref.setSummary(zenMode.getRule().getTriggerDescription()); - switchPref.setIcon(null); - switchPref.setOnPreferenceClickListener(null); - switchPref.setIntent(null); + PrimarySwitchPreference triggerPref = checkNotNull( + ((PreferenceCategory) preference).findPreference(AUTOMATIC_TRIGGER_KEY)); + Preference addTriggerPref = checkNotNull( + ((PreferenceCategory) preference).findPreference(ADD_TRIGGER_KEY)); - if (zenMode.isSystemOwned()) { - if (zenMode.getType() == TYPE_SCHEDULE_TIME) { - switchPref.setTitle(R.string.zen_mode_set_schedule_link); - // TODO: b/332937635 - set correct metrics category - switchPref.setIntent(ZenSubSettingLauncher.forModeFragment(mContext, - ZenModeSetScheduleFragment.class, zenMode.getId(), 0).toIntent()); - } else if (zenMode.getType() == TYPE_SCHEDULE_CALENDAR) { - switchPref.setTitle(R.string.zen_mode_set_calendar_link); - switchPref.setIcon(null); - // TODO: b/332937635 - set correct metrics category - switchPref.setIntent(ZenSubSettingLauncher.forModeFragment(mContext, - ZenModeSetCalendarFragment.class, zenMode.getId(), 0).toIntent()); - } else { - switchPref.setTitle(R.string.zen_mode_select_schedule); - switchPref.setIcon(R.drawable.ic_add_24dp); - switchPref.setSummary(""); - // TODO: b/342156843 - Hide the switch (needs support in SettingsLib). - switchPref.setOnPreferenceClickListener(clickedPreference -> { - ZenModeScheduleChooserDialog.show(mFragment, mOnScheduleOptionListener); - return true; - }); - } + boolean isAddTrigger = zenMode.isSystemOwned() && zenMode.getType() != TYPE_SCHEDULE_TIME + && zenMode.getType() != TYPE_SCHEDULE_CALENDAR; + + if (isAddTrigger) { + triggerPref.setVisible(false); + addTriggerPref.setVisible(true); + addTriggerPref.setOnPreferenceClickListener(unused -> { + ZenModeScheduleChooserDialog.show(mFragment, mOnScheduleOptionListener); + return true; + }); } else { - Intent intent = mConfigurationActivityHelper.getConfigurationActivityIntentForMode( - zenMode, mServiceListing::findService); - if (intent != null) { - preference.setVisible(true); - switchPref.setTitle(R.string.zen_mode_configuration_link_title); - switchPref.setSummary(zenMode.getRule().getTriggerDescription()); - switchPref.setIntent(intent); + addTriggerPref.setVisible(false); + triggerPref.setVisible(true); + triggerPref.setChecked(zenMode.getRule().isEnabled()); + triggerPref.setOnPreferenceChangeListener(mSwitchChangeListener); + + if (zenMode.isSystemOwned()) { + setUpForSystemOwnedTrigger(triggerPref, zenMode); } else { - Log.i(TAG, "No intent found for " + zenMode.getRule().getName()); - preference.setVisible(false); + setUpForAppTrigger(triggerPref, zenMode); } } } + private void setUpForSystemOwnedTrigger(Preference preference, ZenMode mode) { + if (mode.getType() == TYPE_SCHEDULE_TIME) { + // TODO: b/332937635 - set correct metrics category + preference.setIntent(ZenSubSettingLauncher.forModeFragment(mContext, + ZenModeSetScheduleFragment.class, mode.getId(), 0).toIntent()); + + // [Clock Icon] 9:00 - 17:00 / Sun-Mon + preference.setIcon(com.android.internal.R.drawable.ic_zen_mode_type_schedule_time); + ZenModeConfig.ScheduleInfo schedule = + tryParseScheduleConditionId(mode.getRule().getConditionId()); + if (schedule != null) { + preference.setTitle(SystemZenRules.getTimeSummary(mContext, schedule)); + preference.setSummary(SystemZenRules.getShortDaysSummary(mContext, schedule)); + } else { + // Fallback, but shouldn't happen. + Log.wtf(TAG, "SCHEDULE_TIME mode without schedule: " + mode); + preference.setTitle(R.string.zen_mode_set_schedule_link); + preference.setSummary(null); + } + } else if (mode.getType() == TYPE_SCHEDULE_CALENDAR) { + // TODO: b/332937635 - set correct metrics category + preference.setIntent(ZenSubSettingLauncher.forModeFragment(mContext, + ZenModeSetCalendarFragment.class, mode.getId(), 0).toIntent()); + + // [Event Icon] Calendar Events / + preference.setIcon( + com.android.internal.R.drawable.ic_zen_mode_type_schedule_calendar); + preference.setTitle(R.string.zen_mode_trigger_title_schedule_calendar); + preference.setSummary(mode.getTriggerDescription()); + } else { + Log.wtf(TAG, "Unexpected type for system-owned mode: " + mode); + } + } + + @SuppressLint("SwitchIntDef") + private void setUpForAppTrigger(Preference preference, ZenMode mode) { + // App-owned mode may have triggerDescription, configurationActivity, or both/neither. + Intent configurationIntent = + mConfigurationActivityHelper.getConfigurationActivityIntentForMode( + mode, mServiceListing::findService); + + @StringRes int title = switch (mode.getType()) { + case TYPE_BEDTIME -> R.string.zen_mode_trigger_title_bedtime; + case TYPE_DRIVING -> R.string.zen_mode_trigger_title_driving; + default -> R.string.zen_mode_trigger_title_generic; + }; + + String summary; + if (!Strings.isNullOrEmpty(mode.getTriggerDescription())) { + summary = mode.getTriggerDescription(); + } else if (!Strings.isNullOrEmpty(mode.getRule().getPackageName())) { + String appName = null; + try { + ApplicationInfo appInfo = mPackageManager.getApplicationInfo( + mode.getRule().getPackageName(), 0); + appName = appInfo.loadLabel(mPackageManager).toString(); + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Couldn't resolve owner for mode: " + mode); + } + + if (appName != null) { + summary = mContext.getString( + configurationIntent != null + ? R.string.zen_mode_trigger_summary_settings_in_app + : R.string.zen_mode_trigger_summary_managed_by_app, + appName); + } else { + summary = null; + } + } else { + Log.e(TAG, "Mode without package! " + mode); + summary = null; + } + + @DrawableRes int icon; + if (mode.getType() == TYPE_BEDTIME) { + icon = com.android.internal.R.drawable.ic_zen_mode_type_schedule_time; // Clock + } else if (mode.getType() == TYPE_DRIVING) { + icon = com.android.internal.R.drawable.ic_zen_mode_type_driving; // Car + } else { + icon = configurationIntent != null ? R.drawable.ic_zen_mode_trigger_with_activity + : R.drawable.ic_zen_mode_trigger_without_activity; + } + + preference.setTitle(title); + preference.setSummary(summary); + preference.setIcon(icon); + preference.setIntent(configurationIntent); + } + @VisibleForTesting final ZenModeScheduleChooserDialog.OnScheduleOptionListener mOnScheduleOptionListener = conditionId -> saveMode(mode -> { mode.setCustomModeConditionId(mContext, conditionId); return mode; + // TODO: b/342156843 - Maybe jump to the corresponding schedule editing screen? }); - @VisibleForTesting - protected Preference.OnPreferenceChangeListener mSwitchChangeListener = (p, newValue) -> { + private final Preference.OnPreferenceChangeListener mSwitchChangeListener = (p, newValue) -> { final boolean newEnabled = (Boolean) newValue; return saveMode((zenMode) -> { if (newEnabled != zenMode.getRule().isEnabled()) { @@ -148,6 +238,5 @@ class ZenModeSetTriggerLinkPreferenceController extends AbstractZenModePreferenc } return zenMode; }); - // TODO: b/342156843 - Do we want to jump to the corresponding schedule editing screen? }; } diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetTriggerLinkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetTriggerLinkPreferenceControllerTest.java index fc3cef142c5..61ca4d84662 100644 --- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetTriggerLinkPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetTriggerLinkPreferenceControllerTest.java @@ -22,11 +22,15 @@ import static android.app.AutomaticZenRule.TYPE_SCHEDULE_TIME; import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY; import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT; -import static com.android.settings.notification.modes.ZenModeSetTriggerLinkPreferenceController.AUTOMATIC_TRIGGER_PREF_KEY; +import static com.android.settings.notification.modes.ZenModeSetTriggerLinkPreferenceController.ADD_TRIGGER_KEY; +import static com.android.settings.notification.modes.ZenModeSetTriggerLinkPreferenceController.AUTOMATIC_TRIGGER_KEY; +import static com.android.settings.notification.modes.ZenModeSetTriggerLinkPreferenceControllerTest.CharSequenceTruth.assertThat; +import static com.google.common.base.Preconditions.checkNotNull; 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.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -35,6 +39,7 @@ import android.app.AutomaticZenRule; import android.app.Flags; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.platform.test.annotations.EnableFlags; @@ -42,7 +47,11 @@ import android.platform.test.flag.junit.SetFlagsRule; import android.service.notification.SystemZenRules; import android.service.notification.ZenModeConfig; +import androidx.annotation.Nullable; +import androidx.preference.Preference; import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; @@ -53,6 +62,9 @@ import com.android.settingslib.notification.modes.TestModeBuilder; import com.android.settingslib.notification.modes.ZenMode; import com.android.settingslib.notification.modes.ZenModesBackend; +import com.google.common.truth.StringSubject; +import com.google.common.truth.Truth; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -60,6 +72,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; import org.robolectric.RobolectricTestRunner; import java.util.Calendar; @@ -74,32 +87,47 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest { private ZenModesBackend mBackend; private Context mContext; - private PrimarySwitchPreference mPreference; - @Mock private PackageManager mPm; @Mock private ConfigurationActivityHelper mConfigurationActivityHelper; - @Mock private PreferenceCategory mPrefCategory; + private PrimarySwitchPreference mConfigPreference; + private Preference mAddPreference; + @Mock private DashboardFragment mFragment; - private ZenModeSetTriggerLinkPreferenceController mPrefController; + private ZenModeSetTriggerLinkPreferenceController mController; @Before - public void setUp() { + public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mContext = ApplicationProvider.getApplicationContext(); - mPrefController = new ZenModeSetTriggerLinkPreferenceController(mContext, - "zen_automatic_trigger_category", mFragment, mBackend, - mConfigurationActivityHelper, - mock(ZenServiceListing.class)); - mPreference = new PrimarySwitchPreference(mContext); + PreferenceManager preferenceManager = new PreferenceManager(mContext); + PreferenceScreen preferenceScreen = preferenceManager.inflateFromResource(mContext, + R.xml.modes_rule_settings, null); - when(mPrefCategory.findPreference(AUTOMATIC_TRIGGER_PREF_KEY)).thenReturn(mPreference); + mController = new ZenModeSetTriggerLinkPreferenceController(mContext, + "zen_automatic_trigger_category", mFragment, mBackend, mPm, + mConfigurationActivityHelper, mock(ZenServiceListing.class)); + + mPrefCategory = preferenceScreen.findPreference("zen_automatic_trigger_category"); + mConfigPreference = checkNotNull(mPrefCategory).findPreference(AUTOMATIC_TRIGGER_KEY); + mAddPreference = checkNotNull(mPrefCategory).findPreference(ADD_TRIGGER_KEY); + + when(mPm.getApplicationInfo(any(), anyInt())).then( + (Answer) invocationOnMock -> { + ApplicationInfo appInfo = new ApplicationInfo(); + appInfo.packageName = invocationOnMock.getArgument(0); + appInfo.labelRes = 1; // Whatever, but != 0 so that loadLabel calls PM.getText() + return appInfo; + }); + when(mPm.getText(any(), anyInt(), any())).then( + (Answer) invocationOnMock -> + "App named " + invocationOnMock.getArgument(0)); } @Test @@ -110,37 +138,37 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest { .setInterruptionFilter(INTERRUPTION_FILTER_PRIORITY) .build(), true); - mPrefController.updateZenMode(mPrefCategory, manualMode); - assertThat(mPrefController.isAvailable()).isFalse(); + mController.updateZenMode(mPrefCategory, manualMode); + assertThat(mController.isAvailable()).isFalse(); // should be available for other modes - mPrefController.updateZenMode(mPrefCategory, TestModeBuilder.EXAMPLE); - assertThat(mPrefController.isAvailable()).isTrue(); + mController.updateZenMode(mPrefCategory, TestModeBuilder.EXAMPLE); + assertThat(mController.isAvailable()).isTrue(); } @Test - public void testUpdateState() { + public void updateState_switchCheckedIfRuleEnabled() { ZenMode zenMode = new TestModeBuilder().setEnabled(false).build(); // Update preference controller with a zen mode that is not enabled - mPrefController.updateZenMode(mPrefCategory, zenMode); - assertThat(mPreference.getCheckedState()).isFalse(); + mController.updateZenMode(mPrefCategory, zenMode); + assertThat(mConfigPreference.getCheckedState()).isFalse(); // Now with the rule enabled zenMode.getRule().setEnabled(true); - mPrefController.updateZenMode(mPrefCategory, zenMode); - assertThat(mPreference.getCheckedState()).isTrue(); + mController.updateZenMode(mPrefCategory, zenMode); + assertThat(mConfigPreference.getCheckedState()).isTrue(); } @Test - public void testOnPreferenceChange() { + public void onPreferenceChange_updatesMode() { ZenMode zenMode = new TestModeBuilder().setEnabled(false).build(); // start with disabled rule - mPrefController.updateZenMode(mPrefCategory, zenMode); + mController.updateZenMode(mPrefCategory, zenMode); - // then update the preference to be checked - mPrefController.mSwitchChangeListener.onPreferenceChange(mPreference, true); + // then flip the switch + mConfigPreference.callChangeListener(true); // verify the backend got asked to update the mode to be enabled ArgumentCaptor captor = ArgumentCaptor.forClass(ZenMode.class); @@ -149,7 +177,7 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest { } @Test - public void testRuleLink_calendar() { + public void updateState_scheduleCalendarRule() { ZenModeConfig.EventInfo eventInfo = new ZenModeConfig.EventInfo(); eventInfo.calendarId = 1L; eventInfo.calName = "My events"; @@ -159,23 +187,21 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest { .setType(TYPE_SCHEDULE_CALENDAR) .setTriggerDescription("My events") .build(); - mPrefController.updateZenMode(mPrefCategory, mode); - assertThat(mPreference.getTitle()).isNotNull(); - assertThat(mPreference.getTitle().toString()).isEqualTo( - mContext.getString(R.string.zen_mode_set_calendar_link)); - assertThat(mPreference.getSummary()).isNotNull(); - assertThat(mPreference.getSummary().toString()).isEqualTo( - mode.getRule().getTriggerDescription()); - assertThat(mPreference.getIcon()).isNull(); + mController.updateState(mPrefCategory, mode); + assertThat(mAddPreference.isVisible()).isFalse(); + assertThat(mConfigPreference.isVisible()).isTrue(); + assertThat(mConfigPreference.getTitle()).isEqualTo("Calendar events"); + assertThat(mConfigPreference.getSummary()).isEqualTo("My events"); // Destination as written into the intent by SubSettingLauncher - assertThat(mPreference.getIntent().getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) + assertThat( + mConfigPreference.getIntent().getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) .isEqualTo(ZenModeSetCalendarFragment.class.getName()); } @Test - public void testRuleLink_schedule() { + public void updateState_scheduleTimeRule() { ZenModeConfig.ScheduleInfo scheduleInfo = new ZenModeConfig.ScheduleInfo(); scheduleInfo.days = new int[]{Calendar.MONDAY, Calendar.TUESDAY, Calendar.THURSDAY}; scheduleInfo.startHour = 1; @@ -186,44 +212,41 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest { .setType(TYPE_SCHEDULE_TIME) .setTriggerDescription("some schedule") .build(); - mPrefController.updateZenMode(mPrefCategory, mode); - assertThat(mPreference.getTitle()).isNotNull(); - assertThat(mPreference.getTitle().toString()).isEqualTo( - mContext.getString(R.string.zen_mode_set_schedule_link)); - assertThat(mPreference.getSummary()).isNotNull(); - assertThat(mPreference.getSummary().toString()).isEqualTo( - mode.getRule().getTriggerDescription()); - assertThat(mPreference.getIcon()).isNull(); + mController.updateState(mPrefCategory, mode); + assertThat(mAddPreference.isVisible()).isFalse(); + assertThat(mConfigPreference.isVisible()).isTrue(); + assertThat(mConfigPreference.getTitle()).isEqualTo("1:00 AM - 3:00 PM"); + assertThat(mConfigPreference.getSummary()).isEqualTo("Mon - Tue, Thu"); // Destination as written into the intent by SubSettingLauncher - assertThat(mPreference.getIntent().getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) + assertThat( + mConfigPreference.getIntent().getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) .isEqualTo(ZenModeSetScheduleFragment.class.getName()); } @Test - public void testRuleLink_manual() { + public void updateState_customManualRule() { ZenMode mode = new TestModeBuilder() .setConditionId(ZenModeConfig.toCustomManualConditionId()) .setPackage(SystemZenRules.PACKAGE_ANDROID) .setType(TYPE_OTHER) .setTriggerDescription("Will not be shown") .build(); - mPrefController.updateZenMode(mPrefCategory, mode); - assertThat(mPreference.getTitle()).isNotNull(); - assertThat(mPreference.getTitle().toString()).isEqualTo( + mController.updateState(mPrefCategory, mode); + + assertThat(mConfigPreference.isVisible()).isFalse(); + assertThat(mAddPreference.isVisible()).isTrue(); + assertThat(mAddPreference.getTitle()).isEqualTo( mContext.getString(R.string.zen_mode_select_schedule)); - assertThat(mPreference.getIcon()).isNotNull(); - assertThat(mPreference.getSummary()).isNotNull(); - assertThat(mPreference.getSummary().toString()).isEqualTo(""); - - // Set up a click listener to open the dialog. - assertThat(mPreference.getOnPreferenceClickListener()).isNotNull(); + assertThat(mAddPreference.getSummary()).isNull(); + // Sets up a click listener to open the dialog. + assertThat(mAddPreference.getOnPreferenceClickListener()).isNotNull(); } @Test - public void testRuleLink_appWithConfigActivity_linksToConfigActivity() { + public void updateState_appWithConfigActivity_showsLinkToConfigActivity() { ZenMode mode = new TestModeBuilder() .setPackage("some.package") .setTriggerDescription("When The Music's Over") @@ -232,28 +255,62 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest { when(mConfigurationActivityHelper.getConfigurationActivityIntentForMode(any(), any())) .thenReturn(configurationIntent); - mPrefController.updateZenMode(mPrefCategory, mode); + mController.updateState(mPrefCategory, mode); - assertThat(mPreference.getTitle()).isNotNull(); - assertThat(mPreference.getTitle().toString()).isEqualTo( - mContext.getString(R.string.zen_mode_configuration_link_title)); - assertThat(mPreference.getSummary()).isNotNull(); - assertThat(mPreference.getSummary().toString()).isEqualTo("When The Music's Over"); - assertThat(mPreference.getIntent()).isEqualTo(configurationIntent); + assertThat(mConfigPreference.isVisible()).isTrue(); + assertThat(mConfigPreference.getTitle()).isEqualTo("Linked to app"); + assertThat(mConfigPreference.getSummary()).isEqualTo("When The Music's Over"); + assertThat(mConfigPreference.getIntent()).isEqualTo(configurationIntent); } @Test - public void testRuleLink_appWithoutConfigActivity_hidden() { + public void updateState_appWithoutConfigActivity_showsWithoutLinkToConfigActivity() { ZenMode mode = new TestModeBuilder() .setPackage("some.package") - .setTriggerDescription("Will not be shown :(") + .setTriggerDescription("When the saints go marching in") .build(); when(mConfigurationActivityHelper.getConfigurationActivityIntentForMode(any(), any())) .thenReturn(null); - mPrefController.updateZenMode(mPrefCategory, mode); + mController.updateState(mPrefCategory, mode); - assertThat(mPrefCategory.isVisible()).isFalse(); + assertThat(mConfigPreference.isVisible()).isTrue(); + assertThat(mConfigPreference.getTitle()).isEqualTo("Linked to app"); + assertThat(mConfigPreference.getSummary()).isEqualTo("When the saints go marching in"); + assertThat(mConfigPreference.getIntent()).isNull(); + } + + @Test + public void updateState_appWithoutTriggerDescriptionWithConfigActivity_showsAppNameInSummary() { + ZenMode mode = new TestModeBuilder() + .setPackage("some.package") + .build(); + Intent configurationIntent = new Intent("configure the mode"); + when(mConfigurationActivityHelper.getConfigurationActivityIntentForMode(any(), any())) + .thenReturn(configurationIntent); + when(mPm.getText(any(), anyInt(), any())).thenReturn("The App Name"); + + mController.updateState(mPrefCategory, mode); + + assertThat(mConfigPreference.isVisible()).isTrue(); + assertThat(mConfigPreference.getTitle()).isEqualTo("Linked to app"); + assertThat(mConfigPreference.getSummary()).isEqualTo("Info and settings in The App Name"); + } + + @Test + public void updateState_appWithoutTriggerDescriptionNorConfigActivity_showsAppNameInSummary() { + ZenMode mode = new TestModeBuilder() + .setPackage("some.package") + .build(); + when(mConfigurationActivityHelper.getConfigurationActivityIntentForMode(any(), any())) + .thenReturn(null); + when(mPm.getText(any(), anyInt(), any())).thenReturn("The App Name"); + + mController.updateState(mPrefCategory, mode); + + assertThat(mConfigPreference.isVisible()).isTrue(); + assertThat(mConfigPreference.getTitle()).isEqualTo("Linked to app"); + assertThat(mConfigPreference.getSummary()).isEqualTo("Managed by The App Name"); } @Test @@ -264,7 +321,7 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest { .setType(TYPE_OTHER) .setTriggerDescription("") .build(); - mPrefController.updateZenMode(mPrefCategory, originalMode); + mController.updateZenMode(mPrefCategory, originalMode); ZenModeConfig.ScheduleInfo scheduleInfo = new ZenModeConfig.ScheduleInfo(); scheduleInfo.days = new int[] { Calendar.MONDAY }; @@ -272,7 +329,7 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest { scheduleInfo.endHour = 15; Uri scheduleUri = ZenModeConfig.toScheduleConditionId(scheduleInfo); - mPrefController.mOnScheduleOptionListener.onScheduleSelected(scheduleUri); + mController.mOnScheduleOptionListener.onScheduleSelected(scheduleUri); // verify the backend got asked to update the mode to be schedule-based. ArgumentCaptor captor = ArgumentCaptor.forClass(ZenMode.class); @@ -284,4 +341,17 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest { assertThat(updatedMode.getRule().getOwner()).isEqualTo( ZenModeConfig.getScheduleConditionProvider()); } + + static class CharSequenceTruth { + /** + * Shortcut version of {@link Truth#assertThat(String)} suitable for {@link CharSequence}. + * {@link CharSequence} doesn't necessarily provide a good {@code equals()} implementation; + * however we don't care about formatting here, so we want to assert on the resulting + * string (without needing to worry that {@code assertThat(x.getText().toString())} can + * throw if the text is null). + */ + static StringSubject assertThat(@Nullable CharSequence actual) { + return Truth.assertThat((String) (actual != null ? actual.toString() : null)); + } + } }