From 211f81afe632cc7b5e085adfb3d7949d80e0b810 Mon Sep 17 00:00:00 2001 From: Josh Hou Date: Mon, 9 Jan 2023 18:18:11 +0800 Subject: [PATCH 01/17] Fix the security vulnerability issue in AppLocalePickerActivity Examine whether the packages is allowed to display app locales list when creating the AppLocalePickerActivity, and examine whether the target user is the same as the calling user. Bug: 257954050 Test: Follows the test step listed in b/257954050#comment14 Change-Id: I2e25a308bcba6ea0edee89c7a78465f766bdbeac Merged-In: I2e25a308bcba6ea0edee89c7a78465f766bdbeac (cherry picked from commit 5d7d1665fecd9f0dba90ccf5e827d3a295dafdcc) Merged-In: I2e25a308bcba6ea0edee89c7a78465f766bdbeac --- .../localepicker/AppLocalePickerActivity.java | 19 +- .../AppLocalePickerActivityTest.java | 172 +++++++++++++++++- 2 files changed, 183 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/localepicker/AppLocalePickerActivity.java b/src/com/android/settings/localepicker/AppLocalePickerActivity.java index b7fef30a58e..691344da60f 100644 --- a/src/com/android/settings/localepicker/AppLocalePickerActivity.java +++ b/src/com/android/settings/localepicker/AppLocalePickerActivity.java @@ -19,6 +19,7 @@ package com.android.settings.localepicker; import android.app.FragmentTransaction; import android.app.LocaleManager; import android.content.Context; +import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.os.LocaleList; @@ -34,6 +35,7 @@ import com.android.internal.app.LocalePickerWithRegion; import com.android.internal.app.LocaleStore; import com.android.settings.R; import com.android.settings.applications.AppInfoBase; +import com.android.settings.applications.AppLocaleUtil; import com.android.settings.applications.appinfo.AppLocaleDetails; import com.android.settings.core.SettingsBaseActivity; @@ -64,12 +66,17 @@ public class AppLocalePickerActivity extends SettingsBaseActivity } mContextAsUser = this; if (getIntent().hasExtra(AppInfoBase.ARG_PACKAGE_UID)) { - int userId = getIntent().getIntExtra(AppInfoBase.ARG_PACKAGE_UID, -1); - if (userId != -1) { - UserHandle userHandle = UserHandle.getUserHandleForUid(userId); + int uid = getIntent().getIntExtra(AppInfoBase.ARG_PACKAGE_UID, -1); + if (uid != -1) { + UserHandle userHandle = UserHandle.getUserHandleForUid(uid); mContextAsUser = createContextAsUser(userHandle, 0); } } + if (!canDisplayLocaleUi() || mContextAsUser.getUserId() != UserHandle.myUserId()) { + Log.w(TAG, "Not allow to display Locale Settings UI."); + finish(); + return; + } setTitle(R.string.app_locale_picker_title); getActionBar().setDisplayHomeAsUpEnabled(true); @@ -160,4 +167,10 @@ public class AppLocalePickerActivity extends SettingsBaseActivity .replace(R.id.content_frame, mLocalePickerWithRegion) .commit(); } + + private boolean canDisplayLocaleUi() { + return AppLocaleUtil.canDisplayLocaleUi(mContextAsUser, mPackageName, + mContextAsUser.getPackageManager().queryIntentActivities( + AppLocaleUtil.LAUNCHER_ENTRY_INTENT, PackageManager.GET_META_DATA)); + } } diff --git a/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java index 332a39b3436..77b2abb76dc 100644 --- a/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java +++ b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java @@ -18,25 +18,35 @@ package com.android.settings.localepicker; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.annotation.Nullable; import android.app.Activity; import android.app.ApplicationPackageManager; +import android.app.LocaleConfig; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; import android.content.pm.InstallSourceInfo; +import android.content.pm.PackageInfo; +import android.content.pm.ResolveInfo; +import android.content.res.Resources; import android.net.Uri; +import android.os.LocaleList; import android.os.Process; import android.os.UserHandle; import android.telephony.TelephonyManager; +import androidx.annotation.ArrayRes; + import com.android.internal.app.LocaleStore; import com.android.settings.applications.AppInfoBase; -import java.util.Locale; - +import org.junit.After; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -45,17 +55,26 @@ import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.android.controller.ActivityController; import org.robolectric.annotation.Config; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; +import org.robolectric.shadows.ShadowPackageManager; import org.robolectric.shadows.ShadowTelephonyManager; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + @RunWith(RobolectricTestRunner.class) @Config( shadows = { AppLocalePickerActivityTest.ShadowApplicationPackageManager.class, + AppLocalePickerActivityTest.ShadowResources.class, + AppLocalePickerActivityTest.ShadowUserHandle.class, + AppLocalePickerActivityTest.ShadowLocaleConfig.class, }) public class AppLocalePickerActivityTest { private static final String TEST_PACKAGE_NAME = "com.android.settings"; @@ -67,21 +86,99 @@ public class AppLocalePickerActivityTest { @Rule public MockitoRule rule = MockitoJUnit.rule(); + private Context mContext; + private ShadowPackageManager mPackageManager; + + @Before + public void setUp() { + mContext = spy(RuntimeEnvironment.application); + mPackageManager = Shadows.shadowOf(mContext.getPackageManager()); + } + + @After + public void tearDown() { + mPackageManager.removePackage(TEST_PACKAGE_NAME); + ShadowResources.setDisAllowPackage(false); + ShadowApplicationPackageManager.setNoLaunchEntry(false); + ShadowUserHandle.setUserId(0); + ShadowLocaleConfig.setStatus(LocaleConfig.STATUS_SUCCESS); + } + @Test public void launchAppLocalePickerActivity_hasPackageName_success() { ActivityController controller = initActivityController(true); - controller.create(); assertThat(controller.get().isFinishing()).isFalse(); } + @Test + public void launchAppLocalePickerActivity_appNoLocaleConfig_failed() { + ShadowLocaleConfig.setStatus(LocaleConfig.STATUS_NOT_SPECIFIED); + + ActivityController controller = + initActivityController(true); + controller.create(); + + assertThat(controller.get().isFinishing()).isTrue(); + } + + @Test + public void launchAppLocalePickerActivity_appSignPlatformKey_failed() { + final ApplicationInfo applicationInfo = new ApplicationInfo(); + applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY; + applicationInfo.packageName = TEST_PACKAGE_NAME; + + final PackageInfo packageInfo = new PackageInfo(); + packageInfo.packageName = TEST_PACKAGE_NAME; + packageInfo.applicationInfo = applicationInfo; + mPackageManager.installPackage(packageInfo); + + ActivityController controller = + initActivityController(true); + controller.create(); + + assertThat(controller.get().isFinishing()).isTrue(); + } + + @Test + public void launchAppLocalePickerActivity_appMatchDisallowedPackage_failed() { + ShadowResources.setDisAllowPackage(true); + + ActivityController controller = + initActivityController(true); + controller.create(); + + assertThat(controller.get().isFinishing()).isTrue(); + } + + @Test + public void launchAppLocalePickerActivity_appNoLaunchEntry_failed() { + ShadowApplicationPackageManager.setNoLaunchEntry(true); + + ActivityController controller = + initActivityController(true); + controller.create(); + + assertThat(controller.get().isFinishing()).isTrue(); + } + + @Test + public void launchAppLocalePickerActivity_modifyAppLocalesOfAnotherUser_failed() { + ShadowUserHandle.setUserId(10); + + ActivityController controller = + initActivityController(true); + controller.create(); + + assertThat(controller.get().isFinishing()).isTrue(); + } + @Test public void launchAppLocalePickerActivity_intentWithoutPackageName_failed() { ActivityController controller = initActivityController(false); - controller.create(); assertThat(controller.get().isFinishing()).isTrue(); @@ -125,7 +222,7 @@ public class AppLocalePickerActivityTest { if (hasPackageName) { data.setData(TEST_PACKAGE_URI); } - data.putExtra(AppInfoBase.ARG_PACKAGE_UID, UserHandle.getUserId(Process.myUid())); + data.putExtra(AppInfoBase.ARG_PACKAGE_UID, Process.myUid()); ActivityController activityController = Robolectric.buildActivity(TestAppLocalePickerActivity.class, data); Activity activity = activityController.get(); @@ -149,10 +246,75 @@ public class AppLocalePickerActivityTest { @Implements(ApplicationPackageManager.class) public static class ShadowApplicationPackageManager extends org.robolectric.shadows.ShadowApplicationPackageManager { + private static boolean sNoLaunchEntry = false; @Implementation protected Object getInstallSourceInfo(String packageName) { return new InstallSourceInfo("", null, null, ""); } + + @Implementation + protected List queryIntentActivities(Intent intent, int flags) { + if (sNoLaunchEntry) { + return new ArrayList(); + } else { + return super.queryIntentActivities(intent, flags); + } + } + + private static void setNoLaunchEntry(boolean noLaunchEntry) { + sNoLaunchEntry = noLaunchEntry; + } + } + + @Implements(Resources.class) + public static class ShadowResources extends + org.robolectric.shadows.ShadowResources { + private static boolean sDisAllowPackage = false; + + @Implementation + public String[] getStringArray(@ArrayRes int id) { + if (sDisAllowPackage) { + return new String[]{TEST_PACKAGE_NAME}; + } else { + return new String[0]; + } + } + + private static void setDisAllowPackage(boolean disAllowPackage) { + sDisAllowPackage = disAllowPackage; + } + } + + @Implements(UserHandle.class) + public static class ShadowUserHandle { + private static int sUserId = 0; + private static void setUserId(int userId) { + sUserId = userId; + } + + @Implementation + public static int getUserId(int userId) { + return sUserId; + } + } + + @Implements(LocaleConfig.class) + public static class ShadowLocaleConfig { + private static int sStatus = 0; + + @Implementation + public @Nullable LocaleList getSupportedLocales() { + return LocaleList.forLanguageTags("en-US"); + } + + private static void setStatus(@LocaleConfig.Status int status) { + sStatus = status; + } + + @Implementation + public @LocaleConfig.Status int getStatus() { + return sStatus; + } } } From 78b42aeb37c04c0da0fe07f46c2558f15a7efc6b Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Thu, 28 Jul 2022 19:42:27 +0800 Subject: [PATCH 02/17] Only primary user is allowed to control secure nfc Bug: 238298970 Test: manual Merged-In: I945490ef1e62af479a732c9a260ed94bdd8bc313 Change-Id: I945490ef1e62af479a732c9a260ed94bdd8bc313 (cherry picked from commit 0e57ff90cdae3575c243d21d490e2b6384d33397) Merged-In: I945490ef1e62af479a732c9a260ed94bdd8bc313 --- src/com/android/settings/nfc/SecureNfcEnabler.java | 2 +- src/com/android/settings/nfc/SecureNfcPreferenceController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/nfc/SecureNfcEnabler.java b/src/com/android/settings/nfc/SecureNfcEnabler.java index f31a382a571..ad5c4ab7e83 100644 --- a/src/com/android/settings/nfc/SecureNfcEnabler.java +++ b/src/com/android/settings/nfc/SecureNfcEnabler.java @@ -61,7 +61,7 @@ public class SecureNfcEnabler extends BaseNfcEnabler { } private boolean isToggleable() { - if (mUserManager.isGuestUser()) { + if (!mUserManager.isPrimaryUser()) { return false; } return true; diff --git a/src/com/android/settings/nfc/SecureNfcPreferenceController.java b/src/com/android/settings/nfc/SecureNfcPreferenceController.java index cf43ec30ded..460eca3c142 100644 --- a/src/com/android/settings/nfc/SecureNfcPreferenceController.java +++ b/src/com/android/settings/nfc/SecureNfcPreferenceController.java @@ -109,7 +109,7 @@ public class SecureNfcPreferenceController extends TogglePreferenceController } private boolean isToggleable() { - if (mUserManager.isGuestUser()) { + if (!mUserManager.isPrimaryUser()) { return false; } return true; From d6d560ff6eadeb25cd61af989ff5928deee63f94 Mon Sep 17 00:00:00 2001 From: Quang Luong Date: Tue, 4 Apr 2023 00:19:52 +0000 Subject: [PATCH 03/17] Don't overwrite security params when editing saved config WifiConfigController2 sets the security params of a saved config, which may overwrite @hide fields like SecurityParams#mIsAddedByAutoUpgrade. To prevent this, only set the security params for a new config, and use the existing security params for existing configs. Bug: 262312532 Test: atest WifiConfigController2Test Change-Id: I9ef5eb8ce2b4208e1fad27bd68fc4f0fad7d1008 --- .../settings/wifi/WifiConfigController2.java | 49 ++++++++++++------- .../wifi/WifiConfigController2Test.java | 11 +++-- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/com/android/settings/wifi/WifiConfigController2.java b/src/com/android/settings/wifi/WifiConfigController2.java index 9a29c1cf030..f92b58fbd1c 100644 --- a/src/com/android/settings/wifi/WifiConfigController2.java +++ b/src/com/android/settings/wifi/WifiConfigController2.java @@ -592,28 +592,32 @@ public class WifiConfigController2 implements TextWatcher, return null; } - WifiConfiguration config = new WifiConfiguration(); - + WifiConfiguration config; if (mWifiEntry == null) { + config = new WifiConfiguration(); config.SSID = "\"" + mSsidView.getText().toString() + "\""; // If the user adds a network manually, assume that it is hidden. config.hiddenSSID = mHiddenSettingsSpinner.getSelectedItemPosition() == HIDDEN_NETWORK; - } else if (!mWifiEntry.isSaved()) { - config.SSID = "\"" + mWifiEntry.getTitle() + "\""; + } else if (mWifiEntry.isSaved()) { + config = new WifiConfiguration(mWifiEntry.getWifiConfiguration()); } else { - config.networkId = mWifiEntry.getWifiConfiguration().networkId; - config.hiddenSSID = mWifiEntry.getWifiConfiguration().hiddenSSID; + config = new WifiConfiguration(); + config.SSID = "\"" + mWifiEntry.getTitle() + "\""; } config.shared = mSharedCheckBox.isChecked(); switch (mWifiEntrySecurity) { case WifiEntry.SECURITY_NONE: - config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OPEN); + if (mWifiEntry == null || !mWifiEntry.isSaved()) { + config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OPEN); + } break; case WifiEntry.SECURITY_WEP: - config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_WEP); + if (mWifiEntry == null || !mWifiEntry.isSaved()) { + config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_WEP); + } if (mPasswordView.length() != 0) { int length = mPasswordView.length(); String password = mPasswordView.getText().toString(); @@ -628,7 +632,9 @@ public class WifiConfigController2 implements TextWatcher, break; case WifiEntry.SECURITY_PSK: - config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); + if (mWifiEntry == null || !mWifiEntry.isSaved()) { + config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); + } if (mPasswordView.length() != 0) { String password = mPasswordView.getText().toString(); if (password.matches("[0-9A-Fa-f]{64}")) { @@ -642,13 +648,16 @@ public class WifiConfigController2 implements TextWatcher, case WifiEntry.SECURITY_EAP: case WifiEntry.SECURITY_EAP_WPA3_ENTERPRISE: case WifiEntry.SECURITY_EAP_SUITE_B: - if (mWifiEntrySecurity == WifiEntry.SECURITY_EAP_SUITE_B) { - // allowedSuiteBCiphers will be set according to certificate type - config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B); - } else if (mWifiEntrySecurity == WifiEntry.SECURITY_EAP_WPA3_ENTERPRISE) { - config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE); - } else { - config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP); + if (mWifiEntry == null || !mWifiEntry.isSaved()) { + if (mWifiEntrySecurity == WifiEntry.SECURITY_EAP_SUITE_B) { + // allowedSuiteBCiphers will be set according to certificate type + config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B); + } else if (mWifiEntrySecurity == WifiEntry.SECURITY_EAP_WPA3_ENTERPRISE) { + config.setSecurityParams( + WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE); + } else { + config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP); + } } config.enterpriseConfig = new WifiEnterpriseConfig(); int eapMethod = mEapMethodSpinner.getSelectedItemPosition(); @@ -790,7 +799,9 @@ public class WifiConfigController2 implements TextWatcher, } break; case WifiEntry.SECURITY_SAE: - config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); + if (mWifiEntry == null || !mWifiEntry.isSaved()) { + config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); + } if (mPasswordView.length() != 0) { String password = mPasswordView.getText().toString(); config.preSharedKey = '"' + password + '"'; @@ -798,7 +809,9 @@ public class WifiConfigController2 implements TextWatcher, break; case WifiEntry.SECURITY_OWE: - config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE); + if (mWifiEntry == null || !mWifiEntry.isSaved()) { + config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE); + } break; default: diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java index ad086b7dce8..faaa0fa917f 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java @@ -470,7 +470,7 @@ public class WifiConfigController2Test { private void checkSavedMacRandomizedValue(int macRandomizedValue) { when(mWifiEntry.isSaved()).thenReturn(true); - final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class); + final WifiConfiguration mockWifiConfig = spy(new WifiConfiguration()); when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class)); when(mWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfig); mockWifiConfig.macRandomizationSetting = macRandomizedValue; @@ -809,9 +809,10 @@ public class WifiConfigController2Test { private void setUpModifyingSavedPeapConfigController() { when(mWifiEntry.isSaved()).thenReturn(true); when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP); - final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class); + final WifiConfiguration mockWifiConfig = spy(new WifiConfiguration()); + mockWifiConfig.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP); when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class)); - final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class); + final WifiEnterpriseConfig mockWifiEnterpriseConfig = spy(new WifiEnterpriseConfig()); when(mockWifiEnterpriseConfig.getEapMethod()).thenReturn(Eap.PEAP); mockWifiConfig.enterpriseConfig = mockWifiEnterpriseConfig; when(mWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfig); @@ -980,8 +981,8 @@ public class WifiConfigController2Test { private void setUpModifyingSavedCertificateConfigController(String savedCaCertificate, String savedUserCertificate) { - final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class); - final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class); + final WifiConfiguration mockWifiConfig = spy(new WifiConfiguration()); + final WifiEnterpriseConfig mockWifiEnterpriseConfig = spy(new WifiEnterpriseConfig()); mockWifiConfig.enterpriseConfig = mockWifiEnterpriseConfig; when(mWifiEntry.isSaved()).thenReturn(true); From 9661f163c3b4922dc8bff5f6f40af494da95265e Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Mon, 10 Apr 2023 13:32:24 +0800 Subject: [PATCH 04/17] Fix App languages for work profile Use the correct work profile context to fix. Fix: 277536202 Test: Manually with App languages when work profile is installed Change-Id: Ibc3bb47127228c8dc6ebf073cd7881727321d5c8 --- .../settings/spa/system/AppLanguagesListModel.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/spa/system/AppLanguagesListModel.kt b/src/com/android/settings/spa/system/AppLanguagesListModel.kt index 3141d68c94f..942bcc4b794 100644 --- a/src/com/android/settings/spa/system/AppLanguagesListModel.kt +++ b/src/com/android/settings/spa/system/AppLanguagesListModel.kt @@ -33,8 +33,10 @@ import com.android.settings.applications.AppLocaleUtil import com.android.settings.applications.appinfo.AppLocaleDetails import com.android.settings.localepicker.AppLocalePickerActivity import com.android.settingslib.spa.framework.util.filterItem +import com.android.settingslib.spaprivileged.framework.common.asUser import com.android.settingslib.spaprivileged.model.app.AppListModel import com.android.settingslib.spaprivileged.model.app.AppRecord +import com.android.settingslib.spaprivileged.model.app.userHandle import com.android.settingslib.spaprivileged.template.app.AppListItem import com.android.settingslib.spaprivileged.template.app.AppListItemModel import kotlinx.coroutines.Dispatchers @@ -54,17 +56,18 @@ class AppLanguagesListModel(private val context: Context) : AppListModel, appListFlow: Flow>) = userIdFlow.map { userId -> - packageManager.queryIntentActivitiesAsUser( + userId to packageManager.queryIntentActivitiesAsUser( AppLocaleUtil.LAUNCHER_ENTRY_INTENT, PackageManager.ResolveInfoFlags.of(PackageManager.GET_META_DATA.toLong()), userId, ) - }.combine(appListFlow) { resolveInfos, appList -> + }.combine(appListFlow) { (userId, resolveInfos), appList -> + val userContext = context.asUser(UserHandle.of(userId)) appList.map { app -> AppLanguagesRecord( app = app, isAppLocaleSupported = AppLocaleUtil.canDisplayLocaleUi( - context, app, resolveInfos + userContext, app, resolveInfos ), ) } @@ -86,9 +89,7 @@ class AppLanguagesListModel(private val context: Context) : AppListModel.AppItem() { @@ -96,8 +97,7 @@ class AppLanguagesListModel(private val context: Context) : AppListModel Date: Mon, 10 Apr 2023 22:28:50 +0800 Subject: [PATCH 05/17] [BiometricsV2] IconTouchDialog continue enroll When user clicks "OK" in FingerprintEnrollEnrollingIconTouchDialog, continue enrolling. Bug: 276416053 Test: atest FingerprintEnrollEnrollingViewModelTest FingerprintEnrollmentActivityTest Test: Manually check enrolling status as clicking "OK" button on FingerprintEnrollEnrollingIconTouchDialog after enabling biometrics v2 v2 through feature flag. Change-Id: I028723acfe35e5119e43b6860022c7432fc2ae0e --- ...erprintEnrollEnrollingIconTouchDialog.java | 17 +- .../view/FingerprintEnrollmentActivity.java | 5 - .../FingerprintEnrollEnrollingViewModel.java | 22 +-- .../FingerprintEnrollmentActivityTest.java | 179 ++++++++++++++---- ...ngerprintEnrollEnrollingViewModelTest.java | 5 - 5 files changed, 147 insertions(+), 81 deletions(-) diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingIconTouchDialog.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingIconTouchDialog.java index e86d755526e..f4fe7ff9b87 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingIconTouchDialog.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingIconTouchDialog.java @@ -18,14 +18,11 @@ package com.android.settings.biometrics2.ui.view; import android.app.Dialog; import android.app.settings.SettingsEnums; -import android.content.Context; import android.os.Bundle; import androidx.appcompat.app.AlertDialog; -import androidx.lifecycle.ViewModelProvider; import com.android.settings.R; -import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; /** @@ -33,15 +30,6 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment; */ public class FingerprintEnrollEnrollingIconTouchDialog extends InstrumentedDialogFragment { - private FingerprintEnrollEnrollingViewModel mViewModel; - - @Override - public void onAttach(Context context) { - mViewModel = new ViewModelProvider(getActivity()).get( - FingerprintEnrollEnrollingViewModel.class); - super.onAttach(context); - } - @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), @@ -50,10 +38,7 @@ public class FingerprintEnrollEnrollingIconTouchDialog extends InstrumentedDialo .setMessage(R.string.security_settings_fingerprint_enroll_touch_dialog_message) .setPositiveButton( R.string.security_settings_fingerprint_enroll_dialog_ok, - (dialog, which) -> { - dialog.dismiss(); - mViewModel.onIconTouchDialogDismiss(); - }); + (dialog, which) -> dialog.dismiss()); return builder.create(); } diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java index 62928af9700..d84ce6146b5 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java @@ -27,7 +27,6 @@ import static com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewMo import static com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.CREDENTIAL_IS_GENERATING_CHALLENGE; import static com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.CREDENTIAL_VALID; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.ErrorDialogData; -import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED; @@ -518,10 +517,6 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { SKIP_SETUP_FIND_FPS_DIALOG_TAG); break; } - case FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG: { - onSetActivityResult(new ActivityResult(BiometricEnrollBase.RESULT_TIMEOUT, null)); - break; - } case FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED: { if (getSupportFragmentManager().getBackStackEntryCount() > 0) { getSupportFragmentManager().popBackStack(); diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java index 025c58bca95..12584ee9d96 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java @@ -60,25 +60,19 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { */ public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG = 1; - /** - * Icon touch dialog dismiss - */ - public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG = 2; - /** * Has got latest cancelled event due to user skip */ - public static final int FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP = 3; + public static final int FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP = 2; /** * Has got latest cancelled event due to back key */ - public static final int FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED = 4; + public static final int FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED = 3; @IntDef(prefix = { "FINGERPRINT_ENROLL_ENROLLING_ACTION_" }, value = { FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE, FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG, - FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG, FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP, FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED }) @@ -116,7 +110,6 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { private final Vibrator mVibrator; private final MutableLiveData mActionLiveData = new MutableLiveData<>(); - private final MutableLiveData mIconTouchDialogLiveData = new MutableLiveData<>(); private final MutableLiveData mErrorDialogLiveData = new MutableLiveData<>(); private final MutableLiveData mErrorDialogActionLiveData = new MutableLiveData<>(); @@ -233,17 +226,6 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { mActionLiveData.postValue(action); } - /** - * Icon touch dialog dismiss - */ - public void onIconTouchDialogDismiss() { - final int action = FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG; - if (DEBUG) { - Log.d(TAG, "onIconTouchDialogDismiss, post action " + action); - } - mActionLiveData.postValue(action); - } - /** * get enroll stage threshold */ diff --git a/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.java b/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.java index cffc452f407..ae32651cdcf 100644 --- a/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.java +++ b/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.java @@ -33,6 +33,7 @@ import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject2; import android.support.test.uiautomator.Until; +import androidx.annotation.NonNull; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; @@ -54,18 +55,25 @@ public class FingerprintEnrollmentActivityTest { private static final String SETTINGS_PACKAGE_NAME = "com.android.settings"; private static final String ACTIVITY_CLASS_NAME = "com.android.settings.biometrics2.ui.view.FingerprintEnrollmentActivity"; - public static final String EXTRA_IS_SETUP_FLOW = "isSetupFlow"; + private static final String EXTRA_IS_SETUP_FLOW = "isSetupFlow"; + private static final String EXTRA_SKIP_FIND_SENSOR = "skip_find_sensor"; private static final String EXTRA_FROM_SETTINGS_SUMMARY = "from_settings_summary"; private static final String EXTRA_PAGE_TRANSITION_TYPE = "page_transition_type"; private static final String EXTRA_KEY_GK_PW_HANDLE = "gk_pw_handle"; private static final String TEST_PIN = "1234"; + private static final String UDFPS_ENROLLING_TITLE = "Touch & hold the fingerprint sensor"; + private static final String SFPS_ENROLLING_TITLE = + "Lift, then touch. Move your finger slightly each time."; + private static final String RFPS_ENROLLING_TITLE = "Lift, then touch again"; + private UiDevice mDevice; private byte[] mToken = new byte[]{}; private Context mContext; private boolean mFingerprintPropCallbackLaunched; private boolean mCanAssumeUdfps; private boolean mCanAssumeSfps; + private String mEnrollingTitle; private static final int IDLE_TIMEOUT = 10000; @@ -94,6 +102,13 @@ public class FingerprintEnrollmentActivityTest { final FingerprintSensorPropertiesInternal prop = list.get(0); mCanAssumeUdfps = prop.isAnyUdfpsType(); mCanAssumeSfps = prop.isAnySidefpsType(); + if (mCanAssumeUdfps) { + mEnrollingTitle = UDFPS_ENROLLING_TITLE; + } else if (mCanAssumeSfps) { + mEnrollingTitle = SFPS_ENROLLING_TITLE; + } else { + mEnrollingTitle = RFPS_ENROLLING_TITLE; + } } }); @@ -106,8 +121,9 @@ public class FingerprintEnrollmentActivityTest { } @Test - public void testLaunchChooseLock() { - launchFingerprintEnrollActivity(false, null); + public void testIntroChooseLock() { + final Intent intent = newActivityIntent(); + mContext.startActivity(intent); assertThat(mDevice.wait(Until.hasObject(By.text("Choose your backup screen lock method")), IDLE_TIMEOUT)).isTrue(); } @@ -135,12 +151,12 @@ public class FingerprintEnrollmentActivityTest { } @Test - public void testLaunchWithGkPwHandle_withUdfps_clickStart() { + public void testIntroWithGkPwHandle_withUdfps_clickStart() { assumeTrue(mCanAssumeUdfps); LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true); - launchFingerprintEnrollActivityWithGkPwHandle(false); + launchIntroWithGkPwHandle(false); // Intro page verifyIntroPage(); @@ -159,17 +175,16 @@ public class FingerprintEnrollmentActivityTest { startBtn.click(); // Enrolling page - assertThat(mDevice.wait(Until.hasObject(By.text("Touch & hold the fingerprint sensor")), - IDLE_TIMEOUT)).isTrue(); + assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue(); } @Test - public void testLaunchWithGkPwHandle_withUdfps_clickLottie() { + public void testIntroWithGkPwHandle_withUdfps_clickLottie() { assumeTrue(mCanAssumeUdfps); LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true); - launchFingerprintEnrollActivityWithGkPwHandle(false); + launchIntroWithGkPwHandle(false); // Intro page verifyIntroPage(); @@ -188,17 +203,16 @@ public class FingerprintEnrollmentActivityTest { lottie.click(); // Enrolling page - assertThat(mDevice.wait(Until.hasObject(By.text("Touch & hold the fingerprint sensor")), - IDLE_TIMEOUT)).isTrue(); + assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue(); } @Test - public void testLaunchWithGkPwHandle_withSfps() { + public void testIntroWithGkPwHandle_withSfps() { assumeTrue(mCanAssumeSfps); LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true); - launchFingerprintEnrollActivityWithGkPwHandle(false); + launchIntroWithGkPwHandle(false); // Intro page verifyIntroPage(); @@ -216,12 +230,12 @@ public class FingerprintEnrollmentActivityTest { } @Test - public void testLaunchWithGkPwHandle_withRfps() { + public void testIntroWithGkPwHandle_withRfps() { assumeFalse(mCanAssumeUdfps || mCanAssumeSfps); LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true); - launchFingerprintEnrollActivityWithGkPwHandle(false); + launchIntroWithGkPwHandle(false); // Intro page verifyIntroPage(); @@ -241,10 +255,10 @@ public class FingerprintEnrollmentActivityTest { } @Test - public void testLaunchWithGkPwHandle_clickNoThanksInIntroPage() { + public void testIntroWithGkPwHandle_clickNoThanksInIntroPage() { LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true); - launchFingerprintEnrollActivityWithGkPwHandle(false); + launchIntroWithGkPwHandle(false); // Intro page verifyIntroPage(); @@ -258,10 +272,10 @@ public class FingerprintEnrollmentActivityTest { } @Test - public void testLaunchWithGkPwHandle_clickSkipInFindSensor() { + public void testIntroWithGkPwHandle_clickSkipInFindSensor() { LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true); - launchFingerprintEnrollActivityWithGkPwHandle(false); + launchIntroWithGkPwHandle(false); // Intro page verifyIntroPage(); @@ -282,10 +296,10 @@ public class FingerprintEnrollmentActivityTest { } @Test - public void testLaunchWithGkPwHandle_clickSkipAnywayInFindFpsDialog_whenIsSuw() { + public void testIntroWithGkPwHandle_clickSkipAnywayInFindFpsDialog_whenIsSuw() { LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true); - launchFingerprintEnrollActivityWithGkPwHandle(true); + launchIntroWithGkPwHandle(true); // Intro page verifyIntroPage(); @@ -315,10 +329,10 @@ public class FingerprintEnrollmentActivityTest { } @Test - public void testLaunchWithGkPwHandle_clickGoBackInFindFpsDialog_whenIsSuw() { + public void testIntroWithGkPwHandle_clickGoBackInFindFpsDialog_whenIsSuw() { LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true); - launchFingerprintEnrollActivityWithGkPwHandle(true); + launchIntroWithGkPwHandle(true); // Intro page verifyIntroPage(); @@ -346,43 +360,138 @@ public class FingerprintEnrollmentActivityTest { } @Test - public void testLaunchCheckPin() { + public void testIntroCheckPin() { LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true); - launchFingerprintEnrollActivity(false, null); + final Intent intent = newActivityIntent(); + mContext.startActivity(intent); assertThat(mDevice.wait(Until.hasObject(By.text("Enter your device PIN to continue")), IDLE_TIMEOUT)).isTrue(); } + @Test + public void testEnrollingWithGkPwHandle() { + LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true); + + launchEnrollingWithGkPwHandle(); + + // Enrolling screen + mDevice.waitForIdle(); + assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue(); + } + + @Test + public void testEnrollingIconTouchDialog_withSfps() { + assumeTrue(mCanAssumeSfps); + + LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true); + + launchEnrollingWithGkPwHandle(); + + // Enrolling screen + mDevice.waitForIdle(); + assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue(); + + final UiObject2 lottie = mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME, + "illustration_lottie")); + assertThat(lottie).isNotNull(); + + lottie.click(); + lottie.click(); + lottie.click(); + + // IconTouchDialog + mDevice.waitForIdle(); + assertThat(mDevice.wait(Until.hasObject(By.text("Touch the sensor instead")), IDLE_TIMEOUT)) + .isTrue(); + final UiObject2 okButton = mDevice.findObject(By.text("OK")); + assertThat(okButton).isNotNull(); + + okButton.click(); + + // Enrolling screen again + mDevice.waitForIdle(); + assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue(); + } + + @Test + public void testEnrollingIconTouchDialog_withRfps() { + assumeFalse(mCanAssumeUdfps || mCanAssumeSfps); + + LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true); + + launchEnrollingWithGkPwHandle(); + + // Enrolling screen + mDevice.waitForIdle(); + assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue(); + + final UiObject2 lottie = mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME, + "fingerprint_progress_bar")); + assertThat(lottie).isNotNull(); + + lottie.click(); + lottie.click(); + lottie.click(); + + // IconTouchDialog + mDevice.waitForIdle(); + assertThat(mDevice.wait(Until.hasObject(By.text("Whoops, that\u2019s not the sensor")), + IDLE_TIMEOUT)).isTrue(); + final UiObject2 okButton = mDevice.findObject(By.text("OK")); + assertThat(okButton).isNotNull(); + + okButton.click(); + + // Enrolling screen again + mDevice.waitForIdle(); + assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue(); + } + @After public void tearDown() throws Exception { LockScreenUtil.resetLockscreen(TEST_PIN); mDevice.pressHome(); } - private void launchFingerprintEnrollActivityWithGkPwHandle(boolean isSuw) { + private void launchIntroWithGkPwHandle(boolean isSuw) { LockPatternUtils lockPatternUtils = new LockPatternUtils(mContext); final LockscreenCredential lockscreenCredential = LockscreenCredential.createPin(TEST_PIN); final int userId = UserHandle.myUserId(); final LockPatternChecker.OnVerifyCallback onVerifyCallback = (response, timeoutMs) -> { - launchFingerprintEnrollActivity(isSuw, response.getGatekeeperPasswordHandle()); + final Intent intent = newActivityIntent(); + if (isSuw) { + intent.putExtra(EXTRA_IS_SETUP_FLOW, true); + } + intent.putExtra(EXTRA_KEY_GK_PW_HANDLE, response.getGatekeeperPasswordHandle()); + mContext.startActivity(intent); }; LockPatternChecker.verifyCredential(lockPatternUtils, lockscreenCredential, userId, LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, onVerifyCallback); } - private void launchFingerprintEnrollActivity(boolean isSuw, Long gkPwHandle) { + private void launchEnrollingWithGkPwHandle() { + LockPatternUtils lockPatternUtils = new LockPatternUtils(mContext); + final LockscreenCredential lockscreenCredential = LockscreenCredential.createPin(TEST_PIN); + final int userId = UserHandle.myUserId(); + final LockPatternChecker.OnVerifyCallback onVerifyCallback = (response, timeoutMs) -> { + final Intent intent = newActivityIntent(); + intent.putExtra(EXTRA_SKIP_FIND_SENSOR, true); + intent.putExtra(EXTRA_KEY_GK_PW_HANDLE, response.getGatekeeperPasswordHandle()); + mContext.startActivity(intent); + }; + LockPatternChecker.verifyCredential(lockPatternUtils, lockscreenCredential, + userId, LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, onVerifyCallback); + } + + @NonNull + private Intent newActivityIntent() { Intent intent = new Intent(); intent.setClassName(SETTINGS_PACKAGE_NAME, ACTIVITY_CLASS_NAME); - if (isSuw) { - intent.putExtra(EXTRA_IS_SETUP_FLOW, true); - } intent.putExtra(EXTRA_FROM_SETTINGS_SUMMARY, true); intent.putExtra(EXTRA_PAGE_TRANSITION_TYPE, 1); intent.putExtra(Intent.EXTRA_USER_ID, mContext.getUserId()); - if (gkPwHandle != null) { - intent.putExtra(EXTRA_KEY_GK_PW_HANDLE, gkPwHandle); - } intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(intent); + return intent; + } } diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModelTest.java index 4de1057436a..fb0937eed37 100644 --- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModelTest.java +++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModelTest.java @@ -21,7 +21,6 @@ import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFP import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.ErrorDialogData; -import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP; @@ -103,10 +102,6 @@ public class FingerprintEnrollEnrollingViewModelTest { mViewModel.showIconTouchDialog(); assertThat(actionLiveData.getValue()).isEqualTo( FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG); - - mViewModel.onIconTouchDialogDismiss(); - assertThat(actionLiveData.getValue()).isEqualTo( - FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG); } @Test From bc0dc12fce492dff9c1e2493bad87bb324ad8d4c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 10 Apr 2023 23:51:57 -0700 Subject: [PATCH 06/17] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I636427362221ee1405fa14fd1d66218793460cff --- res/values-bs/arrays.xml | 2 +- res/values-hy/arrays.xml | 2 +- res/values-ne/arrays.xml | 2 +- res/values-or/arrays.xml | 6 +++--- res/values-pa/arrays.xml | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/res/values-bs/arrays.xml b/res/values-bs/arrays.xml index 3e1f8f335fa..336692f02d6 100644 --- a/res/values-bs/arrays.xml +++ b/res/values-bs/arrays.xml @@ -337,7 +337,7 @@ "Jačina zvuka zvona" "Jačina zvuka medija" "Jačina zvuka alarma" - "Jačina zvuka za obavještenja" + "Jačina zvuka obavještenja" "Jačina zvuka za Bluetooth vezu" "Drži aktivnim" "Lokacija" diff --git a/res/values-hy/arrays.xml b/res/values-hy/arrays.xml index 42043b34db7..552549001c2 100644 --- a/res/values-hy/arrays.xml +++ b/res/values-hy/arrays.xml @@ -337,7 +337,7 @@ "Զանգի բարձրություն" "Մուլտիմեդիայի ձայնը" "Զարթուցիչի ձայնի բարձրություն" - "Ծանուցման ձայնի բարձրություն" + "Ծանուցումների ձայնի ուժգնություն" "Bluetooth-ի ձայնի բարձրություն" "Արթուն պահել" "Տեղադրություն" diff --git a/res/values-ne/arrays.xml b/res/values-ne/arrays.xml index c3ad6590c6b..2375ea05001 100644 --- a/res/values-ne/arrays.xml +++ b/res/values-ne/arrays.xml @@ -270,7 +270,7 @@ "घन्टी मात्रा" "मिडियाको भोल्युम" "अलार्मको भोल्युम" - "सूचना मात्रा" + "सूचनाको भोल्युम" "ब्लुटुथ मात्रा" "जागा रहनुहोस्" "स्थानको निरीक्षण गर्नुहोस्" diff --git a/res/values-or/arrays.xml b/res/values-or/arrays.xml index 09d1a34f656..d420a726913 100644 --- a/res/values-or/arrays.xml +++ b/res/values-or/arrays.xml @@ -268,8 +268,8 @@ "ମାଷ୍ଟର୍ ଭଲ୍ୟୁମ୍" "ଭଏସ ଭଲ୍ୟୁମ" "ରିଙ୍ଗ ଭଲ୍ୟୁମ୍" - "ମିଡିଆ ଭଲ୍ୟୁମ୍‌" - "ଆଲାରାମର ଭଲ୍ୟୁମ୍‌" + "ମିଡିଆ ଭଲ୍ୟୁମ" + "ଆଲାରାମ ଭଲ୍ୟୁମ" "ବିଜ୍ଞପ୍ତି ଭଲ୍ୟୁମ୍" "ବ୍ଲୁଟୂଥ୍‍‌ ଭଲ୍ୟୁମ୍‌" "ଜାଗ୍ରତ ରଖନ୍ତୁ" @@ -335,7 +335,7 @@ "ମାଷ୍ଟର୍‌ ଭଲ୍ୟୁମ୍" "ଭଏସ୍ ଭଲ୍ୟୁମ୍" "ରିଙ୍ଗ ଭଲ୍ୟୁମ୍" - "ମିଡିଆ ଭଲ୍ୟୁମ୍‌" + "ମିଡିଆ ଭଲ୍ୟୁମ" "ଆଲାରାମ୍ ଭଲ୍ୟୁମ୍" "ବିଜ୍ଞପ୍ତି ଭଲ୍ୟୁମ୍‌" "ବ୍ଲୁଟୂଥ୍‍‌ ଭଲ୍ୟୁମ୍‌" diff --git a/res/values-pa/arrays.xml b/res/values-pa/arrays.xml index 55a86d1044f..d424e74cde1 100644 --- a/res/values-pa/arrays.xml +++ b/res/values-pa/arrays.xml @@ -270,7 +270,7 @@ "ਰਿੰਗ ਦੀ ਅਵਾਜ਼" "ਮੀਡੀਆ ਦੀ ਅਵਾਜ਼" "ਅਲਾਰਮ ਦੀ ਅਵਾਜ਼" - "ਸੂਚਨਾ ਵੌਲਿਊਮ" + "ਸੂਚਨਾ ਦੀ ਅਵਾਜ਼" "bluetooth ਵੌਲਿਊਮ" "ਸਕਿਰਿਆ ਰੱਖੋ" "ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਦਾ ਨਿਰੀਖਣ ਕਰੋ" @@ -337,7 +337,7 @@ "ਰਿੰਗ ਦੀ ਅਵਾਜ਼" "ਮੀਡੀਆ ਦੀ ਅਵਾਜ਼" "ਅਲਾਰਮ ਦੀ ਅਵਾਜ਼" - "ਸੂਚਨਾ ਵੌਲਿਊਮ" + "ਸੂਚਨਾ ਦੀ ਅਵਾਜ਼" "Bluetooth ਵੌਲਿਊਮ" "ਸਕਿਰਿਆ ਰੱਖੋ" "ਟਿਕਾਣਾ" From 817fa66f8b29ee14423e0b0aa448d19662981798 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 10 Apr 2023 23:53:44 -0700 Subject: [PATCH 07/17] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Idfc95fbffa4b55fe31507a00c25ce3d99d058c79 --- res/values-ar/strings.xml | 4 ++-- res/values-as/strings.xml | 4 ++-- res/values-b+sr+Latn/strings.xml | 2 +- res/values-bs/strings.xml | 4 ++-- res/values-ca/strings.xml | 4 ++-- res/values-da/strings.xml | 6 +++--- res/values-de/strings.xml | 2 +- res/values-es-rUS/strings.xml | 4 ++-- res/values-es/strings.xml | 4 ++-- res/values-eu/strings.xml | 2 +- res/values-fa/strings.xml | 12 +++++------ res/values-fr/strings.xml | 6 +++--- res/values-gu/strings.xml | 2 +- res/values-hi/strings.xml | 8 ++++---- res/values-hr/strings.xml | 2 +- res/values-hy/strings.xml | 2 +- res/values-ja/strings.xml | 10 +++++----- res/values-kn/strings.xml | 10 +++++----- res/values-ko/strings.xml | 2 +- res/values-ky/strings.xml | 2 +- res/values-lo/strings.xml | 4 ++-- res/values-lv/strings.xml | 2 +- res/values-mk/strings.xml | 2 +- res/values-my/strings.xml | 2 +- res/values-nb/strings.xml | 34 ++++++++++++++++---------------- res/values-ne/strings.xml | 2 +- res/values-nl/strings.xml | 2 +- res/values-or/strings.xml | 28 +++++++++++++------------- res/values-pa/strings.xml | 4 ++-- res/values-pl/strings.xml | 4 ++-- res/values-pt-rBR/strings.xml | 2 +- res/values-pt-rPT/strings.xml | 4 ++-- res/values-pt/strings.xml | 2 +- res/values-ru/strings.xml | 4 ++-- res/values-si/strings.xml | 4 ++-- res/values-sk/strings.xml | 2 +- res/values-sr/strings.xml | 2 +- res/values-th/strings.xml | 16 +++++++-------- res/values-uk/strings.xml | 2 +- res/values-uz/strings.xml | 2 +- res/values-zh-rCN/strings.xml | 4 ++-- res/values-zh-rTW/strings.xml | 8 ++++---- 42 files changed, 114 insertions(+), 114 deletions(-) diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index cfb84780e49..16dbe07e1c9 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -1468,7 +1468,7 @@ "لن يتم تفعيل الميزة تلقائيًا على الإطلاق." "سيتم التفعيل تلقائيًا في %1$s" "سيتم التفعيل تلقائيًا عند غروب الشمس." - "لن يتم الإيقاف تلقائيًا مطلقًا" + "لن يتم الإيقاف بشكل تلقائي مطلقًا" "سيتم الإيقاف تلقائيًا عند الساعة %1$s" "سيتم الإيقاف تلقائيًا عند شروق الشمس" "التفعيل الآن" @@ -1495,7 +1495,7 @@ "سيتم التفعيل تلقائيًا عند غروب الشمس." "سيتم تفعيل الإعداد تلقائيًا في %1$s." "سيتم تفعيله تلقائيًا عند حلول وقت النوم." - "لن يتم مطلقًا إيقاف الوضع تلقائيًا." + "لن يتم الإيقاف بشكل تلقائي مطلقًا" "سيتم إيقاف الوضع تلقائيًا عند شروق الشمس" "سيتم إيقاف الإعداد تلقائيًا في %1$s." "سيتم إيقافه تلقائيًا بعد انتهاء وقت النوم." diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml index 461580d565d..293e24d6ac5 100644 --- a/res/values-as/strings.xml +++ b/res/values-as/strings.xml @@ -1905,7 +1905,7 @@ "মোৰ অৱস্থান এক্সেছ" "আপোনাৰ অনুমতি বিচৰা এপসমূহক আপোনাৰ অৱস্থানৰ তথ্য ব্যৱহাৰ কৰিবলৈ দিয়ক" "অৱস্থানৰ উৎসসমূহ" - "টে\'বলেটটোৰ বিষয়ে" + "টেবলেটটোৰ বিষয়ে" "ফ\'নৰ বিষয়ে" "ডিভাইচৰ বিষয়ে" "এমিউলেটেড ডিভাইচৰ বিষয়ে" @@ -3697,7 +3697,7 @@ "কলৰ ভলিউম" "এলাৰ্মৰ ভলিউম" "ৰিং আৰু জাননীৰ ভলিউম" - "জাননী-ধ্বনিৰ ভলিউম" + "জাননীৰ ভলিউম" "ফ\'নৰ ৰিংট\'ন" "ডিফ\'ল্ট জাননী ধ্বনি" "এপে যোগান ধৰা ধ্বনি" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index bd29c645c20..c3be9eb636a 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -5588,7 +5588,7 @@ "Dozvolite aplikacijama da šalju sadržaj Android sistemu" "Snimi dinamički deo memorije sistema" "Restartuj uz MTE" - "Sistem će se restartovati i omogućiti eksperimentisanje sa Dodatkom za označavanje memorije (MTE). MTE može negativno da utiče na performanse i stabilnost sistema. Resetovanje će se obaviti pri sledećem restartovanju." + "Sistem će se restartovati i omogućiti eksperimentisanje sa Dodatkom za označavanje memorije (MTE). MTE može negativno da utiče na performanse i stabilnost sistema. Biće poništeno pri sledećem restartovanju." "Snimanje dinamičkog dela memorije sistema" "Snimanje dinamičkog dela memorije sistema nije uspelo" "Automatski snimaj dinamički deo memorije sistema" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 2252dd8620f..d949123ec9b 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -3740,7 +3740,7 @@ "Jačina zvuka poziva" "Jačina zvuka alarma" "Jačina zvuka zvona i obavještenja" - "Jačina zvuka za obavještenja" + "Jačina zvuka obavještenja" "Melodija zvona telefona" "Zadani zvuk obavještenja" "Zvuk iz aplikacije" @@ -3896,7 +3896,7 @@ "Kontrolirajte obavještenja iz pojedinačnih aplikacija" "Opće" "Obavještenja za posao" - "Profil za posao" + "Radni profil" "Prilagodljiva obavještenja" "Prilagodljivi prioritet obavještenja" "Obavještenja niskog prioriteta automatski će se postaviti na Diskretno" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 44c78daebf5..5d12845781c 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -2137,7 +2137,7 @@ "Si desactives aquesta aplicació, és possible que Android i altres aplicacions deixin de funcionar com esperes. Tingues en compte que no pots suprimir aquesta aplicació perquè estava preinstal·lada al dispositiu. Si la desactives, l\'aplicació s\'amagarà al dispositiu." "Vols desactivar les notificacions?" "Botiga" - "Informació de l\'aplicació" + "Detalls de l\'aplicació" "L\'aplicació s\'ha instal·lat des de: %1$s" "Més informació a %1$s" "S\'està executant" @@ -2463,7 +2463,7 @@ "Temps del clic automàtic" "Vibració i tecnologia hàptica" "Controla la intensitat de la vibració segons l\'ús" - "Activades" + "Activat" "Desactivades" "L\'opció de configuració s\'ha desactivat perquè el dispositiu està en silenci" "Trucades" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 7415d965c6d..ed595e5a25e 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -3050,7 +3050,7 @@ "Vil du fjerne alt indhold?" "Lager for loginoplysninger er slettet." "Loginlageret kan ikke ryddes." - "Apps med adgang til telefonbrug" + "Apps med adgang til brugsdata" "CA-certifikat" "VPN- og appbrugercertifikat" "Wi‑Fi-certifikat" @@ -4467,11 +4467,11 @@ "(System)" "(Systemstandard)" "Applagerplads" - "Adgang til telefonbrug" + "Adgang til brugsdata" "Tillad adgang til telefonbrug" "Præferencer for appbrug" "Skærmtid" - "Med adgang til telefonbrug kan en app aflæse, hvilke andre apps du anvender og hvor ofte, samt dit mobilselskab, dine sprogindstillinger og andre oplysninger." + "Med adgang til brugsdata kan en app aflæse, hvilke andre apps du anvender og hvor ofte, samt dit mobilselskab, dine sprogindstillinger og andre oplysninger." "Hukommelse" "Hukommelsesoplysninger" "Kører altid (%s)" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 61eac5ecf41..460622d44df 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -2387,7 +2387,7 @@ "Lautstärketasten gedrückt halten" "Halte beide Lautstärketasten gedrückt" "Dreimal auf den Bildschirm tippen" - "Dreimal auf den Bildschirm tippen" + "dreimal auf den Bildschirm tippen" "Tippe {0,number,integer}-mal schnell auf das Display. Durch diesen Kurzbefehl kann dein Gerät langsamer werden." "Erweitert" "Die Schaltfläche für die Bedienungshilfen ist auf %1$s gestellt. Um die Vergrößerung nutzen zu können, tippe & halte die Schaltfläche für die Bedienungshilfen gedrückt und wähle anschließend \"Vergrößerung\" aus." diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index c7125821f9d..3f9b123cfc8 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -454,7 +454,7 @@ "La función Desbloqueo con huellas dactilares crea un modelo único de la huella dactilar de tu hijo que permite verificar su identidad. Para crear este modelo durante la configuración, deberá tomar fotos de su huella desde diferentes posiciones." "Cuando usas Pixel Imprint, las imágenes se utilizan para actualizar el modelo de huella dactilar. Las imágenes que se usan para crear tu modelo no se guardan, pero el modelo en sí se almacena de manera segura en tu teléfono y nunca sale de él. Todo el proceso se lleva a cabo en el teléfono de forma segura." "Cuando usa Pixel Imprint, las imágenes se utilizan para actualizar el modelo de huella dactilar. Las imágenes que se usan para crear el modelo de tu hijo no se guardan, pero el modelo en sí se almacena de manera segura en el teléfono y nunca sale de él. Todo el proceso se lleva a cabo en el teléfono de forma segura." - "Puedes borrar las imágenes de tu huella dactilar y el modelo, o bien desactivar el desbloqueo con huella dactilar en cualquier momento desde la Configuración. Los modelos y las imágenes de la huella dactilar se almacenan en el teléfono hasta que los borras." + "Puedes borrar las imágenes de tu huella dactilar y el modelo, o bien desactivar el Desbloqueo con huellas dactilares en cualquier momento desde la Configuración. Los modelos y las imágenes de la huella dactilar se almacenan en el teléfono hasta que los borras." "Tu hijo y tú pueden borrar el modelo y las imágenes de su huella dactilar, así como desactivar la función Desbloqueo con huellas dactilares en cualquier momento desde Configuración. Los modelos y las imágenes de la huella se almacenan en el teléfono hasta que se borran." "Tu teléfono se puede desbloquear aunque no lo desees, por ejemplo, si alguien lo acerca 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." @@ -4612,7 +4612,7 @@ "%1$d de %2$d apps que pueden mostrarse sobre otras apps" "Aplicaciones con permiso" "Con permiso" - "No permitido" + "Sin permiso" "instalar, apps, fuentes desconocidas" "Modificar configuración del sistema" "editar, modificar, sistema, configuración" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 95f52565915..948e3a3d976 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -1304,7 +1304,7 @@ "Cuentas de perfil personal" "Cuenta de trabajo (%s)" "Cuenta personal (%s)" - "Búsqueda" + "Buscar" "Pantalla" "Girar pantalla automáticamente" "Desactivado" @@ -4851,7 +4851,7 @@ "recorte de la pantalla, corte" "Opción predeterminada del dispositivo" "No se ha podido crear la superposición" - "Aplicaciones con accesos especiales" + "Acceso especial de aplicaciones" %d aplicaciones pueden utilizar datos sin restricción 1 aplicación puede utilizar datos sin restricción diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index f52e290df27..56ea97d3434 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -5501,7 +5501,7 @@ "Eman Android sistemara edukia bidaltzeko baimena aplikazioei" "Sortu memoria-iraulketaren txostena" "Berrabiarazi MTEekin" - "Sistema berrabiaraziko da, eta memorian etiketatzeko luzapenarekin (MTE) probak egiteko baimena emango. Baliteke MTEak eragin negatiboa izatea sistemaren errendimenduan eta egonkortasunean. Ondoz ondoko hurrengo berrabiaraztean berrezarriko da." + "Sistema berrabiarazi egingo da, eta memorian etiketatzeko luzapenarekin (MTE) probak egiteko baimena emango. Baliteke MTEak eragin negatiboa izatea sistemaren errendimenduan eta egonkortasunean. Ondoz ondoko hurrengo berrabiaraztean berrezarriko da." "Memoria-iraulketaren txostena sortzen" "Ezin izan da sortu memoria-iraulketaren txostena" "Sortu automatikoki memoria-prozesuaren txostenak" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 508e00d0d9a..08e5165e359 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -5076,7 +5076,7 @@ "ارائه‌دهنده اعتبارتان می‌تواند تنظیمات این دستگاه را تغییر دهد و در آن نرم‌افزار نصب کند.\n\nاگر پرداختی را انجام ندهید، دستگاهتان قفل خواهد شد.\n\nبرای دریافت اطلاعات بیشتر، با ارائه‌دهنده اعتبارتان تماس بگیرید." "اگر دستگاهتان را اعتباری دریافت کرده‌اید نمی‌توانید:" "‏نصب برنامه از منابع خارج از «فروشگاه Play»" - "راه‌اندازی مجدد دستگاه در حالت ایمن" + "بازراه‌اندازی دستگاه در حالت ایمن" "افزودن چندین کاربر به دستگاه" "تغییر تاریخ، ساعت، و منطقه زمانی" "استفاده از گزینه‌های توسعه‌دهنده" @@ -5500,8 +5500,8 @@ "محتوای برنامه" "‏به برنامه‌ها برای پخش محتوا به سیستم Android اجازه داده می‌شود" "ثبت رونوشت حافظه آزاد سیستم" - "‏راه‌اندازی مجدد با MTE" - "‏سیستم راه‌اندازی مجدد می‌شود و پس‌از آن، آزمایش کردن با «افزونه‌های نشان‌گذاری حافظه» (MTE) را مجاز می‌کند. MTE می‌تواند بر عملکرد و پایداری سیستم اثر منفی بگذارد. در راه‌اندازی مجدد بعدی، بازنشانی می‌شود." + "‏بازراه‌اندازی با MTE" + "‏سیستم بازراه‌اندازی می‌شود و آزمایش کردن با «افزونه‌های نشان‌گذاری حافظه» (MTE) را مجاز می‌کند. MTE می‌تواند بر عملکرد و پایداری سیستم اثر منفی بگذارد. در بازراه‌اندازی بعدی، بازنشانی می‌شود." "ثبت رونوشت حافطه آزاد سیستم" "رونوشت حافظه آزاد سیستم ثبت نشد" "ثبت خودکار رونوشت‌های حافظه آزاد سیستم" @@ -5764,9 +5764,9 @@ "انتخاب کنید وقتی رایانه لوحی روی پایه قرار می‌گیرد چه چیزی روی صفحه‌نمایش نشان داده شود. هنگام استفاده از محافظ صفحه، دستگاه ممکن است انرژی بیشتری مصرف کند." "سفارشی کردن" "برای فعال کردن پشتیبانی قالب آزاد، راه‌اندازی مجدد الزامی است." - "برای رفتن به حالت میز کار در نمایشگرهای ثانویه، راه‌اندازی مجدد الزامی است." - "اکنون راه‌اندازی مجدد شود" - "بعداً راه‌اندازی مجدد شود" + "برای رفتن به حالت میز کار در نمایشگرهای ثانویه، بازراه‌اندازی الزامی است." + "اکنون بازراه‌اندازی شود" + "بعداً بازراه‌اندازی شود" "صدای فضایی" "صدای رسانه‌های سازگار فراگیرتر می‌شود" "ردیابی سر" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index ddb7ecff2ca..3c993320de8 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -2042,7 +2042,7 @@ "Votre appareil et vos données personnelles sont très vulnérables aux attaques provenant d\'applications inconnues. En installant des applications provenant de cette source, vous acceptez d\'être le seul responsable de tout dommage causé à votre appareil ou de toute perte de données pouvant découler de l\'utilisation de telles applications." "Paramètres avancés" "Activer d\'autres paramètres" - "Infos sur les applis" + "Infos sur l\'appli" "Stockage" "Ouvrir par défaut" "Paramètres par défaut" @@ -4413,8 +4413,8 @@ %d appli inutilisée %d applis inutilisées - "Paramètres des applis inutilisées" - "Suspendre activité appli si inutilisée" + "Paramètres de l\'appli si inutilisée" + "Suspendre l\'activité si inutilisée" "Retirer les autorisations, supprimer les fichiers temporaires et arrêter les notifications" "Toutes les applis" "Applications installées" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index d5f61f0642c..f107876e0d5 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -3512,7 +3512,7 @@ "જ્યારે આ %1$s બીજા NFC ઉપકરણને ટચ કરે ત્યારે ડેટા ફેરબદલીની મંજૂરી આપો" "જ્યારે ટૅબ્લેટ બીજા ડિવાઇસને ટચ કરે ત્યારે ડેટા શેર કરવાની મંજૂરી આપો" "જ્યારે ફોન બીજા ડિવાઇસને ટચ કરે ત્યારે ડેટા વિનિમયની મંજૂરી આપો" - "સ્થાન" + "લોકેશન" "એપ્લિકેશન્સને તમારી સ્થાન માહિતીનો ઉપયોગ કરવા દો" "પાછળ" "આગલું" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 9aff4856eb7..63833bbbede 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -1001,8 +1001,8 @@ "आपको वाई-फ़ाई नेटवर्क बदलने की अनुमति नहीं है." "ज़्यादा" "स्‍वचालित सेटअप (WPS)" - "वाई-फ़ाई स्कैन करना चालू करें?" - "पहले आपको वाई-फ़ाई स्कैन करना होगा, इसके बाद आपको अपने-आप वाई-फ़ाई चालू होने की सुविधा मिलेगी." + "वाई-फ़ाई स्कैनिंग चालू करनी है?" + "वाई-फ़ाई अपने-आप चालू होने की सुविधा पाने के लिए, पहले आपको वाई-फ़ाई स्कैनिंग चालू करनी होगी." "वाई-फ़ाई स्कैन करने की सुविधा से ऐप्लिकेशन और सेवाएं, किसी भी समय वाई-फ़ाई नेटवर्क स्कैन कर सकती हैं. वाई-फ़ाई की सुविधा बंद होने पर भी ऐसा किया जा सकता है. उदाहरण के लिए, इसका इस्तेमाल जगह की जानकारी से जुड़ी सुविधाओं और सेवाओं को बेहतर बनाने के लिए किया जा सकता है." "चालू करें" "वाई-फ़ाई स्कैन करना चालू हो गया है" @@ -3029,7 +3029,7 @@ "सुरक्षित नहीं है" "%d वीपीएन सुरक्षित नहीं है" "%d वीपीएन सुरक्षित नहीं हैं" - "Adaptive connectivity" + "अडैप्टिव कनेक्टिविटी" "अडैप्टिव कनेक्टिविटी का विकल्प चुनने पर, आपका इंटरनेट कनेक्शन अपने-आप मैनेज हो जाएगा. इससे बैटरी लाइफ़ बढ़ती है और डिवाइस की परफ़ॉर्मेंस बेहतर होती है" "चालू" "बंद करें" @@ -3912,7 +3912,7 @@ "नीचे खींचने वाली सूची और लॉक स्क्रीन पर दिखाएं" "नीचे खींचने वाली सूची और स्टेटस बार पर दिखाएं" "नीचे खींचने वाली सूची, स्टेटस बार और लॉक स्क्रीन पर दिखाएं" - "आवाज़ और/या वाइब्रेशन के बिना मिलने वाली सूचनाएं, स्टेटस बार में न दिखाएं" + "साइलेंट मोड पर सेट की गई सूचनाएं, स्टेटस बार में न दिखाएं" "ब्लिंक लाइट" "निजता" "लॉक स्क्रीन छोड़कर आगे बढ़ें" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 94c87f7aded..dcd7c5273ae 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -5588,7 +5588,7 @@ "Dopustite aplikacijama da šalju sadržaj sustavu Android" "Izradi snimku memorije sustava" "Ponovno pokretanje uz MTE" - "Sustav će se ponovno pokrenuti i omogućiti eksperimentiranje s proširenjima za označavanje memorije (MTE). MTE može imati negativan učinak na izvedbu i stabilnost sustava. Poništit će se prilikom naknadnog ponovnog pokretanja." + "Sustav će se ponovno pokrenuti i omogućiti eksperimentiranje s proširenjima za označavanje memorije (MTE). MTE može negativno utjecati na izvedbu i stabilnost sustava. Poništit će se prilikom sljedećeg ponovnog pokretanja." "Izrada snimke memorije sustava" "Izrada snimke memorije sustava nije uspjela" "Automatski izrađuj snimke memorije sustava" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 64c5346f7a3..9cbc9e3c44e 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -3697,7 +3697,7 @@ "Զրույց" "Զարթուցիչ" "Զանգեր և ծանուցումներ" - "Ծանուցման ձայնի բարձրություն" + "Ծանուցումներ" "Հեռախոսի զանգերանգ" "Ծանուցման կանխադրված ձայնը" "Հավելվածի տրամադրված ձայնը" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index d98ef96ff07..2ac4c38041f 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -4351,15 +4351,15 @@ "リンクを追加" "リンクが安全かどうかをアプリが確認し、安全な場合はアプリ内で自動的に開きます。" - 選択済みのリンク: %d 件 - 選択済みのリンク: %d 件 + 確認済みのリンク: %d 件 + 確認済みのリンク: %d 件 以前の選択内容により、以下のリンクはこのアプリで自動的に開きます。 以前の選択内容により、以下のリンクはこのアプリで自動的に開きます。 "OK" - "選択済みのリンク一覧を表示" + "確認済みのリンク一覧を表示" "他のサポートされているリンクを確認しています…" "キャンセル" @@ -4444,7 +4444,7 @@ "対応リンクを開くことをアプリに許可します" "その都度確認" - "リンクを開くことをアプリに許可しない" + "リンクを開くことをアプリに許可しません" %d 個のリンクをアプリで処理します %d 個のリンクをアプリで処理します @@ -4690,7 +4690,7 @@ "表示" "非表示" "アクセス ポイント有効" - "機内モードは ON です" + "機内モードが ON です" "ネットワークは利用できません" "サイレント モード ON" "スマートフォンをミュートに設定" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 3885cae7d1d..a8f02cac246 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -1352,7 +1352,7 @@ "ನಿಮ್ಮ ಆದ್ಯತೆಯ ಹೊಳಪಿನ ಮಟ್ಟ" "ಲಭ್ಯವಿರುವ ಬೆಳಕಿಗೆ ಹೊಂದಿಸಬೇಡಿ" "ಅಧಿಕ ಬ್ಯಾಟರಿ ಬಳಕೆ" - "ಲಭ್ಯವಿರುವ ಬೆಳಕಿಗೆ ಹೊಳಪಿನ ಮಟ್ಟ ಸೂಕ್ತಗೊಳಿಸಿ. ವೈಶಿಷ್ಟ್ಯ ಆನ್ ಇರುವಾಗ ತಾತ್ಕಾಲಿಕವಾಗಿ ಹೊಳಪನ್ನು ಹೊಂದಿಸಬಹುದು." + "ಲಭ್ಯವಿರುವ ಬೆಳಕಿಗೆ ಹೊಳಪಿನ ಮಟ್ಟ ಸೂಕ್ತಗೊಳಿಸಿ. ಫೀಚರ್ ಆನ್ ಇರುವಾಗ ತಾತ್ಕಾಲಿಕವಾಗಿ ಹೊಳಪನ್ನು ಹೊಂದಿಸಬಹುದು." "ನಿಮ್ಮ ಪರದೆಯ ಹೊಳಪನ್ನು ನಿಮ್ಮ ಪರಿಸರ ಮತ್ತು ಚಟುವಟಿಕೆಗಳಿಗೆ ಅನುಗುಣವಾಗಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸರಿಹೊಂದಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಆದ್ಯತೆಗಳನ್ನು ತಿಳಿದುಕೊಳ್ಳಲು ಬೆಳಕನ್ನು ಹೊಂದಿಸಲು ಸಹಾಯ ಮಾಡಲು ನೀವು ಹಸ್ತಚಾಲಿತವಾಗಿ ಸ್ಲೈಡರ್ ಅನ್ನು ಸರಿಸಬಹುದು." "ವೈಟ್ ಬ್ಯಾಲೆನ್ಸ್ ಪ್ರದರ್ಶಿಸಿ" @@ -2395,7 +2395,7 @@ "ಶಾರ್ಟ್‌ಕಟ್ ಸೇವೆ" "ಶಾರ್ಟ್‌ಕಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಲಾಕ್‌ಸ್ಕ್ರೀನ್‌ನ ಶಾರ್ಟ್‌ಕಟ್" - "ಲಾಕ್ ಪರದೆಯಿಂದ ಆನ್ ಮಾಡಲು, ವೈಶಿಷ್ಟ್ಯ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ಅನುಮತಿಸಿ. ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಕೆಲವು ಸೆಕೆಂಡುಗಳ ಕಾಲ ಹಿಡಿದುಕೊಳ್ಳಿ." + "ಲಾಕ್ ಪರದೆಯಿಂದ ಆನ್ ಮಾಡಲು, ಫೀಚರ್ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ಅನುಮತಿಸಿ. ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಕೆಲವು ಸೆಕೆಂಡುಗಳ ಕಾಲ ಹಿಡಿದುಕೊಳ್ಳಿ." "ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಬಟನ್" "ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಬಟನ್ ಮತ್ತು ಗೆಸ್ಚರ್" "ಯಾವುದಾದರೂ ಸ್ಕ್ರೀನ್ ಮೂಲಕ ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಫೀಚರ್‌ಗಳನ್ನು ತ್ವರಿತವಾಗಿ ಪ್ರವೇಶಿಸಿ" @@ -5121,10 +5121,10 @@ "ಆ್ಯಪ್‌ಗಳು" "ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳು ಮತ್ತು ಇತರ" "ಸಿಸ್ಟಂ" - "ಅನುಪಯುಕ್ತ" + "ಟ್ರ್ಯಾಶ್" "ಅನುಪಯುಕ್ತವನ್ನು ಖಾಲಿ ಮಾಡಬೇಕೇ?" "ಅನುಪಯುಕ್ತದಲ್ಲಿ %1$s ಫೈಲ್‌ಗಳಿವೆ. ಎಲ್ಲಾ ಐಟಂಗಳನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ನಿಮಗೆ ಅವುಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ." - "ಅನುಪಯುಕ್ತ ಖಾಲಿಯಾಗಿದೆ" + "ಟ್ರ್ಯಾಶ್ ಖಾಲಿಯಾಗಿದೆ" "ಅನುಪಯುಕ್ತವನ್ನು ಖಾಲಿ ಮಾಡಿ" "^1"" ""^2""" "%1$s ನಲ್ಲಿ ಬಳಸಿರುವುದು" @@ -5174,7 +5174,7 @@ "ಟ್ರಿಗ್ಗರ್ ವಾಹಕ ಪೂರೈಕೆ" "ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಅನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಿ" "ಫೋಕಸ್‌ ಆಗಿ ಇರಲು ಅಧಿಸೂಚನೆಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಿ" - "ವೈಶಿಷ್ಟ್ಯ ಲಭ್ಯವಿಲ್ಲ" + "ಫೀಚರ್ ಲಭ್ಯವಿಲ್ಲ" "ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ ಏಕೆಂದರೆ ಇದು ನಿಮ್ಮ ಫೋನ್‌ನ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ನಿಧಾನಗೊಳಿಸುತ್ತದೆ" "ಯಾವಾಗಲೂ ಕ್ರ್ಯಾಶ್ ಸಂವಾದವನ್ನು ತೋರಿಸಿ" "ಅಪ್ಲಿಕೇಶನ್ ಕ್ರ್ಯಾಶ್ ಆಗುವಾಗ ಪ್ರತಿ ಬಾರಿ ಸಂವಾದವನ್ನು ತೋರಿಸಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index b103be39505..a0336aa861a 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -4859,7 +4859,7 @@ "더보기" "ShortcutManager 대역 제한 기능 재설정" "ShortcutManager 대역 제한 기능이 재설정되었습니다." - "잠금 화면에서 정보 제어" + "잠금 화면에 표시되는 정보 설정" "알림 내용 표시 또는 숨기기" "전체" "도움말 및 지원" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index 34fc5294f52..b087ab6dfaf 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -3697,7 +3697,7 @@ "Сүйлөшүү" "Ойготкучтун катуулугу" "Шыңгырлар менен билдирмелердин үнүнүн катуулугу" - "Эскертме үнүнүн катуулугу" + "Билдирменин үнүнүн катуулугу" "Телефондун шыңгыры" "Билдирменин демейки үнү" "Колдонмонун демейки үнү" diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index 81f1c5fd60a..dddcaf930d1 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -4043,7 +4043,7 @@ "ງຽບ" "ການແຈ້ງເຕືອນທີ່ບໍ່ມີສຽງ ຫຼື ການສັ່ນເຕືອນ" "ອະນຸຍາດແລ້ວ" - "ບໍ່ອະນຸຍາດແລ້ວ" + "ບໍ່ອະນຸຍາດ" "ເບິ່ງແອັບທັງໝົດ" "ປ່ຽນການຕັ້ງຄ່າສຳລັບແຕ່ລະແອັບທີ່ສົ່ງການແຈ້ງເຕືອນ" "ແອັບທີ່ສະແດງຢູ່ອຸປະກອນ" @@ -4612,7 +4612,7 @@ "%1$d ຈາກທັງໝົດ %2$d ແອັບແມ່ນອະນຸຍາດໃຫ້ສະແດງຜົນບັງແອັບອື່ນໄດ້" "ແອັບ​ທີ່​ມີ​ການ​ອະ​ນຸ​ຍາດ" "ອະນຸຍາດແລ້ວ" - "ບໍ່ອະນຸຍາດແລ້ວ" + "ບໍ່ອະນຸຍາດ" "ຕິດຕັ້ງແອັບທີ່ບໍ່ຮູ້ແຫລ່ງທີ່ມາ" "ແກ້ໄຂການຕັ້ງຄ່າລະບົບ" "ຂຽນແກ້ໄຂການຕັ້ງຄ່າລະບົບ" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index b3fd91a72c0..48ec11f8cc8 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -4426,7 +4426,7 @@ "Tiek atvērta lietotnē %s" "Izmantots: %1$s no %2$s" "iekšējā atmiņa" - "ārējā atmiņa" + "ārējā krātuve" "Izmantoti %1$s kopš: %2$s" "Izmantotā krātuve" "Mainīt" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 128c483e744..80e880f8675 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -5501,7 +5501,7 @@ "Дозволете апликациите да испраќаат содржини до системот Android" "Сними слика од меморијата на системот" "Рестартирајте со MTE" - "Системот ќе се рестартира и ќе дозволи експеримент со Memory Tagging Extension (MTE). MTE може да има негативно влијание по изведбата и стабилноста на системот. Ќе се ресетира на следното подоцнежно рестартирање." + "Системот ќе се рестартира и ќе дозволи експеримент со Memory Tagging Extension (MTE). MTE може да има негативно влијание по изведбата и стабилноста на системот. Ќе се ресетира на следното рестартирање." "Се снима слика од меморијата на системот" "Не може да се сними слика од меморијата на системот" "Автоматски снимај слики од меморијата на системот" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 549cd192086..61628858be5 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -3697,7 +3697,7 @@ "ဖုန်းခေါ်သံ အတိုးအကျယ်" "နှိုးစက်အသံ အတိုးအကျယ်" "မြည်သံနှင့် အကြောင်းကြားချက် အသံ" - "အကြောင်းကြားချက်သံ ပမာဏ" + "အကြောင်းကြားသံ အတိုးအကျယ်" "ဖုန်းမြည်သံ" "မူရင်းအကြောင်းကြားသံ" "အက်ပ်ကပံ့ပိုးပေးသော အသံ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index dd1e7fcaeb0..7590f075b50 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -584,7 +584,7 @@ "Registreringen er ikke fullført" "Tidsgrensen for registrering av fingeravtrykk er nådd. Prøv på nytt." "Registrering av fingeravtrykket mislyktes. Prøv på nytt, eller bruk en annen finger." - "Legg til ett til" + "Legg til et til" "Neste" "I tillegg til å låse opp telefonen din, kan du bruke fingeravtrykket ditt til å godkjenne kjøp og apptilgang. ""Finn ut mer" "Alternativet for skjermlås er slått av. For å finne ut mer, kontakt administratoren for organisasjonen din." @@ -942,7 +942,7 @@ "Android Beam" "Når denne funksjonen er slått på, kan du beame appinnhold til en annen enhet som støtter nærfeltskommunikasjon (NFC). Du gjør dette ved å holde enhetene tett sammen. Du kan for eksempel beame nettsider, YouTube-videoer, kontakter med mer.\n\nDu holder bare enhetene mot hverandre (vanligvis rygg mot rygg) og trykker på skjermen. Appen avgjør hva som beames." "Wifi" - "Slå på Wifi" + "Slå på wifi" "Wifi" "Bruk Wifi" "Innstillinger for wifi" @@ -956,20 +956,20 @@ "I flymodus" "Varsle om offentlige nettverk" "Varsle når et offentlig nettverk av høy kvalitet er tilgjengelig" - "Slå på Wi‑Fi automatisk" - "Wi‑Fi slås på igjen i nærheten av lagrede nettverk av høy kvalitet, for eksempel hjemmenettverket ditt" + "Slå på wifi automatisk" + "Wifi slås på igjen i nærheten av lagrede nettverk av høy kvalitet, for eksempel hjemmenettverket ditt" "Utilgjengelig fordi Posisjon er slått av. Slå på ""Posisjon""." "Utilgjengelig fordi Wi‑Fi-søking er slått av" "For å bruke funksjonen, velg en leverandør av nettverksvurdering" "Unngå dårlige tilkoblinger" - "Ikke bruk et Wifi-nettverk med mindre det har en brukbar internettilkobling" + "Ikke bruk et wifi-nettverk med mindre det har en brukbar internettilkobling" "Bare bruk nettverk som har en god internettilkobling" "Koble til offentlige nettverk" "Koble automatisk til offentlige nettverk av høy kvalitet" "For å bruke funksjonen, velg en leverandør av nettverksvurdering" "For å bruke funksjonen, velg en kompatibel leverandør av nettverksvurdering" "Installer sertifikater" - "For å forbedre posisjonsnøyaktigheten kan apper og tjenester søke etter Wifi-nettverk når som helst – også når Wifi er slått av. Dette kan for eksempel brukes til å forbedre posisjonsbaserte funksjoner og tjenester. Du kan endre dette i LINK_BEGINinnstillingene for wifi-skanningLINK_END." + "For å forbedre posisjonsnøyaktigheten kan apper og tjenester søke etter wifi-nettverk når som helst – også når Wifi er slått av. Dette kan for eksempel brukes til å forbedre posisjonsbaserte funksjoner og tjenester. Du kan endre dette i LINK_BEGINinnstillingene for wifi-skanningLINK_END." "For å forbedre posisjonsnøyaktigheten, slå på wifi-skanning i LINK_BEGINinnstillingene for wifi-skanningLINK_END." "Ikke vis igjen" "Behold Wifi på i hvilemodus" @@ -984,8 +984,8 @@ "Bruk mobildata når Wifi ikke har Internett-tilgang. Avgifter for databruk kan påløpe." "Legg til nettverk" "Wi‑Fi-innstillinger" - "Wi‑Fi slås på igjen automatisk" - "Wi‑Fi slås ikke på igjen automatisk" + "Wifi slås på igjen automatisk" + "Wifi slås ikke på igjen automatisk" "Wifi-nettverk" "Flere alternativer" "Wi-Fi Direct" @@ -996,16 +996,16 @@ "Husk nettverket" "Glem nettverket" "Endre nettverket" - "Slå på Wifi for å se tilgjengelige nettverk." + "Slå på wifi for å se tilgjengelige nettverk." "Søker etter nettverk …" "Du har ikke tillatelse til å endre Wifi-nettverk." "Se mer" "Automatisk konfig. (WPS)" - "Vil du slå på Wi‑Fi-skanning?" + "Vil du slå på wifi-skanning?" "For å slå på Wifi automatisk må du først slå på wifi-skanning." "Med wifi-skanning kan apper og tjenester søke etter enheter i nærheten når som helst, selv når Wifi er slått av. Dette kan for eksempel brukes til å forbedre posisjonsbaserte funksjoner og tjenester." "Slå på" - "Wi‑Fi-skanning er slått på" + "Wifi-skanning er slått på" "Avanserte alternativer" "Rullegardinliste med avanserte alternativer" "vis" @@ -1876,7 +1876,7 @@ "Høy batteribruk" "Lav batteribruk" "Wi‑Fi-skanning" - "La apper og tjenester søke etter Wifi-nettverk når som helst, selv når Wifi er slått av. Dette kan for eksempel brukes til å forbedre posisjonsbaserte funksjoner og tjenester." + "La apper og tjenester søke etter wifi-nettverk når som helst, selv når Wifi er slått av. Dette kan for eksempel brukes til å forbedre posisjonsbaserte funksjoner og tjenester." "Bluetooth-søking" "La apper og tjenester søke etter enheter i nærheten når som helst, selv når Bluetooth er slått av. Dette kan for eksempel brukes til å forbedre posisjonsbaserte funksjoner og tjenester." "Posisjonstjenester" @@ -2876,7 +2876,7 @@ "Batteri brukt av skjermen og baklyset" "Reduser lysstyrken og/eller tidsavbruddet for aktivering av skjermsparer" "Batteri brukt av Wifi" - "Slå av Wifi når du ikke bruker det, eller det ikke er tilgjengelig" + "Slå av wifi når du ikke bruker det, eller det ikke er tilgjengelig" "Batteri brukt av Bluetooth" "Slå av Bluetooth når den ikke er i bruk" "Prøv å koble til en annen Bluetooth-enhet" @@ -5247,7 +5247,7 @@ "Ignorer" "For å slå på, endre først «Trykk og hold på av/på-knappen» til av/på-menyen." "Nettverksdetaljer" - "Enhetsnavnet ditt er synlig for apper på telefonen. Det kan også ses av andre personer når du kobler til Bluetooth-enheter, kobler til et Wifi-nettverk eller konfigurerer en wifi-sone." + "Enhetsnavnet ditt er synlig for apper på telefonen. Det kan også ses av andre personer når du kobler til Bluetooth-enheter, kobler til et wifi-nettverk eller konfigurerer en wifi-sone." "Enheter" "Alle innstillinger" "Forslag" @@ -5601,8 +5601,8 @@ "Uten SIM-kort" "Nettverksinnstillinger" "nettverkstilkobling, internett, trådløs, data, wifi, wi-fi, wi fi, mobilnett, mobil, mobiloperatør, 4g, 3g, 2g, lte" - "Slå på Wifi" - "Slå av Wifi" + "Slå på wifi" + "Slå av wifi" "Vil du tilbakestille internett?" "Dette avslutter anropet" "Dette avslutter anropet" @@ -5624,7 +5624,7 @@ "anrop" "SMS" "mobildata" - "For å forbedre brukeropplevelsen på enheten kan apper og tjenester søke etter Wifi-nettverk når som helst – også når Wifi er slått av. Dette kan for eksempel brukes til å forbedre posisjonsbaserte funksjoner og tjenester. Du kan endre dette i innstillingene for wifi-skanning." + "For å forbedre brukeropplevelsen på enheten kan apper og tjenester søke etter wifi-nettverk når som helst – også når wifi er slått av. Dette kan for eksempel brukes til å forbedre posisjonsbaserte funksjoner og tjenester. Du kan endre dette i innstillingene for wifi-skanning." "Endre" "%1$s / %2$s" "Tilkoblet" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index a72750690fe..c0c9f98bd2e 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -3697,7 +3697,7 @@ "कलको भोल्युम" "अलार्मको भोल्युम" "घन्टी तथा सूचनाको भोल्युम" - "ध्वनी सूचना" + "सूचनाको भोल्युम" "फोनको रिङटोन" "सूचना आउँदा बज्ने डिफल्ट साउन्ड" "अनुप्रयोगले प्रदान गरेको ध्वनि" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 1dc42625bb5..796e8314ff9 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -1946,7 +1946,7 @@ "Geef je werkwachtwoord op" "Bevestig je patroon" "Geef je werkpatroon op" - "Geef je pincode opnieuw op" + "Voer je pincode opnieuw in" "Je werkpincode opnieuw invullen" "Geef je werkpincode op" "Wachtwoorden komen niet overeen" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index 1046036c017..8f0d4c335b0 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -58,7 +58,7 @@ "ଦ ୱାଣ୍ଡରଫୁଲ୍ ଉଇଜାର୍ଡ୍ ଅଫ୍ ଓଜ୍" "ଭାଗ 11: ଓଜର ମରକତ ମଣିର ଅଦ୍ଭୁତ ସହର" "ଆଖିରେ ସବୁଜ ଚଷମା ପିନ୍ଧିଥିଲେ ସୁଦ୍ଧା ରଶ୍ମିତା ଓ ତା’ ସାଙ୍ଗମାନେ, ସହରର ସୁନ୍ଦରତା ଦେଖି ପ୍ରଥମେ ଚକିତ ହୋଇଯାଇଥିଲେ। ସବୁଜ ମାର୍ବଲରେ ଗଠିତ ସୁନ୍ଦର ଘରଗୁଡ଼ିକ ରାସ୍ତାର ଉଭୟ ପାର୍ଶ୍ୱରେ ଶୋଭା ପାଉଥିଲା ଏବଂ ଝଲସୁଥିବା ରତ୍ନ ସର୍ବତ୍ର ଖଞ୍ଜାଯାଇଥିଲା। ସେମାନେ, ସେହି ସବୁଜ ମାର୍ବଲ ରାସ୍ତାରେ ଚାଲି ଚାଲି ଆଗକୁ ବଢ଼ିଲେ ଏବଂ ଯେଉଁଠାରେ ଦୁଇଟି ଗଳି ପରସ୍ପର ସହିତ ଯୋଡ଼ି ହୋଇଥିଲା, ସେଠାରେ ପାଖାପାଖି ଖଚିତ ରତ୍ନଗୁଡ଼ିକର ଧାଡ଼ି ଥିଲା ଏବଂ ସେଗୁଡ଼ିକ ସୂର୍ଯ୍ୟାଲୋକ କାରଣରୁ ଝଲସୁଥିଲା। ଝରକାରେ ସବୁଜ ରଙ୍ଗର କାଚ ଲାଗିଥିଲା; ଏପରିକି ସହର ଉପରସ୍ଥ ଆକାଶରେ ମଧ୍ୟ ସବୁଜ ଆଭା ଥିଲା ଏବଂ ସୂର୍ଯ୍ୟ କିରଣ ମଧ୍ୟ ସବୁଜ ରଙ୍ଗର ଥିଲା। \n\nସେଠାରେ ଅନେକ ଲୋକ ଥିଲେ; ପୁରୁଷ, ମହିଳା ଓ ପିଲାମାନେ ଯା’ଆସ କରୁଥିଲେ ଏବଂ ସମସ୍ତେ ସବୁଜ ରଙ୍ଗର କପଡ଼ା ପିନ୍ଧିଥିଲେ ତଥା ସେମାନଙ୍କ ଚର୍ମର ରଙ୍ଗ ସବୁଜ ଥିଲା। ସେମାନେ ବିସ୍ମିତ ଆଖିରେ ରଶ୍ମିତା ଓ ତା’ର ଅଜବ ଦେଖାଯାଉଥିବା ସାଙ୍ଗମାନଙ୍କୁ ଚାହିଁଲେ ଏବଂ ଛୋଟ ପିଲାମାନେ, ଯେତେବେଳେ ସିଂହକୁ ଦେଖିଲେ, ଭୟରେ ଦୌଡ଼ିଯାଇ ଯିଏ ଯାହାର ମା’ମାନଙ୍କ ପଛରେ ଲୁଚିଗଲେ; ହେଲେ କେହିହେଲେ ସେମାନଙ୍କ ସହ କଥା ହେଲେନାହିଁ। ରାସ୍ତାରେ ଅନେକ ଦୋକାନ ଥିଲା, ଆଉ ରଶ୍ମିତା ଦେଖିଲା ଯେ, ସେଠାରେ ଥିବା ସବୁ ଜିନିଷ ସବୁଜ ରଙ୍ଗର ଥିଲା। ସବୁଜ ଜୋତା, ସବୁଜ ଟୋପି ଓ ସବୁ ପ୍ରକାରର ସବୁଜ କପଡ଼ା ସମେତ ସବୁଜ ଚକୋଲେଟ ଓ ସବୁଜ ପପ-କର୍ନ ବିକ୍ରି ହେଉଥିଲା। ଗୋଟିଏ ଜାଗାରେ ଜଣେ ଲୋକ ସବୁଜ ଲେମ୍ୱୁ ସର୍ବତ ବିକ୍ରି କରୁଥିଲା ଏବଂ ଯେତେବେଳେ ପିଲାମାନେ ତାକୁ କିଣିଲେ, ରଶ୍ମିତା ଦେଖିଲା ଯେ, ସେମାନେ ସେହି ଲୋକକୁ ସବୁଜ ପଇସା ଦେଲେ। \n\nକୌଣସି ଘୋଡ଼ା କିମ୍ୱା କୌଣସି ପ୍ରକାରର ପଶୁ ସେଠାରେ ନଥିବା ପରି ଜଣାପଡୁଥିଲା; ଛୋଟ ସବୁଜ ଗାଡ଼ିକୁ ଲୋକମାନେ ଠେଲିଠେଲି ସେଥିରେ ଜିନିଷ-ପତ୍ର ନବା-ଆଣିବା କରୁଥିଲେ। ସମସ୍ତେ ଖୁସି, ସନ୍ତୁଷ୍ଟ ଓ ସମୃଦ୍ଧ ଥିବାପରି ଜଣାପଡ଼ୁଥିଲା।" - "ଠିକ୍‌ ଅଛି" + "ଠିକ ଅଛି" "USB ଷ୍ଟୋରେଜ୍‌" "SD କାର୍ଡ" "ବ୍ଲୁଟୁଥ" @@ -180,7 +180,7 @@ "କରାଯାଇଛି" "ପ୍ରକ୍ସି ହୋଷ୍ଟ ନାମ" "ଧ୍ୟାନ" - "ଠିକ୍‌ ଅଛି" + "ଠିକ ଅଛି" "ଆପଣ ଟାଇପ କରିଥିବା ହୋଷ୍ଟ ନାମ ବୈଧ ନୁହେଁ" "ଆପଣ ଟାଇପ୍‍ କରିଥିବା ବହିଷ୍କାର ତାଲିକା ଠିକ୍‌ ଭାବେ ଫର୍ମାଟ୍‌ ହୋଇନାହିଁ। କମା ଦ୍ୱାରା ଅଲଗା କରାଯାଇଥିବା, ବହିଷ୍କାର ଡୋମେନ୍‌ଗୁଡ଼ିକର ଏକ ତାଲିକା ଟାଇପ୍‌ କରନ୍ତୁ।" "ଆପଣଙ୍କୁ ପୋର୍ଟ ଫିଲ୍ଡ ସମ୍ପୂର୍ଣ୍ଣ କରିବା ଆବଶ୍ୟକ।" @@ -245,7 +245,7 @@ "SD କାର୍ଡ" "ପ୍ରକ୍ସି ସେଟିଂସ" "ବାତିଲ" - "ଠିକ୍‌ ଅଛି" + "ଠିକ ଅଛି" "ଭୁଲିଯାଆନ୍ତୁ" "ସେଭ୍‌ କରନ୍ତୁ" "ହୋଇଗଲା" @@ -390,7 +390,7 @@ "ଆପଣ ସର୍ବାଧିକ ସଂଖ୍ୟାର ଫେସ୍‌ଗୁଡ଼ିକୁ ଯୋଡିଛନ୍ତି" "ଆଉ ଅଧିକ ଫେସ୍‌ଗୁଡ଼ିକୁ ଯୋଡିପାରିବ ନାହିଁ" "ପଞ୍ଜିକରଣ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇନାହିଁ" - "ଠିକ୍ ଅଛି" + "ଠିକ ଅଛି" "ମୁହଁ ନାମାଙ୍କନର ସମୟ ସମାପ୍ତ ହୋଇଯାଇଛି। ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।" "ଫେସ୍ ଏନରୋଲମ୍ୟାଣ୍ଟ ହୋଇପାରିଲା ନାହିଁ।" "ସବୁ ପ୍ରସ୍ତୁତ। ଠିକ୍‍ଥିବା ପରି ଜଣାପଡୁଛି।" @@ -483,7 +483,7 @@ "ଟିପଚିହ୍ନ ବ୍ୟବହାର କରି" "ଫେସ ବା ଟିପଚିହ୍ନ ବ୍ୟବହାର କରି" "ଫୋନଟି ତୁମ ବାପାମାଙ୍କୁ ଫେରାଇ ଦିଅ" - "ଠିକ୍ ଅଛି" + "ଠିକ ଅଛି" "ସ୍କ୍ରୀନ୍‌ ଲକ୍‌ ଛାଡ଼ିଦେବେ?" "ଡିଭାଇସ ସୁରକ୍ଷା ବୈଶିଷ୍ଟ୍ୟ ଚାଲୁ ହୋଇପାରିବ ନାହିଁ। ଏହି ଟାବ୍‌ଲେଟ୍‌ ଯଦି ଚୋରି ହୋଇଯାଏ, ହଜିଯାଏ କିମ୍ୱା ରିସେଟ୍‌ କରାଯାଏ, ତେବେ ଆପଣ ଏହାକୁ ବ୍ୟବହାର କରିବାରୁ ଅନ୍ୟମାନଙ୍କୁ ରୋକିପାରିବେ ନାହିଁ।" "ଡିଭାଇସ୍‌ ସୁରକ୍ଷା ବୈଶିଷ୍ଟ୍ୟ ଅନ୍‍ ହେବନାହିଁ। ଏହି ଡିଭାଇସ୍‍ ହଜିଲେ କିମ୍ୱା ଚୋରି ହୋଇଗଲେ, ଅନ୍ୟମାନଙ୍କୁ ଏହାକୁ ବ୍ୟବହାର କରିବାରୁ ଆପଣ ରୋକିପାରିବେ ନାହିଁ।" @@ -503,7 +503,7 @@ "ସେନ୍ସର୍ ଖୋଜିବା ପାଇଁ ସ୍କ୍ରିନ୍ ଉପରେ ଆପଣଙ୍କ ଆଙ୍ଗୁଠିକୁ ମୁଭ୍ କରନ୍ତୁ। ଟିପଚିହ୍ନ ସେନ୍ସରକୁ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ।" "ଡିଭାଇସ୍‌ ଏବଂ ଟିପଚିହ୍ନ ସେନସର୍ ଲୋକେସନ୍‌ ଚିତ୍ରଣ" "ନାମ" - "ଠିକ୍‍ ଅଛି" + "ଠିକ ଅଛି" "ଡିଲିଟ୍‌ କରନ୍ତୁ" "ସେନ୍ସରକୁ ସ୍ପର୍ଶ କରନ୍ତୁ" "ନିଜ ଆଙ୍ଗୁଠିକୁ ସେନ୍ସର୍ ଉପରେ ରଖନ୍ତୁ ଏବଂ ଏକ ଭାଇବ୍ରେସନ୍ ଅନୁଭବ କରିବା ପରେ ଉଠାଇଦିଅନ୍ତୁ" @@ -2241,7 +2241,7 @@ "ବାକ୍ୟାଂଶ" "ଅଧିକ ବିକଳ୍ପ" "କମ୍‌ ବିକଳ୍ପ" - "ଓକେ" + "ଠିକ ଅଛି" "ଶଦ୍ଦ:" "ସର୍ଟକଟ୍‌:" "ଭାଷା:" @@ -2608,7 +2608,7 @@ "ଗୋଟିଏ ଆପ ଏକ ଅସ୍ପଷ୍ଟ ଅନୁରୋଧକୁ ଅଣଦେଖା କରୁଥିବା ଯୋଗୁଁ, ସେଟିଂସ ଆପଣଙ୍କ ଉତ୍ତରକୁ ଯାଞ୍ଚ କରିପାରିବ ନାହିଁ।" "%1$s, ଏହି ଡିଭାଇସ୍‌ର ସମ୍ପୂର୍ଣ୍ଣ ନିୟନ୍ତ୍ରଣ ଅନୁରୋଧ କରୁଛି। ଏହି ସେବା, ସ୍କ୍ରିନ୍‌ ପଢିପାରିବ ଏବଂ ଆକ୍ସେସିବିଲିଟୀ ଆବଶ୍ୟକତା ଅନୁଯାୟୀ ଉପଯୋଗକର୍ତ୍ତା ତରଫରୁ କାର୍ଯ୍ୟ କରିପାରିବ। ଅଧିକାଂଶ ଆପ୍‌ ପାଇଁ ଏହି ସ୍ତରର ନିୟନ୍ତ୍ରଣ ସଠିକ୍‌ ନୁହେଁ।" "ଯେଉଁ ଆପ୍ସ ଆପଣଙ୍କୁ ଆକ୍ସେସିବିଲିଟୀ ଆବଶ୍ୟକତାରେ ସହାୟତା କରେ, ସେହି ଆପ୍ସ ପାଇଁ ସମ୍ପୂର୍ଣ୍ଣ ନିୟନ୍ତ୍ରଣ ଉପଯୁକ୍ତ ଅଟେ, କିନ୍ତୁ ଅଧିକାଂଶ ଆପ୍ସ ପାଇଁ ଉପଯୁକ୍ତ ନୁହେଁ।" - "ଭ୍ୟୁ ଏବଂ ସ୍କ୍ରିନ୍‍ ନିୟନ୍ତ୍ରଣ" + "ସ୍କ୍ରିନକୁ ଦେଖନ୍ତୁ ଏବଂ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ" "ଏହା ସ୍କ୍ରିନ୍‍ର ସମସ୍ତ ବିଷୟବସ୍ତୁ ପଢ଼ିପାରେ ଏବଂ ଅନ୍ୟ ଆପ୍ସରେ ବିଷୟବସ୍ତୁ ପ୍ରଦର୍ଶନ କରିପାରେ।" "ଦେଖନ୍ତୁ ଏବଂ କାର୍ଯ୍ୟ ସମ୍ପାଦନ କରନ୍ତୁ" "ଏହା କୌଣସି ଆପ କିମ୍ବା ହାର୍ଡୱେର ସେନ୍ସର ସହ ଆପଣଙ୍କର ଇଣ୍ଟେରାକ୍ସନକୁ ଟ୍ରାକ କରିପାରେ ଏବଂ ଆପଣଙ୍କ ତରଫରୁ ଆପ୍ସ ସହ ଇଣ୍ଟରାକ୍ଟ କରିପାରେ।" @@ -3021,7 +3021,7 @@ "କଥିତ ଭାଷା" "Voices ଇନ୍‌ଷ୍ଟଲ୍‍ କରନ୍ତୁ" "ଭଏସ୍‌ ଇନ୍‌ଷ୍ଟଲ୍‌ କରିବାକୁ %s ଆପ୍‌ ଜାରି ରଖନ୍ତୁ" - "ଆପ୍‌ ଖୋଲନ୍ତୁ" + "ଆପ ଖୋଲନ୍ତୁ" "ବାତିଲ" "ରିସେଟ୍‌ କରନ୍ତୁ" "ଚଲାନ୍ତୁ" @@ -3695,9 +3695,9 @@ "ମିଡିଆ ଭଲ୍ୟୁମ୍‌" "କାଷ୍ଟ ଭଲ୍ୟୁମ୍‌" "କଲ୍‍ ଭଲ୍ୟୁମ୍‍" - "ଆଲାର୍ମର ଭଲ୍ୟୁମ୍‌" + "ଆଲାରାମ ଭଲ୍ୟୁମ" "ରିଙ୍ଗ ଏବଂ ବିଜ୍ଞପ୍ତି ଭଲ୍ୟୁମ୍" - "ସୂଚନା ଭଲ୍ୟୁମ" + "ବିଜ୍ଞପ୍ତି ଭଲ୍ୟୁମ" "ଫୋନ ରିଂଟୋନ" "ଡିଫଲ୍ଟ ବିଜ୍ଞପ୍ତି ସାଉଣ୍ଡ" "ଆପ୍‌ ଦ୍ୱାରା ପ୍ରଦତ୍ତ ଶବ୍ଦ" @@ -4288,7 +4288,7 @@ "ସ୍କ୍ରୀନ୍‌ ଉପରେ \"ବିରକ୍ତ କର ନାହିଁ\"କୁ ଚାଲୁ କରି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ନିରବ କରନ୍ତୁ" "ବିଜ୍ଞପ୍ତି ସେଟିଂସ" "ଚେତାବନୀ" - "ଠିକ୍‌ ଅଛି" + "ଠିକ ଅଛି" "ବନ୍ଦ କରନ୍ତୁ" "ଏହି ଡିଭାଇସ ବିଷୟରେ ମତାମତ ପଠାନ୍ତୁ" "ଆଡ୍‌ମିନ୍‌ PIN ପ୍ରବେଶ କରନ୍ତୁ" @@ -4358,7 +4358,7 @@ ଏହି ଲିଙ୍କଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରାଯାଇଛି ଏବଂ ଏଗୁଡ଼ିକ ସ୍ୱଚାଳିତ ଭାବେ ଏହି ଆପରେ ଖୋଲେ। ଏହି ଲିଙ୍କକୁ ଯାଞ୍ଚ କରାଯାଇଛି ଏବଂ ଏହା ସ୍ୱଚାଳିତ ଭାବେ ଏହି ଆପରେ ଖୋଲେ। - "ଠିକ୍ ଅଛି" + "ଠିକ ଅଛି" "ଯାଞ୍ଚ କରାଯାଇଥିବା ଲିଙ୍କଗୁଡ଼ିକର ତାଲିକା ଦେଖାନ୍ତୁ" "ଅନ୍ୟ ସମର୍ଥିତ ଲିଙ୍କଗୁଡ଼ିକ ପାଇଁ ଯାଞ୍ଚ କରାଯାଉଛି…" "ବାତିଲ କରନ୍ତୁ" @@ -5682,7 +5682,7 @@ "ଫୋନ୍ ନମ୍ଵରଗୁଡ଼ିକ ଲେଖନ୍ତୁ" "ଫୋନ୍ ନମ୍ଵର୍ ଲେଖନ୍ତୁ" "ଫୋନ୍ ନମ୍ଵର୍ ଉପଲବ୍ଧ ନାହିଁ।" - "ଠିକ୍ ଅଛି" + "ଠିକ ଅଛି" "2Gକୁ ଅନୁମତି ଦିଅନ୍ତୁ" "2G କମ ସୁରକ୍ଷିତ ଅଟେ, କିନ୍ତୁ କିଛି ଲୋକେସନରେ ଏହା ଆପଣଙ୍କ କନେକ୍ସନକୁ ଉନ୍ନତ କରିପାରେ। ଜରୁରୀକାଳୀନ କଲଗୁଡ଼ିକ ପାଇଁ, 2Gକୁ ସର୍ବଦା ଅନୁମତି ଦିଆଯାଇଛି।" "%1$s ପାଇଁ 2G ଉପଲବ୍ଧ ହେବା ଆବଶ୍ୟକ" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 45360d5197e..a8c01a82168 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -3697,7 +3697,7 @@ "ਕਾਲ ਦੀ ਅਵਾਜ਼" "ਅਲਾਰਮ ਦੀ ਅਵਾਜ਼" "ਘੰਟੀ ਅਤੇ ਸੂਚਨਾ ਦੀ ਅਵਾਜ਼" - "ਸੂਚਨਾ ਵੌਲਿਊਮ" + "ਸੂਚਨਾ ਦੀ ਅਵਾਜ਼" "ਫ਼ੋਨ ਰਿੰਗਟੋਨ" "ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਸੂਚਨਾ ਧੁਨੀ" "ਐਪ ਵੱਲੋਂ ਮੁਹੱਈਆ ਕਰਵਾਈ ਧੁਨੀ" @@ -4007,7 +4007,7 @@ "ਕਦੇ ਵੀ ਨਹੀਂ" "ਡੀਵਾਈਸ ਅਤੇ ਐਪ ਸੂਚਨਾਵਾਂ" - "ਕੰਟਰੋਲ ਕਰੋ ਕਿ ਕਿਹੜੀਆਂ ਐਪਾਂ ਅਤੇ ਡੀਵਾਈਸਾਂ ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਪੜ੍ਹੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ" + "ਕੰਟਰੋਲ ਕਰੋ ਕਿ ਕਿਹੜੀਆਂ ਐਪਾਂ ਅਤੇ ਡੀਵਾਈਸ ਸੂਚਨਾਵਾਂ ਪੜ੍ਹ ਸਕਦੇ ਹਨ" "ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਸੂਚਨਾਵਾਂ \'ਤੇ ਪਹੁੰਚ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਹੈ" "ਐਪ ਸੂਚਨਾਵਾਂ ਨਹੀਂ ਪੜ੍ਹ ਸਕਦੇ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index f6adb60f9c7..83db71c39c7 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -2511,8 +2511,8 @@ "Czas automatycznego kliknięcia" "Wibracje i reakcje haptyczne" "Kontroluj siłę wibracji w różnych przypadkach użycia" - "Włączono" - "Wyłączono" + "Włączone" + "Wyłączone" "Ustawienie jest wyłączone, ponieważ urządzenie zostało wyciszone" "Połączenia" "Powiadomienia i alarmy" diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 451c23820cf..494c4436f53 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -4658,7 +4658,7 @@ "Ativadas para todos os apps" "%1$d apps instalados" "24 apps instalados" - "%1$s usado - %2$s livre(s)" + "%1$s usado - %2$s livres" "Armazenamento interno: %1$s de utilização - %2$s livres" "Entrar no modo de suspensão após %1$s de inatividade" "Tema escuro, tamanho da fonte, brilho" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 179ecf54023..86689858a46 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -4372,7 +4372,7 @@ "armazenamento interno" "armazenamento externo" "%1$s util. desde %2$s" - "Armazenamento utilizado" + "Armazenamento usado" "Alterar" "Alterar armazenamento" "Notificações" @@ -5501,7 +5501,7 @@ "Permitir que as apps enviem conteúdo para o sistema Android" "Fazer a captura da área dinâmica para dados do sistema" "Reiniciar com MTE" - "O sistema vai reiniciar e permitir experimentar com a Memory Tagging Extension (MTE). A MTE pode afetar negativamente o desempenho e a estabilidade do sistema. Será reposto no próximo reinício subsequente." + "O sistema vai reiniciar e permitir experimentar com a Memory Tagging Extension (MTE). A MTE pode afetar negativamente o desempenho e a estabilidade do sistema. A opção será reposta no próximo reinício." "A fazer a captura da área dinâmica para dados do sistema…" "Não foi possível fazer a captura da área dinâmica para dados do sistema." "Fazer automaticamente capturas da área dinâmica para dados do sistema" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 451c23820cf..494c4436f53 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -4658,7 +4658,7 @@ "Ativadas para todos os apps" "%1$d apps instalados" "24 apps instalados" - "%1$s usado - %2$s livre(s)" + "%1$s usado - %2$s livres" "Armazenamento interno: %1$s de utilização - %2$s livres" "Entrar no modo de suspensão após %1$s de inatividade" "Tema escuro, tamanho da fonte, brilho" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 84a2e2ce0de..e1e9c243b13 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -3780,8 +3780,8 @@ "Громкость сигналов при входящих вызовах и уведомлениях: 80 %." "Музыка, видео, игры" "Громкость трансляции" - "Разговор" - "Будильник" + "Громкость разговора" + "Громкость будильника" "Вызовы и уведомления" "Громкость уведомлений" "Рингтон" diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index f3f874f5b92..5e57cd77479 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -3694,10 +3694,10 @@ "නාද සහ දැනුම්දීම හඬ 80%" "මාධ්‍ය ශබ්දය" "විකාශන හඬ" - "ඇමතුම් ශබ්දය ත්‍රීවතාවය" + "ඇමතුම් ශබ්දය" "සීනුවේ ශබ්දය" "නාද සහ දැනුම්දීම හඬ" - "දැනුම්දීමේ ශබ්ද ත්‍රීවතාව" + "දැනුම්දීමේ ශබ්දය" "දුරකථන රිගින්ටෝනය" "පෙරනිමි දැනුම්දීම් හඬ" "යෙදුම සපයන හඬ" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 9cf90ff1e64..9fc6ad9f0a8 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -3780,7 +3780,7 @@ "Hlasitosť zvonenia a upozornení je na 80 %" "Hlasitosť médií" "Hlasitosť prenášania" - "Hlasitosť hovoru" + "Hlasitosť hovorov" "Hlasitosť budíkov" "Hlasitosť zvonení a upozornení" "Hlasitosť upozornení" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 66b35b850e8..c6728f95337 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -5588,7 +5588,7 @@ "Дозволите апликацијама да шаљу садржај Android систему" "Сними динамички део меморије система" "Рестартуј уз MTE" - "Систем ће се рестартовати и омогућити експериментисање са Додатком за означавање меморије (MTE). MTE може негативно да утиче на перформансе и стабилност система. Ресетовање ће се обавити при следећем рестартовању." + "Систем ће се рестартовати и омогућити експериментисање са Додатком за означавање меморије (MTE). MTE може негативно да утиче на перформансе и стабилност система. Биће поништено при следећем рестартовању." "Снимање динамичког дела меморије система" "Снимање динамичког дела меморије система није успело" "Аутоматски снимај динамички део меморије система" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index b88620b8e49..d0d40a42e1f 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -2289,7 +2289,7 @@ "คุณปรับแต่งอุปกรณ์นี้ให้ตรงกับความต้องการได้ และเปลี่ยนฟีเจอร์การช่วยเหลือพิเศษเหล่านี้ได้ภายหลังในการตั้งค่า" "เปลี่ยนขนาดแบบอักษร" "โปรแกรมอ่านหน้าจอ" - "คำบรรยายวิดีโอ" + "คำบรรยายแทนเสียง" "เสียง" "ทั่วไป" "การแสดงผล" @@ -2304,7 +2304,7 @@ "TalkBack" "โปรแกรมอ่านหน้าจอสำหรับผู้ที่ตาบอดหรือมีสายตาเลือนรางเป็นหลัก" "แตะรายการบนหน้าจอเพื่อฟังการอ่านออกเสียง" - "ค่ากำหนดคำบรรยายวิดีโอ" + "ค่ากำหนดคำบรรยายแทนเสียง" "เกี่ยวกับค่ากำหนดคำบรรยาย" "ดูข้อมูลเพิ่มเติมเกี่ยวกับค่ากำหนดคำบรรยาย" "การขยาย" @@ -2496,7 +2496,7 @@ "ดูข้อมูลเพิ่มเติมเกี่ยวกับการแก้สี" "เกี่ยวกับการกลับสี" "ดูข้อมูลเพิ่มเติมเกี่ยวกับการกลับสี" - "แสดงคำบรรยาย" + "แสดงคำบรรยายแทนเสียง" "สำหรับแอปที่รองรับเท่านั้น" "ขนาดและรูปแบบของคำบรรยาย" "ขนาดข้อความ %1$s" @@ -2581,14 +2581,14 @@ "ตัวเลือกที่กำหนดเอง" "สีพื้นหลัง" "ความทึบแสงของพื้นหลัง" - "สีของหน้าต่างคำอธิบายภาพ" - "ความทึบแสงของหน้าต่างคำอธิบายภาพ" + "สีของหน้าต่างคำบรรยายแทนเสียง" + "ความทึบแสงของหน้าต่างคำบรรยายแทนเสียง" "สีข้อความ" "ความทึบแสงของข้อความ" "สีขอบ" "ชนิดขอบ" "ชุดแบบอักษร" - "คำบรรยายจะมีหน้าตาแบบนี้" + "คำบรรยายแทนเสียงจะมีลักษณะดังนี้" "Aa" "ค่าเริ่มต้น" "สี" @@ -2626,7 +2626,7 @@ "ใช้งานง่าย, เข้าถึงง่าย, ความช่วยเหลือ, การช่วยเหลือพิเศษ" "แว่นขยายหน้าจอ, ซูม, การขยาย, สายตาเลือนราง, ขยาย, ทำให้ใหญ่ขึ้น" - "คำบรรยายวิดีโอ, คำบรรภาพ, คำบรรยาย, Live Transcribe, มีปัญหาในการได้ยิน, สูญเสียการได้ยิน, CART, การแปลงคำพูดเป็นข้อความ, คำบรรยาย" + "คำบรรยายแทนเสียง, คำบรรภาพ, คำบรรยาย, Live Transcribe, มีปัญหาในการได้ยิน, สูญเสียการได้ยิน, CART, การแปลงคำพูดเป็นข้อความ" @@ -2639,7 +2639,7 @@ "การเคลื่อนไหว, เมาส์" "มีปัญหาในการได้ยิน, สูญเสียการได้ยิน" - "มีปัญหาในการได้ยิน, สูญเสียการได้ยิน, คำบรรยายวิดีโอ, โทรพิมพ์, tty" + "มีปัญหาในการได้ยิน, สูญเสียการได้ยิน, คำบรรยายแทนเสียง, โทรพิมพ์, tty" "การพิมพ์" "ปิด" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 02d1747bd62..aff063fccd6 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -2238,7 +2238,7 @@ - "Мова та введення" + "Мова й введення" "У вас немає дозволу змінювати мову пристрою." "Мова та введення" "Інструменти" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index 5951e167e8d..883bf7fcf73 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -3697,7 +3697,7 @@ "Suhbat tovushi" "Signal tovushi" "Jiringlash va bildirishnoma tovushi" - "Bildirishnomalar ovozi" + "Bildirishnoma tovushi" "Telefon ringtoni" "Standart bildirishnoma tovushi" "Ilova tovushi" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index a33b8e39ea6..fa1a72d595b 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -2524,7 +2524,7 @@ "音频调整" "语音描述" - "听取有关当前屏幕画面内容的语音说明(仅限支持该设置的电影或电视节目)" + "以语音的形式描述当前画面呈现的内容(仅限支持该设置的电影或电视节目)" "语音描述, 语音, 描述, 弱视, audio description, audio, description, low vision," "快捷方式已开启" "已关闭" @@ -5501,7 +5501,7 @@ "允许应用将内容发送到 Android 系统" "捕获系统堆转储数据" "重新启动并启用 MTE" - "系统将重新启动并允许尝试内存标记扩展 (MTE)。MTE 可能会对系统性能和稳定性产生负面影响。将在下一次重新启动时重置。" + "系统将重新启动并允许尝试内存标记扩展 (MTE)。MTE 可能会导致系统性能和稳定性下降。在系统下一次重新启动时,此设置会被重置。" "正在捕获系统堆转储数据" "无法捕获系统堆转储数据" "自动捕获堆转储数据" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 377a2f7339a..9a8bf70157d 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -583,7 +583,7 @@ "使用食指輕觸手機背面的感應器。" "未完成註冊" "指紋註冊操作逾時,請再試一次。" - "無法註冊指紋。請再試一次或使用不同的手指。" + "無法註冊指紋。請再試一次或用另一隻手指。" "新增另一個" "下一步" "除了將手機解鎖,你也可以使用指紋授權購物交易及存取應用程式。""瞭解詳情" @@ -1047,12 +1047,12 @@ "查看或變更訂閱" "已隨機化的 MAC" "新增裝置" - "將下面的視窗對準 QR 圖碼,即可將這個裝置新增至「%1$s」" + "將下面的視窗對準 QR code,即可將這個裝置新增至「%1$s」" "掃描 QR code" "將 QR 圖碼置於相機正下方即可連線到「%1$s」" "掃描 QR code 即可加入 Wi‑Fi" "分享 Wi-Fi" - "使用其他裝置掃描這個 QR 圖碼即可加入「%1$s」" + "使用其他裝置掃描這個 QR code 即可加入「%1$s」" "掃描這個 QR 圖碼即可連線至「%1$s」" "請再試一次,如果問題持續發生,請與裝置製造商聯絡" "發生錯誤" @@ -1080,7 +1080,7 @@ "自動連線" "允許裝置在進入有效範圍時連線至這個網路" "新增裝置" - "使用 QR 圖碼將裝置新增至這個網路" + "使用 QR code 將裝置新增至這個網路" "QR 圖碼格式無效" "重試" "與裝置的其他使用者共用" From 20944e2028f612c952427207882128d6bdfee5ca Mon Sep 17 00:00:00 2001 From: Zaiyue Xue Date: Fri, 7 Apr 2023 21:03:07 +0800 Subject: [PATCH 08/17] Draw vertical dividers with different colors if it has a timestamp label https://screenshot.googleplex.com/3pZ4ip96aXzqkZv.png https://screenshot.googleplex.com/ePpBc8YNhJAsfR5.png Bug: 265364379 Fix: 265364379 Test: manual Change-Id: I20b06323db110fe4ab05fb51edcabc3bc2519456 --- .../batteryusage/BatteryChartView.java | 49 ++++++++++++++----- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java index b17ccaa9065..445a5d12966 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java @@ -16,6 +16,7 @@ package com.android.settings.fuelgauge.batteryusage; import static com.android.settings.Utils.formatPercentage; +import static com.android.settings.fuelgauge.batteryusage.BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS; import static java.lang.Math.round; import static java.util.Objects.requireNonNull; @@ -29,6 +30,7 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; import android.os.Bundle; +import android.util.ArraySet; import android.util.AttributeSet; import android.util.Log; import android.view.HapticFeedbackConstants; @@ -52,13 +54,13 @@ import com.android.settingslib.Utils; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.Set; /** A widget component to draw chart graph. */ public class BatteryChartView extends AppCompatImageView implements View.OnClickListener { private static final String TAG = "BatteryChartView"; private static final int DIVIDER_COLOR = Color.parseColor("#CDCCC5"); - private static final long UPDATE_STATE_DELAYED_TIME = 500L; /** A callback listener for selected group index is updated. */ public interface OnSelectListener { @@ -70,6 +72,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick private final Rect mIndent = new Rect(); private final Rect[] mPercentageBounds = new Rect[]{new Rect(), new Rect(), new Rect()}; private final List mAxisLabelsBounds = new ArrayList<>(); + private final Set mLabelDrawnIndexes = new ArraySet<>(); private BatteryChartViewModel mViewModel; private int mHoveredIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID; @@ -80,6 +83,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick private int mTrapezoidColor; private int mTrapezoidSolidColor; private int mTrapezoidHoverColor; + private int mDefaultTextColor; private int mTextPadding; private Paint mDividerPaint; private Paint mTrapezoidPaint; @@ -134,6 +138,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick // Pre-draws the view first to load style atttributions into paint. textView.draw(new Canvas()); mTextPaint = textView.getPaint(); + mDefaultTextColor = mTextPaint.getColor(); } else { mTextPaint = null; } @@ -332,6 +337,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick final int height = getHeight() - mIndent.top - mIndent.bottom; // Draws the top divider line for 100% curve. float offsetY = mIndent.top + mDividerWidth * .5f; + mDividerPaint.setColor(DIVIDER_COLOR); canvas.drawLine(0, offsetY, width, offsetY, mDividerPaint); drawPercentage(canvas, /*index=*/ 0, offsetY); @@ -351,6 +357,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick private void drawPercentage(Canvas canvas, int index, float offsetY) { if (mTextPaint != null) { mTextPaint.setTextAlign(Paint.Align.RIGHT); + mTextPaint.setColor(mDefaultTextColor); canvas.drawText( mPercentages[index], getWidth(), @@ -367,18 +374,6 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick final float bottomY = getHeight() - mIndent.bottom; final float startY = bottomY - mDividerHeight; final float trapezoidSlotOffset = mTrapezoidHOffset + mDividerWidth * .5f; - // Draws each vertical dividers. - float startX = mDividerWidth * .5f; - for (int index = 0; index < dividerCount; index++) { - canvas.drawLine(startX, startY, startX, bottomY, mDividerPaint); - final float nextX = startX + mDividerWidth + unitWidth; - // Updates the trapezoid slots for drawing. - if (index < mTrapezoidSlots.length) { - mTrapezoidSlots[index].mLeft = round(startX + trapezoidSlotOffset); - mTrapezoidSlots[index].mRight = round(nextX - trapezoidSlotOffset); - } - startX = nextX; - } // Draws the axis label slot information. if (mViewModel != null) { final float baselineY = getHeight() - mTextPadding; @@ -404,6 +399,26 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick } drawAxisLabels(canvas, axisLabelDisplayAreas, baselineY); } + // Draws each vertical dividers. + float startX = mDividerWidth * .5f; + for (int index = 0; index < dividerCount; index++) { + float dividerY = bottomY; + if (mViewModel.axisLabelPosition() == BETWEEN_TRAPEZOIDS + && mLabelDrawnIndexes.contains(index)) { + mDividerPaint.setColor(mTrapezoidSolidColor); + dividerY += mDividerHeight / 4f; + } else { + mDividerPaint.setColor(DIVIDER_COLOR); + } + canvas.drawLine(startX, startY, startX, dividerY, mDividerPaint); + final float nextX = startX + mDividerWidth + unitWidth; + // Updates the trapezoid slots for drawing. + if (index < mTrapezoidSlots.length) { + mTrapezoidSlots[index].mLeft = round(startX + trapezoidSlotOffset); + mTrapezoidSlots[index].mRight = round(nextX - trapezoidSlotOffset); + } + startX = nextX; + } } /** Gets all the axis label texts displaying area positions if they are shown. */ @@ -432,9 +447,12 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick private void drawAxisLabels(Canvas canvas, final Rect[] displayAreas, final float baselineY) { final int lastIndex = displayAreas.length - 1; + mLabelDrawnIndexes.clear(); // Suppose first and last labels are always able to draw. drawAxisLabelText(canvas, 0, displayAreas[0], baselineY); + mLabelDrawnIndexes.add(0); drawAxisLabelText(canvas, lastIndex, displayAreas[lastIndex], baselineY); + mLabelDrawnIndexes.add(lastIndex); drawAxisLabelsBetweenStartIndexAndEndIndex(canvas, displayAreas, 0, lastIndex, baselineY); } @@ -458,6 +476,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick return; } drawAxisLabelText(canvas, middleIndex, displayAreas[middleIndex], baselineY); + mLabelDrawnIndexes.add(middleIndex); drawAxisLabelsBetweenStartIndexAndEndIndex( canvas, displayAreas, startIndex, middleIndex, baselineY); drawAxisLabelsBetweenStartIndexAndEndIndex( @@ -471,7 +490,9 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick return; } drawAxisLabelText(canvas, middleIndex1, displayAreas[middleIndex1], baselineY); + mLabelDrawnIndexes.add(middleIndex1); drawAxisLabelText(canvas, middleIndex2, displayAreas[middleIndex2], baselineY); + mLabelDrawnIndexes.add(middleIndex2); drawAxisLabelsBetweenStartIndexAndEndIndex( canvas, displayAreas, startIndex, middleIndex1, baselineY); drawAxisLabelsBetweenStartIndexAndEndIndex( @@ -488,12 +509,14 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick private void drawAxisLabelText( Canvas canvas, final int index, final Rect displayArea, final float baselineY) { + mTextPaint.setColor(mTrapezoidSolidColor); mTextPaint.setTextAlign(Paint.Align.CENTER); canvas.drawText( mViewModel.getText(index), displayArea.centerX(), baselineY, mTextPaint); + mLabelDrawnIndexes.add(index); } private void drawTrapezoids(Canvas canvas) { From 75a1a3f65dadd2b67579c5d8aea635c90b771351 Mon Sep 17 00:00:00 2001 From: Sunny Shao Date: Tue, 11 Apr 2023 17:13:41 +0800 Subject: [PATCH 09/17] Fix empty icon while tapping Auto-rotate screen widget - Use the layer-list and AdaptiveIconShapeDrawable to include ic_screen_rotation_24dp. - Update the color-check-baseline.xml. Fixes: 277309043 Test: manual test Change-Id: Ie1e3e114bb274c819902e1f5ff87240128afcba5 --- AndroidManifest.xml | 2 +- color-check-baseline.xml | 16 ++++++++++++++ res/drawable/ic_screen_rotation.xml | 33 +++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 res/drawable/ic_screen_rotation.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 433d8b6860a..e9157acdf73 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1358,7 +1358,7 @@ diff --git a/color-check-baseline.xml b/color-check-baseline.xml index 2fd63fc8307..509d9ae0e5a 100644 --- a/color-check-baseline.xml +++ b/color-check-baseline.xml @@ -4429,6 +4429,22 @@ column="13"/> + + + + + + + + + + + + + + From 57b03b309db4f94852f54deb2ddfc7ff1314faf3 Mon Sep 17 00:00:00 2001 From: Shen Lin Date: Tue, 11 Apr 2023 18:09:19 +0800 Subject: [PATCH 10/17] Align Settings and SystemUI packageName references This CL migrated both Settings and SystemUI packageName into Utils.java to align references. Bug: 277651621 Test: m Settings -j128 Change-Id: I3d6808de76120a2ddbbed4980b8a65cec81502c9 --- src/com/android/settings/Utils.java | 2 ++ .../settings/applications/AppStateOverlayBridge.java | 3 ++- .../settings/applications/RecentAppStatsMixin.java | 3 ++- .../pictureinpicture/PictureInPictureSettings.java | 3 ++- .../specialaccess/turnscreenon/TurnScreenOnSettings.java | 3 ++- .../connecteddevice/BluetoothDashboardFragment.java | 7 +++---- .../connecteddevice/ConnectedDeviceDashboardFragment.java | 6 +++--- .../settings/fuelgauge/PowerUsageFeatureProviderImpl.java | 5 +++-- .../android/settings/panel/PanelFeatureProviderImpl.java | 8 ++++---- 9 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index f996444b482..2b1a3bdcd46 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -131,6 +131,8 @@ public final class Utils extends com.android.settingslib.Utils { public static final String SETTINGS_PACKAGE_NAME = "com.android.settings"; + public static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui"; + public static final String OS_PKG = "os"; /** diff --git a/src/com/android/settings/applications/AppStateOverlayBridge.java b/src/com/android/settings/applications/AppStateOverlayBridge.java index 838ee422521..022f45ae824 100644 --- a/src/com/android/settings/applications/AppStateOverlayBridge.java +++ b/src/com/android/settings/applications/AppStateOverlayBridge.java @@ -19,6 +19,7 @@ import android.Manifest; import android.app.AppOpsManager; import android.content.Context; +import com.android.settings.Utils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.AppFilter; @@ -70,7 +71,7 @@ public class AppStateOverlayBridge extends AppStateAppOpsBridge { private static final List DISABLE_PACKAGE_LIST = new ArrayList<>(); static { - DISABLE_PACKAGE_LIST.add("com.android.systemui"); + DISABLE_PACKAGE_LIST.add(Utils.SYSTEMUI_PACKAGE_NAME); } public OverlayState(PermissionState permissionState) { diff --git a/src/com/android/settings/applications/RecentAppStatsMixin.java b/src/com/android/settings/applications/RecentAppStatsMixin.java index 4bf38642624..e592fdff39d 100644 --- a/src/com/android/settings/applications/RecentAppStatsMixin.java +++ b/src/com/android/settings/applications/RecentAppStatsMixin.java @@ -17,6 +17,7 @@ package com.android.settings.applications; import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME; +import static com.android.settings.Utils.SYSTEMUI_PACKAGE_NAME; import android.app.Application; import android.app.usage.UsageStats; @@ -71,7 +72,7 @@ public class RecentAppStatsMixin implements Comparator, LifecycleObs "android", "com.android.phone", SETTINGS_PACKAGE_NAME, - "com.android.systemui", + SYSTEMUI_PACKAGE_NAME, "com.android.providers.calendar", "com.android.providers.media" )); diff --git a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java index d794de69475..3c90bf358c0 100644 --- a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java +++ b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java @@ -38,6 +38,7 @@ import androidx.preference.Preference.OnPreferenceClickListener; import androidx.preference.PreferenceScreen; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settings.applications.AppInfoBase; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.EmptyTextSettings; @@ -57,7 +58,7 @@ public class PictureInPictureSettings extends EmptyTextSettings { static final List IGNORE_PACKAGE_LIST = new ArrayList<>(); static { - IGNORE_PACKAGE_LIST.add("com.android.systemui"); + IGNORE_PACKAGE_LIST.add(Utils.SYSTEMUI_PACKAGE_NAME); } /** diff --git a/src/com/android/settings/applications/specialaccess/turnscreenon/TurnScreenOnSettings.java b/src/com/android/settings/applications/specialaccess/turnscreenon/TurnScreenOnSettings.java index 302d6b595ae..5f95779cfbb 100644 --- a/src/com/android/settings/applications/specialaccess/turnscreenon/TurnScreenOnSettings.java +++ b/src/com/android/settings/applications/specialaccess/turnscreenon/TurnScreenOnSettings.java @@ -37,6 +37,7 @@ import androidx.preference.Preference.OnPreferenceClickListener; import androidx.preference.PreferenceScreen; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settings.applications.AppInfoBase; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.EmptyTextSettings; @@ -58,7 +59,7 @@ public class TurnScreenOnSettings extends EmptyTextSettings { static final List IGNORE_PACKAGE_LIST = new ArrayList<>(); static { - IGNORE_PACKAGE_LIST.add("com.android.systemui"); + IGNORE_PACKAGE_LIST.add(Utils.SYSTEMUI_PACKAGE_NAME); } /** diff --git a/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java b/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java index b30aee4d216..66f2f1b8f31 100644 --- a/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java +++ b/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java @@ -25,6 +25,7 @@ import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.SettingsActivity; +import com.android.settings.Utils; import com.android.settings.bluetooth.BluetoothDeviceRenamePreferenceController; import com.android.settings.bluetooth.BluetoothSwitchPreferenceController; import com.android.settings.dashboard.DashboardFragment; @@ -45,8 +46,6 @@ public class BluetoothDashboardFragment extends DashboardFragment { private static final String TAG = "BluetoothDashboardFrag"; private static final String KEY_BLUETOOTH_SCREEN_FOOTER = "bluetooth_screen_footer"; - private static final String SETTINGS_PACKAGE_NAME = "com.android.settings"; - private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui"; private static final String SLICE_ACTION = "com.android.settings.SEARCH_RESULT_TRAMPOLINE"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); @@ -112,8 +111,8 @@ public class BluetoothDashboardFragment extends DashboardFragment { @VisibleForTesting boolean isAlwaysDiscoverable(String callingAppPackageName, String action) { return TextUtils.equals(SLICE_ACTION, action) ? false - : TextUtils.equals(SETTINGS_PACKAGE_NAME, callingAppPackageName) - || TextUtils.equals(SYSTEMUI_PACKAGE_NAME, callingAppPackageName); + : TextUtils.equals(Utils.SETTINGS_PACKAGE_NAME, callingAppPackageName) + || TextUtils.equals(Utils.SYSTEMUI_PACKAGE_NAME, callingAppPackageName); } /** diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java index 3c6077e3c24..9286b8164cc 100644 --- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java +++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java @@ -28,6 +28,7 @@ import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.SettingsActivity; +import com.android.settings.Utils; import com.android.settings.core.SettingsUIDeviceConfig; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; @@ -38,7 +39,6 @@ import com.android.settingslib.search.SearchIndexable; public class ConnectedDeviceDashboardFragment extends DashboardFragment { private static final String TAG = "ConnectedDeviceFrag"; - private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final String SLICE_ACTION = "com.android.settings.SEARCH_RESULT_TRAMPOLINE"; @@ -92,8 +92,8 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment { @VisibleForTesting boolean isAlwaysDiscoverable(String callingAppPackageName, String action) { return TextUtils.equals(SLICE_ACTION, action) ? false - : TextUtils.equals(SETTINGS_PACKAGE_NAME, callingAppPackageName) - || TextUtils.equals(SYSTEMUI_PACKAGE_NAME, callingAppPackageName); + : TextUtils.equals(Utils.SETTINGS_PACKAGE_NAME, callingAppPackageName) + || TextUtils.equals(Utils.SYSTEMUI_PACKAGE_NAME, callingAppPackageName); } /** diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java index cc802e8d30a..dee38126494 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java @@ -16,6 +16,8 @@ package com.android.settings.fuelgauge; +import static com.android.settings.Utils.SYSTEMUI_PACKAGE_NAME; + import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -37,9 +39,8 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider private static final String PACKAGE_CALENDAR_PROVIDER = "com.android.providers.calendar"; private static final String PACKAGE_MEDIA_PROVIDER = "com.android.providers.media"; - private static final String PACKAGE_SYSTEMUI = "com.android.systemui"; private static final String[] PACKAGES_SYSTEM = {PACKAGE_MEDIA_PROVIDER, - PACKAGE_CALENDAR_PROVIDER, PACKAGE_SYSTEMUI}; + PACKAGE_CALENDAR_PROVIDER, SYSTEMUI_PACKAGE_NAME}; protected PackageManager mPackageManager; protected Context mContext; diff --git a/src/com/android/settings/panel/PanelFeatureProviderImpl.java b/src/com/android/settings/panel/PanelFeatureProviderImpl.java index 57a1ab0324a..71711f9228e 100644 --- a/src/com/android/settings/panel/PanelFeatureProviderImpl.java +++ b/src/com/android/settings/panel/PanelFeatureProviderImpl.java @@ -22,9 +22,9 @@ import android.os.Bundle; import android.provider.Settings; import android.util.FeatureFlagUtils; -public class PanelFeatureProviderImpl implements PanelFeatureProvider { +import com.android.settings.Utils; - private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui"; +public class PanelFeatureProviderImpl implements PanelFeatureProvider { @Override public PanelContent getPanel(Context context, Bundle bundle) { @@ -42,7 +42,7 @@ public class PanelFeatureProviderImpl implements PanelFeatureProvider { // Redirect to the internet dialog in SystemUI. Intent intent = new Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY); intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND) - .setPackage(SYSTEMUI_PACKAGE_NAME); + .setPackage(Utils.SYSTEMUI_PACKAGE_NAME); context.sendBroadcast(intent); return null; case Settings.Panel.ACTION_NFC: @@ -55,7 +55,7 @@ public class PanelFeatureProviderImpl implements PanelFeatureProvider { // Redirect to the volume panel in SystemUI. Intent volumeIntent = new Intent(Settings.Panel.ACTION_VOLUME); volumeIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND).setPackage( - SYSTEMUI_PACKAGE_NAME); + Utils.SYSTEMUI_PACKAGE_NAME); context.sendBroadcast(volumeIntent); return null; } else { From bf4119b4b562104bbf80bfc9fa115a0f40dc0f0b Mon Sep 17 00:00:00 2001 From: Vania Januar Date: Tue, 4 Apr 2023 19:14:46 +0100 Subject: [PATCH 11/17] Add developer options to force enable Notes role. The Notes role is enabled through a RRO that overlays the config config_enableDefaultNotes (and its work profile counterpart). Bug: 276432652 Test: ForceEnableNotesRolePreferenceControllerTest Change-Id: Iab05b6c13dabda94c513919365a3a9f69dacb80e --- res/values/strings.xml | 6 + res/xml/development_settings.xml | 5 + .../DevelopmentSettingsDashboardFragment.java | 1 + ...ceEnableNotesRolePreferenceController.java | 103 ++++++++++++++++++ ...ableNotesRolePreferenceControllerTest.java | 102 +++++++++++++++++ 5 files changed, 217 insertions(+) create mode 100644 src/com/android/settings/development/ForceEnableNotesRolePreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/development/ForceEnableNotesRolePreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index dea4320fc22..534dc04ef98 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -11891,6 +11891,12 @@ Disable restrictions on the system resource usage of the app child processes + + Force enable Notes role + + Enable note-taking system integrations via the Notes role. If the Notes role is already enabled, does nothing. + + Broadcast diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index 9e1dbad8ba3..e7aac3e7528 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -713,6 +713,11 @@ android:title="@string/disable_phantom_process_monitor_title" android:summary="@string/disable_phantom_process_monitor_summary" /> + + Date: Tue, 11 Apr 2023 21:00:45 +0000 Subject: [PATCH 12/17] Make Tips & Support page launchable from Settings Search results Bug: 258315425 Test: Tested on pixel device: in Settings search bar, enter "Tips" then tap the result for Tips & Support -> verify Tips and Support page is launched Change-Id: I30e52f5498fbeb840e7448fa464c20649f0b1db5 --- .../android/settings/support/SupportDashboardActivity.java | 6 ++++-- .../settings/support/SupportDashboardActivityTest.java | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/support/SupportDashboardActivity.java b/src/com/android/settings/support/SupportDashboardActivity.java index b8a22b996e1..46548584e02 100644 --- a/src/com/android/settings/support/SupportDashboardActivity.java +++ b/src/com/android/settings/support/SupportDashboardActivity.java @@ -17,7 +17,6 @@ package com.android.settings.support; import android.app.Activity; import android.content.Context; -import android.content.Intent; import android.os.Bundle; import com.android.settings.R; @@ -37,6 +36,9 @@ import java.util.List; @SearchIndexable public class SupportDashboardActivity extends Activity implements Indexable { + public static final String ACTION_SUPPORT_SETTINGS = + "com.android.settings.action.SUPPORT_SETTINGS"; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -70,7 +72,7 @@ public class SupportDashboardActivity extends Activity implements Indexable { data.summaryOn = context.getString(R.string.support_summary); data.intentTargetPackage = context.getPackageName(); data.intentTargetClass = SupportDashboardActivity.class.getName(); - data.intentAction = Intent.ACTION_MAIN; + data.intentAction = ACTION_SUPPORT_SETTINGS; data.key = SUPPORT_SEARCH_INDEX_KEY; result.add(data); diff --git a/tests/robotests/src/com/android/settings/support/SupportDashboardActivityTest.java b/tests/robotests/src/com/android/settings/support/SupportDashboardActivityTest.java index 0124551740e..f5109944626 100644 --- a/tests/robotests/src/com/android/settings/support/SupportDashboardActivityTest.java +++ b/tests/robotests/src/com/android/settings/support/SupportDashboardActivityTest.java @@ -16,6 +16,8 @@ package com.android.settings.support; +import static com.android.settings.support.SupportDashboardActivity.ACTION_SUPPORT_SETTINGS; + import static com.google.common.truth.Truth.assertThat; import android.content.Context; @@ -59,7 +61,7 @@ public class SupportDashboardActivityTest { mContext.getString(R.string.page_tab_title_support)); assertThat(value.intentTargetPackage).isEqualTo(mContext.getPackageName()); assertThat(value.intentTargetClass).isEqualTo(SupportDashboardActivity.class.getName()); - assertThat(value.intentAction).isEqualTo(Intent.ACTION_MAIN); + assertThat(value.intentAction).isEqualTo(ACTION_SUPPORT_SETTINGS); } @Test From 08bd7960c3ffd43dbec25795fe3fe8457747c506 Mon Sep 17 00:00:00 2001 From: Hao Dong Date: Wed, 12 Apr 2023 00:03:52 +0000 Subject: [PATCH 13/17] Fix biometrics unicorn consent string bug. Test: manual test Bug: 277815321 Change-Id: Id32720807d0c6aec199dcd13449f9333d2c36978 --- res-product/values/strings.xml | 6 ++++++ .../biometrics/face/FaceEnrollIntroduction.java | 4 ++++ .../face/FaceEnrollParentalConsent.java | 15 ++++++++++++++- .../FingerprintEnrollParentalConsent.java | 8 ++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/res-product/values/strings.xml b/res-product/values/strings.xml index 2f01c4725bd..2a58f458036 100644 --- a/res-product/values/strings.xml +++ b/res-product/values/strings.xml @@ -96,6 +96,12 @@ Allow your child to use their face to unlock their device + Allow your child to use their face to unlock their phone or verify it\u2019s them. This happens when they sign in to apps, approve a purchase, and more. + + Allow your child to use their face to unlock their tablet or verify it\u2019s them. This happens when they sign in to apps, approve a purchase, and more. + + Allow your child to use their face to unlock their device or verify it\u2019s them. This happens when they sign in to apps, approve a purchase, and more. + Using your child\u2019s face to unlock their phone may be less secure than a strong pattern or PIN. Using your child\u2019s face to unlock their tablet may be less secure than a strong pattern or PIN. diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java index 3e8c45852d7..efd9753a2a2 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java @@ -592,6 +592,10 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { return data; } + protected boolean isFaceStrong() { + return mIsFaceStrong; + } + private void onFaceStrengthChanged() { // Set up and show the "less secure" info section if necessary. if (!mIsFaceStrong && getResources().getBoolean( diff --git a/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java b/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java index a3a745d698b..aabbf6f9316 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java @@ -47,13 +47,14 @@ public class FaceEnrollParentalConsent extends FaceEnrollIntroduction { R.string.security_settings_face_enroll_introduction_control_consent_title, R.string.security_settings_face_enroll_introduction_control_consent_message, R.string.security_settings_face_enroll_introduction_consent_message_0, + R.string.security_settings_face_enroll_introduction_consent_message_0_class3, R.string.security_settings_face_enroll_introduction_info_consent_less_secure }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setDescriptionText(R.string.security_settings_face_enroll_introduction_consent_message_0); + updateDescriptionText(); } @Override @@ -144,4 +145,16 @@ public class FaceEnrollParentalConsent extends FaceEnrollIntroduction { public int getMetricsCategory() { return SettingsEnums.FACE_PARENTAL_CONSENT; } + + @Override + protected void updateDescriptionText() { + super.updateDescriptionText(); + if (isFaceStrong()) { + setDescriptionText(getString( + R.string.security_settings_face_enroll_introduction_consent_message_0_class3)); + } else { + setDescriptionText( + R.string.security_settings_face_enroll_introduction_consent_message_0); + } + } } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollParentalConsent.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollParentalConsent.java index c33ae175a09..7f4142def5c 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollParentalConsent.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollParentalConsent.java @@ -131,4 +131,12 @@ public class FingerprintEnrollParentalConsent extends FingerprintEnrollIntroduct public int getMetricsCategory() { return SettingsEnums.FINGERPRINT_PARENTAL_CONSENT; } + + + @Override + protected void updateDescriptionText() { + super.updateDescriptionText(); + setDescriptionText( + R.string.security_settings_fingerprint_enroll_introduction_consent_message); + } } From 0b9bfd3c1f047b9cb2688fd9538b5b4ef61a5de3 Mon Sep 17 00:00:00 2001 From: David Liu Date: Tue, 11 Apr 2023 17:45:31 +0000 Subject: [PATCH 14/17] Update Settings owners list Change-Id: Idb59b4ebf8d252d31877a6ed2203e7f66fc6e6ff --- OWNERS | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/OWNERS b/OWNERS index 8938b643aeb..6d4f95f0de4 100644 --- a/OWNERS +++ b/OWNERS @@ -2,22 +2,18 @@ android-settings-core-eng+gerrit@google.com # People who can approve changes for submission -arcwang@google.com cantol@google.com chaohuiw@google.com chiujason@google.com -cyl@google.com +dswliu@google.com edgarwang@google.com -llz@google.com millchen@google.com songchenxi@google.com -stanleytfwang@google.com sunnyshao@google.com yantingyang@google.com ykhung@google.com # Emergency only -lijun@google.com wangqi@google.com yanglu@google.com From 680cd305a121f8de92892fd2a37cb2349c8d65b1 Mon Sep 17 00:00:00 2001 From: Zaiyue Xue Date: Wed, 12 Apr 2023 11:44:44 +0800 Subject: [PATCH 15/17] Optimize screen time cross power connection logic from O(N^2) to O(N) Bug: 277844625 Fix: 277844625 Test: presubmit Change-Id: If945e45a5eb279fd730dcc13575dd4fe45ac3ad4 --- .../settings/fuelgauge/batteryusage/DataProcessor.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java index ec1a4be0fae..8818431d40d 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java +++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java @@ -852,9 +852,11 @@ public final class DataProcessor { final List usagePeriodList, final List batteryEventList) { final List resultList = new ArrayList<>(); + int index = 0; for (AppUsagePeriod inputPeriod : usagePeriodList) { long lastStartTime = inputPeriod.getStartTime(); - for (BatteryEvent batteryEvent : batteryEventList) { + while (index < batteryEventList.size()) { + BatteryEvent batteryEvent = batteryEventList.get(index); if (batteryEvent.getTimestamp() < inputPeriod.getStartTime()) { // Because the batteryEventList has been sorted, here is to mark the power // connection state when the usage period starts. If power is connected when @@ -865,6 +867,7 @@ public final class DataProcessor { } else if (batteryEvent.getType() == BatteryEventType.POWER_DISCONNECTED) { lastStartTime = inputPeriod.getStartTime(); } + index++; continue; } if (batteryEvent.getTimestamp() > inputPeriod.getEndTime()) { @@ -883,6 +886,7 @@ public final class DataProcessor { } else if (batteryEvent.getType() == BatteryEventType.POWER_DISCONNECTED) { lastStartTime = batteryEvent.getTimestamp(); } + index++; } if (lastStartTime != 0) { resultList.add(AppUsagePeriod.newBuilder() From a2ab3ae5b3c32a16893198766c5e26d8ea5a7fb6 Mon Sep 17 00:00:00 2001 From: Zaiyue Xue Date: Wed, 12 Apr 2023 17:24:16 +0800 Subject: [PATCH 16/17] Small refactor battery usage code according to the comments in previous cls. Bug: 262802531 Test: presubmit Change-Id: I0d496fc6a41af5964311dafe8dd89f8b8058de82 --- .../BatteryUsageBreakdownController.java | 7 ++---- .../fuelgauge/batteryusage/DataProcessor.java | 6 ++--- .../fuelgauge/batteryusage/DatabaseUtils.java | 24 +++++++------------ .../BatteryUsageBreakdownControllerTest.java | 4 ++-- .../batteryusage/DataProcessManagerTest.java | 6 ++--- .../batteryusage/DatabaseUtilsTest.java | 20 ++++++++-------- 6 files changed, 29 insertions(+), 38 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java index 2121c60218b..cd1bdefc92d 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java @@ -313,11 +313,8 @@ public class BatteryUsageBreakdownController extends BasePreferenceController @VisibleForTesting void removeAndCacheAllUnusedPreferences() { List entries = getBatteryDiffEntries(); - Set entryKeySet = new ArraySet<>(); - for (BatteryDiffEntry entry : entries) { - entryKeySet.add(entry.getKey()); - } - + Set entryKeySet = new ArraySet<>(entries.size()); + entries.forEach(entry -> entryKeySet.add(entry.getKey())); final int prefsCount = mAppListPreferenceGroup.getPreferenceCount(); for (int index = prefsCount - 1; index >= 0; index--) { final Preference pref = mAppListPreferenceGroup.getPreference(index); diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java index 8818431d40d..24571cd0a60 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java +++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java @@ -725,9 +725,9 @@ public final class DataProcessor { @VisibleForTesting @Nullable static Map>> buildAppUsagePeriodList( - final List allAppUsageEvents, final List batteryEventList, + final List appUsageEvents, final List batteryEventList, final long startTime, final long endTime) { - if (allAppUsageEvents.isEmpty()) { + if (appUsageEvents.isEmpty()) { return null; } @@ -735,7 +735,7 @@ public final class DataProcessor { // use. final List deviceEvents = new ArrayList<>(); final ArrayMap> usageEventsByInstanceId = new ArrayMap<>(); - for (final AppUsageEvent event : allAppUsageEvents) { + for (final AppUsageEvent event : appUsageEvents) { final AppUsageEventType eventType = event.getType(); if (eventType == AppUsageEventType.ACTIVITY_RESUMED || eventType == AppUsageEventType.ACTIVITY_STOPPED) { diff --git a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java index 84a39bb811f..0435e451e82 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java +++ b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java @@ -110,13 +110,7 @@ public final class DatabaseUtils { // For testing only. @VisibleForTesting - static Supplier sFakeBatteryStateSupplier; - @VisibleForTesting - static Supplier sFakeAppUsageEventSupplier; - @VisibleForTesting - static Supplier sFakeAppUsageLatestTimestampSupplier; - @VisibleForTesting - static Supplier sFakeBatteryEventSupplier; + static Supplier sFakeSupplier; private DatabaseUtils() { } @@ -340,7 +334,7 @@ public final class DatabaseUtils { resolver.insert(BATTERY_EVENT_URI, contentValues); Log.d(TAG, "insert() battery event data into database: " + batteryEvent.toString()); } catch (Exception e) { - Log.e(TAG, "insert() battery event data into database error:\n" + e); + Log.e(TAG, "insert() battery event data into database error:", e); } Log.d(TAG, String.format("sendBatteryEventData() in %d/ms", (System.currentTimeMillis() - startTime))); @@ -487,8 +481,8 @@ public final class DatabaseUtils { Context context, final Uri appUsageLatestTimestampUri) { // We have already make sure the context here is with profile parent's user identity. Don't // need to check whether current user is work profile. - try (Cursor cursor = sFakeAppUsageLatestTimestampSupplier != null - ? sFakeAppUsageLatestTimestampSupplier.get() + try (Cursor cursor = sFakeSupplier != null + ? sFakeSupplier.get() : context.getContentResolver().query( appUsageLatestTimestampUri, null, null, null)) { if (cursor == null || cursor.getCount() == 0) { @@ -514,8 +508,8 @@ public final class DatabaseUtils { if (context == null) { return appUsageEventList; } - try (Cursor cursor = sFakeAppUsageEventSupplier != null - ? sFakeAppUsageEventSupplier.get() + try (Cursor cursor = sFakeSupplier != null + ? sFakeSupplier.get() : context.getContentResolver().query(appUsageEventUri, null, null, null)) { if (cursor == null || cursor.getCount() == 0) { return appUsageEventList; @@ -540,8 +534,8 @@ public final class DatabaseUtils { if (context == null) { return batteryEventList; } - try (Cursor cursor = sFakeBatteryEventSupplier != null - ? sFakeBatteryEventSupplier.get() + try (Cursor cursor = sFakeSupplier != null + ? sFakeSupplier.get() : context.getContentResolver().query(batteryEventUri, null, null, null)) { if (cursor == null || cursor.getCount() == 0) { return batteryEventList; @@ -566,7 +560,7 @@ public final class DatabaseUtils { return null; } final Map> resultMap = new HashMap(); - try (Cursor cursor = sFakeBatteryStateSupplier != null ? sFakeBatteryStateSupplier.get() : + try (Cursor cursor = sFakeSupplier != null ? sFakeSupplier.get() : context.getContentResolver().query(batteryStateUri, null, null, null)) { if (cursor == null || cursor.getCount() == 0) { return resultMap; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java index 16fec0909e0..8d0a839f6bc 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java @@ -176,7 +176,7 @@ public final class BatteryUsageBreakdownControllerTest { } @Test - public void removeAndCacheAllUnusedPreferences_removePerf_buildCacheAndRemoveAllPreference() { + public void removeAndCacheAllUnusedPreferences_removePref_buildCacheAndRemoveAllPreference() { doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount(); doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).getPreference(0); doReturn(PREF_KEY2).when(mBatteryHistEntry).getKey(); @@ -193,7 +193,7 @@ public final class BatteryUsageBreakdownControllerTest { } @Test - public void removeAndCacheAllUnusedPreferences_keepPerf_KeepAllPreference() { + public void removeAndCacheAllUnusedPreferences_keepPref_KeepAllPreference() { doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount(); doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).getPreference(0); doReturn(PREF_KEY).when(mBatteryHistEntry).getKey(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java index 753a7f7a1d0..2a001163485 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java @@ -102,7 +102,7 @@ public final class DataProcessManagerTest { AppUsageEventEntity.KEY_UID, AppUsageEventEntity.KEY_PACKAGE_NAME, AppUsageEventEntity.KEY_TIMESTAMP}); - DatabaseUtils.sFakeAppUsageEventSupplier = () -> cursor; + DatabaseUtils.sFakeSupplier = () -> cursor; doReturn(true).when(mUserManager).isUserUnlocked(anyInt()); mDataProcessManager.start(); @@ -171,7 +171,7 @@ public final class DataProcessManagerTest { cursor.addRow(new Object[] { AppUsageEventType.ACTIVITY_STOPPED.getNumber(), /*timestamp=*/ 6, /*userId=*/ 1, /*instanceId=*/ 2, packageName}); - DatabaseUtils.sFakeAppUsageEventSupplier = () -> cursor; + DatabaseUtils.sFakeSupplier = () -> cursor; final DataProcessManager dataProcessManager = new DataProcessManager( mContext, /*handler=*/ null, /*rawStartTimestamp=*/ 2L, /*callbackFunction=*/ null, @@ -240,7 +240,7 @@ public final class DataProcessManagerTest { AppUsageEventEntity.KEY_TIMESTAMP}); // Adds fake data into the cursor. cursor.addRow(new Object[] {101L, "app name1", 1001L}); - DatabaseUtils.sFakeAppUsageEventSupplier = () -> cursor; + DatabaseUtils.sFakeSupplier = () -> cursor; mDataProcessManager.start(); 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 20799d403d3..efce44e600f 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java @@ -261,7 +261,7 @@ public final class DatabaseUtilsTest { public void getAppUsageStartTimestampOfUser_emptyCursorContent_returnEarliestTimestamp() { final MatrixCursor cursor = new MatrixCursor(new String[] {AppUsageEventEntity.KEY_TIMESTAMP}); - DatabaseUtils.sFakeAppUsageLatestTimestampSupplier = () -> cursor; + DatabaseUtils.sFakeSupplier = () -> cursor; final long earliestTimestamp = 10001L; assertThat(DatabaseUtils.getAppUsageStartTimestampOfUser( @@ -270,7 +270,7 @@ public final class DatabaseUtilsTest { @Test public void getAppUsageStartTimestampOfUser_nullCursor_returnEarliestTimestamp() { - DatabaseUtils.sFakeAppUsageLatestTimestampSupplier = () -> null; + DatabaseUtils.sFakeSupplier = () -> null; final long earliestTimestamp = 10001L; assertThat(DatabaseUtils.getAppUsageStartTimestampOfUser( mContext, /*userId=*/ 0, earliestTimestamp)).isEqualTo(earliestTimestamp); @@ -283,7 +283,7 @@ public final class DatabaseUtilsTest { new MatrixCursor(new String[] {AppUsageEventEntity.KEY_TIMESTAMP}); // Adds fake data into the cursor. cursor.addRow(new Object[] {returnedTimestamp}); - DatabaseUtils.sFakeAppUsageLatestTimestampSupplier = () -> cursor; + DatabaseUtils.sFakeSupplier = () -> cursor; final long earliestTimestamp1 = 1001L; assertThat(DatabaseUtils.getAppUsageStartTimestampOfUser( @@ -302,7 +302,7 @@ public final class DatabaseUtilsTest { AppUsageEventEntity.KEY_PACKAGE_NAME, AppUsageEventEntity.KEY_TIMESTAMP, AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE}); - DatabaseUtils.sFakeAppUsageEventSupplier = () -> cursor; + DatabaseUtils.sFakeSupplier = () -> cursor; assertThat(DatabaseUtils.getAppUsageEventForUsers( mContext, @@ -313,7 +313,7 @@ public final class DatabaseUtilsTest { @Test public void getAppUsageEventForUsers_nullCursor_returnEmptyMap() { - DatabaseUtils.sFakeAppUsageEventSupplier = () -> null; + DatabaseUtils.sFakeSupplier = () -> null; assertThat(DatabaseUtils.getAppUsageEventForUsers( mContext, /*calendar=*/ null, @@ -335,7 +335,7 @@ public final class DatabaseUtilsTest { cursor.addRow(new Object[] {101L, "app name2", timestamp2}); cursor.addRow(new Object[] {101L, "app name3", timestamp2}); cursor.addRow(new Object[] {101L, "app name4", timestamp2}); - DatabaseUtils.sFakeAppUsageEventSupplier = () -> cursor; + DatabaseUtils.sFakeSupplier = () -> cursor; final List appUsageEventList = DatabaseUtils.getAppUsageEventForUsers( mContext, @@ -356,7 +356,7 @@ public final class DatabaseUtilsTest { BatteryHistEntry.KEY_UID, BatteryHistEntry.KEY_USER_ID, BatteryHistEntry.KEY_TIMESTAMP}); - DatabaseUtils.sFakeBatteryStateSupplier = () -> cursor; + DatabaseUtils.sFakeSupplier = () -> cursor; assertThat(DatabaseUtils.getHistoryMapSinceLastFullCharge( mContext, /*calendar=*/ null)).isEmpty(); @@ -364,7 +364,7 @@ public final class DatabaseUtilsTest { @Test public void getHistoryMapSinceLastFullCharge_nullCursor_returnEmptyMap() { - DatabaseUtils.sFakeBatteryStateSupplier = () -> null; + DatabaseUtils.sFakeSupplier = () -> null; assertThat(DatabaseUtils.getHistoryMapSinceLastFullCharge( mContext, /*calendar=*/ null)).isEmpty(); } @@ -383,7 +383,7 @@ public final class DatabaseUtilsTest { "app name3", timestamp2, 3, ConvertUtils.CONSUMER_TYPE_UID_BATTERY}); cursor.addRow(new Object[] { "app name4", timestamp2, 4, ConvertUtils.CONSUMER_TYPE_UID_BATTERY}); - DatabaseUtils.sFakeBatteryStateSupplier = () -> cursor; + DatabaseUtils.sFakeSupplier = () -> cursor; final Map> batteryHistMap = DatabaseUtils.getHistoryMapSinceLastFullCharge( @@ -413,7 +413,7 @@ public final class DatabaseUtilsTest { doReturn(true).when(mUserManager).isManagedProfile(); doReturn(UserHandle.SYSTEM).when(mUserManager).getProfileParent(UserHandle.CURRENT); - DatabaseUtils.sFakeBatteryStateSupplier = () -> getMatrixCursor(); + DatabaseUtils.sFakeSupplier = () -> getMatrixCursor(); final Map> batteryHistMap = DatabaseUtils.getHistoryMapSinceLastFullCharge( From df3bf351cdc130296147e38348b86ce5fe530217 Mon Sep 17 00:00:00 2001 From: Marcelo Arteiro Date: Tue, 11 Apr 2023 14:24:18 +0000 Subject: [PATCH 17/17] Fix for Check mark color on Regional preferences https://screenshot.googleplex.com/BkRTpomGg7oXP6C Test: Manual Fix: 272398108 Change-Id: Ic762215e35058731ddbd3ea042cb14e0a135793c --- res/drawable/ic_check_24dp.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/drawable/ic_check_24dp.xml b/res/drawable/ic_check_24dp.xml index 9ac80215bb0..0ed6b3253d7 100644 --- a/res/drawable/ic_check_24dp.xml +++ b/res/drawable/ic_check_24dp.xml @@ -18,8 +18,8 @@ android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0" - android:tint="?androidprv:attr/materialColorPrimaryContainer"> + android:tint="?androidprv:attr/colorAccent"> - \ No newline at end of file +