From fd19bf11ef0848a8d1baa38ad507ef708d6799c1 Mon Sep 17 00:00:00 2001 From: Aseem Kumar Date: Wed, 16 Apr 2025 11:22:07 -0700 Subject: [PATCH 01/10] Add ComponentName explicitly to make sure arbitary intents aren't launched from Settings. Bug: 378902342 Flag: EXEMPT security fix (cherry picked from commit 6a896b6b26d445800773e1b4649895bea17eac1f) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:93b1d350bacd6a887e56f0a5c710826cb721c21d) Merged-In: I0e67f1258cb427c5b998e40a8a0c104af3ead042 Change-Id: I0e67f1258cb427c5b998e40a8a0c104af3ead042 --- .../settings/accounts/AccountTypePreferenceLoader.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/accounts/AccountTypePreferenceLoader.java b/src/com/android/settings/accounts/AccountTypePreferenceLoader.java index 7cfeb1cc193..a90bea09747 100644 --- a/src/com/android/settings/accounts/AccountTypePreferenceLoader.java +++ b/src/com/android/settings/accounts/AccountTypePreferenceLoader.java @@ -264,7 +264,14 @@ public class AccountTypePreferenceLoader { try { // Allows to launch only authenticator owned activities. ApplicationInfo authenticatorAppInf = pm.getApplicationInfo(authDesc.packageName, 0); - return resolvedAppInfo.uid == authenticatorAppInf.uid; + if (resolvedAppInfo.uid == authenticatorAppInf.uid) { + // Explicitly set the component to be same as authenticator to + // prevent launching arbitrary activities. + intent.setComponent(resolvedActivityInfo.getComponentName()); + return true; + } else { + return false; + } } catch (NameNotFoundException e) { Log.e(TAG, "Intent considered unsafe due to exception.", -- GitLab From 33a1cbf7bd0e4db07d53e63f4cd470c8eaa4999c Mon Sep 17 00:00:00 2001 From: Adam Bookatz Date: Mon, 17 Mar 2025 14:34:08 -0700 Subject: [PATCH 02/10] AppRestrictions - use vetted component After vetting the intent, use the component we used for the vetting. Bug: 353680402 Bug: 365739560 Test: manual Flag: EXEMPT bugfix (cherry picked from commit d3e34060803c97ae05719fe9301026e5c54892c8) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:d0af7c3ed99b36d3e686090b2cf7cc468edd2206) Merged-In: Iff0d820c1261c29eb6703bf89194339cba700688 Change-Id: Iff0d820c1261c29eb6703bf89194339cba700688 --- .../users/AppRestrictionsFragment.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/users/AppRestrictionsFragment.java b/src/com/android/settings/users/AppRestrictionsFragment.java index 0676ec894d9..379e4bbaec6 100644 --- a/src/com/android/settings/users/AppRestrictionsFragment.java +++ b/src/com/android/settings/users/AppRestrictionsFragment.java @@ -643,8 +643,11 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen } else if (restrictionsIntent != null) { preference.setRestrictions(restrictions); if (invokeIfCustom && AppRestrictionsFragment.this.isResumed()) { + // We don't necessarily trust the given intent to launch its component. + // We will first check it, and only use parts of it that were indeed checked. + final Intent vettedIntent; try { - assertSafeToStartCustomActivity(restrictionsIntent); + vettedIntent = assertSafeToStartCustomActivity(restrictionsIntent); } catch (ActivityNotFoundException | SecurityException e) { // return without startActivity Log.e(TAG, "Cannot start restrictionsIntent " + e); @@ -655,12 +658,16 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen int requestCode = generateCustomActivityRequestCode( RestrictionsResultReceiver.this.preference); AppRestrictionsFragment.this.startActivityForResult( - new Intent(restrictionsIntent), requestCode); + vettedIntent, requestCode); } } } - private void assertSafeToStartCustomActivity(Intent intent) { + /** + * Checks that it is safe to start the custom activity, and, if so, returns a copy of the + * Intent using its vetted components. + */ + private Intent assertSafeToStartCustomActivity(Intent intent) { EventLog.writeEvent(0x534e4554, "223578534", -1 /* UID */, ""); ResolveInfo resolveInfo = mPackageManager.resolveActivity( intent, PackageManager.MATCH_DEFAULT_ONLY); @@ -674,6 +681,13 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen throw new SecurityException("Application " + packageName + " is not allowed to start activity " + intent); } + + // We were able to vet the given intent this time. Make a copy using the components + // that were used to do the vetting, since that's as much as we've verified is safe. + final Intent vettedIntent = new Intent(intent); + vettedIntent.setComponent(activityInfo.getComponentName()); + vettedIntent.setPackage(activityInfo.packageName); + return vettedIntent; } } -- GitLab From 214b82f7097bc5056938780f3f4d9c5194bea2eb Mon Sep 17 00:00:00 2001 From: Joe Bolinger Date: Sat, 5 Apr 2025 02:30:30 +0000 Subject: [PATCH 03/10] Drop PendingIntent extras from external packages during enrollment. Bug: 388528350 Flag: EXEMPT bugfix Test: atest FingerprintEnrollIntroductionTest FaceEnrollIntroductionTest (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:4ccdeee849d5fef78498ba33cadc525523efcbd7) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:3029a6c8fc419ecff5e42e1dfd7c4e8fdc19ebf5) Merged-In: I61281dcf95e53100a96d6a218f3f00fd1b4ea3f9 Change-Id: I61281dcf95e53100a96d6a218f3f00fd1b4ea3f9 --- .../BiometricEnrollIntroduction.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java index 2a350f4abd5..7fae9696149 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java @@ -48,6 +48,8 @@ import com.google.android.setupdesign.span.LinkSpan; import com.google.android.setupdesign.template.RequireScrollMixin; import com.google.android.setupdesign.util.DynamicColorPalette; +import java.util.List; + /** * Abstract base class for the intro onboarding activity for biometric enrollment. */ @@ -232,6 +234,19 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase }); } + @Override + protected void onStart() { + super.onStart(); + + if (!getPackageName().equals(getCallingPackage())) { + for (String key : List.of(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, + MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE, + MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT)) { + getIntent().removeExtra(key); + } + } + } + @Override protected void onResume() { super.onResume(); @@ -443,14 +458,15 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase getIntent().removeExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT); } - protected void removeEnrollNextBiometricIfSkipEnroll(@Nullable Intent data) { + private void removeEnrollNextBiometricIfSkipEnroll(@Nullable Intent data) { if (data != null && data.getBooleanExtra( MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false)) { removeEnrollNextBiometric(); } } - protected void handleBiometricResultSkipOrFinished(int resultCode, @Nullable Intent data) { + + private void handleBiometricResultSkipOrFinished(int resultCode, @Nullable Intent data) { removeEnrollNextBiometricIfSkipEnroll(data); if (resultCode == RESULT_SKIP) { onEnrollmentSkipped(data); -- GitLab From 591ea09a63e577a9ed666006e70430cc4f245078 Mon Sep 17 00:00:00 2001 From: Zhibin Liu Date: Wed, 21 May 2025 23:57:59 -0700 Subject: [PATCH 04/10] Check package name format before using it for SPA nav for udc Bug: b/409780975 Test: unit test Flag: EXEMPT bug fix (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:e806e18728782060c3d151fc515a503bcdd71209) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:2745372ff05b59454e617f148076c3eab1121eef) Merged-In: I3aba7bcc34b5ecf3d35d06e531ea01ab908b200f Change-Id: I3aba7bcc34b5ecf3d35d06e531ea01ab908b200f --- src/com/android/settings/spa/SpaActivity.kt | 2 +- .../src/com/android/settings/spa/SpaActivityTest.kt | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/spa/SpaActivity.kt b/src/com/android/settings/spa/SpaActivity.kt index 2b52b21af0c..6b7a3668b76 100644 --- a/src/com/android/settings/spa/SpaActivity.kt +++ b/src/com/android/settings/spa/SpaActivity.kt @@ -64,7 +64,7 @@ class SpaActivity : BrowseActivity() { @JvmStatic fun Context.startSpaActivityForApp(destinationPrefix: String, intent: Intent): Boolean { - val packageName = intent.data?.schemeSpecificPart ?: return false + val packageName = intent.data?.schemeSpecificPart?.takeIf { Regex("^([a-zA-Z]\\w*\\.)*[a-zA-Z]\\w*$").matches(it) } ?: return false startSpaActivity("$destinationPrefix/$packageName/${UserHandle.myUserId()}") return true } diff --git a/tests/spa_unit/src/com/android/settings/spa/SpaActivityTest.kt b/tests/spa_unit/src/com/android/settings/spa/SpaActivityTest.kt index 1b2a7b1ee90..1aa8d17eb85 100644 --- a/tests/spa_unit/src/com/android/settings/spa/SpaActivityTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/SpaActivityTest.kt @@ -36,6 +36,8 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.Mock +import org.mockito.Mockito.any +import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.MockitoSession import org.mockito.quality.Strictness @@ -115,6 +117,17 @@ class SpaActivityTest { .isEqualTo("Destination/package.name/${UserHandle.myUserId()}") } + @Test + fun startSpaActivityForApp_hasMalformedPackageName() { + val intent = Intent().apply { + data = Uri.parse("package:package.name/10#") + } + + context.startSpaActivityForApp(DESTINATION, intent) + + verify(context, never()).startActivity(any()) + } + private companion object { const val DESTINATION = "Destination" const val PACKAGE_NAME = "package.name" -- GitLab From da4efc0a0615eeede3c09e30db3156ac878c3c23 Mon Sep 17 00:00:00 2001 From: Rubin Xu Date: Wed, 21 May 2025 15:34:51 +0100 Subject: [PATCH 05/10] Use correct API to get calling package name in CredentialStorage Activity.getCallingPackage() does not always return the package name of the actual calling app. getLaunchedFromPackage() should be used instead. Bug: 389681530 Test: manual Flag: EXEMPT bugfix (cherry picked from commit 70bd3efe0674bccb0d454845d86fb2402779a7bf) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:5a82b21528b9c2a2340b3e18b40ac737dd23a658) Merged-In: Ibdbc45e53f4aa46fae79fa234705b3735bfda4cd Change-Id: Ibdbc45e53f4aa46fae79fa234705b3735bfda4cd --- .../settings/security/CredentialStorage.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/security/CredentialStorage.java b/src/com/android/settings/security/CredentialStorage.java index ea336314566..57a59cd287f 100644 --- a/src/com/android/settings/security/CredentialStorage.java +++ b/src/com/android/settings/security/CredentialStorage.java @@ -17,6 +17,7 @@ package com.android.settings.security; import android.app.Activity; +import android.app.ActivityManager; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.DialogInterface; @@ -331,15 +332,25 @@ public final class CredentialStorage extends FragmentActivity { } } + private String getCallingPackageName() { + try { + return ActivityManager.getService().getLaunchedFromPackage(getActivityToken()); + } catch (RemoteException re) { + // Error talking to ActivityManager, just give up + return null; + } + } + /** * Check that the caller is either certinstaller or Settings running in a profile of this user. */ private boolean checkCallerIsCertInstallerOrSelfInProfile() { - if (TextUtils.equals("com.android.certinstaller", getCallingPackage())) { + String callingPackage = getCallingPackageName(); + if (TextUtils.equals("com.android.certinstaller", callingPackage)) { // CertInstaller is allowed to install credentials if it has the same signature as // Settings package. return getPackageManager().checkSignatures( - getCallingPackage(), getPackageName()) == PackageManager.SIGNATURE_MATCH; + callingPackage, getPackageName()) == PackageManager.SIGNATURE_MATCH; } final int launchedFromUserId; -- GitLab From cee46cf86cd938da0f829eb56701bdfbf92ccb36 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Mon, 12 May 2025 14:50:40 -0400 Subject: [PATCH 06/10] Hide notification content in history - if the user is locked - and the user has chosen to hide sensistive content when locked Test: manual with a work profile with a different pin Bug: 378088320 Flag: EXEMPT bug fix (cherry picked from commit 9df37c3f8be2dedd2e44e52da4de45fba33c6a6e) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:7a486ef252fbaf0420c61b8be407cef10f97eecf) Merged-In: Ia70454d9859fb788ffa1f48f88760f88c354cdff Change-Id: Ia70454d9859fb788ffa1f48f88760f88c354cdff --- .../history/NotificationHistoryActivity.java | 28 ++++++++++++++++--- .../history/NotificationHistoryAdapter.java | 21 +++++++++++--- .../history/NotificationSbnAdapter.java | 14 ++++++++-- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/notification/history/NotificationHistoryActivity.java b/src/com/android/settings/notification/history/NotificationHistoryActivity.java index b71d295f7f5..7070fbba3a7 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryActivity.java +++ b/src/com/android/settings/notification/history/NotificationHistoryActivity.java @@ -16,6 +16,7 @@ package com.android.settings.notification.history; +import static android.provider.Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS; import static android.provider.Settings.Secure.NOTIFICATION_HISTORY_ENABLED; import static androidx.core.view.accessibility.AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUSED; @@ -25,9 +26,11 @@ import android.annotation.ColorInt; import android.app.ActionBar; import android.app.ActivityManager; import android.app.INotificationManager; +import android.app.KeyguardManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; +import android.content.pm.UserInfo; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Outline; @@ -56,6 +59,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLoggerImpl; +import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.NotificationExpandButton; import com.android.settings.R; import com.android.settings.notification.NotificationBackend; @@ -67,6 +71,7 @@ import com.android.settingslib.widget.OnMainSwitchChangeListener; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; @@ -112,6 +117,8 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { }; private UiEventLogger mUiEventLogger = new UiEventLoggerImpl(); + private ArrayList mContentRestrictedUsers = new ArrayList<>(); + enum NotificationHistoryEvent implements UiEventLogger.UiEventEnum { @UiEvent(doc = "User turned on notification history") NOTIFICATION_HISTORY_ON(504), @@ -210,14 +217,14 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { final NotificationHistoryRecyclerView rv = viewForPackage.findViewById(R.id.notification_list); - rv.setAdapter(new NotificationHistoryAdapter(mNm, rv, + rv.setAdapter(new NotificationHistoryAdapter(NotificationHistoryActivity.this, mNm, rv, newCount -> { count.setText(StringUtil.getIcuPluralsString(this, newCount, R.string.notification_history_count)); if (newCount == 0) { viewForPackage.setVisibility(View.GONE); } - }, mUiEventLogger)); + }, mUiEventLogger, mContentRestrictedUsers)); ((NotificationHistoryAdapter) rv.getAdapter()).onRebuildComplete( new ArrayList<>(nhp.notifications)); @@ -261,6 +268,19 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { mPm = getPackageManager(); mUm = getSystemService(UserManager.class); + + List users = mUm.getProfiles(getUserId()); + for (UserInfo user : users) { + if (Settings.Secure.getIntForUser(getContentResolver(), + LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0, user.id) == 0) { + LockPatternUtils lpu = new LockPatternUtils(this); + KeyguardManager km = getSystemService(KeyguardManager.class); + if (lpu.isSecure(user.id) && km.isDeviceLocked(user.id)) { + mContentRestrictedUsers.add(user.id); + } + } + } + // wait for history loading and recent/snooze loading mCountdownLatch = new CountDownLatch(2); @@ -406,7 +426,7 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { mSnoozedRv.setLayoutManager(lm); mSnoozedRv.setAdapter( new NotificationSbnAdapter(NotificationHistoryActivity.this, mPm, mUm, - true, mUiEventLogger)); + true, mUiEventLogger, mContentRestrictedUsers)); mSnoozedRv.setNestedScrollingEnabled(false); if (snoozed == null || snoozed.length == 0) { @@ -422,7 +442,7 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity { mDismissedRv.setLayoutManager(dismissLm); mDismissedRv.setAdapter( new NotificationSbnAdapter(NotificationHistoryActivity.this, mPm, mUm, - false, mUiEventLogger)); + false, mUiEventLogger, mContentRestrictedUsers)); mDismissedRv.setNestedScrollingEnabled(false); if (dismissed == null || dismissed.length == 0) { diff --git a/src/com/android/settings/notification/history/NotificationHistoryAdapter.java b/src/com/android/settings/notification/history/NotificationHistoryAdapter.java index 96bc14a6fb2..275ff4e2c95 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryAdapter.java +++ b/src/com/android/settings/notification/history/NotificationHistoryAdapter.java @@ -22,6 +22,7 @@ import static android.provider.Settings.EXTRA_CONVERSATION_ID; import android.app.INotificationManager; import android.app.NotificationHistory.HistoricalNotification; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.RemoteException; @@ -52,16 +53,23 @@ public class NotificationHistoryAdapter extends private List mValues; private OnItemDeletedListener mListener; private UiEventLogger mUiEventLogger; - public NotificationHistoryAdapter(INotificationManager nm, + private ArrayList mContentRestrictedUsers = new ArrayList<>(); + Context mContext; + + public NotificationHistoryAdapter(Context context, + INotificationManager nm, NotificationHistoryRecyclerView listView, OnItemDeletedListener listener, - UiEventLogger uiEventLogger) { + UiEventLogger uiEventLogger, + ArrayList contentRestrictedUsers) { + mContext = context; mValues = new ArrayList<>(); setHasStableIds(true); listView.setOnItemSwipeDeleteListener(this); mNm = nm; mListener = listener; mUiEventLogger = uiEventLogger; + mContentRestrictedUsers = contentRestrictedUsers; } @Override @@ -80,8 +88,13 @@ public class NotificationHistoryAdapter extends public void onBindViewHolder(final @NonNull NotificationHistoryViewHolder holder, int position) { final HistoricalNotification hn = mValues.get(position); - holder.setTitle(hn.getTitle()); - holder.setSummary(hn.getText()); + if (mContentRestrictedUsers.contains(hn.getUserId())) { + holder.setSummary(mContext.getString( + com.android.internal.R.string.notification_hidden_text)); + } else { + holder.setTitle(hn.getTitle()); + holder.setSummary(hn.getText()); + } holder.setPostedTime(hn.getPostedTimeMs()); final View.OnClickListener onClick = v -> { mUiEventLogger.logWithPosition(NotificationHistoryActivity.NotificationHistoryEvent diff --git a/src/com/android/settings/notification/history/NotificationSbnAdapter.java b/src/com/android/settings/notification/history/NotificationSbnAdapter.java index 1d61ae79cd0..a2932ae5fa0 100644 --- a/src/com/android/settings/notification/history/NotificationSbnAdapter.java +++ b/src/com/android/settings/notification/history/NotificationSbnAdapter.java @@ -74,9 +74,11 @@ public class NotificationSbnAdapter extends private List mEnabledProfiles = new ArrayList<>(); private boolean mIsSnoozed; private UiEventLogger mUiEventLogger; + private ArrayList mContentRestrictedUsers = new ArrayList<>(); public NotificationSbnAdapter(Context context, PackageManager pm, UserManager um, - boolean isSnoozed, UiEventLogger uiEventLogger) { + boolean isSnoozed, UiEventLogger uiEventLogger, + ArrayList contentRestrictedUsers) { mContext = context; mPm = pm; mUserBadgeCache = new HashMap<>(); @@ -97,6 +99,7 @@ public class NotificationSbnAdapter extends // If true, this is the panel for snoozed notifs, otherwise the one for dismissed notifs. mIsSnoozed = isSnoozed; mUiEventLogger = uiEventLogger; + mContentRestrictedUsers = contentRestrictedUsers; } @Override @@ -114,8 +117,13 @@ public class NotificationSbnAdapter extends holder.setIconBackground(loadBackground(sbn)); holder.setIcon(loadIcon(sbn)); holder.setPackageLabel(loadPackageLabel(sbn.getPackageName()).toString()); - holder.setTitle(getTitleString(sbn.getNotification())); - holder.setSummary(getTextString(mContext, sbn.getNotification())); + if (mContentRestrictedUsers.contains(sbn.getNormalizedUserId())) { + holder.setSummary(mContext.getString( + com.android.internal.R.string.notification_hidden_text)); + } else { + holder.setTitle(getTitleString(sbn.getNotification())); + holder.setSummary(getTextString(mContext, sbn.getNotification())); + } holder.setPostedTime(sbn.getPostTime()); holder.setDividerVisible(position < (mValues.size() -1)); int userId = normalizeUserId(sbn); -- GitLab From ca8f012da8942de253a9bc236f66786d823e5f46 Mon Sep 17 00:00:00 2001 From: Adam Bookatz Date: Wed, 11 Dec 2024 17:22:46 -0800 Subject: [PATCH 07/10] startActivityForResult with earlier new Intent We already make sure to use a copy of the Intent, but now we do so earlier. See bug. Bug: 353680402 Flag: EXEMPT bugfix Test: manual Test: atest com.android.settings.users.UserSettingsTest com.android.settings.users.UserDetailsSettingsTest (cherry picked from commit b7240e2f0c50455a1c8f3ae1fc4f27d55b86e89b) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:7ffa1f91350d51cbd26a5ee1ac4aada7ae1ca7be) Merged-In: I860e9e606de6b8d3c99fa52a63b72ba7a99ce179 Change-Id: I860e9e606de6b8d3c99fa52a63b72ba7a99ce179 --- src/com/android/settings/users/AppRestrictionsFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/users/AppRestrictionsFragment.java b/src/com/android/settings/users/AppRestrictionsFragment.java index 379e4bbaec6..60b7925967d 100644 --- a/src/com/android/settings/users/AppRestrictionsFragment.java +++ b/src/com/android/settings/users/AppRestrictionsFragment.java @@ -669,8 +669,9 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen */ private Intent assertSafeToStartCustomActivity(Intent intent) { EventLog.writeEvent(0x534e4554, "223578534", -1 /* UID */, ""); + final Intent vettedIntent = new Intent(intent); ResolveInfo resolveInfo = mPackageManager.resolveActivity( - intent, PackageManager.MATCH_DEFAULT_ONLY); + vettedIntent, PackageManager.MATCH_DEFAULT_ONLY); if (resolveInfo == null) { throw new ActivityNotFoundException("No result for resolving " + intent); @@ -684,7 +685,6 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen // We were able to vet the given intent this time. Make a copy using the components // that were used to do the vetting, since that's as much as we've verified is safe. - final Intent vettedIntent = new Intent(intent); vettedIntent.setComponent(activityInfo.getComponentName()); vettedIntent.setPackage(activityInfo.packageName); return vettedIntent; -- GitLab From f3cc1073e51e7945d7f75b4f43fe30d610a37ab8 Mon Sep 17 00:00:00 2001 From: Joe Bolinger Date: Sat, 7 Jun 2025 03:02:15 +0000 Subject: [PATCH 08/10] Ignore face settings extras when called by an external package. Bug: 411418366 Flag: EXEMPT bug fix Test: manual from any user not 0 (adb shell am start -a android.settings.FACE_SETTINGS --ei android.intent.extra.USER_ID 0) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:486947205e05e83314bd76e4822af442ca82be9c) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:387df9edf18fbfd42af166033c1532695f858c01) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:cb785b85c3655329e8cb66eca10d67d20f855e5f) Merged-In: I06193e421a140a90568251fc25baa7fc81c12d78 Change-Id: I06193e421a140a90568251fc25baa7fc81c12d78 --- .../biometrics/face/FaceSettings.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java index 979faa22fc2..e8043f81834 100644 --- a/src/com/android/settings/biometrics/face/FaceSettings.java +++ b/src/com/android/settings/biometrics/face/FaceSettings.java @@ -76,8 +76,8 @@ public class FaceSettings extends DashboardFragment { private FaceManager mFaceManager; private DevicePolicyManager mDevicePolicyManager; private int mUserId; - private int mSensorId; - private long mChallenge; + private int mSensorId = -1; + private long mChallenge = 0; private byte[] mToken; private FaceSettingsAttentionPreferenceController mAttentionController; private FaceSettingsRemoveButtonPreferenceController mRemoveController; @@ -176,12 +176,19 @@ public class FaceSettings extends DashboardFragment { mUserManager = context.getSystemService(UserManager.class); mFaceManager = context.getSystemService(FaceManager.class); mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); - mToken = getIntent().getByteArrayExtra(KEY_TOKEN); - mSensorId = getIntent().getIntExtra(BiometricEnrollBase.EXTRA_KEY_SENSOR_ID, -1); - mChallenge = getIntent().getLongExtra(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, 0L); - mUserId = getActivity().getIntent().getIntExtra( - Intent.EXTRA_USER_ID, UserHandle.myUserId()); + final SettingsActivity activity = (SettingsActivity) requireActivity(); + final String callingPackage = activity.getInitialCallingPackage(); + if (callingPackage == null || !callingPackage.equals(activity.getPackageName())) { + mUserId = UserHandle.myUserId(); + } else { + // only allow these extras when called internally by Settings + mToken = getIntent().getByteArrayExtra(KEY_TOKEN); + mSensorId = getIntent().getIntExtra(BiometricEnrollBase.EXTRA_KEY_SENSOR_ID, -1); + mChallenge = getIntent().getLongExtra(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, 0L); + mUserId = getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId()); + } + mFaceFeatureProvider = FeatureFactory.getFactory(getContext()).getFaceFeatureProvider(); if (mUserManager.getUserInfo(mUserId).isManagedProfile()) { -- GitLab From 8ed92b94df54987d9a3fb746af4f3b83a35000dc Mon Sep 17 00:00:00 2001 From: LineageOS Infra Date: Fri, 1 Aug 2025 19:45:04 +0000 Subject: [PATCH 09/10] Automatic translation import Change-Id: Ie51d72440329d00ecbc2df74c96e8046f50ae584 --- res/values-az/cm_strings.xml | 10 ++-- res/values-it/cm_strings.xml | 2 +- res/values-ug/cm_strings.xml | 91 ++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 6 deletions(-) diff --git a/res/values-az/cm_strings.xml b/res/values-az/cm_strings.xml index d8a073c7a3a..fde23218cbc 100644 --- a/res/values-az/cm_strings.xml +++ b/res/values-az/cm_strings.xml @@ -77,10 +77,10 @@ 30 dəqiqə Tək çəkilişdə avto-parlaqlıq Parlaqlıq nizamı yalnız ekran açılanda icra edilir - Şəbəkə müraciətinə icazə ver + Şəbəkə erişiminə icazə ver Şəbəkə istifadəsini fəallaşdır - Mobil internet - Mobil internet istifadəsini fəallaşdır + Mobil veri + Mobil veri istifadəsini fəallaşdır VPN VPN istifadəsini fəallaşdır Wi\u2011Fi @@ -101,9 +101,9 @@ Planşetin kilidini açmaq üçün barmaq izi sensoruna uzun basın Cihazın kilidini açmaq üçün barmaq izi sensoruna uzun basın Ekranı oyandırmaq və kilidi açmaq üçün, ekran altındakı barmaq izi sensoruna uzun basın. - Xəbərdarlıq: Bu seçim, düzgün işləməyə və ya məlumat itkisinə səbəb ola bilər, buna görə də tövsiyə edilmir! + Xəbərdarlıq: Bu seçim, düzgün işləməyə və ya veri itkisinə səbəb ola bilər, buna görə də tövsiyə edilmir! Köməkli GPS istifadə edin - GPS-in başlatma performansını əhəmiyyətli dərəcədə artıra bilən peyk köməkçi datalarını internetdən endirin. Fövqəladə hal zəngləri üçün köməkçi GPS-ə həmişə icazə verilir. + GPS-in başlatma performansını əhəmiyyətli dərəcədə artırmaq üçün internetdən peyk köməkçi verilərini endirin. Fövqəladə hal zəngləri üçün köməkçi GPS-ə həmişə icazə verilir. Texnologiya Sağlamlıq Yaxşı diff --git a/res/values-it/cm_strings.xml b/res/values-it/cm_strings.xml index 1c53843d949..41fe33cda61 100644 --- a/res/values-it/cm_strings.xml +++ b/res/values-it/cm_strings.xml @@ -43,7 +43,7 @@ Scegli la dimensione della sequenza Mostra sequenza errata Mostra punti sequenza - Frequenza massima di aggiornamento + Frequenza di aggiornamento massima Frequenza di aggiornamento minima Individua il sensore d\'impronte digitali sulla parte anteriore del tuo tablet. Individua il sensore d\'impronte digitali sulla parte anteriore del tuo dispositivo. diff --git a/res/values-ug/cm_strings.xml b/res/values-ug/cm_strings.xml index 21d5fafd596..5ea73f3cff4 100644 --- a/res/values-ug/cm_strings.xml +++ b/res/values-ug/cm_strings.xml @@ -15,18 +15,109 @@ limitations under the License. --> + قوشۇمچە ئىقتىدار + ئالىي تەڭشەك + Root سالاھىيىتىدە سازلايدۇ + Root سالاھىيىتىدە Android سازلاشنى ئىجرا قىلىشقا يول قويىدۇ + زاپاس تەمىنلىگۈچىنى ئۆزگەرتىدۇ + زاپاس تەمىنلىگۈچى تاللىنىدۇ + ساپ قارا رەڭ + قاراڭغۇ ئۆرنەك ئۈچۈن ساق قارا تەگلىك LineageOS قانۇن ئۇچۇرى + {count, plural, + one {}=1 {سىز ئىجادىيەت تەڭشىكىنى قوزغىتىشقا يەنە # قەدەم قالدىڭىز.} + other {سىز ئىجادىيەت تەڭشىكىنى قوزغىتىشقا يەنە # قەدەم قالدىڭىز.} + } ئىجادكارلار تەڭشەكلىرىنى قوزغاتتىڭىز! ھاجەتسىز، سىز ئاللىبۇرۇن ئىجادكارلار تەڭشەكلىرىنى قوزغاتقان. + ئۇخلىتىشتا چېكىلىدۇ + ئېكراننى تاقاشتا ھالەت بالداق ياكى قۇلۇپ ئېكران قوش چېكىلىدۇ + سەزگۈرلۈكى يۇقىرى ئېكراننىڭ نۇسخا ئېلىش نىسبىتى + سەزگۈر ئېكراننىڭ نۇسخا ئېلىش نىسبىتىنى ئۆرلىتىدۇ + لەيلىمە ئۇقتۇرۇش + كىچىك بىر لەيلىمە كۆزنەكتە ئالدىنلىق ئۇقتۇرۇشىنى كۆرسىتىدۇ سەزگۈر ئېكراننىڭ يۇقىرى سېزىمچانلىقى سەزگۈر ئېكراننىڭ سېزىمچانلىقىنى كۈچەيتىپ پەلەي كىيگەندە ئىشلىتىشكە قولايلىق يارىتىدۇ + خېرىدارنىڭ VPN ئىشلىتىشىگە يول قويىدۇ + قىزىق نۇقتا خېرىدارىنىڭ بۇ ئۈسكۈنىنىڭ VPN نى ئىشلىتىپ يۇقىرى ئېقىمغا باغلىنىشىغا يول قويىدۇ + ئەندىزە چوڭلۇقى تاللىنىدۇ ئەندىزە خاتالىقىنى كۆرسىتىش ئەندىزە نۇقتىسىنى كۆرسىتىش + ئەڭ يۇقىرى يېڭىلاش نىسبىتى + ئەڭ تۆۋەن يېڭىلاش نىسبىتى + تاختا كومپيۇتېرىڭىزنىڭ ئالدى تەرىپىدىكى بارماق ئىزى سەزگۈچىنى تېپىڭ. + ئۈسكۈنىڭىزنىڭ ئالدى تەرىپىدىكى بارماق ئىزى سەزگۈچىنى تېپىڭ. + تېلېفونىڭىزنىڭ ئالدى تەرىپىدىكى بارماق ئىزى سەزگۈچىنى تېپىڭ. + تاختا كومپيۇتېرىڭىزنىڭ كەينى تەرىپىدىكى بارماق ئىزى سەزگۈچىنى تېپىڭ. + ئۈسكۈنىڭىزنىڭ كەينى تەرىپىدىكى بارماق ئىزى سەزگۈچىنى تېپىڭ. + تېلېفونىڭىزنىڭ كەينى تەرىپىدىكى بارماق ئىزى سەزگۈچىنى تېپىڭ. + تاختا كومپيۇتېرىڭىزنىڭ يان تەرىپىدىكى بارماق ئىزى سەزگۈچىنى تېپىڭ. + ئۈسكۈنىڭىزنىڭ يان تەرىپىدىكى بارماق ئىزى سەزگۈچىنى تېپىڭ. + تېلېفونىڭىزنىڭ يان تەرىپىدىكى بارماق ئىزى سەزگۈچىنى تېپىڭ. + تاختا كومپيۇتېرىڭىزنىڭ ئالدى تەرىپىدىكى سەزگۈچكە تەگكۈزۈڭ. + ئۈسكۈنىڭىزنىڭ ئالدى تەرىپىدىكى سەزگۈچكە تەگكۈزۈڭ. + تېلېفونىڭىزنىڭ ئالدى تەرىپىدىكى سەزگۈچكە تەگكۈزۈڭ. + تاختا كومپيۇتېرىڭىزنىڭ كەينى تەرىپىدىكى سەزگۈچكە تەگكۈزۈڭ. + ئۈسكۈنىڭىزنىڭ كەينى تەرىپىدىكى سەزگۈچكە تەگكۈزۈڭ. + تېلېفونىڭىزنىڭ كەينى تەرىپىدىكى سەزگۈچكە تەگكۈزۈڭ. + تاختا كومپيۇتېرىڭىزنىڭ يان تەرىپىدىكى سەزگۈچكە تەگكۈزۈڭ. + ئۈسكۈنىڭىزنىڭ يان تەرىپىدىكى سەزگۈچكە تەگكۈزۈڭ. + تېلېفونىڭىزنىڭ يان تەرىپىدىكى سەزگۈچكە تەگكۈزۈڭ. + ئېكران تاقالغان تەقدىردىمۇ، تېگىش سەزگۈچى ئارقىلىق قۇلۇپنى ئاچقىلى بولىدۇ. سەزگۈچكە يېقىنلاشقاندا تاسادىپىي قۇلۇپ ئېچىلىپ كېتىشنىڭ ئالدىنى ئالىدۇ. + يولباشچى ئەسكەرتىشى + ئېكراننىڭ ئاستىدا يولباشچى ئەسكەرتىش بالداقنى كۆرسىتىدۇ + ئۇقتۇرۇش ئاۋازى ئارىسىدىكى ئەڭ قىسقا ۋاقىت + قوڭغۇراق ياكى تىترەشنىڭ ھەر %1$s قېتىمدا بىر قېتىم يۈز بېرىشىگە يول قويىدۇ + ھېچقانداق چەكلىمە يوق + 10 سېكۇنت + 30 سېكۇنت + 1 مىنۇت + 5 مىنۇت + 15 مىنۇت + 30 مىنۇت + بىر كۇنۇپكىدا يورۇقلۇقنى ئۆزلۈكىدىن تەڭشەش + يورۇقلۇق تەڭشەش پەقەت ئېكران ئېچىلغان پەيتتىلا يۈز بېرىدۇ + تور زىيارىتىگە يول قويىدۇ + تور ئىشلىتىشنى قوزغىتىدۇ + كۆچمە سانلىق مەلۇمات + كۆچمە سانلىق مەلۇمات ئىشلىتىشنى قوزغىتىدۇ + VPN سانلىق مەلۇمات + VPN سانلىق مەلۇماتى ئىشلىتىشنى قوزغىتىدۇ + Wi\u2011Fi سانلىق مەلۇماتى + WiFi سانلىق مەلۇماتى ئىشلىتىشنى قوزغىتىدۇ قالايمىقان جايلاشتۇرۇش ئۈسكۈنە قۇلۇپىنى ئاچقاندا قالايمىقان تەرتىپتىكى PIN جايلاشتۇرۇشنى ئىشلىتىدۇ تاسادىپىي ئويغىتىشنىڭ ئالدىنى ئېلىش + ئېكراننىڭ ئويغىتىشتىن ئىلگىرى ئارىلىق سەزگۈچنى تەكشۈرىدۇ + سەزگۈر ئېكران قول ئىشارىتى + تېز مەشغۇلاتنىڭ نۇرغۇن سەزگۈر ئېكران قول ئىشارىتىنى ئىجرا قىلىدۇ لەيلىتىش مەشغۇلاتى بارمىقىڭىزنى ئېكراننىڭ ئۈستىگە لەيلىتىپ توركۆرگۈ، يىراقتىكى ئۈستەلئۈستى قاتارلىقلارنىڭ چاشقىنەك ئىستىرىلكىسى سۈپىتىدە ئىشلىتىشىگە يول قويىدۇ چېتىلغاندا ئويغات توكقا چېتىلغان ياكى ئۈزۈلگەندە ئېكراننى ئاچىدۇ + تېز توكلاش + چەكلەپ ئۈسكۈنىگە توك قاچىلىغاندا قىزىپ كېتىشنى ئازايتىدۇ ياكى توكداننىڭ ئىشلىتىش ئۆمرىنى ئۇزارتىدۇ + بارماق ئىزى سەزگۈچ ئۇزۇن بېسىلسا تېلېفون قۇلۇپى ئېچىلىدۇ + بارماق ئىزى سەزگۈچ ئۇزۇن بېسىلسا تاختا كومپيۇتېر قۇلۇپى ئېچىلىدۇ + بارماق ئىزى سەزگۈچ ئۇزۇن بېسىلسا ئۈسكۈنە قۇلۇپى ئېچىلىدۇ + ئېكراننى ئويغىتىپ قۇلۇپ ئېچىشتا، ئېكران ئاستىدىكى بارماق ئىزى سەزگۈچ ئۇزۇن بېسىلىدۇ. + ئاگاھلاندۇرۇش: بۇ تاللانما ئادەتتىكىدەك ئىشلىمەسلىكى مۇمكىن ياكى سانلىق مەلۇماتنىڭ يوقىلىشىنى كەلتۈرۈپ چىقىرىشى مۇمكىن شۇڭا تەۋسىيە قىلىنمايدۇ! + كۈچەيتىلگەن GPS ئىشلەت + ئىنتېرنېتتىن سۈنئىي ھەمراھ قوشۇمچە سانلىق مەلۇماتىنى چۈشۈرىدۇ، بۇ GPS نىڭ قوزغىلىش ئۈنۈمىنى زور دەرىجىدە ئۆستۈرىدۇ. جىددىي چاقىرىشقا نىسبەتەن ھەمىشە GPS قوشۇمچە ئورۇن بەلگىلە ئىقتىدارىغا يول قويىدۇ. + تېخنىكا + ساغلاملىق + ياخشى + زىيادە قىزىق + توك يوق + توك بېسىمى يۇقىرى + بىلىنمىگەن خاتالىق + سوغۇق + يوچۇن + تېمپېراتۇرا + توك بېسىمى + %1$d mAh + لايىھەلەش ئىقتىدارى + %1$d mAh + ئەڭ چوڭ سىغىمى + %1$d mAh (%2$d%%) -- GitLab From 036dc440bc183e9ca6905624217c128cef6c7827 Mon Sep 17 00:00:00 2001 From: LineageOS Infra Date: Mon, 1 Sep 2025 17:00:07 +0000 Subject: [PATCH 10/10] Automatic translation import Change-Id: Ie8487c3628252b3bad06ed294f7149aca65fb612 --- res/values-be/cm_strings.xml | 1 + res/values-iw/cm_strings.xml | 85 +++++++++++++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 6 deletions(-) diff --git a/res/values-be/cm_strings.xml b/res/values-be/cm_strings.xml index f446e0670bb..a9df9513c65 100644 --- a/res/values-be/cm_strings.xml +++ b/res/values-be/cm_strings.xml @@ -16,6 +16,7 @@ --> Дадаткі + Адладка суперкарыстальнікам Змяніць пастаўшчыка рэзервовага капіявання Націсніце для сну Двойчы націсніце на панэль стану або экран блакіроўкі, каб перавесці прыладу ў рэжым сну diff --git a/res/values-iw/cm_strings.xml b/res/values-iw/cm_strings.xml index eb6438b9399..652e4cb64ad 100644 --- a/res/values-iw/cm_strings.xml +++ b/res/values-iw/cm_strings.xml @@ -15,18 +15,57 @@ limitations under the License. --> + תוספות + הגדרות מתקדמות + ניפוי תקלות עם גישת שורש + אפשר הרצת ניפוי תקלות באנדרואיד עם גישת שורש + החלפת ספק גיבוי + בחירת ספק גיבוי + שחור נקי + רקע שחור נקי לערכת נושא כהה LineageOS משפטי + {count, plural, + =1 {הינך צעד אחד מהפעלת הגדרות למפתחים.} + other {הינך # צעדים מהפעלת הגדרות למפתחים.} + } אפשרויות מפתח פעילות! אין צורך. כבר הפעלת את אפשרויות המפתח. הקש בכדי לכבות מסך - הקש פעמיים על שורת המצב או על מסך נעילה בכדי לכבות את המסך + הקשה פעמיים על שורת המצב או על מסך נעילה בכדי לכבות את המסך + קצב דיגום נגיעה גבוה + הגברת קצב דיגום מסך מגע התראות קופצות הראה התראות חשובות בחלון צף קטן רגישות גבוהה למגע - הגבר את רגישות מסך המגע, כך שניתן יהיה להשתמש בו בעת לבישת כפפות - בחר גודל תבנית - הצג שגיאות דפוס - הצג נקודות דפוס + הגברת רגישות מסך המגע, כך שניתן יהיה להשתמש בו בעת עטיית כפפות + אפשר ללקוחות להשתמש ב-VPN + אפשר ללקוחות נקודת חמה להשתמש בחיבורי ה-VPN של התקן זה לצורך גישה לרשת + בחירת גודל תבנית + הצגת שגיאת תבנית + הצגת נקודות תבנית + קצב רענון מקסימלי + קצב רענון מינימלי + ניתן למצוא את חיישן טביעת אצבע בחזית הטאבלט שלך. + ניתן למצוא את חיישן טביעת אצבע בחזית ההתקן שלך. + ניתן למצוא את חיישן טביעת אצבע בחזית הטלפון שלך. + ניתן למצוא את חיישן טביעת אצבע בגב הטאבלט שלך. + ניתן למצוא את חיישן טביעת אצבע בגב ההתקן שלך. + ניתן למצוא את חיישן טביעת אצבע בגב הטלפון שלך. + ניתן למצוא את חיישן טביעת אצבע בצד הטאבלט שלך. + ניתן למצוא את חיישן טביעת אצבע בצד ההתקן שלך. + ניתן למצוא את חיישן טביעת אצבע בצד הטלפון שלך. + יש לגעת בחיישן בחזית הטאבלט שלך. + יש לגעת בחיישן בחזית ההתקן שלך. + יש לגעת בחיישן בחזית הטלפון שלך. + יש לגעת בחיישן בגב הטאבלט שלך. + יש לגעת בחיישן בגב ההתקן שלך. + יש לגעת בחיישן בגב הטלפון שלך. + יש לגעת בחיישן בצד הטאבלט שלך. + יש לגעת בחיישן בצד ההתקן שלך. + יש לגעת בחיישן בצד הטלפון שלך. + יש לגעת בחיישן כדי לפתוח את הנעילה, גם כשהמסך כבוי. חיישן קירבה מונע פתיחה מקרית. + רמז לניווט + הצגת רמזי ניווט בתחתית המסך זמן מינימלי בין צלילי התראות אפשר צלילים או רטט לא יותר מפעם אחת בכל %1$s ללא מגבלה @@ -34,7 +73,16 @@ 30 שניות דקה 1 5 דקות + רבע שעה 30 דקות + בהירות אוטומטית בלחיצה אחת + התאמת הבהירות תתבצע רק כאשר המסך דלוק + אפשר גישה לרשת + אפשר שימוש ברשת + נתונים ניידים + אפשר שימוש בנתונים ניידים + נתוני VPN + אפשר שימוש בנתוני VPN ‏נתוני Wi‑Fi אפשר שימוש בנתוני Wi‑Fi ערבב פריסה @@ -45,6 +93,31 @@ השתמש במחוות מגע שונות לפעולות מהירות מגע בריחוף מאפשר להעביר את האצבע מעל המסך כמו עכבר של מחשב בדפדפנים, בעמדות שליטה מרחוק וכד\' - הער מסך בעת חיבור + יעירו בעת חיבור הפעל את המסך כאשר מקור חשמל מתחבר או מתנתק מהמכשיר + טעינה מהירה + ניתן להשבית על מנת להפחית את חימום ההתקן בזמן טעינה או להאריך את חיי הסוללה + לחיצה ארוכה על חיישן טביעת אצבע לשחרור נעילת הטלפון + לחיצה ארוכה על חיישן טביעת אצבע לשחרור נעילת טאבלט + לחיצה ארוכה על חיישן טביעת אצבע לשחרור נעילת ההתקן + לפתיחת הנעילה ולעורר את המסך, יש ללחוץ לחיצה ארוכה על חיישן טביעת אצבע שמתחת למסך. + אזהרה: אפשרות זו לא מומלצת! ייתכן שלא תפעל כראוי, או תגרום לאובדן נתונים. + שימוש במסייע GPS + הורדת נתוני סיוע לווייני מהאינטרנט שיכולים לשפר מאוד את ביצועי ההפעלה של ה-GPS. בקריאות חירום, נתוני סיוע ל-GPS מאופשרים תמיד. + טכנולוגיה + בריאות + טובה + התחממות יתר + תקולה + מתח חשמלי גבוה + כשל לא מוגדר + קרה + לא ידוע + טמפרטורה + מתח + %1$d מיליאמפר/שעה + קיבולת מקורית + %1$d מיליאמפר/שעה + קיבולת מרבית + %1$d מיליאמפר/שעה (%2$d%%) -- GitLab